|  | /* | 
|  | * 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. | 
|  | */ | 
|  | /*-----------------BEGIN TYPEs------------------------------------------*/ | 
|  | #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 | 
|  | /*-----------------END TYPEs------------------------------------------*/ | 
|  | #define NUMTYPES			4		// careful! | 
|  |  | 
|  | /*-----------------BEGIN SUBTYPEs---------------------------------------*/ | 
|  |  | 
|  | /*-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) | 
|  |  | 
|  | // dhcp.c | 
|  | //#define DHCP TX | 
|  | //#define DHCP_REQ (DHCP<<7) | 
|  |  | 
|  | // 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 | 
|  | // ??ISR.C | 
|  |  | 
|  | #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) | 
|  | //#define OTHERS_MISC		(OTHERS << 29)	// ProcSupport.c | 
|  | /*-----------------END SUBTYPEs------------------------------------------*/ | 
|  |  | 
|  |  | 
|  | /* 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. | 
|  | */ | 
|  | typedef struct | 
|  | { | 
|  | unsigned int Subtype, Type; | 
|  | unsigned int OnOff; | 
|  | //	unsigned int debug_level;	 /* future expansion */ | 
|  | } __attribute__((packed)) USER_BCM_DBG_STATE; | 
|  |  | 
|  | //---Kernel-space mapping of Debug State | 
|  | typedef struct _S_BCM_DEBUG_STATE { | 
|  | UINT 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 ! | 
|  | */ | 
|  | UINT subtype[(NUMTYPES*2)+1]; | 
|  | UINT debug_level; | 
|  | } S_BCM_DEBUG_STATE; | 
|  | /* 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)		\ | 
|  | printk(KERN_DEBUG string, ##args);	\ | 
|  | else						\ | 
|  | printk(KERN_DEBUG "%s:" 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]))) {	\ | 
|  | printk(KERN_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 | 
|  |  |