PM / sleep: Asynchronous threads for suspend_noirq
[linux/fpc-iii.git] / drivers / staging / bcm / Debug.h
blob7b331215c1acc985c2cbc4fc6e603fe7474e2bdc
1 /*
2 * Debug.h
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
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.
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
23 /* -SUBTYPEs for TX : TYPE is DBG_TYPE_TX -----//
24 * Transmit.c ,Arp.c, LeakyBucket.c, And Qos.c
25 * total 17 macros
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)
34 /* Arp.c */
35 #define IP_ADDR (TX << 4)
36 #define ARP_REQ (TX << 5)
37 #define ARP_RESP (TX << 6)
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)
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)
53 /* TX_Misc */
54 #define TX_OSAL_DBG (TX << 17)
56 /* --SUBTYPEs for ------INIT & EXIT---------------------
57 * ------------ TYPE is DBG_TYPE_INITEXIT -----//
58 * DriverEntry.c, bcmfwup.c, ChipDetectTask.c, HaltnReset.c, InterfaceDDR.c
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)
70 /* -SUBTYPEs for --RX----------------------------------
71 * ------------RX : TYPE is DBG_TYPE_RX -----//
72 * Receive.c
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)
81 /* -SUBTYPEs for ----OTHER ROUTINES------------------
82 * ------------OTHERS : TYPE is DBG_TYPE_OTHER -----//
83 * HaltnReset,CheckForHang,PnP,Misc,CmHost
84 * total 12 macros
86 #define OTHERS 1
87 #define ISR OTHERS
88 #define MP_DPC (ISR << 0)
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)
97 /* pnp.c */
98 #define PNP OTHERS
99 #define MP_PNP (PNP << 5)
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)
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)
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)
122 #define INTF_INIT (OTHERS << 19)
123 #define INTF_ERR (OTHERS << 20)
124 #define INTF_WARN (OTHERS << 21)
125 #define INTF_NORM (OTHERS << 22)
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)
133 #define HOST_MIBS (OTHERS << 28)
134 #define CONN_MSG (CMHOST << 29)
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.
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.
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
157 #define BCM_NONE 0
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)
167 #define DBG_LVL_CURR (BCM_ALL)
168 #define DBG_LVL_ALL BCM_ALL
170 /* ---Userspace mapping of Debug State.
171 * Delibrately matches that of the Windows driver..
172 * The TestApp's ioctl passes this struct to us.
174 struct bcm_user_debug_state {
175 unsigned int Subtype, Type;
176 unsigned int OnOff;
177 /* unsigned int debug_level; future expansion */
178 } __packed;
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 !
188 unsigned int subtype[(NUMTYPES*2)+1];
189 unsigned int debug_level;
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.
195 #define DBG_NO_FUNC_PRINT (1 << 31)
196 #define DBG_LVL_BITMASK 0xFF
198 /* --- Only for direct printk's; "hidden" to API. */
199 #define DBG_TYPE_PRINTK 3
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); \
214 } while (0)
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); \
227 } while (0)
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]); \
240 } while (0)
242 #endif