Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.9.
  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