1  /*
2   * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved.
3   *
4   * Permission to use, copy, modify, and/or distribute this software for
5   * any purpose with or without fee is hereby granted, provided that the
6   * above copyright notice and this permission notice appear in all
7   * copies.
8   *
9   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10   * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11   * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12   * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13   * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14   * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15   * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16   * PERFORMANCE OF THIS SOFTWARE.
17   */
18  
19  #ifndef _A_DEBUG_H_
20  #define _A_DEBUG_H_
21  
22  #ifdef __cplusplus
23  extern "C" {
24  #endif /* __cplusplus */
25  
26  #include <a_types.h>
27  #include "osapi_linux.h"
28  
29  /* standard debug print masks bits 0..7 */
30  #define ATH_DEBUG_ERR   (1 << 0)        /* errors */
31  #define ATH_DEBUG_WARN  (1 << 1)        /* warnings */
32  #define ATH_DEBUG_INFO  (1 << 2)        /* informational (module startup info) */
33  #define ATH_DEBUG_TRC   (1 << 3)        /* generic function call tracing */
34  #define ATH_DEBUG_RSVD1 (1 << 4)
35  #define ATH_DEBUG_RSVD2 (1 << 5)
36  #define ATH_DEBUG_RSVD3 (1 << 6)
37  #define ATH_DEBUG_RSVD4 (1 << 7)
38  
39  #define ATH_DEBUG_MASK_DEFAULTS  (ATH_DEBUG_ERR | ATH_DEBUG_WARN)
40  #define ATH_DEBUG_ANY  0xFFFF
41  
42  /* other aliases used throughout */
43  #define ATH_DEBUG_ERROR   ATH_DEBUG_ERR
44  #define ATH_LOG_ERR       ATH_DEBUG_ERR
45  #define ATH_LOG_INF       ATH_DEBUG_INFO
46  #define ATH_LOG_TRC       ATH_DEBUG_TRC
47  #define ATH_DEBUG_TRACE   ATH_DEBUG_TRC
48  #define ATH_DEBUG_INIT    ATH_DEBUG_INFO
49  
50  /* bits 8..31 are module-specific masks */
51  #define ATH_DEBUG_MODULE_MASK_SHIFT   8
52  
53  /* macro to make a module-specific masks */
54  #define ATH_DEBUG_MAKE_MODULE_MASK(index)  (1 << (ATH_DEBUG_MODULE_MASK_SHIFT + (index)))
55  
56  void debug_dump_bytes(A_UCHAR *buffer, A_UINT16 length,
57  		      char *pDescription);
58  
59  /* Debug support on a per-module basis
60   *
61   * Usage:
62   *
63   *   Each module can utilize it's own debug mask variable.  A set of commonly used
64   *   masks are provided (ERRORS, WARNINGS, TRACE etc..).  It is up to each module
65   *   to define module-specific masks using the macros above.
66   *
67   *   Each module defines a single debug mask variable debug_XXX where the "name" of the module is
68   *   common to all C-files within that module.  This requires every C-file that includes a_debug.h
69   *   to define the module name in that file.
70   *
71   *   Example:
72   *
73   *   #define ATH_MODULE_NAME htc
74   *   #include "a_debug.h"
75   *
76   *   This will define a debug mask structure called debug_htc and all debug macros will reference this
77   *   variable.
78   *
79   *   A module can define module-specific bit masks using the ATH_DEBUG_MAKE_MODULE_MASK() macro:
80   *
81   *      #define ATH_DEBUG_MY_MASK1  ATH_DEBUG_MAKE_MODULE_MASK(0)
82   *      #define ATH_DEBUG_MY_MASK2  ATH_DEBUG_MAKE_MODULE_MASK(1)
83   *
84   *   The instantiation of the debug structure should be made by the module.  When a module is
85   *   instantiated, the module can set a description string, a default mask and an array of description
86   *   entries containing information on each module-defined debug mask.
87   *   NOTE: The instantiation is statically allocated, only one instance can exist per module.
88   *
89   *   Example:
90   *
91   *
92   *   #define ATH_DEBUG_BMI  ATH_DEBUG_MAKE_MODULE_MASK(0)
93   *
94   *   #ifdef DEBUG
95   *   static ATH_DEBUG_MASK_DESCRIPTION bmi_debug_desc[] = {
96   *       { ATH_DEBUG_BMI , "BMI Tracing"},   <== description of the module specific mask
97   *   };
98   *
99   *   ATH_DEBUG_INSTANTIATE_MODULE_VAR(bmi,
100   *                                    "bmi"  <== module name
101   *                                    "Boot Manager Interface",  <== description of module
102   *                                    ATH_DEBUG_MASK_DEFAULTS,          <== defaults
103   *                                    ATH_DEBUG_DESCRIPTION_COUNT(bmi_debug_desc),
104   *                                    bmi_debug_desc);
105   *
106   *   #endif
107   *
108   *  A module can optionally register it's debug module information in order for other tools to change the
109   *  bit mask at runtime.  A module can call  A_REGISTER_MODULE_DEBUG_INFO() in it's module
110   *  init code.  This macro can be called multiple times without consequence.  The debug info maintains
111   *  state to indicate whether the information was previously registered.
112   *
113   * */
114  
115  #define ATH_DEBUG_MAX_MASK_DESC_LENGTH   32
116  #define ATH_DEBUG_MAX_MOD_DESC_LENGTH    64
117  
118  typedef struct {
119  	A_UINT32 Mask;
120  	A_CHAR Description[ATH_DEBUG_MAX_MASK_DESC_LENGTH];
121  } ATH_DEBUG_MASK_DESCRIPTION;
122  
123  #define ATH_DEBUG_INFO_FLAGS_REGISTERED (1 << 0)
124  
125  typedef struct _ATH_DEBUG_MODULE_DBG_INFO {
126  	struct _ATH_DEBUG_MODULE_DBG_INFO *pNext;
127  	A_CHAR ModuleName[16];
128  	A_CHAR ModuleDescription[ATH_DEBUG_MAX_MOD_DESC_LENGTH];
129  	A_UINT32 Flags;
130  	A_UINT32 CurrentMask;
131  	int MaxDescriptions;
132  	ATH_DEBUG_MASK_DESCRIPTION *pMaskDescriptions;          /* pointer to array of descriptions */
133  } ATH_DEBUG_MODULE_DBG_INFO;
134  
135  #define ATH_DEBUG_DESCRIPTION_COUNT(d)  (int)((sizeof((d))) / (sizeof(ATH_DEBUG_MASK_DESCRIPTION)))
136  
137  #define GET_ATH_MODULE_DEBUG_VAR_NAME(s) _XGET_ATH_MODULE_NAME_DEBUG_(s)
138  #define GET_ATH_MODULE_DEBUG_VAR_MASK(s) _XGET_ATH_MODULE_NAME_DEBUG_(s).CurrentMask
139  #define _XGET_ATH_MODULE_NAME_DEBUG_(s) debug_ ## s
140  
141  #ifdef WLAN_DEBUG
142  
143  /* for source files that will instantiate the debug variables */
144  #define ATH_DEBUG_INSTANTIATE_MODULE_VAR(s, name, moddesc, initmask, count, descriptions) \
145  	ATH_DEBUG_MODULE_DBG_INFO GET_ATH_MODULE_DEBUG_VAR_NAME(s) = \
146  	{NULL, (name), (moddesc), 0, (initmask), (count), (descriptions)}
147  
148  #ifdef ATH_MODULE_NAME
149  extern ATH_DEBUG_MODULE_DBG_INFO
150  GET_ATH_MODULE_DEBUG_VAR_NAME(ATH_MODULE_NAME);
151  #define AR_DEBUG_LVL_CHECK(lvl) (GET_ATH_MODULE_DEBUG_VAR_MASK(ATH_MODULE_NAME) & (lvl))
152  #endif /* ATH_MODULE_NAME */
153  
154  #define ATH_DEBUG_SET_DEBUG_MASK(s, lvl) GET_ATH_MODULE_DEBUG_VAR_MASK(s) = (lvl)
155  
156  #define ATH_DEBUG_DECLARE_EXTERN(s) \
157  	extern ATH_DEBUG_MODULE_DBG_INFO GET_ATH_MODULE_DEBUG_VAR_NAME(s)
158  
159  #define AR_DEBUG_PRINTBUF(buffer, length, desc) debug_dump_bytes(buffer, length, desc)
160  
161  #define AR_DEBUG_ASSERT A_ASSERT
162  
163  void a_dump_module_debug_info(ATH_DEBUG_MODULE_DBG_INFO *pInfo);
164  void a_register_module_debug_info(ATH_DEBUG_MODULE_DBG_INFO *pInfo);
165  #ifdef A_SIMOS_DEVHOST
166  #define A_DUMP_MODULE_DEBUG_INFO(s) a_dump_module_debug_info(&(GET_ATH_MODULE_DEBUG_VAR_NAME(s)))
167  #define A_REGISTER_MODULE_DEBUG_INFO(s) a_register_module_debug_info(&(GET_ATH_MODULE_DEBUG_VAR_NAME(s)))
168  #else
169  #define A_DUMP_MODULE_DEBUG_INFO(s)
170  #define A_REGISTER_MODULE_DEBUG_INFO(s)
171  #endif
172  
173  #else                           /* !DEBUG */
174  /* NON DEBUG */
175  #define ATH_DEBUG_INSTANTIATE_MODULE_VAR(s, name, moddesc, initmask, count, descriptions)
176  #define AR_DEBUG_LVL_CHECK(lvl) 0
177  #define AR_DEBUG_PRINTBUF(buffer, length, desc)
178  #define AR_DEBUG_ASSERT(test)
179  #define ATH_DEBUG_DECLARE_EXTERN(s)
180  #define ATH_DEBUG_SET_DEBUG_MASK(s, lvl)
181  #define A_DUMP_MODULE_DEBUG_INFO(s)
182  #define A_REGISTER_MODULE_DEBUG_INFO(s)
183  
184  #endif
185  
186  #if defined(__linux__) && !defined(LINUX_EMULATION)
187  #include "debug_linux.h"
188  #endif
189  
190  #ifdef __cplusplus
191  }
192  #endif /* __cplusplus */
193  #endif
194