1 /*
2  * Copyright (c) 2005-2011 Atheros Communications Inc.
3  * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 #if !defined(_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ)
19 
20 #include <linux/tracepoint.h>
21 #include "core.h"
22 
23 #if !defined(_TRACE_H_)
24 static inline u32 ath10k_frm_hdr_len(const void *buf)
25 {
26 	const struct ieee80211_hdr *hdr = buf;
27 
28 	return ieee80211_hdrlen(hdr->frame_control);
29 }
30 #endif
31 
32 #define _TRACE_H_
33 
34 /* create empty functions when tracing is disabled */
35 #if !defined(CONFIG_ATH10K_TRACING)
36 #undef TRACE_EVENT
37 #define TRACE_EVENT(name, proto, ...) \
38 static inline void trace_ ## name(proto) {}
39 #undef DECLARE_EVENT_CLASS
40 #define DECLARE_EVENT_CLASS(...)
41 #undef DEFINE_EVENT
42 #define DEFINE_EVENT(evt_class, name, proto, ...) \
43 static inline void trace_ ## name(proto) {}
44 #endif /* !CONFIG_ATH10K_TRACING || __CHECKER__ */
45 
46 #undef TRACE_SYSTEM
47 #define TRACE_SYSTEM ath10k
48 
49 #define ATH10K_MSG_MAX 200
50 
51 DECLARE_EVENT_CLASS(ath10k_log_event,
52 	TP_PROTO(struct ath10k *ar, struct va_format *vaf),
53 	TP_ARGS(ar, vaf),
54 	TP_STRUCT__entry(
55 		__string(device, dev_name(ar->dev))
56 		__string(driver, dev_driver_string(ar->dev))
57 		__dynamic_array(char, msg, ATH10K_MSG_MAX)
58 	),
59 	TP_fast_assign(
60 		__assign_str(device, dev_name(ar->dev));
61 		__assign_str(driver, dev_driver_string(ar->dev));
62 		WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
63 				       ATH10K_MSG_MAX,
64 				       vaf->fmt,
65 				       *vaf->va) >= ATH10K_MSG_MAX);
66 	),
67 	TP_printk(
68 		"%s %s %s",
69 		__get_str(driver),
70 		__get_str(device),
71 		__get_str(msg)
72 	)
73 );
74 
75 DEFINE_EVENT(ath10k_log_event, ath10k_log_err,
76 	     TP_PROTO(struct ath10k *ar, struct va_format *vaf),
77 	     TP_ARGS(ar, vaf)
78 );
79 
80 DEFINE_EVENT(ath10k_log_event, ath10k_log_warn,
81 	     TP_PROTO(struct ath10k *ar, struct va_format *vaf),
82 	     TP_ARGS(ar, vaf)
83 );
84 
85 DEFINE_EVENT(ath10k_log_event, ath10k_log_info,
86 	     TP_PROTO(struct ath10k *ar, struct va_format *vaf),
87 	     TP_ARGS(ar, vaf)
88 );
89 
90 TRACE_EVENT(ath10k_log_dbg,
91 	TP_PROTO(struct ath10k *ar, unsigned int level, struct va_format *vaf),
92 	TP_ARGS(ar, level, vaf),
93 	TP_STRUCT__entry(
94 		__string(device, dev_name(ar->dev))
95 		__string(driver, dev_driver_string(ar->dev))
96 		__field(unsigned int, level)
97 		__dynamic_array(char, msg, ATH10K_MSG_MAX)
98 	),
99 	TP_fast_assign(
100 		__assign_str(device, dev_name(ar->dev));
101 		__assign_str(driver, dev_driver_string(ar->dev));
102 		__entry->level = level;
103 		WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
104 				       ATH10K_MSG_MAX,
105 				       vaf->fmt,
106 				       *vaf->va) >= ATH10K_MSG_MAX);
107 	),
108 	TP_printk(
109 		"%s %s %s",
110 		__get_str(driver),
111 		__get_str(device),
112 		__get_str(msg)
113 	)
114 );
115 
116 TRACE_EVENT(ath10k_log_dbg_dump,
117 	TP_PROTO(struct ath10k *ar, const char *msg, const char *prefix,
118 		 const void *buf, size_t buf_len),
119 
120 	TP_ARGS(ar, msg, prefix, buf, buf_len),
121 
122 	TP_STRUCT__entry(
123 		__string(device, dev_name(ar->dev))
124 		__string(driver, dev_driver_string(ar->dev))
125 		__string(msg, msg)
126 		__string(prefix, prefix)
127 		__field(size_t, buf_len)
128 		__dynamic_array(u8, buf, buf_len)
129 	),
130 
131 	TP_fast_assign(
132 		__assign_str(device, dev_name(ar->dev));
133 		__assign_str(driver, dev_driver_string(ar->dev));
134 		__assign_str(msg, msg);
135 		__assign_str(prefix, prefix);
136 		__entry->buf_len = buf_len;
137 		memcpy(__get_dynamic_array(buf), buf, buf_len);
138 	),
139 
140 	TP_printk(
141 		"%s %s %s/%s\n",
142 		__get_str(driver),
143 		__get_str(device),
144 		__get_str(prefix),
145 		__get_str(msg)
146 	)
147 );
148 
149 TRACE_EVENT(ath10k_wmi_cmd,
150 	TP_PROTO(struct ath10k *ar, int id, const void *buf, size_t buf_len,
151 		 int ret),
152 
153 	TP_ARGS(ar, id, buf, buf_len, ret),
154 
155 	TP_STRUCT__entry(
156 		__string(device, dev_name(ar->dev))
157 		__string(driver, dev_driver_string(ar->dev))
158 		__field(unsigned int, id)
159 		__field(size_t, buf_len)
160 		__dynamic_array(u8, buf, buf_len)
161 		__field(int, ret)
162 	),
163 
164 	TP_fast_assign(
165 		__assign_str(device, dev_name(ar->dev));
166 		__assign_str(driver, dev_driver_string(ar->dev));
167 		__entry->id = id;
168 		__entry->buf_len = buf_len;
169 		__entry->ret = ret;
170 		memcpy(__get_dynamic_array(buf), buf, buf_len);
171 	),
172 
173 	TP_printk(
174 		"%s %s id %d len %zu ret %d",
175 		__get_str(driver),
176 		__get_str(device),
177 		__entry->id,
178 		__entry->buf_len,
179 		__entry->ret
180 	)
181 );
182 
183 TRACE_EVENT(ath10k_wmi_event,
184 	TP_PROTO(struct ath10k *ar, int id, const void *buf, size_t buf_len),
185 
186 	TP_ARGS(ar, id, buf, buf_len),
187 
188 	TP_STRUCT__entry(
189 		__string(device, dev_name(ar->dev))
190 		__string(driver, dev_driver_string(ar->dev))
191 		__field(unsigned int, id)
192 		__field(size_t, buf_len)
193 		__dynamic_array(u8, buf, buf_len)
194 	),
195 
196 	TP_fast_assign(
197 		__assign_str(device, dev_name(ar->dev));
198 		__assign_str(driver, dev_driver_string(ar->dev));
199 		__entry->id = id;
200 		__entry->buf_len = buf_len;
201 		memcpy(__get_dynamic_array(buf), buf, buf_len);
202 	),
203 
204 	TP_printk(
205 		"%s %s id %d len %zu",
206 		__get_str(driver),
207 		__get_str(device),
208 		__entry->id,
209 		__entry->buf_len
210 	)
211 );
212 
213 TRACE_EVENT(ath10k_htt_stats,
214 	TP_PROTO(struct ath10k *ar, const void *buf, size_t buf_len),
215 
216 	TP_ARGS(ar, buf, buf_len),
217 
218 	TP_STRUCT__entry(
219 		__string(device, dev_name(ar->dev))
220 		__string(driver, dev_driver_string(ar->dev))
221 		__field(size_t, buf_len)
222 		__dynamic_array(u8, buf, buf_len)
223 	),
224 
225 	TP_fast_assign(
226 		__assign_str(device, dev_name(ar->dev));
227 		__assign_str(driver, dev_driver_string(ar->dev));
228 		__entry->buf_len = buf_len;
229 		memcpy(__get_dynamic_array(buf), buf, buf_len);
230 	),
231 
232 	TP_printk(
233 		"%s %s len %zu",
234 		__get_str(driver),
235 		__get_str(device),
236 		__entry->buf_len
237 	)
238 );
239 
240 TRACE_EVENT(ath10k_wmi_dbglog,
241 	TP_PROTO(struct ath10k *ar, const void *buf, size_t buf_len),
242 
243 	TP_ARGS(ar, buf, buf_len),
244 
245 	TP_STRUCT__entry(
246 		__string(device, dev_name(ar->dev))
247 		__string(driver, dev_driver_string(ar->dev))
248 		__field(size_t, buf_len)
249 		__dynamic_array(u8, buf, buf_len)
250 	),
251 
252 	TP_fast_assign(
253 		__assign_str(device, dev_name(ar->dev));
254 		__assign_str(driver, dev_driver_string(ar->dev));
255 		__entry->buf_len = buf_len;
256 		memcpy(__get_dynamic_array(buf), buf, buf_len);
257 	),
258 
259 	TP_printk(
260 		"%s %s len %zu",
261 		__get_str(driver),
262 		__get_str(device),
263 		__entry->buf_len
264 	)
265 );
266 
267 TRACE_EVENT(ath10k_htt_pktlog,
268 	    TP_PROTO(struct ath10k *ar, const void *buf, u16 buf_len),
269 
270 	TP_ARGS(ar, buf, buf_len),
271 
272 	TP_STRUCT__entry(
273 		__string(device, dev_name(ar->dev))
274 		__string(driver, dev_driver_string(ar->dev))
275 		__field(u16, buf_len)
276 		__dynamic_array(u8, pktlog, buf_len)
277 	),
278 
279 	TP_fast_assign(
280 		__assign_str(device, dev_name(ar->dev));
281 		__assign_str(driver, dev_driver_string(ar->dev));
282 		__entry->buf_len = buf_len;
283 		memcpy(__get_dynamic_array(pktlog), buf, buf_len);
284 	),
285 
286 	TP_printk(
287 		"%s %s size %hu",
288 		__get_str(driver),
289 		__get_str(device),
290 		__entry->buf_len
291 	 )
292 );
293 
294 TRACE_EVENT(ath10k_htt_tx,
295 	    TP_PROTO(struct ath10k *ar, u16 msdu_id, u16 msdu_len,
296 		     u8 vdev_id, u8 tid),
297 
298 	TP_ARGS(ar, msdu_id, msdu_len, vdev_id, tid),
299 
300 	TP_STRUCT__entry(
301 		__string(device, dev_name(ar->dev))
302 		__string(driver, dev_driver_string(ar->dev))
303 		__field(u16, msdu_id)
304 		__field(u16, msdu_len)
305 		__field(u8, vdev_id)
306 		__field(u8, tid)
307 	),
308 
309 	TP_fast_assign(
310 		__assign_str(device, dev_name(ar->dev));
311 		__assign_str(driver, dev_driver_string(ar->dev));
312 		__entry->msdu_id = msdu_id;
313 		__entry->msdu_len = msdu_len;
314 		__entry->vdev_id = vdev_id;
315 		__entry->tid = tid;
316 	),
317 
318 	TP_printk(
319 		"%s %s msdu_id %d msdu_len %d vdev_id %d tid %d",
320 		__get_str(driver),
321 		__get_str(device),
322 		__entry->msdu_id,
323 		__entry->msdu_len,
324 		__entry->vdev_id,
325 		__entry->tid
326 	 )
327 );
328 
329 TRACE_EVENT(ath10k_txrx_tx_unref,
330 	    TP_PROTO(struct ath10k *ar, u16 msdu_id),
331 
332 	TP_ARGS(ar, msdu_id),
333 
334 	TP_STRUCT__entry(
335 		__string(device, dev_name(ar->dev))
336 		__string(driver, dev_driver_string(ar->dev))
337 		__field(u16, msdu_id)
338 	),
339 
340 	TP_fast_assign(
341 		__assign_str(device, dev_name(ar->dev));
342 		__assign_str(driver, dev_driver_string(ar->dev));
343 		__entry->msdu_id = msdu_id;
344 	),
345 
346 	TP_printk(
347 		"%s %s msdu_id %d",
348 		__get_str(driver),
349 		__get_str(device),
350 		__entry->msdu_id
351 	 )
352 );
353 
354 DECLARE_EVENT_CLASS(ath10k_hdr_event,
355 		    TP_PROTO(struct ath10k *ar, const void *data, size_t len),
356 
357 	TP_ARGS(ar, data, len),
358 
359 	TP_STRUCT__entry(
360 		__string(device, dev_name(ar->dev))
361 		__string(driver, dev_driver_string(ar->dev))
362 		__field(size_t, len)
363 		__dynamic_array(u8, data, ath10k_frm_hdr_len(data))
364 	),
365 
366 	TP_fast_assign(
367 		__assign_str(device, dev_name(ar->dev));
368 		__assign_str(driver, dev_driver_string(ar->dev));
369 		__entry->len = ath10k_frm_hdr_len(data);
370 		memcpy(__get_dynamic_array(data), data, __entry->len);
371 	),
372 
373 	TP_printk(
374 		"%s %s len %zu\n",
375 		__get_str(driver),
376 		__get_str(device),
377 		__entry->len
378 	)
379 );
380 
381 DECLARE_EVENT_CLASS(ath10k_payload_event,
382 		    TP_PROTO(struct ath10k *ar, const void *data, size_t len),
383 
384 	TP_ARGS(ar, data, len),
385 
386 	TP_STRUCT__entry(
387 		__string(device, dev_name(ar->dev))
388 		__string(driver, dev_driver_string(ar->dev))
389 		__field(size_t, len)
390 		__dynamic_array(u8, payload, (len - ath10k_frm_hdr_len(data)))
391 	),
392 
393 	TP_fast_assign(
394 		__assign_str(device, dev_name(ar->dev));
395 		__assign_str(driver, dev_driver_string(ar->dev));
396 		__entry->len = len - ath10k_frm_hdr_len(data);
397 		memcpy(__get_dynamic_array(payload),
398 		       data + ath10k_frm_hdr_len(data), __entry->len);
399 	),
400 
401 	TP_printk(
402 		"%s %s len %zu\n",
403 		__get_str(driver),
404 		__get_str(device),
405 		__entry->len
406 	)
407 );
408 
409 DEFINE_EVENT(ath10k_hdr_event, ath10k_tx_hdr,
410 	     TP_PROTO(struct ath10k *ar, const void *data, size_t len),
411 	     TP_ARGS(ar, data, len)
412 );
413 
414 DEFINE_EVENT(ath10k_payload_event, ath10k_tx_payload,
415 	     TP_PROTO(struct ath10k *ar, const void *data, size_t len),
416 	     TP_ARGS(ar, data, len)
417 );
418 
419 DEFINE_EVENT(ath10k_hdr_event, ath10k_rx_hdr,
420 	     TP_PROTO(struct ath10k *ar, const void *data, size_t len),
421 	     TP_ARGS(ar, data, len)
422 );
423 
424 DEFINE_EVENT(ath10k_payload_event, ath10k_rx_payload,
425 	     TP_PROTO(struct ath10k *ar, const void *data, size_t len),
426 	     TP_ARGS(ar, data, len)
427 );
428 
429 TRACE_EVENT(ath10k_htt_rx_desc,
430 	    TP_PROTO(struct ath10k *ar, const void *data, size_t len),
431 
432 	TP_ARGS(ar, data, len),
433 
434 	TP_STRUCT__entry(
435 		__string(device, dev_name(ar->dev))
436 		__string(driver, dev_driver_string(ar->dev))
437 		__field(u16, len)
438 		__dynamic_array(u8, rxdesc, len)
439 	),
440 
441 	TP_fast_assign(
442 		__assign_str(device, dev_name(ar->dev));
443 		__assign_str(driver, dev_driver_string(ar->dev));
444 		__entry->len = len;
445 		memcpy(__get_dynamic_array(rxdesc), data, len);
446 	),
447 
448 	TP_printk(
449 		"%s %s rxdesc len %d",
450 		__get_str(driver),
451 		__get_str(device),
452 		__entry->len
453 	 )
454 );
455 
456 #endif /* _TRACE_H_ || TRACE_HEADER_MULTI_READ*/
457 
458 /* we don't want to use include/trace/events */
459 #undef TRACE_INCLUDE_PATH
460 #define TRACE_INCLUDE_PATH .
461 #undef TRACE_INCLUDE_FILE
462 #define TRACE_INCLUDE_FILE trace
463 
464 /* This part must be outside protection */
465 #include <trace/define_trace.h>
466