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-2007 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 
62 /*
63  * CONFIG_FUSION_LOGGING - enabled in Kconfig
64  */
65 
66 #ifdef CONFIG_FUSION_LOGGING
67 #define MPT_CHECK_LOGGING(IOC, CMD, BITS)			\
68 {								\
69 	if (IOC->debug_level & BITS)				\
70 		CMD;						\
71 }
72 #else
73 #define MPT_CHECK_LOGGING(IOC, CMD, BITS)
74 #endif
75 
76 
77 /*
78  * debug macros
79  */
80 
81 #define dprintk(IOC, CMD)			\
82 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG)
83 
84 #define dsgprintk(IOC, CMD)			\
85 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_SG)
86 
87 #define devtprintk(IOC, CMD)			\
88 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_EVENTS)
89 
90 #define devtverboseprintk(IOC, CMD)		\
91 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_VERBOSE_EVENTS)
92 
93 #define dinitprintk(IOC, CMD)			\
94 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_INIT)
95 
96 #define dexitprintk(IOC, CMD)			\
97 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_EXIT)
98 
99 #define dfailprintk(IOC, CMD)			\
100 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_FAIL)
101 
102 #define dtmprintk(IOC, CMD)			\
103 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_TM)
104 
105 #define ddvprintk(IOC, CMD)			\
106 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_DV)
107 
108 #define dreplyprintk(IOC, CMD)			\
109 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_REPLY)
110 
111 #define dhsprintk(IOC, CMD)			\
112 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_HANDSHAKE)
113 
114 #define dcprintk(IOC, CMD)			\
115 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_CONFIG)
116 
117 #define ddlprintk(IOC, CMD)			\
118 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_DL)
119 
120 #define drsprintk(IOC, CMD)			\
121 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_RESET)
122 
123 #define dsprintk(IOC, CMD)			\
124 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_SCSI)
125 
126 #define dctlprintk(IOC, CMD)			\
127 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_IOCTL)
128 
129 #define dfcprintk(IOC, CMD)			\
130 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_FC)
131 
132 #define dsasprintk(IOC, CMD)			\
133 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_SAS)
134 
135 #define dsaswideprintk(IOC, CMD)		\
136 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_SAS_WIDE)
137 
138 
139 
140 /*
141  * Verbose logging
142  */
143 #if defined(MPT_DEBUG_VERBOSE) && defined(CONFIG_FUSION_LOGGING)
144 static inline void
145 DBG_DUMP_FW_DOWNLOAD(MPT_ADAPTER *ioc, u32  *mfp, int numfrags)
146 {
147 	int i;
148 
149 	if (!(ioc->debug_level & MPT_DEBUG))
150 		return;
151 	printk(KERN_DEBUG "F/W download request:\n");
152 	for (i=0; i < 7+numfrags*2; i++)
153 		printk(" %08x", le32_to_cpu(mfp[i]));
154 	printk("\n");
155 }
156 
157 static inline void
158 DBG_DUMP_PUT_MSG_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
159 {
160 	int	 ii, n;
161 
162 	if (!(ioc->debug_level & MPT_DEBUG_MSG_FRAME))
163 		return;
164 	printk(KERN_DEBUG "%s: About to Put msg frame @ %p:\n",
165 		ioc->name, mfp);
166 	n = ioc->req_sz/4 - 1;
167 	while (mfp[n] == 0)
168 		n--;
169 	for (ii=0; ii<=n; ii++) {
170 		if (ii && ((ii%8)==0))
171 			printk("\n");
172 		printk(" %08x", le32_to_cpu(mfp[ii]));
173 	}
174 	printk("\n");
175 }
176 
177 static inline void
178 DBG_DUMP_FW_REQUEST_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
179 {
180 	int  i, n;
181 
182 	if (!(ioc->debug_level & MPT_DEBUG_MSG_FRAME))
183 		return;
184 	n = 10;
185 	printk(KERN_INFO " ");
186 	for (i = 0; i < n; i++)
187 		printk(" %08x", le32_to_cpu(mfp[i]));
188 	printk("\n");
189 }
190 
191 static inline void
192 DBG_DUMP_REQUEST_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
193 {
194 	int  i, n;
195 
196 	if (!(ioc->debug_level & MPT_DEBUG_MSG_FRAME))
197 		return;
198 	n = 24;
199 	for (i=0; i<n; i++) {
200 		if (i && ((i%8)==0))
201 			printk("\n");
202 		printk("%08x ", le32_to_cpu(mfp[i]));
203 	}
204 	printk("\n");
205 }
206 
207 static inline void
208 DBG_DUMP_REPLY_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
209 {
210 	int  i, n;
211 
212 	if (!(ioc->debug_level & MPT_DEBUG_MSG_FRAME))
213 		return;
214 	n = (le32_to_cpu(mfp[0]) & 0x00FF0000) >> 16;
215 	printk(KERN_INFO " ");
216 	for (i=0; i<n; i++)
217 		printk(" %08x", le32_to_cpu(mfp[i]));
218 	printk("\n");
219 }
220 
221 static inline void
222 DBG_DUMP_REQUEST_FRAME_HDR(MPT_ADAPTER *ioc, u32 *mfp)
223 {
224 	int  i, n;
225 
226 	if (!(ioc->debug_level & MPT_DEBUG_MSG_FRAME))
227 		return;
228 	n = 3;
229 	printk(KERN_INFO " ");
230 	for (i=0; i<n; i++)
231 		printk(" %08x", le32_to_cpu(mfp[i]));
232 	printk("\n");
233 }
234 
235 static inline void
236 DBG_DUMP_TM_REQUEST_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
237 {
238 	int  i, n;
239 
240 	if (!(ioc->debug_level & MPT_DEBUG_TM))
241 		return;
242 	n = 13;
243 	printk(KERN_DEBUG "TM_REQUEST:\n");
244 	for (i=0; i<n; i++) {
245 		if (i && ((i%8)==0))
246 			printk("\n");
247 		printk("%08x ", le32_to_cpu(mfp[i]));
248 	}
249 	printk("\n");
250 }
251 
252 static inline void
253 DBG_DUMP_TM_REPLY_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
254 {
255 	int  i, n;
256 
257 	if (!(ioc->debug_level & MPT_DEBUG_TM))
258 		return;
259 	n = (le32_to_cpu(mfp[0]) & 0x00FF0000) >> 16;
260 	printk(KERN_DEBUG "TM_REPLY MessageLength=%d:\n", n);
261 	for (i=0; i<n; i++) {
262 		if (i && ((i%8)==0))
263 			printk("\n");
264 		printk(" %08x", le32_to_cpu(mfp[i]));
265 	}
266 	printk("\n");
267 }
268 
269 #define dmfprintk(IOC, CMD)			\
270 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_MSG_FRAME)
271 
272 # else /* ifdef MPT_DEBUG_MF */
273 
274 #define DBG_DUMP_FW_DOWNLOAD(IOC, mfp, numfrags)
275 #define DBG_DUMP_PUT_MSG_FRAME(IOC, mfp)
276 #define DBG_DUMP_FW_REQUEST_FRAME(IOC, mfp)
277 #define DBG_DUMP_REQUEST_FRAME(IOC, mfp)
278 #define DBG_DUMP_REPLY_FRAME(IOC, mfp)
279 #define DBG_DUMP_REQUEST_FRAME_HDR(IOC, mfp)
280 #define DBG_DUMP_TM_REQUEST_FRAME(IOC, mfp)
281 #define DBG_DUMP_TM_REPLY_FRAME(IOC, mfp)
282 
283 #define dmfprintk(IOC, CMD)			\
284 	MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_MSG_FRAME)
285 
286 #endif /* defined(MPT_DEBUG_VERBOSE) && defined(CONFIG_FUSION_LOGGING) */
287 
288 #endif /* ifndef MPTDEBUG_H_INCLUDED */
289