1 /* 2 * Copyright (c) 2014-2021 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 /** 20 * DOC: i_qdf_trace.h 21 * 22 * Linux-specific definitions for QDF trace 23 * 24 */ 25 26 #if !defined(__I_QDF_TRACE_H) 27 #define __I_QDF_TRACE_H 28 29 /* 30 * The CONFIG_QCOM_MINIDUMP feature can only be used 31 * beginning with kernel version msm-4.19 since that is 32 * when msm_minidump_removerefion() was added. 33 */ 34 #if defined(CONFIG_QCOM_MINIDUMP) && \ 35 (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) 36 #define WLAN_QCOM_MINIDUMP 37 #endif 38 /* older kernels have a bug in kallsyms, so ensure module.h is included */ 39 #include <linux/module.h> 40 #include <linux/kallsyms.h> 41 #ifdef CONFIG_QCA_MINIDUMP 42 #include <linux/minidump_tlv.h> 43 #endif 44 #ifdef WLAN_QCOM_MINIDUMP 45 #include <soc/qcom/minidump.h> 46 #endif 47 48 #if !defined(__printf) 49 #define __printf(a, b) 50 #endif 51 52 /* QDF_TRACE is the macro invoked to add trace messages to code. See the 53 * documenation for qdf_trace_msg() for the parameters etc. for this function. 54 * 55 * NOTE: Code QDF_TRACE() macros into the source code. Do not code directly 56 * to the qdf_trace_msg() function. 57 * 58 * NOTE 2: qdf tracing is totally turned off if WLAN_DEBUG is *not* defined. 59 * This allows us to build 'performance' builds where we can measure performance 60 * without being bogged down by all the tracing in the code 61 */ 62 #if defined(QDF_TRACE_PRINT_ENABLE) 63 #define qdf_trace(log_level, args...) \ 64 do { \ 65 extern int qdf_dbg_mask; \ 66 if (qdf_dbg_mask >= log_level) { \ 67 printk(args); \ 68 printk("\n"); \ 69 } \ 70 } while (0) 71 #endif 72 73 #if defined(WLAN_DEBUG) || defined(DEBUG) || defined(QDF_TRACE_PRINT_ENABLE) 74 #define QDF_TRACE qdf_trace_msg 75 #define QDF_VTRACE qdf_vtrace_msg 76 #define QDF_TRACE_HEX_DUMP qdf_trace_hex_dump 77 #else 78 #define QDF_TRACE(arg ...) __qdf_trace_dummy(arg) 79 #define QDF_VTRACE(arg ...) __qdf_vtrace_dummy(arg) 80 #define QDF_TRACE_HEX_DUMP(arg ...) __qdf_trace_hexdump_dummy(arg) 81 #endif 82 83 #if defined(WLAN_DEBUG) || defined(DEBUG) || defined(QDF_TRACE_PRINT_ENABLE) 84 #define QDF_MAX_LOGS_PER_SEC 2 85 /** 86 * __QDF_TRACE_RATE_LIMITED() - rate limited version of QDF_TRACE 87 * @params: parameters to pass through to QDF_TRACE 88 * 89 * This API prevents logging a message more than QDF_MAX_LOGS_PER_SEC times per 90 * second. This means any subsequent calls to this API from the same location 91 * within 1/QDF_MAX_LOGS_PER_SEC seconds will be dropped. 92 * 93 * Return: None 94 */ 95 #define __QDF_TRACE_RATE_LIMITED(params...)\ 96 do {\ 97 static ulong __last_ticks;\ 98 ulong __ticks = jiffies;\ 99 if (time_after(__ticks,\ 100 __last_ticks + HZ / QDF_MAX_LOGS_PER_SEC)) {\ 101 QDF_TRACE(params);\ 102 __last_ticks = __ticks;\ 103 } \ 104 } while (0) 105 106 #define __QDF_TRACE_HEX_DUMP_RATE_LIMITED(params...)\ 107 do {\ 108 static ulong __last_ticks;\ 109 ulong __ticks = jiffies;\ 110 if (time_after(__ticks,\ 111 __last_ticks + HZ / QDF_MAX_LOGS_PER_SEC)) {\ 112 QDF_TRACE_HEX_DUMP(params);\ 113 __last_ticks = __ticks;\ 114 } \ 115 } while (0) 116 #else 117 #define __QDF_TRACE_RATE_LIMITED(arg ...) 118 #define __QDF_TRACE_HEX_DUMP_RATE_LIMITED(arg ...) 119 #endif 120 121 #define __QDF_TRACE_NO_FL(log_level, module_id, format, args...) \ 122 QDF_TRACE(module_id, log_level, format, ## args) 123 124 #define __QDF_TRACE_FL(log_level, module_id, format, args...) \ 125 QDF_TRACE(module_id, log_level, FL(format), ## args) 126 127 #define __QDF_TRACE_RL(log_level, module_id, format, args...) \ 128 __QDF_TRACE_RATE_LIMITED(module_id, log_level, FL(format), ## args) 129 130 #define __QDF_TRACE_RL_NO_FL(log_level, module_id, format, args...) \ 131 __QDF_TRACE_RATE_LIMITED(module_id, log_level, format, ## args) 132 133 #define __QDF_TRACE_HEX_DUMP_RL(log_level, module_id, args...) \ 134 __QDF_TRACE_HEX_DUMP_RATE_LIMITED(module_id, log_level, ## args) 135 136 static inline void __qdf_trace_noop(QDF_MODULE_ID module, 137 const char *format, ...) { } 138 static inline void __qdf_trace_dummy(QDF_MODULE_ID module, 139 QDF_TRACE_LEVEL level, 140 const char *format, ...) { } 141 static inline void __qdf_vtrace_dummy(QDF_MODULE_ID module, 142 QDF_TRACE_LEVEL level, 143 const char *str_format, va_list val) { } 144 static inline void __qdf_trace_hexdump_dummy(QDF_MODULE_ID module, 145 QDF_TRACE_LEVEL level, 146 void *data, int buf_len) { } 147 148 149 #ifdef WLAN_LOG_FATAL 150 #define QDF_TRACE_FATAL(params...) \ 151 __QDF_TRACE_FL(QDF_TRACE_LEVEL_FATAL, ## params) 152 #define QDF_TRACE_FATAL_NO_FL(params...) \ 153 __QDF_TRACE_NO_FL(QDF_TRACE_LEVEL_FATAL, ## params) 154 #define QDF_TRACE_FATAL_RL(params...) \ 155 __QDF_TRACE_RL(QDF_TRACE_LEVEL_FATAL, ## params) 156 #define QDF_TRACE_FATAL_RL_NO_FL(params...) \ 157 __QDF_TRACE_RL_NO_FL(QDF_TRACE_LEVEL_FATAL, ## params) 158 #define QDF_VTRACE_FATAL(module_id, fmt, args) \ 159 QDF_VTRACE(module_id, QDF_TRACE_LEVEL_FATAL, fmt, args) 160 #define QDF_TRACE_HEX_DUMP_FATAL_RL(params...) \ 161 __QDF_TRACE_HEX_DUMP_RL(QDF_TRACE_LEVEL_FATAL, ## params) 162 #else 163 #define QDF_TRACE_FATAL(params...) __qdf_trace_noop(params) 164 #define QDF_TRACE_FATAL_NO_FL(params...) __qdf_trace_noop(params) 165 #define QDF_TRACE_FATAL_RL(params...) __qdf_trace_noop(params) 166 #define QDF_TRACE_FATAL_RL_NO_FL(params...) __qdf_trace_noop(params) 167 #define QDF_VTRACE_FATAL(params...) __qdf_trace_noop(params) 168 #define QDF_TRACE_HEX_DUMP_FATAL_RL(params...) __qdf_trace_noop(params) 169 #endif 170 171 #ifdef WLAN_LOG_ERROR 172 #define QDF_TRACE_ERROR(params...) \ 173 __QDF_TRACE_FL(QDF_TRACE_LEVEL_ERROR, ## params) 174 #define QDF_TRACE_ERROR_NO_FL(params...) \ 175 __QDF_TRACE_NO_FL(QDF_TRACE_LEVEL_ERROR, ## params) 176 #define QDF_TRACE_ERROR_RL(params...) \ 177 __QDF_TRACE_RL(QDF_TRACE_LEVEL_ERROR, ## params) 178 #define QDF_TRACE_ERROR_RL_NO_FL(params...) \ 179 __QDF_TRACE_RL_NO_FL(QDF_TRACE_LEVEL_ERROR, ## params) 180 #define QDF_VTRACE_ERROR(module_id, fmt, args) \ 181 QDF_VTRACE(module_id, QDF_TRACE_LEVEL_ERROR, fmt, args) 182 #define QDF_TRACE_HEX_DUMP_ERROR_RL(params...) \ 183 __QDF_TRACE_HEX_DUMP_RL(QDF_TRACE_LEVEL_ERROR, ## params) 184 #else 185 #define QDF_TRACE_ERROR(params...) __qdf_trace_noop(params) 186 #define QDF_TRACE_ERROR_NO_FL(params...) __qdf_trace_noop(params) 187 #define QDF_TRACE_ERROR_RL(params...) __qdf_trace_noop(params) 188 #define QDF_TRACE_ERROR_RL_NO_FL(params...) __qdf_trace_noop(params) 189 #define QDF_VTRACE_ERROR(params...) __qdf_trace_noop(params) 190 #define QDF_TRACE_HEX_DUMP_ERROR_RL(params...) __qdf_trace_noop(params) 191 #endif 192 193 #ifdef WLAN_LOG_WARN 194 #define QDF_TRACE_WARN(params...) \ 195 __QDF_TRACE_FL(QDF_TRACE_LEVEL_WARN, ## params) 196 #define QDF_TRACE_WARN_NO_FL(params...) \ 197 __QDF_TRACE_NO_FL(QDF_TRACE_LEVEL_WARN, ## params) 198 #define QDF_TRACE_WARN_RL(params...) \ 199 __QDF_TRACE_RL(QDF_TRACE_LEVEL_WARN, ## params) 200 #define QDF_TRACE_WARN_RL_NO_FL(params...) \ 201 __QDF_TRACE_RL_NO_FL(QDF_TRACE_LEVEL_WARN, ## params) 202 #define QDF_VTRACE_WARN(module_id, fmt, args) \ 203 QDF_VTRACE(module_id, QDF_TRACE_LEVEL_WARN, fmt, args) 204 #define QDF_TRACE_HEX_DUMP_WARN_RL(params...) \ 205 __QDF_TRACE_HEX_DUMP_RL(QDF_TRACE_LEVEL_WARN, ## params) 206 #else 207 #define QDF_TRACE_WARN(params...) __qdf_trace_noop(params) 208 #define QDF_TRACE_WARN_NO_FL(params...) __qdf_trace_noop(params) 209 #define QDF_TRACE_WARN_RL(params...) __qdf_trace_noop(params) 210 #define QDF_TRACE_WARN_RL_NO_FL(params...) __qdf_trace_noop(params) 211 #define QDF_VTRACE_WARN(params...) __qdf_trace_noop(params) 212 #define QDF_TRACE_HEX_DUMP_WARN_RL(params...) __qdf_trace_noop(params) 213 #endif 214 215 #ifdef WLAN_LOG_INFO 216 #define QDF_TRACE_INFO(params...) \ 217 __QDF_TRACE_FL(QDF_TRACE_LEVEL_INFO, ## params) 218 #define QDF_TRACE_INFO_NO_FL(params...) \ 219 __QDF_TRACE_NO_FL(QDF_TRACE_LEVEL_INFO, ## params) 220 #define QDF_TRACE_INFO_RL(params...) \ 221 __QDF_TRACE_RL(QDF_TRACE_LEVEL_INFO, ## params) 222 #define QDF_TRACE_INFO_RL_NO_FL(params...) \ 223 __QDF_TRACE_RL_NO_FL(QDF_TRACE_LEVEL_INFO, ## params) 224 #define QDF_VTRACE_INFO(module_id, fmt, args) \ 225 QDF_VTRACE(module_id, QDF_TRACE_LEVEL_INFO, fmt, args) 226 #define QDF_TRACE_HEX_DUMP_INFO_RL(params...) \ 227 __QDF_TRACE_HEX_DUMP_RL(QDF_TRACE_LEVEL_INFO, ## params) 228 #else 229 #define QDF_TRACE_INFO(params...) __qdf_trace_noop(params) 230 #define QDF_TRACE_INFO_NO_FL(params...) __qdf_trace_noop(params) 231 #define QDF_TRACE_INFO_RL(params...) __qdf_trace_noop(params) 232 #define QDF_TRACE_INFO_RL_NO_FL(params...) __qdf_trace_noop(params) 233 #define QDF_VTRACE_INFO(params...) __qdf_trace_noop(params) 234 #define QDF_TRACE_HEX_DUMP_INFO_RL(params...) __qdf_trace_noop(params) 235 #endif 236 237 #ifdef WLAN_LOG_DEBUG 238 #define QDF_TRACE_DEBUG(params...) \ 239 __QDF_TRACE_FL(QDF_TRACE_LEVEL_DEBUG, ## params) 240 #define QDF_TRACE_DEBUG_NO_FL(params...) \ 241 __QDF_TRACE_NO_FL(QDF_TRACE_LEVEL_DEBUG, ## params) 242 #define QDF_TRACE_DEBUG_RL(params...) \ 243 __QDF_TRACE_RL(QDF_TRACE_LEVEL_DEBUG, ## params) 244 #define QDF_TRACE_DEBUG_RL_NO_FL(params...) \ 245 __QDF_TRACE_RL_NO_FL(QDF_TRACE_LEVEL_DEBUG, ## params) 246 #define QDF_VTRACE_DEBUG(module_id, fmt, args) \ 247 QDF_VTRACE(module_id, QDF_TRACE_LEVEL_DEBUG, fmt, args) 248 #define QDF_TRACE_HEX_DUMP_DEBUG_RL(params...) \ 249 __QDF_TRACE_HEX_DUMP_RL(QDF_TRACE_LEVEL_DEBUG, ## params) 250 #else 251 #define QDF_TRACE_DEBUG(params...) __qdf_trace_noop(params) 252 #define QDF_TRACE_DEBUG_NO_FL(params...) __qdf_trace_noop(params) 253 #define QDF_TRACE_DEBUG_RL(params...) __qdf_trace_noop(params) 254 #define QDF_TRACE_DEBUG_RL_NO_FL(params...) __qdf_trace_noop(params) 255 #define QDF_VTRACE_DEBUG(params...) __qdf_trace_noop(params) 256 #define QDF_TRACE_HEX_DUMP_DEBUG_RL(params...) __qdf_trace_noop(params) 257 #endif 258 259 #ifdef WLAN_LOG_ENTER 260 #define QDF_TRACE_ENTER(params...) \ 261 __QDF_TRACE_FL(QDF_TRACE_LEVEL_DEBUG, ## params) 262 #else 263 #define QDF_TRACE_ENTER(params...) __qdf_trace_noop(params) 264 #endif 265 266 #ifdef WLAN_LOG_EXIT 267 #define QDF_TRACE_EXIT(params...) \ 268 __QDF_TRACE_FL(QDF_TRACE_LEVEL_DEBUG, ## params) 269 #else 270 #define QDF_TRACE_EXIT(params...) __qdf_trace_noop(params) 271 #endif 272 273 #define QDF_ENABLE_TRACING 274 #define qdf_scnprintf scnprintf 275 276 #ifdef QDF_ENABLE_TRACING 277 278 #ifdef WLAN_WARN_ON_ASSERT 279 #define QDF_ASSERT(_condition) \ 280 do { \ 281 if (!(_condition)) { \ 282 pr_err("QDF ASSERT in %s Line %d\n", \ 283 __func__, __LINE__); \ 284 WARN_ON(1); \ 285 } \ 286 } while (0) 287 #else 288 #define QDF_ASSERT(_condition) \ 289 do { \ 290 if (!(_condition)) { \ 291 /* no-op */ \ 292 } \ 293 } while (0) 294 #endif /* WLAN_WARN_ON_ASSERT */ 295 /** 296 * qdf_trace_msg()- logging API 297 * @module: Module identifier. A member of the QDF_MODULE_ID enumeration that 298 * identifies the module issuing the trace message. 299 * @level: Trace level. A member of the QDF_TRACE_LEVEL enumeration indicating 300 * the severity of the condition causing the trace message to be issued. 301 * More severe conditions are more likely to be logged. 302 * @str_format: Format string. The message to be logged. This format string 303 * contains printf-like replacement parameters, which follow this 304 * parameter in the variable argument list. 305 * 306 * Users wishing to add tracing information to their code should use 307 * QDF_TRACE. QDF_TRACE() will compile into a call to qdf_trace_msg() when 308 * tracing is enabled. 309 * 310 * Return: nothing 311 * 312 * implemented in qdf_trace.c 313 */ 314 void __printf(3, 4) qdf_trace_msg(QDF_MODULE_ID module, QDF_TRACE_LEVEL level, 315 const char *str_format, ...); 316 317 /** 318 * qdf_vtrace_msg() - the va_list version of qdf_trace_msg 319 * @module: the calling module's Id 320 * @level: the logging level to log using 321 * @str_format: the log format string 322 * @val: the va_list containing the values to format according to str_format 323 * 324 * Return: None 325 */ 326 void qdf_vtrace_msg(QDF_MODULE_ID module, QDF_TRACE_LEVEL level, 327 const char *str_format, va_list val); 328 329 #else 330 331 /* This code will be used for compilation if tracing is to be compiled out */ 332 /* of the code so these functions/macros are 'do nothing' */ 333 static inline void qdf_trace_msg(QDF_MODULE_ID module, QDF_TRACE_LEVEL level, 334 const char *str_format, ...) 335 { 336 } 337 338 #define QDF_ASSERT(_condition) 339 340 #endif 341 342 #ifdef QDF_TRACE_PRINT_ENABLE 343 static inline void qdf_vprint(const char *fmt, va_list args) 344 { 345 QDF_VTRACE_INFO(QDF_MODULE_ID_ANY, fmt, args); 346 } 347 #else /* QDF_TRACE_PRINT_ENABLE */ 348 static inline void qdf_vprint(const char *fmt, va_list args) 349 { 350 QDF_VTRACE_ERROR(QDF_MODULE_ID_QDF, fmt, args); 351 } 352 #endif 353 354 #ifdef PANIC_ON_BUG 355 #ifdef CONFIG_SLUB_DEBUG 356 /** 357 * __qdf_bug() - Calls BUG() when the PANIC_ON_BUG compilation option is enabled 358 * 359 * Note: Calling BUG() can cause a compiler to assume any following code is 360 * unreachable. Because these BUG's may or may not be enabled by the build 361 * configuration, this can cause developers some pain. Consider: 362 * 363 * bool bit; 364 * 365 * if (ptr) 366 * bit = ptr->returns_bool(); 367 * else 368 * __qdf_bug(); 369 * 370 * // do stuff with @bit 371 * 372 * return bit; 373 * 374 * In this case, @bit is potentially uninitialized when we return! However, the 375 * compiler can correctly assume this case is impossible when PANIC_ON_BUG is 376 * enabled. Because developers typically enable this feature, the "maybe 377 * uninitialized" warning will not be emitted, and the bug remains uncaught 378 * until someone tries to make a build without PANIC_ON_BUG. 379 * 380 * A simple workaround for this, is to put the definition of __qdf_bug in 381 * another compilation unit, which prevents the compiler from assuming 382 * subsequent code is unreachable. For CONFIG_SLUB_DEBUG, do this to catch more 383 * bugs. Otherwise, use the typical inlined approach. 384 * 385 * Return: None 386 */ 387 void __qdf_bug(void); 388 #else /* CONFIG_SLUB_DEBUG */ 389 static inline void __qdf_bug(void) 390 { 391 BUG(); 392 } 393 #endif /* CONFIG_SLUB_DEBUG */ 394 395 /** 396 * QDF_DEBUG_PANIC() - In debug builds, panic, otherwise do nothing 397 * @reason_fmt: a format string containing the reason for the panic 398 * @args: zero or more printf compatible logging arguments 399 * 400 * Return: None 401 */ 402 #define QDF_DEBUG_PANIC(reason_fmt, args...) \ 403 QDF_DEBUG_PANIC_FL(__func__, __LINE__, reason_fmt, ## args) 404 405 /** 406 * QDF_DEBUG_PANIC_FL() - In debug builds, panic, otherwise do nothing 407 * @func: origin function name to be logged 408 * @line: origin line number to be logged 409 * @fmt: printf compatible format string to be logged 410 * @args: zero or more printf compatible logging arguments 411 * 412 * Return: None 413 */ 414 #define QDF_DEBUG_PANIC_FL(func, line, fmt, args...) \ 415 do { \ 416 pr_err("WLAN Panic @ %s:%d: " fmt "\n", func, line, ##args); \ 417 __qdf_bug(); \ 418 } while (false) 419 420 #define QDF_BUG(_condition) \ 421 do { \ 422 if (!(_condition)) { \ 423 pr_err("QDF BUG in %s Line %d: Failed assertion '" \ 424 #_condition "'\n", __func__, __LINE__); \ 425 __qdf_bug(); \ 426 } \ 427 } while (0) 428 429 #define QDF_BUG_ON_ASSERT(_condition) \ 430 do { \ 431 if (!(_condition)) { \ 432 __qdf_bug(); \ 433 } \ 434 } while (0) 435 436 #else /* PANIC_ON_BUG */ 437 438 #define QDF_DEBUG_PANIC(reason...) \ 439 do { \ 440 /* no-op */ \ 441 } while (false) 442 443 #define QDF_DEBUG_PANIC_FL(func, line, fmt, args...) \ 444 do { \ 445 /* no-op */ \ 446 } while (false) 447 448 #define QDF_BUG(_condition) \ 449 do { \ 450 if (!(_condition)) { \ 451 /* no-op */ \ 452 } \ 453 } while (0) 454 455 #define QDF_BUG_ON_ASSERT(_condition) \ 456 do { \ 457 if (!(_condition)) { \ 458 /* no-op */ \ 459 } \ 460 } while (0) 461 462 #endif /* PANIC_ON_BUG */ 463 464 #ifdef KSYM_SYMBOL_LEN 465 #define __QDF_SYMBOL_LEN KSYM_SYMBOL_LEN 466 #else 467 #define __QDF_SYMBOL_LEN 1 468 #endif 469 470 #ifdef CONFIG_QCA_MINIDUMP 471 static inline void 472 __qdf_minidump_log(void *start_addr, size_t size, const char *name) 473 { 474 if (minidump_fill_segments((const uintptr_t)start_addr, size, 475 QCA_WDT_LOG_DUMP_TYPE_WLAN_MOD, 476 name) < 0) 477 QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_INFO, 478 "%s: failed to log %pK (%s)\n", 479 __func__, start_addr, name); 480 } 481 482 static inline void 483 __qdf_minidump_remove(void *addr, size_t size, const char *name) 484 { 485 minidump_remove_segments((const uintptr_t)addr); 486 } 487 #elif defined(WLAN_QCOM_MINIDUMP) 488 static inline void 489 __qdf_minidump_log(void *start_addr, const size_t size, 490 const char *name) 491 { 492 struct md_region md_entry; 493 int ret; 494 495 snprintf(md_entry.name, sizeof(md_entry.name), name); 496 md_entry.virt_addr = (uintptr_t)start_addr; 497 md_entry.phys_addr = virt_to_phys(start_addr); 498 md_entry.size = size; 499 ret = msm_minidump_add_region(&md_entry); 500 if (ret < 0) { 501 QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_QDF, 502 "%s: failed to log %pK (%s)\n", 503 __func__, start_addr, name); 504 } 505 } 506 507 static inline void 508 __qdf_minidump_remove(void *start_addr, const size_t size, 509 const char *name) 510 { 511 struct md_region md_entry; 512 513 snprintf(md_entry.name, sizeof(md_entry.name), name); 514 md_entry.virt_addr = (uintptr_t)start_addr; 515 md_entry.phys_addr = virt_to_phys(start_addr); 516 md_entry.size = size; 517 msm_minidump_remove_region(&md_entry); 518 } 519 #else 520 static inline void 521 __qdf_minidump_log(void *start_addr, 522 const size_t size, const char *name) {} 523 static inline void 524 __qdf_minidump_remove(void *start_addr, 525 const size_t size, const char *name) {} 526 #endif 527 #endif /* __I_QDF_TRACE_H */ 528