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 * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
6 */
7
8 #include <linux/export.h>
9 #include <linux/vmalloc.h>
10 #include "core.h"
11 #include "debug.h"
12
ath11k_info(struct ath11k_base * ab,const char * fmt,...)13 void ath11k_info(struct ath11k_base *ab, const char *fmt, ...)
14 {
15 struct va_format vaf = {
16 .fmt = fmt,
17 };
18 va_list args;
19
20 va_start(args, fmt);
21 vaf.va = &args;
22 #if defined(__linux__)
23 dev_info(ab->dev, "%pV", &vaf);
24 #elif defined(__FreeBSD__)
25 {
26 char *str;
27 vasprintf(&str, M_KMALLOC, fmt, args);
28 dev_printk(KERN_INFO, ab->dev, "%s", str);
29 free(str, M_KMALLOC);
30 }
31 #endif
32 trace_ath11k_log_info(ab, &vaf);
33 va_end(args);
34 }
35 EXPORT_SYMBOL(ath11k_info);
36
ath11k_err(struct ath11k_base * ab,const char * fmt,...)37 void ath11k_err(struct ath11k_base *ab, const char *fmt, ...)
38 {
39 struct va_format vaf = {
40 .fmt = fmt,
41 };
42 va_list args;
43
44 va_start(args, fmt);
45 vaf.va = &args;
46 #if defined(__linux__)
47 dev_err(ab->dev, "%pV", &vaf);
48 #elif defined(__FreeBSD__)
49 {
50 char *str;
51 vasprintf(&str, M_KMALLOC, fmt, args);
52 dev_printk(KERN_ERR, ab->dev, "%s", str);
53 free(str, M_KMALLOC);
54 }
55 #endif
56 trace_ath11k_log_err(ab, &vaf);
57 va_end(args);
58 }
59 EXPORT_SYMBOL(ath11k_err);
60
ath11k_warn(struct ath11k_base * ab,const char * fmt,...)61 void ath11k_warn(struct ath11k_base *ab, const char *fmt, ...)
62 {
63 struct va_format vaf = {
64 .fmt = fmt,
65 };
66 va_list args;
67
68 va_start(args, fmt);
69 vaf.va = &args;
70 #if defined(__linux__)
71 dev_warn_ratelimited(ab->dev, "%pV", &vaf);
72 #elif defined(__FreeBSD__)
73 {
74 static linux_ratelimit_t __ratelimited;
75
76 if (linux_ratelimited(&__ratelimited)) {
77 char *str;
78 vasprintf(&str, M_KMALLOC, fmt, args);
79 dev_printk(KERN_WARN, ab->dev, "%s", str);
80 free(str, M_KMALLOC);
81 }
82 }
83 #endif
84 trace_ath11k_log_warn(ab, &vaf);
85 va_end(args);
86 }
87 EXPORT_SYMBOL(ath11k_warn);
88
89 #ifdef CONFIG_ATH11K_DEBUG
90
__ath11k_dbg(struct ath11k_base * ab,enum ath11k_debug_mask mask,const char * fmt,...)91 void __ath11k_dbg(struct ath11k_base *ab, enum ath11k_debug_mask mask,
92 const char *fmt, ...)
93 {
94 struct va_format vaf;
95 va_list args;
96
97 va_start(args, fmt);
98
99 vaf.fmt = fmt;
100 vaf.va = &args;
101
102 if (ath11k_debug_mask & mask)
103 #if defined(__linux__)
104 dev_printk(KERN_DEBUG, ab->dev, "%s %pV", ath11k_dbg_str(mask), &vaf);
105 #elif defined(__FreeBSD__)
106 {
107 char *str;
108 vasprintf(&str, M_KMALLOC, fmt, args);
109 dev_printk(KERN_DEBUG, ab->dev, "%s %s", ath11k_dbg_str(mask), str);
110 free(str, M_KMALLOC);
111 }
112 #endif
113
114 trace_ath11k_log_dbg(ab, mask, &vaf);
115
116 va_end(args);
117 }
118 EXPORT_SYMBOL(__ath11k_dbg);
119
ath11k_dbg_dump(struct ath11k_base * ab,enum ath11k_debug_mask mask,const char * msg,const char * prefix,const void * buf,size_t len)120 void ath11k_dbg_dump(struct ath11k_base *ab,
121 enum ath11k_debug_mask mask,
122 const char *msg, const char *prefix,
123 const void *buf, size_t len)
124 {
125 #if defined(__linux__)
126 char linebuf[256];
127 size_t linebuflen;
128 const void *ptr;
129 #elif defined(__FreeBSD__)
130 struct sbuf *sb;
131 int rc;
132 #endif
133
134 if (ath11k_debug_mask & mask) {
135 if (msg)
136 __ath11k_dbg(ab, mask, "%s\n", msg);
137
138 #if defined(__linux__)
139 for (ptr = buf; (ptr - buf) < len; ptr += 16) {
140 linebuflen = 0;
141 linebuflen += scnprintf(linebuf + linebuflen,
142 sizeof(linebuf) - linebuflen,
143 "%s%08x: ",
144 (prefix ? prefix : ""),
145 (unsigned int)(ptr - buf));
146 hex_dump_to_buffer(ptr, len - (ptr - buf), 16, 1,
147 linebuf + linebuflen,
148 sizeof(linebuf) - linebuflen, true);
149 dev_printk(KERN_DEBUG, ab->dev, "%s\n", linebuf);
150 }
151 #elif defined(__FreeBSD__)
152 sb = sbuf_new_auto();
153 if (sb == NULL)
154 goto trace;
155
156 sbuf_hexdump(sb, buf, len, prefix, 0);
157 sbuf_trim(sb);
158 rc = sbuf_finish(sb);
159 if (rc == 0)
160 dev_printk(KERN_DEBUG, ab->dev, "%s\n", sbuf_data(sb));
161 sbuf_delete(sb);
162 trace: ;
163 #endif
164 }
165
166 /* tracing code doesn't like null strings */
167 trace_ath11k_log_dbg_dump(ab, msg ? msg : "", prefix ? prefix : "",
168 buf, len);
169 }
170 EXPORT_SYMBOL(ath11k_dbg_dump);
171
172 #endif /* CONFIG_ATH11K_DEBUG */
173