1f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger/*
2f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger * Debug.h
3f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger *
4f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger * Dynamic (runtime) debug framework implementation.
5f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger * -kaiwan.
6f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger */
7f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#ifndef _DEBUG_H
8f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define _DEBUG_H
9f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#include <linux/string.h>
10f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define NONE 0xFFFF
11f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
12f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
13f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger//--------------------------------------------------------------------------------
14f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
15f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger/* TYPE and SUBTYPE
16f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger * Define valid TYPE (or category or code-path, however you like to think of it)
17f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger * and SUBTYPE s.
18f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger * Type and SubType are treated as bitmasks.
19f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger */
20f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger/*-----------------BEGIN TYPEs------------------------------------------*/
21f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define DBG_TYPE_INITEXIT		(1 << 0)	// 1
22f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define DBG_TYPE_TX				(1 << 1)	// 2
23f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define DBG_TYPE_RX				(1 << 2)	// 4
24f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define DBG_TYPE_OTHERS			(1 << 3)	// 8
25f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger/*-----------------END TYPEs------------------------------------------*/
26f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define NUMTYPES			4		// careful!
27f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
28f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger/*-----------------BEGIN SUBTYPEs---------------------------------------*/
29f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
30f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger/*-SUBTYPEs for TX :  TYPE is DBG_TYPE_TX -----//
31f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger Transmit.c ,Arp.c, LeakyBucket.c, And Qos.c
32f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger total 17 macros */
33f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger// Transmit.c
34f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define TX 			1
35f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define MP_SEND  	(TX<<0)
36f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define NEXT_SEND   (TX<<1)
37f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define TX_FIFO  	(TX<<2)
38f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define TX_CONTROL 	(TX<<3)
39f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
40f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger// Arp.c
41f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define IP_ADDR  	(TX<<4)
42f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define ARP_REQ  	(TX<<5)
43f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define ARP_RESP 	(TX<<6)
44f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
45f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger// dhcp.c
46f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger//#define DHCP TX
47f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger//#define DHCP_REQ (DHCP<<7)
48f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
49f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger// Leakybucket.c
50f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define TOKEN_COUNTS (TX<<8)
51f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define CHECK_TOKENS (TX<<9)
52f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define TX_PACKETS   (TX<<10)
53f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define TIMER  		 (TX<<11)
54f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
55f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger// Qos.c
56f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define QOS TX
57f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define QUEUE_INDEX (QOS<<12)
58f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define IPV4_DBG 	(QOS<<13)
59f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define IPV6_DBG 	(QOS<<14)
60f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define PRUNE_QUEUE (QOS<<15)
61f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define SEND_QUEUE 	(QOS<<16)
62f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
63f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger//TX_Misc
64f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define TX_OSAL_DBG (TX<<17)
65f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
66f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
67f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger//--SUBTYPEs for ------INIT & EXIT---------------------
68f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger/*------------ TYPE is DBG_TYPE_INITEXIT -----//
69f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen HemmingerDriverEntry.c, bcmfwup.c, ChipDetectTask.c, HaltnReset.c, InterfaceDDR.c */
70f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define MP 1
71f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define DRV_ENTRY 	(MP<<0)
72f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define MP_INIT  	(MP<<1)
73f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define READ_REG 	(MP<<3)
74f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define DISPATCH 	(MP<<2)
75f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define CLAIM_ADAP 	(MP<<4)
76f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define REG_IO_PORT (MP<<5)
77f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define INIT_DISP 	(MP<<6)
78f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define RX_INIT  	(MP<<7)
79f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
80f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
81f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger//-SUBTYPEs for --RX----------------------------------
82f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger//------------RX  :  TYPE is DBG_TYPE_RX -----//
83f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger// Receive.c
84f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define RX 1
85f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define RX_DPC  	(RX<<0)
86f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define RX_CTRL 	(RX<<3)
87f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define RX_DATA 	(RX<<4)
88f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define MP_RETURN 	(RX<<1)
89f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define LINK_MSG 	(RX<<2)
90f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
91f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
92f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger//-SUBTYPEs for ----OTHER ROUTINES------------------
93f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger//------------OTHERS  :  TYPE is DBG_TYPE_OTHER -----//
94f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger// HaltnReset,CheckForHang,PnP,Misc,CmHost
95f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger// total 12 macros
96f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define OTHERS 1
97f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger// ??ISR.C
98f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
99f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define ISR OTHERS
100f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define MP_DPC  (ISR<<0)
101f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
102f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger// HaltnReset.c
103f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define HALT OTHERS
104f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define MP_HALT  		(HALT<<1)
105f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define CHECK_HANG 		(HALT<<2)
106f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define MP_RESET 		(HALT<<3)
107f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define MP_SHUTDOWN 	(HALT<<4)
108f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
109f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger// pnp.c
110f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define PNP OTHERS
111f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define MP_PNP  		(PNP<<5)
112f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
113f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger// Misc.c
114f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define MISC OTHERS
115f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define DUMP_INFO 		(MISC<<6)
116f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define CLASSIFY 		(MISC<<7)
117f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define LINK_UP_MSG 	(MISC<<8)
118f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define CP_CTRL_PKT 	(MISC<<9)
119f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define DUMP_CONTROL 	(MISC<<10)
120f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define LED_DUMP_INFO 	(MISC<<11)
121f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
122f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger// CmHost.c
123f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define CMHOST OTHERS
124f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
125f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
126f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define SERIAL  		(OTHERS<<12)
127f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define IDLE_MODE 		(OTHERS<<13)
128f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
129f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define WRM   			(OTHERS<<14)
130f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define RDM   			(OTHERS<<15)
131f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
132f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger// TODO - put PHS_SEND in Tx PHS_RECEIVE in Rx path ?
133f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define PHS_SEND    	(OTHERS<<16)
134ceeb6fec707e88adc2d8faa65a67df8451d02f63Joe Perches#define PHS_RECEIVE 	(OTHERS<<17)
135f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define PHS_MODULE 	    (OTHERS<<18)
136f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
137f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define INTF_INIT    	(OTHERS<<19)
138f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define INTF_ERR     	(OTHERS<<20)
139f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define INTF_WARN    	(OTHERS<<21)
140f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define INTF_NORM 		(OTHERS<<22)
141f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
142f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define IRP_COMPLETION 	(OTHERS<<23)
143f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define SF_DESCRIPTOR_CNTS (OTHERS<<24)
144f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define PHS_DISPATCH 	(OTHERS << 25)
145f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define OSAL_DBG 		(OTHERS << 26)
146f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define NVM_RW      	(OTHERS << 27)
147f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
148f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define HOST_MIBS   	(OTHERS << 28)
149f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define CONN_MSG    	(CMHOST << 29)
150f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger//#define OTHERS_MISC		(OTHERS << 29)	// ProcSupport.c
151f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger/*-----------------END SUBTYPEs------------------------------------------*/
152f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
153f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
154f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger/* Debug level
155f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger * We have 8 debug levels, in (numerical) increasing order of verbosity.
156f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger * IMP: Currently implementing ONLY DBG_LVL_ALL , i.e. , all debug prints will
157f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger * appear (of course, iff global debug flag is ON and we match the Type and SubType).
158f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger * Finer granularity debug levels are currently not in use, although the feature exists.
159f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger *
160f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger * Another way to say this:
161f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger * All the debug prints currently have 'debug_level' set to DBG_LVL_ALL .
162f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger * You can compile-time change that to any of the below, if you wish to. However, as of now, there's
163f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger * no dynamic facility to have the userspace 'TestApp' set debug_level. Slated for future expansion.
164f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger */
165f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define BCM_ALL			7
166f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define	BCM_LOW			6
167f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define	BCM_PRINT		5
168f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define	BCM_NORMAL		4
169f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define	BCM_MEDIUM		3
170f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define	BCM_SCREAM		2
171f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define	BCM_ERR			1
172f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger/* Not meant for developer in debug prints.
173f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger * To be used to disable all prints by setting the DBG_LVL_CURR to this value */
174f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define	BCM_NONE		0
175f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
176f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger/* The current driver logging level.
177f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger * Everything at this level and (numerically) lower (meaning higher prio)
178f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger * is logged.
179f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger* Replace 'BCM_ALL' in the DBG_LVL_CURR macro with the logging level desired.
180f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger * For eg. to set the logging level to 'errors only' use:
181f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger *	 #define DBG_LVL_CURR	(BCM_ERR)
182f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger */
183f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
184f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define DBG_LVL_CURR	(BCM_ALL)
185f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define DBG_LVL_ALL		BCM_ALL
186f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
187f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger/*---Userspace mapping of Debug State.
188f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger * Delibrately matches that of the Windows driver..
189f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger * The TestApp's ioctl passes this struct to us.
190f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger */
191f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemmingertypedef struct
192f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger{
193f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger	unsigned int Subtype, Type;
194f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger	unsigned int OnOff;
195f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger//	unsigned int debug_level;	 /* future expansion */
196f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger} __attribute__((packed)) USER_BCM_DBG_STATE;
197f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
198f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger//---Kernel-space mapping of Debug State
199f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemmingertypedef struct _S_BCM_DEBUG_STATE {
200f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger	UINT type;
201f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger	/* A bitmap of 32 bits for Subtype per Type.
202f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger	 * Valid indexes in 'subtype' array are *only* 1,2,4 and 8,
203f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger	 * corresponding to valid Type values. Hence we use the 'Type' field
204f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger	 * as the index value, ignoring the array entries 0,3,5,6,7 !
205f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger	 */
206f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger	UINT subtype[(NUMTYPES*2)+1];
207f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger	UINT debug_level;
208f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger} S_BCM_DEBUG_STATE;
209f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger/* Instantiated in the Adapter structure */
210f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger/* We'll reuse the debug level parameter to include a bit (the MSB) to indicate whether or not
211f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger * we want the function's name printed.  */
212f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define DBG_NO_FUNC_PRINT	1 << 31
213f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define DBG_LVL_BITMASK		0xFF
214f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
215f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger//--- Only for direct printk's; "hidden" to API.
216f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define DBG_TYPE_PRINTK		3
217f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
2182564a148d5326f1d36202e497b3dd0a17422c636Stephen Hemminger#define BCM_DEBUG_PRINT(Adapter, Type, SubType, dbg_level, string, args...) \
2192564a148d5326f1d36202e497b3dd0a17422c636Stephen Hemminger	do {								\
2202564a148d5326f1d36202e497b3dd0a17422c636Stephen Hemminger		if (DBG_TYPE_PRINTK == Type)				\
221c5113e3c111b03c8eaf3fb0ef39e33dc25171adcStephen Hemminger			pr_info("%s:" string, __func__, ##args);	\
2222564a148d5326f1d36202e497b3dd0a17422c636Stephen Hemminger		else if (Adapter &&					\
2232564a148d5326f1d36202e497b3dd0a17422c636Stephen Hemminger			 (dbg_level & DBG_LVL_BITMASK) <= Adapter->stDebugState.debug_level && \
2242564a148d5326f1d36202e497b3dd0a17422c636Stephen Hemminger			 (Type & Adapter->stDebugState.type) &&		\
2252564a148d5326f1d36202e497b3dd0a17422c636Stephen Hemminger			 (SubType & Adapter->stDebugState.subtype[Type])) { \
2262564a148d5326f1d36202e497b3dd0a17422c636Stephen Hemminger			if (dbg_level & DBG_NO_FUNC_PRINT)		\
2272564a148d5326f1d36202e497b3dd0a17422c636Stephen Hemminger				printk(KERN_DEBUG string, ##args);	\
2282564a148d5326f1d36202e497b3dd0a17422c636Stephen Hemminger			else						\
229c5113e3c111b03c8eaf3fb0ef39e33dc25171adcStephen Hemminger				printk(KERN_DEBUG "%s:" string, __func__, ##args);	\
2302564a148d5326f1d36202e497b3dd0a17422c636Stephen Hemminger		}							\
231f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger	} while (0)
232f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
2332564a148d5326f1d36202e497b3dd0a17422c636Stephen Hemminger#define BCM_DEBUG_PRINT_BUFFER(Adapter, Type, SubType, dbg_level,  buffer, bufferlen) do { \
2342564a148d5326f1d36202e497b3dd0a17422c636Stephen Hemminger	if (DBG_TYPE_PRINTK == Type ||					\
2352564a148d5326f1d36202e497b3dd0a17422c636Stephen Hemminger	    (Adapter &&							\
2362564a148d5326f1d36202e497b3dd0a17422c636Stephen Hemminger	     (dbg_level & DBG_LVL_BITMASK) <= Adapter->stDebugState.debug_level  && \
2372564a148d5326f1d36202e497b3dd0a17422c636Stephen Hemminger	     (Type & Adapter->stDebugState.type) &&			\
238c5113e3c111b03c8eaf3fb0ef39e33dc25171adcStephen Hemminger	     (SubType & Adapter->stDebugState.subtype[Type]))) {	\
239c5113e3c111b03c8eaf3fb0ef39e33dc25171adcStephen Hemminger		printk(KERN_DEBUG "%s:\n", __func__);			\
240c5113e3c111b03c8eaf3fb0ef39e33dc25171adcStephen Hemminger		print_hex_dump(KERN_DEBUG, " ", DUMP_PREFIX_OFFSET,	\
241c5113e3c111b03c8eaf3fb0ef39e33dc25171adcStephen Hemminger			       16, 1, buffer, bufferlen, false);	\
242c5113e3c111b03c8eaf3fb0ef39e33dc25171adcStephen Hemminger	}								\
2432564a148d5326f1d36202e497b3dd0a17422c636Stephen Hemminger} while(0)
2442564a148d5326f1d36202e497b3dd0a17422c636Stephen Hemminger
245f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
246f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#define BCM_SHOW_DEBUG_BITMAP(Adapter)	do { \
247f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger	int i;									\
248f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger	for (i=0; i<(NUMTYPES*2)+1; i++) {		\
249f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger		if ((i == 1) || (i == 2) || (i == 4) || (i == 8)) {		\
250f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger		/* CAUTION! Forcefully turn on ALL debug paths and subpaths!	\
251f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger		Adapter->stDebugState.subtype[i] = 0xffffffff;	*/ \
252f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger		BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "subtype[%d] = 0x%08x\n", 	\
253f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger		i, Adapter->stDebugState.subtype[i]);	\
254f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger		}	\
255f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger	}		\
256f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger} while (0)
257f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
258f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger#endif
259f8942e07a3db9d82e8fb11d3d494876b8bae9ff9Stephen Hemminger
260