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)
147static inline void
148DBG_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
160static inline void
161DBG_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
180static inline void
181DBG_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
194static inline void
195DBG_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
210static inline void
211DBG_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
224static inline void
225DBG_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
238static inline void
239DBG_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
255static inline void
256DBG_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