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