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 // 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)
134 #define PHS_RECEIVE 	(OTHERS<<17)
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
217 
218 #define BCM_DEBUG_PRINT(Adapter, Type, SubType, dbg_level, string, args...) \
219 	do {								\
220 		if (DBG_TYPE_PRINTK == Type)				\
221 			pr_info("%s:" string, __func__, ##args);	\
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						\
229 				printk(KERN_DEBUG "%s:" string, __func__, ##args);	\
230 		}							\
231 	} while (0)
232 
233 #define BCM_DEBUG_PRINT_BUFFER(Adapter, Type, SubType, dbg_level,  buffer, bufferlen) do { \
234 	if (DBG_TYPE_PRINTK == Type ||					\
235 	    (Adapter &&							\
236 	     (dbg_level & DBG_LVL_BITMASK) <= Adapter->stDebugState.debug_level  && \
237 	     (Type & Adapter->stDebugState.type) &&			\
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 	}								\
243 } while(0)
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 
260