]>
Commit | Line | Data |
---|---|---|
f8942e07 SH |
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 | ||
f8942e07 SH |
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 | */ | |
744467ea KM |
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 */ | |
4f2e1477 KM |
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) | |
f8942e07 | 33 | |
744467ea | 34 | /* Arp.c */ |
4f2e1477 KM |
35 | #define IP_ADDR (TX << 4) |
36 | #define ARP_REQ (TX << 5) | |
37 | #define ARP_RESP (TX << 6) | |
f8942e07 | 38 | |
744467ea | 39 | /* Leakybucket.c */ |
4f2e1477 KM |
40 | #define TOKEN_COUNTS (TX << 8) |
41 | #define CHECK_TOKENS (TX << 9) | |
42 | #define TX_PACKETS (TX << 10) | |
43 | #define TIMER (TX << 11) | |
f8942e07 | 44 | |
744467ea | 45 | /* Qos.c */ |
4f2e1477 KM |
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) | |
f8942e07 | 52 | |
744467ea | 53 | /* TX_Misc */ |
4f2e1477 | 54 | #define TX_OSAL_DBG (TX << 17) |
f8942e07 | 55 | |
744467ea KM |
56 | /* --SUBTYPEs for ------INIT & EXIT--------------------- |
57 | * ------------ TYPE is DBG_TYPE_INITEXIT -----// | |
58 | * DriverEntry.c, bcmfwup.c, ChipDetectTask.c, HaltnReset.c, InterfaceDDR.c | |
59 | */ | |
4f2e1477 KM |
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) | |
f8942e07 | 69 | |
744467ea KM |
70 | /* -SUBTYPEs for --RX---------------------------------- |
71 | * ------------RX : TYPE is DBG_TYPE_RX -----// | |
72 | * Receive.c | |
73 | */ | |
4f2e1477 KM |
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) | |
f8942e07 | 80 | |
744467ea KM |
81 | /* -SUBTYPEs for ----OTHER ROUTINES------------------ |
82 | * ------------OTHERS : TYPE is DBG_TYPE_OTHER -----// | |
83 | * HaltnReset,CheckForHang,PnP,Misc,CmHost | |
84 | * total 12 macros | |
85 | */ | |
4f2e1477 | 86 | #define OTHERS 1 |
4f2e1477 KM |
87 | #define ISR OTHERS |
88 | #define MP_DPC (ISR << 0) | |
f8942e07 | 89 | |
744467ea | 90 | /* HaltnReset.c */ |
4f2e1477 KM |
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) | |
f8942e07 | 96 | |
744467ea | 97 | /* pnp.c */ |
4f2e1477 KM |
98 | #define PNP OTHERS |
99 | #define MP_PNP (PNP << 5) | |
f8942e07 | 100 | |
744467ea | 101 | /* Misc.c */ |
4f2e1477 KM |
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) | |
f8942e07 | 109 | |
744467ea | 110 | /* CmHost.c */ |
4f2e1477 KM |
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) | |
f8942e07 | 116 | |
744467ea | 117 | /* TODO - put PHS_SEND in Tx PHS_RECEIVE in Rx path ? */ |
4f2e1477 KM |
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) | |
f8942e07 | 135 | |
f8942e07 SH |
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 | */ | |
4f2e1477 KM |
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 | |
f8942e07 | 154 | /* Not meant for developer in debug prints. |
744467ea KM |
155 | * To be used to disable all prints by setting the DBG_LVL_CURR to this value |
156 | */ | |
4f2e1477 | 157 | #define BCM_NONE 0 |
f8942e07 SH |
158 | |
159 | /* The current driver logging level. | |
160 | * Everything at this level and (numerically) lower (meaning higher prio) | |
161 | * is logged. | |
744467ea | 162 | * Replace 'BCM_ALL' in the DBG_LVL_CURR macro with the logging level desired. |
f8942e07 SH |
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) | |
4f2e1477 | 168 | #define DBG_LVL_ALL BCM_ALL |
f8942e07 | 169 | |
744467ea | 170 | /* ---Userspace mapping of Debug State. |
f8942e07 SH |
171 | * Delibrately matches that of the Windows driver.. |
172 | * The TestApp's ioctl passes this struct to us. | |
173 | */ | |
a0497289 | 174 | struct bcm_user_debug_state { |
f8942e07 SH |
175 | unsigned int Subtype, Type; |
176 | unsigned int OnOff; | |
744467ea | 177 | /* unsigned int debug_level; future expansion */ |
a0497289 | 178 | } __packed; |
f8942e07 | 179 | |
744467ea | 180 | /* ---Kernel-space mapping of Debug State */ |
4b388a9e | 181 | struct bcm_debug_state { |
b2a089b7 | 182 | unsigned int type; |
f8942e07 SH |
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 | */ | |
b2a089b7 KM |
188 | unsigned int subtype[(NUMTYPES*2)+1]; |
189 | unsigned int debug_level; | |
4b388a9e | 190 | }; |
744467ea KM |
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 | */ | |
79a46913 | 195 | #define DBG_NO_FUNC_PRINT (1 << 31) |
f8942e07 SH |
196 | #define DBG_LVL_BITMASK 0xFF |
197 | ||
744467ea | 198 | /* --- Only for direct printk's; "hidden" to API. */ |
f8942e07 | 199 | #define DBG_TYPE_PRINTK 3 |
f8942e07 | 200 | |
2564a148 SH |
201 | #define BCM_DEBUG_PRINT(Adapter, Type, SubType, dbg_level, string, args...) \ |
202 | do { \ | |
203 | if (DBG_TYPE_PRINTK == Type) \ | |
c5113e3c | 204 | pr_info("%s:" string, __func__, ##args); \ |
2564a148 | 205 | else if (Adapter && \ |
4f2e1477 KM |
206 | (dbg_level & DBG_LVL_BITMASK) <= Adapter->stDebugState.debug_level && \ |
207 | (Type & Adapter->stDebugState.type) && \ | |
208 | (SubType & Adapter->stDebugState.subtype[Type])) { \ | |
2564a148 | 209 | if (dbg_level & DBG_NO_FUNC_PRINT) \ |
ee39b787 | 210 | pr_debug("%s:\n", string); \ |
2564a148 | 211 | else \ |
ee39b787 | 212 | pr_debug("%s:\n" string, __func__, ##args); \ |
4f2e1477 KM |
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]))) { \ | |
ee39b787 | 223 | pr_debug("%s:\n", __func__); \ |
4f2e1477 KM |
224 | print_hex_dump(KERN_DEBUG, " ", DUMP_PREFIX_OFFSET, \ |
225 | 16, 1, buffer, bufferlen, false); \ | |
2564a148 | 226 | } \ |
f8942e07 SH |
227 | } while (0) |
228 | ||
4f2e1477 KM |
229 | #define BCM_SHOW_DEBUG_BITMAP(Adapter) do { \ |
230 | int i; \ | |
231 | for (i = 0; i < (NUMTYPES * 2) + 1; i++) { \ | |
f8942e07 | 232 | if ((i == 1) || (i == 2) || (i == 4) || (i == 8)) { \ |
4f2e1477 | 233 | /* CAUTION! Forcefully turn on ALL debug paths and subpaths! \ |
744467ea KM |
234 | * Adapter->stDebugState.subtype[i] = 0xffffffff; \ |
235 | */ \ | |
4f2e1477 KM |
236 | BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "subtype[%d] = 0x%08x\n", \ |
237 | i, Adapter->stDebugState.subtype[i]); \ | |
f8942e07 SH |
238 | } \ |
239 | } \ | |
240 | } while (0) | |
241 | ||
242 | #endif |