1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Debug/trace/assert driver definitions for Dongle Host Driver. 4 * 5 * Copyright (C) 1999-2019, Broadcom. 6 * 7 * Unless you and Broadcom execute a separate written software license 8 * agreement governing use of this software, this software is licensed to you 9 * under the terms of the GNU General Public License version 2 (the "GPL"), 10 * available at http://www.broadcom.com/licenses/GPLv2.php, with the 11 * following added to such license: 12 * 13 * As a special exception, the copyright holders of this software give you 14 * permission to link this software with independent modules, and to copy and 15 * distribute the resulting executable under terms of your choice, provided that 16 * you also meet, for each linked independent module, the terms and conditions of 17 * the license of that module. An independent module is a module which is not 18 * derived from this software. The special exception does not apply to any 19 * modifications of the software. 20 * 21 * Notwithstanding the above, under no circumstances may you combine this 22 * software in any way with any other Broadcom software provided under a license 23 * other than the GPL, without Broadcom's express prior written consent. 24 * 25 * 26 * <<Broadcom-WL-IPTag/Open:>> 27 * 28 * $Id: dhd_dbg.h 798329 2019-01-08 05:40:39Z $ 29 */ 30 31 #ifndef _dhd_dbg_ 32 #define _dhd_dbg_ 33 34 #ifdef DHD_LOG_DUMP 35 extern char *dhd_log_dump_get_timestamp(void); 36 extern void dhd_log_dump_write(int type, char *binary_data, 37 int binary_len, const char *fmt, ...); 38 #ifndef _DHD_LOG_DUMP_DEFINITIONS_ 39 #define _DHD_LOG_DUMP_DEFINITIONS_ 40 #define GENERAL_LOG_HDR "\n-------------------- General log ---------------------------\n" 41 #define PRESERVE_LOG_HDR "\n-------------------- Preserve log ---------------------------\n" 42 #define SPECIAL_LOG_HDR "\n-------------------- Special log ---------------------------\n" 43 #define DHD_DUMP_LOG_HDR "\n-------------------- 'dhd dump' log -----------------------\n" 44 #define EXT_TRAP_LOG_HDR "\n-------------------- Extended trap data -------------------\n" 45 #define HEALTH_CHK_LOG_HDR "\n-------------------- Health check data --------------------\n" 46 #ifdef DHD_DUMP_PCIE_RINGS 47 #define FLOWRING_DUMP_HDR "\n-------------------- Flowring dump --------------------\n" 48 #endif /* DHD_DUMP_PCIE_RINGS */ 49 #define DHD_LOG_DUMP_WRITE(fmt, ...) \ 50 dhd_log_dump_write(DLD_BUF_TYPE_GENERAL, NULL, 0, fmt, ##__VA_ARGS__) 51 #define DHD_LOG_DUMP_WRITE_EX(fmt, ...) \ 52 dhd_log_dump_write(DLD_BUF_TYPE_SPECIAL, NULL, 0, fmt, ##__VA_ARGS__) 53 #define DHD_LOG_DUMP_WRITE_PRSRV(fmt, ...) \ 54 dhd_log_dump_write(DLD_BUF_TYPE_PRESERVE, NULL, 0, fmt, ##__VA_ARGS__) 55 #endif /* !_DHD_LOG_DUMP_DEFINITIONS_ */ 56 #define CONCISE_DUMP_BUFLEN 16 * 1024 57 #define ECNTRS_LOG_HDR "\n-------------------- Ecounters log --------------------------\n" 58 #ifdef DHD_STATUS_LOGGING 59 #define STATUS_LOG_HDR "\n-------------------- Status log -----------------------\n" 60 #endif /* DHD_STATUS_LOGGING */ 61 #define RTT_LOG_HDR "\n-------------------- RTT log --------------------------\n" 62 #define COOKIE_LOG_HDR "\n-------------------- Cookie List ----------------------------\n" 63 #endif /* DHD_LOG_DUMP */ 64 65 #if defined(DHD_DEBUG) 66 67 /* NON-NDIS cases */ 68 #ifdef DHD_LOG_DUMP 69 /* Common case for EFI and non EFI */ 70 #define DHD_ERROR(args) \ 71 do { \ 72 if (dhd_msg_level & DHD_ERROR_VAL) { \ 73 printf args; \ 74 DHD_LOG_DUMP_WRITE("[%s]: ", dhd_log_dump_get_timestamp()); \ 75 DHD_LOG_DUMP_WRITE args; \ 76 } \ 77 } while (0) 78 79 /* !defined(DHD_EFI) and defined(DHD_LOG_DUMP) */ 80 #define DHD_INFO(args) do {if (dhd_msg_level & DHD_INFO_VAL) printf args;} while (0) 81 #else /* DHD_LOG_DUMP */ 82 /* !defined(DHD_LOG_DUMP cases) */ 83 #define DHD_ERROR(args) do {if (dhd_msg_level & DHD_ERROR_VAL) printf args;} while (0) 84 #define DHD_INFO(args) do {if (dhd_msg_level & DHD_INFO_VAL) printf args;} while (0) 85 #endif /* DHD_LOG_DUMP */ 86 87 #define DHD_TRACE(args) do {if (dhd_msg_level & DHD_TRACE_VAL) printf args;} while (0) 88 89 #ifdef DHD_LOG_DUMP 90 /* LOG_DUMP defines common to EFI and NON-EFI */ 91 #define DHD_ERROR_MEM(args) \ 92 do { \ 93 if (dhd_msg_level & DHD_ERROR_VAL) { \ 94 if (dhd_msg_level & DHD_ERROR_MEM_VAL) { \ 95 printf args; \ 96 } \ 97 DHD_LOG_DUMP_WRITE("[%s]: ", dhd_log_dump_get_timestamp()); \ 98 DHD_LOG_DUMP_WRITE args; \ 99 } \ 100 } while (0) 101 #define DHD_IOVAR_MEM(args) \ 102 do { \ 103 if (dhd_msg_level & DHD_ERROR_VAL) { \ 104 if (dhd_msg_level & DHD_IOVAR_MEM_VAL) { \ 105 printf args; \ 106 } \ 107 DHD_LOG_DUMP_WRITE("[%s]: ", dhd_log_dump_get_timestamp()); \ 108 DHD_LOG_DUMP_WRITE args; \ 109 } \ 110 } while (0) 111 #define DHD_LOG_MEM(args) \ 112 do { \ 113 if (dhd_msg_level & DHD_ERROR_VAL) { \ 114 DHD_LOG_DUMP_WRITE("[%s]: ", dhd_log_dump_get_timestamp()); \ 115 DHD_LOG_DUMP_WRITE args; \ 116 } \ 117 } while (0) 118 /* NON-EFI builds with LOG DUMP enabled */ 119 #define DHD_EVENT(args) \ 120 do { \ 121 if (dhd_msg_level & DHD_EVENT_VAL) { \ 122 printf args; \ 123 DHD_LOG_DUMP_WRITE("[%s]: ", dhd_log_dump_get_timestamp()); \ 124 DHD_LOG_DUMP_WRITE args; \ 125 } \ 126 } while (0) 127 #define DHD_PRSRV_MEM(args) \ 128 do { \ 129 if (dhd_msg_level & DHD_EVENT_VAL) { \ 130 if (dhd_msg_level & DHD_PRSRV_MEM_VAL) \ 131 printf args; \ 132 DHD_LOG_DUMP_WRITE_PRSRV("[%s]: ", dhd_log_dump_get_timestamp()); \ 133 DHD_LOG_DUMP_WRITE_PRSRV args; \ 134 } \ 135 } while (0) 136 137 /* Re-using 'DHD_MSGTRACE_VAL' for controlling printing of ecounter binary event 138 * logs to console and debug dump -- need to cleanup in the future to use separate 139 * 'DHD_ECNTR_VAL' bitmap flag. 'DHD_MSGTRACE_VAL' will be defined only 140 * for non-android builds. 141 */ 142 #define DHD_ECNTR_LOG(args) \ 143 do { \ 144 if (dhd_msg_level & DHD_EVENT_VAL) { \ 145 if (dhd_msg_level & DHD_MSGTRACE_VAL) { \ 146 printf args; \ 147 DHD_LOG_DUMP_WRITE("[%s]: ", dhd_log_dump_get_timestamp()); \ 148 DHD_LOG_DUMP_WRITE args; \ 149 } \ 150 } \ 151 } while (0) 152 153 #define DHD_ERROR_EX(args) \ 154 do { \ 155 if (dhd_msg_level & DHD_ERROR_VAL) { \ 156 printf args; \ 157 DHD_LOG_DUMP_WRITE_EX("[%s]: ", dhd_log_dump_get_timestamp()); \ 158 DHD_LOG_DUMP_WRITE_EX args; \ 159 } \ 160 } while (0) 161 162 #define DHD_MSGTRACE_LOG(args) \ 163 do { \ 164 if (dhd_msg_level & DHD_MSGTRACE_VAL) { \ 165 printf args; \ 166 } \ 167 DHD_LOG_DUMP_WRITE("[%s]: ", dhd_log_dump_get_timestamp()); \ 168 DHD_LOG_DUMP_WRITE args; \ 169 } while (0) 170 #else /* DHD_LOG_DUMP */ 171 /* !DHD_LOG_DUMP */ 172 #define DHD_MSGTRACE_LOG(args) do {if (dhd_msg_level & DHD_MSGTRACE_VAL) printf args;} while (0) 173 #define DHD_ERROR_MEM(args) DHD_ERROR(args) 174 #define DHD_IOVAR_MEM(args) DHD_ERROR(args) 175 #define DHD_LOG_MEM(args) DHD_ERROR(args) 176 #define DHD_EVENT(args) do {if (dhd_msg_level & DHD_EVENT_VAL) printf args;} while (0) 177 #define DHD_ECNTR_LOG(args) DHD_EVENT(args) 178 #define DHD_PRSRV_MEM(args) DHD_EVENT(args) 179 #define DHD_ERROR_EX(args) DHD_ERROR(args) 180 #endif /* DHD_LOG_DUMP */ 181 182 #define DHD_DATA(args) do {if (dhd_msg_level & DHD_DATA_VAL) printf args;} while (0) 183 #define DHD_CTL(args) do {if (dhd_msg_level & DHD_CTL_VAL) printf args;} while (0) 184 #define DHD_TIMER(args) do {if (dhd_msg_level & DHD_TIMER_VAL) printf args;} while (0) 185 #define DHD_HDRS(args) do {if (dhd_msg_level & DHD_HDRS_VAL) printf args;} while (0) 186 #define DHD_BYTES(args) do {if (dhd_msg_level & DHD_BYTES_VAL) printf args;} while (0) 187 #define DHD_INTR(args) do {if (dhd_msg_level & DHD_INTR_VAL) printf args;} while (0) 188 #define DHD_GLOM(args) do {if (dhd_msg_level & DHD_GLOM_VAL) printf args;} while (0) 189 #define DHD_BTA(args) do {if (dhd_msg_level & DHD_BTA_VAL) printf args;} while (0) 190 #define DHD_ISCAN(args) do {if (dhd_msg_level & DHD_ISCAN_VAL) printf args;} while (0) 191 #define DHD_ARPOE(args) do {if (dhd_msg_level & DHD_ARPOE_VAL) printf args;} while (0) 192 #define DHD_REORDER(args) do {if (dhd_msg_level & DHD_REORDER_VAL) printf args;} while (0) 193 #define DHD_PNO(args) do {if (dhd_msg_level & DHD_PNO_VAL) printf args;} while (0) 194 #define DHD_RTT(args) do {if (dhd_msg_level & DHD_RTT_VAL) printf args;} while (0) 195 #define DHD_PKT_MON(args) do {if (dhd_msg_level & DHD_PKT_MON_VAL) printf args;} while (0) 196 197 #if defined(DHD_LOG_DUMP) 198 #if defined(DHD_LOG_PRINT_RATE_LIMIT) 199 #define DHD_FWLOG(args) \ 200 do { \ 201 if (dhd_msg_level & DHD_FWLOG_VAL) { \ 202 if (!log_print_threshold) \ 203 printf args; \ 204 DHD_LOG_DUMP_WRITE args; \ 205 } \ 206 } while (0) 207 #else 208 #define DHD_FWLOG(args) \ 209 do { \ 210 if (dhd_msg_level & DHD_FWLOG_VAL) { \ 211 printf args; \ 212 DHD_LOG_DUMP_WRITE args; \ 213 } \ 214 } while (0) 215 #endif // endif 216 #else /* DHD_LOG_DUMP */ 217 #define DHD_FWLOG(args) do {if (dhd_msg_level & DHD_FWLOG_VAL) printf args;} while (0) 218 #endif /* DHD_LOG_DUMP */ 219 220 #define DHD_DBGIF(args) do {if (dhd_msg_level & DHD_DBGIF_VAL) printf args;} while (0) 221 222 #ifdef DHD_PCIE_NATIVE_RUNTIMEPM 223 #define DHD_RPM(args) do {if (dhd_msg_level & DHD_RPM_VAL) printf args;} while (0) 224 #endif /* DHD_PCIE_NATIVE_RUNTIMEPM */ 225 226 #define DHD_TRACE_HW4 DHD_TRACE 227 #define DHD_INFO_HW4 DHD_INFO 228 #define DHD_ERROR_NO_HW4 DHD_ERROR 229 230 #define DHD_ERROR_ON() (dhd_msg_level & DHD_ERROR_VAL) 231 #define DHD_TRACE_ON() (dhd_msg_level & DHD_TRACE_VAL) 232 #define DHD_INFO_ON() (dhd_msg_level & DHD_INFO_VAL) 233 #define DHD_DATA_ON() (dhd_msg_level & DHD_DATA_VAL) 234 #define DHD_CTL_ON() (dhd_msg_level & DHD_CTL_VAL) 235 #define DHD_TIMER_ON() (dhd_msg_level & DHD_TIMER_VAL) 236 #define DHD_HDRS_ON() (dhd_msg_level & DHD_HDRS_VAL) 237 #define DHD_BYTES_ON() (dhd_msg_level & DHD_BYTES_VAL) 238 #define DHD_INTR_ON() (dhd_msg_level & DHD_INTR_VAL) 239 #define DHD_GLOM_ON() (dhd_msg_level & DHD_GLOM_VAL) 240 #define DHD_EVENT_ON() (dhd_msg_level & DHD_EVENT_VAL) 241 #define DHD_BTA_ON() (dhd_msg_level & DHD_BTA_VAL) 242 #define DHD_ISCAN_ON() (dhd_msg_level & DHD_ISCAN_VAL) 243 #define DHD_ARPOE_ON() (dhd_msg_level & DHD_ARPOE_VAL) 244 #define DHD_REORDER_ON() (dhd_msg_level & DHD_REORDER_VAL) 245 #define DHD_NOCHECKDIED_ON() (dhd_msg_level & DHD_NOCHECKDIED_VAL) 246 #define DHD_PNO_ON() (dhd_msg_level & DHD_PNO_VAL) 247 #define DHD_RTT_ON() (dhd_msg_level & DHD_RTT_VAL) 248 #define DHD_MSGTRACE_ON() (dhd_msg_level & DHD_MSGTRACE_VAL) 249 #define DHD_FWLOG_ON() (dhd_msg_level & DHD_FWLOG_VAL) 250 #define DHD_DBGIF_ON() (dhd_msg_level & DHD_DBGIF_VAL) 251 #define DHD_PKT_MON_ON() (dhd_msg_level & DHD_PKT_MON_VAL) 252 #define DHD_PKT_MON_DUMP_ON() (dhd_msg_level & DHD_PKT_MON_DUMP_VAL) 253 #ifdef DHD_PCIE_NATIVE_RUNTIMEPM 254 #define DHD_RPM_ON() (dhd_msg_level & DHD_RPM_VAL) 255 #endif /* DHD_PCIE_NATIVE_RUNTIMEPM */ 256 257 #else /* defined(BCMDBG) || defined(DHD_DEBUG) */ 258 259 #define DHD_ERROR(args) do {if (dhd_msg_level & DHD_ERROR_VAL) \ 260 printf args;} while (0) 261 #define DHD_TRACE(args) 262 #define DHD_INFO(args) 263 264 #define DHD_DATA(args) 265 #define DHD_CTL(args) 266 #define DHD_TIMER(args) 267 #define DHD_HDRS(args) 268 #define DHD_BYTES(args) 269 #define DHD_INTR(args) 270 #define DHD_GLOM(args) 271 272 #define DHD_EVENT(args) 273 #define DHD_ECNTR_LOG(args) DHD_EVENT(args) 274 275 #define DHD_PRSRV_MEM(args) DHD_EVENT(args) 276 277 #define DHD_BTA(args) 278 #define DHD_ISCAN(args) 279 #define DHD_ARPOE(args) 280 #define DHD_REORDER(args) 281 #define DHD_PNO(args) 282 #define DHD_RTT(args) 283 #define DHD_PKT_MON(args) 284 285 #define DHD_MSGTRACE_LOG(args) 286 #define DHD_FWLOG(args) 287 288 #define DHD_DBGIF(args) 289 290 #define DHD_ERROR_MEM(args) DHD_ERROR(args) 291 #define DHD_IOVAR_MEM(args) DHD_ERROR(args) 292 #define DHD_LOG_MEM(args) DHD_ERROR(args) 293 #define DHD_ERROR_EX(args) DHD_ERROR(args) 294 295 #define DHD_TRACE_HW4 DHD_TRACE 296 #define DHD_INFO_HW4 DHD_INFO 297 #define DHD_ERROR_NO_HW4 DHD_ERROR 298 299 #define DHD_ERROR_ON() 0 300 #define DHD_TRACE_ON() 0 301 #define DHD_INFO_ON() 0 302 #define DHD_DATA_ON() 0 303 #define DHD_CTL_ON() 0 304 #define DHD_TIMER_ON() 0 305 #define DHD_HDRS_ON() 0 306 #define DHD_BYTES_ON() 0 307 #define DHD_INTR_ON() 0 308 #define DHD_GLOM_ON() 0 309 #define DHD_EVENT_ON() 0 310 #define DHD_BTA_ON() 0 311 #define DHD_ISCAN_ON() 0 312 #define DHD_ARPOE_ON() 0 313 #define DHD_REORDER_ON() 0 314 #define DHD_NOCHECKDIED_ON() 0 315 #define DHD_PNO_ON() 0 316 #define DHD_RTT_ON() 0 317 #define DHD_PKT_MON_ON() 0 318 #define DHD_PKT_MON_DUMP_ON() 0 319 #define DHD_MSGTRACE_ON() 0 320 #define DHD_FWLOG_ON() 0 321 #define DHD_DBGIF_ON() 0 322 #ifdef DHD_PCIE_NATIVE_RUNTIMEPM 323 #define DHD_RPM_ON() 0 324 #endif /* DHD_PCIE_NATIVE_RUNTIMEPM */ 325 #endif // endif 326 327 #define PRINT_RATE_LIMIT_PERIOD 5000000u /* 5s in units of us */ 328 #define DHD_ERROR_RLMT(args) \ 329 do { \ 330 if (dhd_msg_level & DHD_ERROR_VAL) { \ 331 static uint64 __err_ts = 0; \ 332 static uint32 __err_cnt = 0; \ 333 uint64 __cur_ts = 0; \ 334 __cur_ts = OSL_SYSUPTIME_US(); \ 335 if (__err_ts == 0 || (__cur_ts > __err_ts && \ 336 (__cur_ts - __err_ts > PRINT_RATE_LIMIT_PERIOD))) { \ 337 __err_ts = __cur_ts; \ 338 DHD_ERROR(args); \ 339 DHD_ERROR(("[Repeats %u times]\n", __err_cnt)); \ 340 __err_cnt = 0; \ 341 } else { \ 342 ++__err_cnt; \ 343 } \ 344 } \ 345 } while (0) 346 347 /* even in non-BCMDBG builds, logging of dongle iovars should be available */ 348 #define DHD_DNGL_IOVAR_SET(args) \ 349 do {if (dhd_msg_level & DHD_DNGL_IOVAR_SET_VAL) printf args;} while (0) 350 351 #define DHD_LOG(args) 352 353 #define DHD_BLOG(cp, size) 354 355 #define DHD_NONE(args) 356 extern int dhd_msg_level; 357 #ifdef DHD_LOG_PRINT_RATE_LIMIT 358 extern int log_print_threshold; 359 #endif /* DHD_LOG_PRINT_RATE_LIMIT */ 360 361 #define DHD_RTT_MEM(args) DHD_LOG_MEM(args) 362 #define DHD_RTT_ERR(args) DHD_ERROR(args) 363 364 /* Defines msg bits */ 365 #include <dhdioctl.h> 366 367 #endif /* _dhd_dbg_ */ 368