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