Stephen Hemminger | f8942e0 | 2010-09-08 14:46:36 -0700 | [diff] [blame] | 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 | |
Stephen Hemminger | f8942e0 | 2010-09-08 14:46:36 -0700 | [diff] [blame] | 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) |
Joe Perches | ceeb6fe | 2011-06-23 11:40:18 -0700 | [diff] [blame] | 134 | #define PHS_RECEIVE (OTHERS<<17) |
Stephen Hemminger | f8942e0 | 2010-09-08 14:46:36 -0700 | [diff] [blame] | 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 |
Stephen Hemminger | f8942e0 | 2010-09-08 14:46:36 -0700 | [diff] [blame] | 217 | |
Stephen Hemminger | 2564a14 | 2010-10-29 08:11:12 -0700 | [diff] [blame] | 218 | #define BCM_DEBUG_PRINT(Adapter, Type, SubType, dbg_level, string, args...) \ |
| 219 | do { \ |
| 220 | if (DBG_TYPE_PRINTK == Type) \ |
Stephen Hemminger | c5113e3c | 2010-10-29 21:26:06 -0700 | [diff] [blame] | 221 | pr_info("%s:" string, __func__, ##args); \ |
Stephen Hemminger | 2564a14 | 2010-10-29 08:11:12 -0700 | [diff] [blame] | 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 \ |
Stephen Hemminger | c5113e3c | 2010-10-29 21:26:06 -0700 | [diff] [blame] | 229 | printk(KERN_DEBUG "%s:" string, __func__, ##args); \ |
Stephen Hemminger | 2564a14 | 2010-10-29 08:11:12 -0700 | [diff] [blame] | 230 | } \ |
| 231 | } while (0) |
Stephen Hemminger | f8942e0 | 2010-09-08 14:46:36 -0700 | [diff] [blame] | 232 | |
| 233 | #define BCM_DEBUG_PRINT_BUFFER(Adapter, Type, SubType, dbg_level, buffer, bufferlen) do { \ |
Stephen Hemminger | 2564a14 | 2010-10-29 08:11:12 -0700 | [diff] [blame] | 234 | if (DBG_TYPE_PRINTK == Type || \ |
| 235 | (Adapter && \ |
| 236 | (dbg_level & DBG_LVL_BITMASK) <= Adapter->stDebugState.debug_level && \ |
| 237 | (Type & Adapter->stDebugState.type) && \ |
Stephen Hemminger | c5113e3c | 2010-10-29 21:26:06 -0700 | [diff] [blame] | 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 | } \ |
Stephen Hemminger | 2564a14 | 2010-10-29 08:11:12 -0700 | [diff] [blame] | 243 | } while(0) |
Stephen Hemminger | f8942e0 | 2010-09-08 14:46:36 -0700 | [diff] [blame] | 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 | |