Loading...
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 */
174struct 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 */
181struct 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
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 -----//
69DriverEntry.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 */
191typedef 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
199typedef 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