xref: /freebsd/sys/contrib/dev/athk/ath11k/debug.c (revision 2cd31bd8fa687922d2a571ae53456ecd2e9ba095)
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 
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 
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 
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 
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 
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