1 /* 2 * Debug.h 3 * 4 * Dynamic (runtime) debug framework implementation. 5 * -kaiwan. 6 */ 7 #ifndef _DEBUG_H 8 #define _DEBUG_H 9 #include <linux/string.h> 10 #define NONE 0xFFFF 11 12 /* TYPE and SUBTYPE 13 * Define valid TYPE (or category or code-path, however you like to think of it) 14 * and SUBTYPE s. 15 * Type and SubType are treated as bitmasks. 16 */ 17 #define DBG_TYPE_INITEXIT (1 << 0) /* 1 */ 18 #define DBG_TYPE_TX (1 << 1) /* 2 */ 19 #define DBG_TYPE_RX (1 << 2) /* 4 */ 20 #define DBG_TYPE_OTHERS (1 << 3) /* 8 */ 21 #define NUMTYPES 4 22 23 /* -SUBTYPEs for TX : TYPE is DBG_TYPE_TX -----// 24 * Transmit.c ,Arp.c, LeakyBucket.c, And Qos.c 25 * total 17 macros 26 */ 27 /* Transmit.c */ 28 #define TX 1 29 #define MP_SEND (TX << 0) 30 #define NEXT_SEND (TX << 1) 31 #define TX_FIFO (TX << 2) 32 #define TX_CONTROL (TX << 3) 33 34 /* Arp.c */ 35 #define IP_ADDR (TX << 4) 36 #define ARP_REQ (TX << 5) 37 #define ARP_RESP (TX << 6) 38 39 /* Leakybucket.c */ 40 #define TOKEN_COUNTS (TX << 8) 41 #define CHECK_TOKENS (TX << 9) 42 #define TX_PACKETS (TX << 10) 43 #define TIMER (TX << 11) 44 45 /* Qos.c */ 46 #define QOS TX 47 #define QUEUE_INDEX (QOS << 12) 48 #define IPV4_DBG (QOS << 13) 49 #define IPV6_DBG (QOS << 14) 50 #define PRUNE_QUEUE (QOS << 15) 51 #define SEND_QUEUE (QOS << 16) 52 53 /* TX_Misc */ 54 #define TX_OSAL_DBG (TX << 17) 55 56 /* --SUBTYPEs for ------INIT & EXIT--------------------- 57 * ------------ TYPE is DBG_TYPE_INITEXIT -----// 58 * DriverEntry.c, bcmfwup.c, ChipDetectTask.c, HaltnReset.c, InterfaceDDR.c 59 */ 60 #define MP 1 61 #define DRV_ENTRY (MP << 0) 62 #define MP_INIT (MP << 1) 63 #define READ_REG (MP << 3) 64 #define DISPATCH (MP << 2) 65 #define CLAIM_ADAP (MP << 4) 66 #define REG_IO_PORT (MP << 5) 67 #define INIT_DISP (MP << 6) 68 #define RX_INIT (MP << 7) 69 70 /* -SUBTYPEs for --RX---------------------------------- 71 * ------------RX : TYPE is DBG_TYPE_RX -----// 72 * Receive.c 73 */ 74 #define RX 1 75 #define RX_DPC (RX << 0) 76 #define RX_CTRL (RX << 3) 77 #define RX_DATA (RX << 4) 78 #define MP_RETURN (RX << 1) 79 #define LINK_MSG (RX << 2) 80 81 /* -SUBTYPEs for ----OTHER ROUTINES------------------ 82 * ------------OTHERS : TYPE is DBG_TYPE_OTHER -----// 83 * HaltnReset,CheckForHang,PnP,Misc,CmHost 84 * total 12 macros 85 */ 86 #define OTHERS 1 87 #define ISR OTHERS 88 #define MP_DPC (ISR << 0) 89 90 /* HaltnReset.c */ 91 #define HALT OTHERS 92 #define MP_HALT (HALT << 1) 93 #define CHECK_HANG (HALT << 2) 94 #define MP_RESET (HALT << 3) 95 #define MP_SHUTDOWN (HALT << 4) 96 97 /* pnp.c */ 98 #define PNP OTHERS 99 #define MP_PNP (PNP << 5) 100 101 /* Misc.c */ 102 #define MISC OTHERS 103 #define DUMP_INFO (MISC << 6) 104 #define CLASSIFY (MISC << 7) 105 #define LINK_UP_MSG (MISC << 8) 106 #define CP_CTRL_PKT (MISC << 9) 107 #define DUMP_CONTROL (MISC << 10) 108 #define LED_DUMP_INFO (MISC << 11) 109 110 /* CmHost.c */ 111 #define CMHOST OTHERS 112 #define SERIAL (OTHERS << 12) 113 #define IDLE_MODE (OTHERS << 13) 114 #define WRM (OTHERS << 14) 115 #define RDM (OTHERS << 15) 116 117 /* TODO - put PHS_SEND in Tx PHS_RECEIVE in Rx path ? */ 118 #define PHS_SEND (OTHERS << 16) 119 #define PHS_RECEIVE (OTHERS << 17) 120 #define PHS_MODULE (OTHERS << 18) 121 122 #define INTF_INIT (OTHERS << 19) 123 #define INTF_ERR (OTHERS << 20) 124 #define INTF_WARN (OTHERS << 21) 125 #define INTF_NORM (OTHERS << 22) 126 127 #define IRP_COMPLETION (OTHERS << 23) 128 #define SF_DESCRIPTOR_CNTS (OTHERS << 24) 129 #define PHS_DISPATCH (OTHERS << 25) 130 #define OSAL_DBG (OTHERS << 26) 131 #define NVM_RW (OTHERS << 27) 132 133 #define HOST_MIBS (OTHERS << 28) 134 #define CONN_MSG (CMHOST << 29) 135 136 /* Debug level 137 * We have 8 debug levels, in (numerical) increasing order of verbosity. 138 * IMP: Currently implementing ONLY DBG_LVL_ALL , i.e. , all debug prints will 139 * appear (of course, iff global debug flag is ON and we match the Type and SubType). 140 * Finer granularity debug levels are currently not in use, although the feature exists. 141 * 142 * Another way to say this: 143 * All the debug prints currently have 'debug_level' set to DBG_LVL_ALL . 144 * You can compile-time change that to any of the below, if you wish to. However, as of now, there's 145 * no dynamic facility to have the userspace 'TestApp' set debug_level. Slated for future expansion. 146 */ 147 #define BCM_ALL 7 148 #define BCM_LOW 6 149 #define BCM_PRINT 5 150 #define BCM_NORMAL 4 151 #define BCM_MEDIUM 3 152 #define BCM_SCREAM 2 153 #define BCM_ERR 1 154 /* Not meant for developer in debug prints. 155 * To be used to disable all prints by setting the DBG_LVL_CURR to this value 156 */ 157 #define BCM_NONE 0 158 159 /* The current driver logging level. 160 * Everything at this level and (numerically) lower (meaning higher prio) 161 * is logged. 162 * Replace 'BCM_ALL' in the DBG_LVL_CURR macro with the logging level desired. 163 * For eg. to set the logging level to 'errors only' use: 164 * #define DBG_LVL_CURR (BCM_ERR) 165 */ 166 167 #define DBG_LVL_CURR (BCM_ALL) 168 #define DBG_LVL_ALL BCM_ALL 169 170 /* ---Userspace mapping of Debug State. 171 * Delibrately matches that of the Windows driver.. 172 * The TestApp's ioctl passes this struct to us. 173 */ 174 struct bcm_user_debug_state { 175 unsigned int Subtype, Type; 176 unsigned int OnOff; 177 /* unsigned int debug_level; future expansion */ 178 } __packed; 179 180 /* ---Kernel-space mapping of Debug State */ 181 struct bcm_debug_state { 182 unsigned int type; 183 /* A bitmap of 32 bits for Subtype per Type. 184 * Valid indexes in 'subtype' array are *only* 1,2,4 and 8, 185 * corresponding to valid Type values. Hence we use the 'Type' field 186 * as the index value, ignoring the array entries 0,3,5,6,7 ! 187 */ 188 unsigned int subtype[(NUMTYPES*2)+1]; 189 unsigned int debug_level; 190 }; 191 /* Instantiated in the Adapter structure 192 * We'll reuse the debug level parameter to include a bit (the MSB) to indicate whether or not 193 * we want the function's name printed. 194 */ 195 #define DBG_NO_FUNC_PRINT (1 << 31) 196 #define DBG_LVL_BITMASK 0xFF 197 198 /* --- Only for direct printk's; "hidden" to API. */ 199 #define DBG_TYPE_PRINTK 3 200 201 #define BCM_DEBUG_PRINT(Adapter, Type, SubType, dbg_level, string, args...) \ 202 do { \ 203 if (DBG_TYPE_PRINTK == Type) \ 204 pr_info("%s:" string, __func__, ##args); \ 205 else if (Adapter && \ 206 (dbg_level & DBG_LVL_BITMASK) <= Adapter->stDebugState.debug_level && \ 207 (Type & Adapter->stDebugState.type) && \ 208 (SubType & Adapter->stDebugState.subtype[Type])) { \ 209 if (dbg_level & DBG_NO_FUNC_PRINT) \ 210 pr_debug("%s:\n", string); \ 211 else \ 212 pr_debug("%s:\n" string, __func__, ##args); \ 213 } \ 214 } while (0) 215 216 #define BCM_DEBUG_PRINT_BUFFER(Adapter, Type, SubType, dbg_level, buffer, bufferlen) \ 217 do { \ 218 if (DBG_TYPE_PRINTK == Type || \ 219 (Adapter && \ 220 (dbg_level & DBG_LVL_BITMASK) <= Adapter->stDebugState.debug_level && \ 221 (Type & Adapter->stDebugState.type) && \ 222 (SubType & Adapter->stDebugState.subtype[Type]))) { \ 223 pr_debug("%s:\n", __func__); \ 224 print_hex_dump(KERN_DEBUG, " ", DUMP_PREFIX_OFFSET, \ 225 16, 1, buffer, bufferlen, false); \ 226 } \ 227 } while (0) 228 229 #define BCM_SHOW_DEBUG_BITMAP(Adapter) do { \ 230 int i; \ 231 for (i = 0; i < (NUMTYPES * 2) + 1; i++) { \ 232 if ((i == 1) || (i == 2) || (i == 4) || (i == 8)) { \ 233 /* CAUTION! Forcefully turn on ALL debug paths and subpaths! \ 234 * Adapter->stDebugState.subtype[i] = 0xffffffff; \ 235 */ \ 236 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "subtype[%d] = 0x%08x\n", \ 237 i, Adapter->stDebugState.subtype[i]); \ 238 } \ 239 } \ 240 } while (0) 241 242 #endif 243