1 | // SPDX-License-Identifier: BSD-3-Clause-Clear |
2 | /* |
3 | * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. |
4 | * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. |
5 | */ |
6 | |
7 | #include <linux/vmalloc.h> |
8 | #include "core.h" |
9 | #include "debug.h" |
10 | |
11 | void ath11k_info(struct ath11k_base *ab, const char *fmt, ...) |
12 | { |
13 | struct va_format vaf = { |
14 | .fmt = fmt, |
15 | }; |
16 | va_list args; |
17 | |
18 | va_start(args, fmt); |
19 | vaf.va = &args; |
20 | dev_info(ab->dev, "%pV" , &vaf); |
21 | trace_ath11k_log_info(ab, vaf: &vaf); |
22 | va_end(args); |
23 | } |
24 | EXPORT_SYMBOL(ath11k_info); |
25 | |
26 | void ath11k_err(struct ath11k_base *ab, const char *fmt, ...) |
27 | { |
28 | struct va_format vaf = { |
29 | .fmt = fmt, |
30 | }; |
31 | va_list args; |
32 | |
33 | va_start(args, fmt); |
34 | vaf.va = &args; |
35 | dev_err(ab->dev, "%pV" , &vaf); |
36 | trace_ath11k_log_err(ab, vaf: &vaf); |
37 | va_end(args); |
38 | } |
39 | EXPORT_SYMBOL(ath11k_err); |
40 | |
41 | void ath11k_warn(struct ath11k_base *ab, const char *fmt, ...) |
42 | { |
43 | struct va_format vaf = { |
44 | .fmt = fmt, |
45 | }; |
46 | va_list args; |
47 | |
48 | va_start(args, fmt); |
49 | vaf.va = &args; |
50 | dev_warn_ratelimited(ab->dev, "%pV" , &vaf); |
51 | trace_ath11k_log_warn(ab, vaf: &vaf); |
52 | va_end(args); |
53 | } |
54 | EXPORT_SYMBOL(ath11k_warn); |
55 | |
56 | #ifdef CONFIG_ATH11K_DEBUG |
57 | |
58 | void __ath11k_dbg(struct ath11k_base *ab, enum ath11k_debug_mask mask, |
59 | const char *fmt, ...) |
60 | { |
61 | struct va_format vaf; |
62 | va_list args; |
63 | |
64 | va_start(args, fmt); |
65 | |
66 | vaf.fmt = fmt; |
67 | vaf.va = &args; |
68 | |
69 | if (ath11k_debug_mask & mask) |
70 | dev_printk(KERN_DEBUG, ab->dev, "%s %pV" , ath11k_dbg_str(mask), &vaf); |
71 | |
72 | trace_ath11k_log_dbg(ab, level: mask, vaf: &vaf); |
73 | |
74 | va_end(args); |
75 | } |
76 | EXPORT_SYMBOL(__ath11k_dbg); |
77 | |
78 | void ath11k_dbg_dump(struct ath11k_base *ab, |
79 | enum ath11k_debug_mask mask, |
80 | const char *msg, const char *prefix, |
81 | const void *buf, size_t len) |
82 | { |
83 | char linebuf[256]; |
84 | size_t linebuflen; |
85 | const void *ptr; |
86 | |
87 | if (ath11k_debug_mask & mask) { |
88 | if (msg) |
89 | __ath11k_dbg(ab, mask, "%s\n" , msg); |
90 | |
91 | for (ptr = buf; (ptr - buf) < len; ptr += 16) { |
92 | linebuflen = 0; |
93 | linebuflen += scnprintf(buf: linebuf + linebuflen, |
94 | size: sizeof(linebuf) - linebuflen, |
95 | fmt: "%s%08x: " , |
96 | (prefix ? prefix : "" ), |
97 | (unsigned int)(ptr - buf)); |
98 | hex_dump_to_buffer(buf: ptr, len: len - (ptr - buf), rowsize: 16, groupsize: 1, |
99 | linebuf: linebuf + linebuflen, |
100 | linebuflen: sizeof(linebuf) - linebuflen, ascii: true); |
101 | dev_printk(KERN_DEBUG, ab->dev, "%s\n" , linebuf); |
102 | } |
103 | } |
104 | |
105 | /* tracing code doesn't like null strings */ |
106 | trace_ath11k_log_dbg_dump(ab, msg: msg ? msg : "" , prefix: prefix ? prefix : "" , |
107 | buf, buf_len: len); |
108 | } |
109 | EXPORT_SYMBOL(ath11k_dbg_dump); |
110 | |
111 | #endif /* CONFIG_ATH11K_DEBUG */ |
112 | |