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

source code of linux/drivers/net/wireless/ath/ath11k/trace.h