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