Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
mptdebug.h
Go to the documentation of this file.
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:[email protected])
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 */