at v3.18 242 lines 7.2 kB view raw
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 */ 174struct 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 */ 181struct 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