| /* | |
| * Debug.h | |
| * | |
| * Dynamic (runtime) debug framework implementation. | |
| * -kaiwan. | |
| */ | |
| #ifndef _DEBUG_H | |
| #define _DEBUG_H | |
| #include <linux/string.h> | |
| #define NONE 0xFFFF | |
| /* TYPE and SUBTYPE | |
| * Define valid TYPE (or category or code-path, however you like to think of it) | |
| * and SUBTYPE s. | |
| * Type and SubType are treated as bitmasks. | |
| */ | |
| #define DBG_TYPE_INITEXIT (1 << 0) /* 1 */ | |
| #define DBG_TYPE_TX (1 << 1) /* 2 */ | |
| #define DBG_TYPE_RX (1 << 2) /* 4 */ | |
| #define DBG_TYPE_OTHERS (1 << 3) /* 8 */ | |
| #define NUMTYPES 4 | |
| /* -SUBTYPEs for TX : TYPE is DBG_TYPE_TX -----// | |
| * Transmit.c ,Arp.c, LeakyBucket.c, And Qos.c | |
| * total 17 macros | |
| */ | |
| /* Transmit.c */ | |
| #define TX 1 | |
| #define MP_SEND (TX << 0) | |
| #define NEXT_SEND (TX << 1) | |
| #define TX_FIFO (TX << 2) | |
| #define TX_CONTROL (TX << 3) | |
| /* Arp.c */ | |
| #define IP_ADDR (TX << 4) | |
| #define ARP_REQ (TX << 5) | |
| #define ARP_RESP (TX << 6) | |
| /* Leakybucket.c */ | |
| #define TOKEN_COUNTS (TX << 8) | |
| #define CHECK_TOKENS (TX << 9) | |
| #define TX_PACKETS (TX << 10) | |
| #define TIMER (TX << 11) | |
| /* Qos.c */ | |
| #define QOS TX | |
| #define QUEUE_INDEX (QOS << 12) | |
| #define IPV4_DBG (QOS << 13) | |
| #define IPV6_DBG (QOS << 14) | |
| #define PRUNE_QUEUE (QOS << 15) | |
| #define SEND_QUEUE (QOS << 16) | |
| /* TX_Misc */ | |
| #define TX_OSAL_DBG (TX << 17) | |
| /* --SUBTYPEs for ------INIT & EXIT--------------------- | |
| * ------------ TYPE is DBG_TYPE_INITEXIT -----// | |
| * DriverEntry.c, bcmfwup.c, ChipDetectTask.c, HaltnReset.c, InterfaceDDR.c | |
| */ | |
| #define MP 1 | |
| #define DRV_ENTRY (MP << 0) | |
| #define MP_INIT (MP << 1) | |
| #define READ_REG (MP << 3) | |
| #define DISPATCH (MP << 2) | |
| #define CLAIM_ADAP (MP << 4) | |
| #define REG_IO_PORT (MP << 5) | |
| #define INIT_DISP (MP << 6) | |
| #define RX_INIT (MP << 7) | |
| /* -SUBTYPEs for --RX---------------------------------- | |
| * ------------RX : TYPE is DBG_TYPE_RX -----// | |
| * Receive.c | |
| */ | |
| #define RX 1 | |
| #define RX_DPC (RX << 0) | |
| #define RX_CTRL (RX << 3) | |
| #define RX_DATA (RX << 4) | |
| #define MP_RETURN (RX << 1) | |
| #define LINK_MSG (RX << 2) | |
| /* -SUBTYPEs for ----OTHER ROUTINES------------------ | |
| * ------------OTHERS : TYPE is DBG_TYPE_OTHER -----// | |
| * HaltnReset,CheckForHang,PnP,Misc,CmHost | |
| * total 12 macros | |
| */ | |
| #define OTHERS 1 | |
| #define ISR OTHERS | |
| #define MP_DPC (ISR << 0) | |
| /* HaltnReset.c */ | |
| #define HALT OTHERS | |
| #define MP_HALT (HALT << 1) | |
| #define CHECK_HANG (HALT << 2) | |
| #define MP_RESET (HALT << 3) | |
| #define MP_SHUTDOWN (HALT << 4) | |
| /* pnp.c */ | |
| #define PNP OTHERS | |
| #define MP_PNP (PNP << 5) | |
| /* Misc.c */ | |
| #define MISC OTHERS | |
| #define DUMP_INFO (MISC << 6) | |
| #define CLASSIFY (MISC << 7) | |
| #define LINK_UP_MSG (MISC << 8) | |
| #define CP_CTRL_PKT (MISC << 9) | |
| #define DUMP_CONTROL (MISC << 10) | |
| #define LED_DUMP_INFO (MISC << 11) | |
| /* CmHost.c */ | |
| #define CMHOST OTHERS | |
| #define SERIAL (OTHERS << 12) | |
| #define IDLE_MODE (OTHERS << 13) | |
| #define WRM (OTHERS << 14) | |
| #define RDM (OTHERS << 15) | |
| /* TODO - put PHS_SEND in Tx PHS_RECEIVE in Rx path ? */ | |
| #define PHS_SEND (OTHERS << 16) | |
| #define PHS_RECEIVE (OTHERS << 17) | |
| #define PHS_MODULE (OTHERS << 18) | |
| #define INTF_INIT (OTHERS << 19) | |
| #define INTF_ERR (OTHERS << 20) | |
| #define INTF_WARN (OTHERS << 21) | |
| #define INTF_NORM (OTHERS << 22) | |
| #define IRP_COMPLETION (OTHERS << 23) | |
| #define SF_DESCRIPTOR_CNTS (OTHERS << 24) | |
| #define PHS_DISPATCH (OTHERS << 25) | |
| #define OSAL_DBG (OTHERS << 26) | |
| #define NVM_RW (OTHERS << 27) | |
| #define HOST_MIBS (OTHERS << 28) | |
| #define CONN_MSG (CMHOST << 29) | |
| /* Debug level | |
| * We have 8 debug levels, in (numerical) increasing order of verbosity. | |
| * IMP: Currently implementing ONLY DBG_LVL_ALL , i.e. , all debug prints will | |
| * appear (of course, iff global debug flag is ON and we match the Type and SubType). | |
| * Finer granularity debug levels are currently not in use, although the feature exists. | |
| * | |
| * Another way to say this: | |
| * All the debug prints currently have 'debug_level' set to DBG_LVL_ALL . | |
| * You can compile-time change that to any of the below, if you wish to. However, as of now, there's | |
| * no dynamic facility to have the userspace 'TestApp' set debug_level. Slated for future expansion. | |
| */ | |
| #define BCM_ALL 7 | |
| #define BCM_LOW 6 | |
| #define BCM_PRINT 5 | |
| #define BCM_NORMAL 4 | |
| #define BCM_MEDIUM 3 | |
| #define BCM_SCREAM 2 | |
| #define BCM_ERR 1 | |
| /* Not meant for developer in debug prints. | |
| * To be used to disable all prints by setting the DBG_LVL_CURR to this value | |
| */ | |
| #define BCM_NONE 0 | |
| /* The current driver logging level. | |
| * Everything at this level and (numerically) lower (meaning higher prio) | |
| * is logged. | |
| * Replace 'BCM_ALL' in the DBG_LVL_CURR macro with the logging level desired. | |
| * For eg. to set the logging level to 'errors only' use: | |
| * #define DBG_LVL_CURR (BCM_ERR) | |
| */ | |
| #define DBG_LVL_CURR (BCM_ALL) | |
| #define DBG_LVL_ALL BCM_ALL | |
| /* ---Userspace mapping of Debug State. | |
| * Delibrately matches that of the Windows driver.. | |
| * The TestApp's ioctl passes this struct to us. | |
| */ | |
| struct bcm_user_debug_state { | |
| unsigned int Subtype, Type; | |
| unsigned int OnOff; | |
| /* unsigned int debug_level; future expansion */ | |
| } __packed; | |
| /* ---Kernel-space mapping of Debug State */ | |
| struct bcm_debug_state { | |
| unsigned int type; | |
| /* A bitmap of 32 bits for Subtype per Type. | |
| * Valid indexes in 'subtype' array are *only* 1,2,4 and 8, | |
| * corresponding to valid Type values. Hence we use the 'Type' field | |
| * as the index value, ignoring the array entries 0,3,5,6,7 ! | |
| */ | |
| unsigned int subtype[(NUMTYPES*2)+1]; | |
| unsigned int debug_level; | |
| }; | |
| /* Instantiated in the Adapter structure | |
| * We'll reuse the debug level parameter to include a bit (the MSB) to indicate whether or not | |
| * we want the function's name printed. | |
| */ | |
| #define DBG_NO_FUNC_PRINT (1 << 31) | |
| #define DBG_LVL_BITMASK 0xFF | |
| /* --- Only for direct printk's; "hidden" to API. */ | |
| #define DBG_TYPE_PRINTK 3 | |
| #define BCM_DEBUG_PRINT(Adapter, Type, SubType, dbg_level, string, args...) \ | |
| do { \ | |
| if (DBG_TYPE_PRINTK == Type) \ | |
| pr_info("%s:" string, __func__, ##args); \ | |
| else if (Adapter && \ | |
| (dbg_level & DBG_LVL_BITMASK) <= Adapter->stDebugState.debug_level && \ | |
| (Type & Adapter->stDebugState.type) && \ | |
| (SubType & Adapter->stDebugState.subtype[Type])) { \ | |
| if (dbg_level & DBG_NO_FUNC_PRINT) \ | |
| pr_debug("%s:\n", string); \ | |
| else \ | |
| pr_debug("%s:\n" string, __func__, ##args); \ | |
| } \ | |
| } while (0) | |
| #define BCM_DEBUG_PRINT_BUFFER(Adapter, Type, SubType, dbg_level, buffer, bufferlen) \ | |
| do { \ | |
| if (DBG_TYPE_PRINTK == Type || \ | |
| (Adapter && \ | |
| (dbg_level & DBG_LVL_BITMASK) <= Adapter->stDebugState.debug_level && \ | |
| (Type & Adapter->stDebugState.type) && \ | |
| (SubType & Adapter->stDebugState.subtype[Type]))) { \ | |
| pr_debug("%s:\n", __func__); \ | |
| print_hex_dump(KERN_DEBUG, " ", DUMP_PREFIX_OFFSET, \ | |
| 16, 1, buffer, bufferlen, false); \ | |
| } \ | |
| } while (0) | |
| #define BCM_SHOW_DEBUG_BITMAP(Adapter) do { \ | |
| int i; \ | |
| for (i = 0; i < (NUMTYPES * 2) + 1; i++) { \ | |
| if ((i == 1) || (i == 2) || (i == 4) || (i == 8)) { \ | |
| /* CAUTION! Forcefully turn on ALL debug paths and subpaths! \ | |
| * Adapter->stDebugState.subtype[i] = 0xffffffff; \ | |
| */ \ | |
| BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "subtype[%d] = 0x%08x\n", \ | |
| i, Adapter->stDebugState.subtype[i]); \ | |
| } \ | |
| } \ | |
| } while (0) | |
| #endif |