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