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, ...) \
18 static inline void trace_ ## name(proto) {} \
19 static 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, ...) \
28 static 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 
36 TRACE_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 
67 TRACE_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 
94 TRACE_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 
124 DECLARE_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 
145 DEFINE_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 
150 DEFINE_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 
155 DEFINE_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 
160 TRACE_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 
190 TRACE_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 
220 TRACE_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 
249 TRACE_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 
282 TRACE_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 
309 TRACE_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