xref: /wlan-dirver/qca-wifi-host-cmn/qdf/linux/src/i_qdf_trace.h (revision a64d8a0dbea74a9757ced8bd24c04bf658d196c7)
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