1 /*
2  *  linux/drivers/message/fusion/mptdebug.h
3  *      For use with LSI PCI chip/adapter(s)
4  *      running LSI Fusion MPT (Message Passing Technology) firmware.
5  *
6  *  Copyright (c) 1999-2008 LSI Corporation
7  *  (mailto:DL-MPTFusionLinux@lsi.com)
8  *
9  */
10 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
11 
12 #ifndef MPTDEBUG_H_INCLUDED
13 #define MPTDEBUG_H_INCLUDED
14 
15 /*
16  * debug level can be programmed on the fly via SysFS (hex values)
17  *
18  * Example:  (programming for MPT_DEBUG_EVENTS on host 5)
19  *
20  * echo 8 > /sys/class/scsi_host/host5/debug_level
21  *
22  * --------------------------------------------------------
23  * mpt_debug_level - command line parameter
24  * this allow enabling debug at driver load time (for all iocs)
25  *
26  * Example  (programming for MPT_DEBUG_EVENTS)
27  *
28  * insmod mptbase.ko mpt_debug_level=8
29  *
30  * --------------------------------------------------------
31  * CONFIG_FUSION_LOGGING - enables compiling debug into driver
32  * this can be enabled in the driver Makefile
33  *
34  *
35  * --------------------------------------------------------
36  * Please note most debug prints are set to logging priority = debug
37  * This is the lowest level, and most verbose.  Please refer to manual
38  * pages for syslogd or syslogd-ng on how to configure this.
39  */
40 
41 #define MPT_DEBUG			0x00000001
42 #define MPT_DEBUG_MSG_FRAME		0x00000002
43 #define MPT_DEBUG_SG			0x00000004
44 #define MPT_DEBUG_EVENTS		0x00000008
45 #define MPT_DEBUG_VERBOSE_EVENTS	0x00000010
46 #define MPT_DEBUG_INIT			0x00000020
47 #define MPT_DEBUG_EXIT			0x00000040
48 #define MPT_DEBUG_FAIL			0x00000080
49 #define MPT_DEBUG_TM			0x00000100
50 #define MPT_DEBUG_DV			0x00000200
51 #define MPT_DEBUG_REPLY			0x00000400
52 #define MPT_DEBUG_HANDSHAKE		0x00000800
53 #define MPT_DEBUG_CONFIG		0x00001000
54 #define MPT_DEBUG_DL			0x00002000
55 #define MPT_DEBUG_RESET			0x00008000
56 #define MPT_DEBUG_SCSI			0x00010000
57 #define MPT_DEBUG_IOCTL			0x00020000
58 #define MPT_DEBUG_FC			0x00080000
59 #define MPT_DEBUG_SAS			0x00100000
60 #define MPT_DEBUG_SAS_WIDE		0x00200000
61 #define MPT_DEBUG_36GB_MEM              0x00400000
62 
63 /*
64  * CONFIG_FUSION_LOGGING - enabled in Kconfig
65  */
66 
67 #ifdef CONFIG_FUSION_LOGGING
68 #define MPT_CHECK_LOGGING(IOC, CMD, BITS)			\
69 {								\
70 	if (IOC->debug_level & BITS)				\
71 		CMD;						\
72 }
73 #else
74 #define MPT_CHECK_LOGGING(IOC, CMD, BITS)
75 #endif
76 
77 
78 /*
79  * debug macros
80  */
81 
82 #define dprintk(IOC, CMD)			\
83 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG)
84 
85 #define dsgprintk(IOC, CMD)			\
86 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_SG)
87 
88 #define devtprintk(IOC, CMD)			\
89 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_EVENTS)
90 
91 #define devtverboseprintk(IOC, CMD)		\
92 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_VERBOSE_EVENTS)
93 
94 #define dinitprintk(IOC, CMD)			\
95 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_INIT)
96 
97 #define dexitprintk(IOC, CMD)			\
98 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_EXIT)
99 
100 #define dfailprintk(IOC, CMD)			\
101 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_FAIL)
102 
103 #define dtmprintk(IOC, CMD)			\
104 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_TM)
105 
106 #define ddvprintk(IOC, CMD)			\
107 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_DV)
108 
109 #define dreplyprintk(IOC, CMD)			\
110 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_REPLY)
111 
112 #define dhsprintk(IOC, CMD)			\
113 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_HANDSHAKE)
114 
115 #define dcprintk(IOC, CMD)			\
116 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_CONFIG)
117 
118 #define ddlprintk(IOC, CMD)			\
119 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_DL)
120 
121 #define drsprintk(IOC, CMD)			\
122 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_RESET)
123 
124 #define dsprintk(IOC, CMD)			\
125 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_SCSI)
126 
127 #define dctlprintk(IOC, CMD)			\
128 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_IOCTL)
129 
130 #define dfcprintk(IOC, CMD)			\
131 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_FC)
132 
133 #define dsasprintk(IOC, CMD)			\
134 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_SAS)
135 
136 #define dsaswideprintk(IOC, CMD)		\
137 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_SAS_WIDE)
138 
139 #define d36memprintk(IOC, CMD)		\
140 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_36GB_MEM)
141 
142 
143 /*
144  * Verbose logging
145  */
146 #if defined(MPT_DEBUG_VERBOSE) && defined(CONFIG_FUSION_LOGGING)
147 static inline void
148 DBG_DUMP_FW_DOWNLOAD(MPT_ADAPTER *ioc, u32  *mfp, int numfrags)
149 {
150 	int i;
151 
152 	if (!(ioc->debug_level & MPT_DEBUG))
153 		return;
154 	printk(KERN_DEBUG "F/W download request:\n");
155 	for (i=0; i < 7+numfrags*2; i++)
156 		printk(" %08x", le32_to_cpu(mfp[i]));
157 	printk("\n");
158 }
159 
160 static inline void
161 DBG_DUMP_PUT_MSG_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
162 {
163 	int	 ii, n;
164 
165 	if (!(ioc->debug_level & MPT_DEBUG_MSG_FRAME))
166 		return;
167 	printk(KERN_DEBUG "%s: About to Put msg frame @ %p:\n",
168 		ioc->name, mfp);
169 	n = ioc->req_sz/4 - 1;
170 	while (mfp[n] == 0)
171 		n--;
172 	for (ii=0; ii<=n; ii++) {
173 		if (ii && ((ii%8)==0))
174 			printk("\n");
175 		printk(" %08x", le32_to_cpu(mfp[ii]));
176 	}
177 	printk("\n");
178 }
179 
180 static inline void
181 DBG_DUMP_FW_REQUEST_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
182 {
183 	int  i, n;
184 
185 	if (!(ioc->debug_level & MPT_DEBUG_MSG_FRAME))
186 		return;
187 	n = 10;
188 	printk(KERN_INFO " ");
189 	for (i = 0; i < n; i++)
190 		printk(" %08x", le32_to_cpu(mfp[i]));
191 	printk("\n");
192 }
193 
194 static inline void
195 DBG_DUMP_REQUEST_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
196 {
197 	int  i, n;
198 
199 	if (!(ioc->debug_level & MPT_DEBUG_MSG_FRAME))
200 		return;
201 	n = 24;
202 	for (i=0; i<n; i++) {
203 		if (i && ((i%8)==0))
204 			printk("\n");
205 		printk("%08x ", le32_to_cpu(mfp[i]));
206 	}
207 	printk("\n");
208 }
209 
210 static inline void
211 DBG_DUMP_REPLY_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
212 {
213 	int  i, n;
214 
215 	if (!(ioc->debug_level & MPT_DEBUG_MSG_FRAME))
216 		return;
217 	n = (le32_to_cpu(mfp[0]) & 0x00FF0000) >> 16;
218 	printk(KERN_INFO " ");
219 	for (i=0; i<n; i++)
220 		printk(" %08x", le32_to_cpu(mfp[i]));
221 	printk("\n");
222 }
223 
224 static inline void
225 DBG_DUMP_REQUEST_FRAME_HDR(MPT_ADAPTER *ioc, u32 *mfp)
226 {
227 	int  i, n;
228 
229 	if (!(ioc->debug_level & MPT_DEBUG_MSG_FRAME))
230 		return;
231 	n = 3;
232 	printk(KERN_INFO " ");
233 	for (i=0; i<n; i++)
234 		printk(" %08x", le32_to_cpu(mfp[i]));
235 	printk("\n");
236 }
237 
238 static inline void
239 DBG_DUMP_TM_REQUEST_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
240 {
241 	int  i, n;
242 
243 	if (!(ioc->debug_level & MPT_DEBUG_TM))
244 		return;
245 	n = 13;
246 	printk(KERN_DEBUG "TM_REQUEST:\n");
247 	for (i=0; i<n; i++) {
248 		if (i && ((i%8)==0))
249 			printk("\n");
250 		printk("%08x ", le32_to_cpu(mfp[i]));
251 	}
252 	printk("\n");
253 }
254 
255 static inline void
256 DBG_DUMP_TM_REPLY_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
257 {
258 	int  i, n;
259 
260 	if (!(ioc->debug_level & MPT_DEBUG_TM))
261 		return;
262 	n = (le32_to_cpu(mfp[0]) & 0x00FF0000) >> 16;
263 	printk(KERN_DEBUG "TM_REPLY MessageLength=%d:\n", n);
264 	for (i=0; i<n; i++) {
265 		if (i && ((i%8)==0))
266 			printk("\n");
267 		printk(" %08x", le32_to_cpu(mfp[i]));
268 	}
269 	printk("\n");
270 }
271 
272 #define dmfprintk(IOC, CMD)			\
273 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_MSG_FRAME)
274 
275 # else /* ifdef MPT_DEBUG_MF */
276 
277 #define DBG_DUMP_FW_DOWNLOAD(IOC, mfp, numfrags)
278 #define DBG_DUMP_PUT_MSG_FRAME(IOC, mfp)
279 #define DBG_DUMP_FW_REQUEST_FRAME(IOC, mfp)
280 #define DBG_DUMP_REQUEST_FRAME(IOC, mfp)
281 #define DBG_DUMP_REPLY_FRAME(IOC, mfp)
282 #define DBG_DUMP_REQUEST_FRAME_HDR(IOC, mfp)
283 #define DBG_DUMP_TM_REQUEST_FRAME(IOC, mfp)
284 #define DBG_DUMP_TM_REPLY_FRAME(IOC, mfp)
285 
286 #define dmfprintk(IOC, CMD)			\
287 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_MSG_FRAME)
288 
289 #endif /* defined(MPT_DEBUG_VERBOSE) && defined(CONFIG_FUSION_LOGGING) */
290 
291 #endif /* ifndef MPTDEBUG_H_INCLUDED */
292