• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  */
174 struct 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 */
181 struct 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
243