1 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
2 /*
3  * Copyright (c) 2019 The Linux Foundation. All rights reserved.
4  */
5 
6 #if !defined(_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ)
7 
8 #include <linux/tracepoint.h>
9 #include "core.h"
10 
11 #define _TRACE_H_
12 
13 /* create empty functions when tracing is disabled */
14 #if !defined(CONFIG_ATH11K_TRACING)
15 #undef TRACE_EVENT
16 #define TRACE_EVENT(name, proto, ...) \
17 static inline void trace_ ## name(proto) {} \
18 static inline bool trace_##name##_enabled(void) \
19 {						\
20 	return false;				\
21 }
22 
23 #undef DECLARE_EVENT_CLASS
24 #define DECLARE_EVENT_CLASS(...)
25 #undef DEFINE_EVENT
26 #define DEFINE_EVENT(evt_class, name, proto, ...) \
27 static inline void trace_ ## name(proto) {}
28 #endif /* !CONFIG_ATH11K_TRACING || __CHECKER__ */
29 
30 #undef TRACE_SYSTEM
31 #define TRACE_SYSTEM ath11k
32 
33 #define ATH11K_MSG_MAX 400
34 
35 TRACE_EVENT(ath11k_htt_pktlog,
36 	    TP_PROTO(struct ath11k *ar, const void *buf, u16 buf_len,
37 		     u32 pktlog_checksum),
38 
39 	TP_ARGS(ar, buf, buf_len, pktlog_checksum),
40 
41 	TP_STRUCT__entry(
42 		__string(device, dev_name(ar->ab->dev))
43 		__string(driver, dev_driver_string(ar->ab->dev))
44 		__field(u16, buf_len)
45 		__field(u32, pktlog_checksum)
46 		__dynamic_array(u8, pktlog, buf_len)
47 	),
48 
49 	TP_fast_assign(
50 		__assign_str(device, dev_name(ar->ab->dev));
51 		__assign_str(driver, dev_driver_string(ar->ab->dev));
52 		__entry->buf_len = buf_len;
53 		__entry->pktlog_checksum = pktlog_checksum;
54 		memcpy(__get_dynamic_array(pktlog), buf, buf_len);
55 	),
56 
57 	TP_printk(
58 		"%s %s size %u pktlog_checksum %d",
59 		__get_str(driver),
60 		__get_str(device),
61 		__entry->buf_len,
62 		__entry->pktlog_checksum
63 	 )
64 );
65 
66 TRACE_EVENT(ath11k_htt_ppdu_stats,
67 	    TP_PROTO(struct ath11k *ar, const void *data, size_t len),
68 
69 	TP_ARGS(ar, data, len),
70 
71 	TP_STRUCT__entry(
72 		__string(device, dev_name(ar->ab->dev))
73 		__string(driver, dev_driver_string(ar->ab->dev))
74 		__field(u16, len)
75 		__dynamic_array(u8, ppdu, len)
76 	),
77 
78 	TP_fast_assign(
79 		__assign_str(device, dev_name(ar->ab->dev));
80 		__assign_str(driver, dev_driver_string(ar->ab->dev));
81 		__entry->len = len;
82 		memcpy(__get_dynamic_array(ppdu), data, len);
83 	),
84 
85 	TP_printk(
86 		"%s %s ppdu len %d",
87 		__get_str(driver),
88 		__get_str(device),
89 		__entry->len
90 	 )
91 );
92 
93 TRACE_EVENT(ath11k_htt_rxdesc,
94 	    TP_PROTO(struct ath11k *ar, const void *data, size_t log_type, size_t len),
95 
96 	TP_ARGS(ar, data, log_type, len),
97 
98 	TP_STRUCT__entry(
99 		__string(device, dev_name(ar->ab->dev))
100 		__string(driver, dev_driver_string(ar->ab->dev))
101 		__field(u16, len)
102 		__field(u16, log_type)
103 		__dynamic_array(u8, rxdesc, len)
104 	),
105 
106 	TP_fast_assign(
107 		__assign_str(device, dev_name(ar->ab->dev));
108 		__assign_str(driver, dev_driver_string(ar->ab->dev));
109 		__entry->len = len;
110 		__entry->log_type = log_type;
111 		memcpy(__get_dynamic_array(rxdesc), data, len);
112 	),
113 
114 	TP_printk(
115 		"%s %s rxdesc len %d type %d",
116 		__get_str(driver),
117 		__get_str(device),
118 		__entry->len,
119 		__entry->log_type
120 	 )
121 );
122 
123 DECLARE_EVENT_CLASS(ath11k_log_event,
124 		    TP_PROTO(struct ath11k_base *ab, struct va_format *vaf),
125 	TP_ARGS(ab, vaf),
126 	TP_STRUCT__entry(
127 		__string(device, dev_name(ab->dev))
128 		__string(driver, dev_driver_string(ab->dev))
129 		__dynamic_array(char, msg, ATH11K_MSG_MAX)
130 	),
131 	TP_fast_assign(
132 		__assign_str(device, dev_name(ab->dev));
133 		__assign_str(driver, dev_driver_string(ab->dev));
134 		WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
135 				       ATH11K_MSG_MAX,
136 				       vaf->fmt,
137 				       *vaf->va) >= ATH11K_MSG_MAX);
138 	),
139 	TP_printk(
140 		"%s %s %s",
141 		__get_str(driver),
142 		__get_str(device),
143 		__get_str(msg)
144 	)
145 );
146 
147 DEFINE_EVENT(ath11k_log_event, ath11k_log_err,
148 	     TP_PROTO(struct ath11k_base *ab, struct va_format *vaf),
149 	     TP_ARGS(ab, vaf)
150 );
151 
152 DEFINE_EVENT(ath11k_log_event, ath11k_log_warn,
153 	     TP_PROTO(struct ath11k_base *ab, struct va_format *vaf),
154 	     TP_ARGS(ab, vaf)
155 );
156 
157 DEFINE_EVENT(ath11k_log_event, ath11k_log_info,
158 	     TP_PROTO(struct ath11k_base *ab, struct va_format *vaf),
159 	     TP_ARGS(ab, vaf)
160 );
161 
162 TRACE_EVENT(ath11k_wmi_cmd,
163 	    TP_PROTO(struct ath11k_base *ab, int id, const void *buf, size_t buf_len),
164 
165 	TP_ARGS(ab, id, buf, buf_len),
166 
167 	TP_STRUCT__entry(
168 		__string(device, dev_name(ab->dev))
169 		__string(driver, dev_driver_string(ab->dev))
170 		__field(unsigned int, id)
171 		__field(size_t, buf_len)
172 		__dynamic_array(u8, buf, buf_len)
173 	),
174 
175 	TP_fast_assign(
176 		__assign_str(device, dev_name(ab->dev));
177 		__assign_str(driver, dev_driver_string(ab->dev));
178 		__entry->id = id;
179 		__entry->buf_len = buf_len;
180 		memcpy(__get_dynamic_array(buf), buf, buf_len);
181 	),
182 
183 	TP_printk(
184 		"%s %s id %d len %zu",
185 		__get_str(driver),
186 		__get_str(device),
187 		__entry->id,
188 		__entry->buf_len
189 	 )
190 );
191 
192 TRACE_EVENT(ath11k_wmi_event,
193 	    TP_PROTO(struct ath11k_base *ab, int id, const void *buf, size_t buf_len),
194 
195 	TP_ARGS(ab, id, buf, buf_len),
196 
197 	TP_STRUCT__entry(
198 		__string(device, dev_name(ab->dev))
199 		__string(driver, dev_driver_string(ab->dev))
200 		__field(unsigned int, id)
201 		__field(size_t, buf_len)
202 		__dynamic_array(u8, buf, buf_len)
203 	),
204 
205 	TP_fast_assign(
206 		__assign_str(device, dev_name(ab->dev));
207 		__assign_str(driver, dev_driver_string(ab->dev));
208 		__entry->id = id;
209 		__entry->buf_len = buf_len;
210 		memcpy(__get_dynamic_array(buf), buf, buf_len);
211 	),
212 
213 	TP_printk(
214 		"%s %s id %d len %zu",
215 		__get_str(driver),
216 		__get_str(device),
217 		__entry->id,
218 		__entry->buf_len
219 	)
220 );
221 
222 TRACE_EVENT(ath11k_log_dbg,
223 	    TP_PROTO(struct ath11k_base *ab, unsigned int level, struct va_format *vaf),
224 
225 	TP_ARGS(ab, level, vaf),
226 
227 	TP_STRUCT__entry(
228 		__string(device, dev_name(ab->dev))
229 		__string(driver, dev_driver_string(ab->dev))
230 		__field(unsigned int, level)
231 		__dynamic_array(char, msg, ATH11K_MSG_MAX)
232 	),
233 
234 	TP_fast_assign(
235 		__assign_str(device, dev_name(ab->dev));
236 		__assign_str(driver, dev_driver_string(ab->dev));
237 		__entry->level = level;
238 		WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
239 				       ATH11K_MSG_MAX, vaf->fmt,
240 				       *vaf->va) >= ATH11K_MSG_MAX);
241 	),
242 
243 	TP_printk(
244 		"%s %s %s",
245 		__get_str(driver),
246 		__get_str(device),
247 		__get_str(msg)
248 	)
249 );
250 
251 TRACE_EVENT(ath11k_log_dbg_dump,
252 	    TP_PROTO(struct ath11k_base *ab, const char *msg, const char *prefix,
253 		     const void *buf, size_t buf_len),
254 
255 	TP_ARGS(ab, msg, prefix, buf, buf_len),
256 
257 	TP_STRUCT__entry(
258 		__string(device, dev_name(ab->dev))
259 		__string(driver, dev_driver_string(ab->dev))
260 		__string(msg, msg)
261 		__string(prefix, prefix)
262 		__field(size_t, buf_len)
263 		__dynamic_array(u8, buf, buf_len)
264 	),
265 
266 	TP_fast_assign(
267 		__assign_str(device, dev_name(ab->dev));
268 		__assign_str(driver, dev_driver_string(ab->dev));
269 		__assign_str(msg, msg);
270 		__assign_str(prefix, prefix);
271 		__entry->buf_len = buf_len;
272 		memcpy(__get_dynamic_array(buf), buf, buf_len);
273 	),
274 
275 	TP_printk(
276 		"%s %s %s/%s\n",
277 		__get_str(driver),
278 		__get_str(device),
279 		__get_str(prefix),
280 		__get_str(msg)
281 	)
282 );
283 
284 TRACE_EVENT(ath11k_wmi_diag,
285 	    TP_PROTO(struct ath11k_base *ab, const void *data, size_t len),
286 
287 	TP_ARGS(ab, data, len),
288 
289 	TP_STRUCT__entry(
290 		__string(device, dev_name(ab->dev))
291 		__string(driver, dev_driver_string(ab->dev))
292 		__field(u16, len)
293 		__dynamic_array(u8, data, len)
294 	),
295 
296 	TP_fast_assign(
297 		__assign_str(device, dev_name(ab->dev));
298 		__assign_str(driver, dev_driver_string(ab->dev));
299 		__entry->len = len;
300 		memcpy(__get_dynamic_array(data), data, len);
301 	),
302 
303 	TP_printk(
304 		"%s %s tlv diag len %d",
305 		__get_str(driver),
306 		__get_str(device),
307 		__entry->len
308 	)
309 );
310 
311 #endif /* _TRACE_H_ || TRACE_HEADER_MULTI_READ*/
312 
313 /* we don't want to use include/trace/events */
314 #undef TRACE_INCLUDE_PATH
315 #define TRACE_INCLUDE_PATH .
316 #undef TRACE_INCLUDE_FILE
317 #define TRACE_INCLUDE_FILE trace
318 
319 /* This part must be outside protection */
320 #include <trace/define_trace.h>
321