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_)
24static 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, ...) \
38static 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, ...) \
43static 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
51DECLARE_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
75DEFINE_EVENT(ath10k_log_event, ath10k_log_err,
76	     TP_PROTO(struct ath10k *ar, struct va_format *vaf),
77	     TP_ARGS(ar, vaf)
78);
79
80DEFINE_EVENT(ath10k_log_event, ath10k_log_warn,
81	     TP_PROTO(struct ath10k *ar, struct va_format *vaf),
82	     TP_ARGS(ar, vaf)
83);
84
85DEFINE_EVENT(ath10k_log_event, ath10k_log_info,
86	     TP_PROTO(struct ath10k *ar, struct va_format *vaf),
87	     TP_ARGS(ar, vaf)
88);
89
90TRACE_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
116TRACE_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
149TRACE_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
183TRACE_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
213TRACE_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
240TRACE_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
267TRACE_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
294TRACE_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
329TRACE_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
354DECLARE_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
381DECLARE_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
409DEFINE_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
414DEFINE_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
419DEFINE_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
424DEFINE_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
429TRACE_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
456TRACE_EVENT(ath10k_wmi_diag_container,
457	    TP_PROTO(struct ath10k *ar,
458		     u8 type,
459		     u32 timestamp,
460		     u32 code,
461		     u16 len,
462		     const void *data),
463
464	TP_ARGS(ar, type, timestamp, code, len, data),
465
466	TP_STRUCT__entry(
467		__string(device, dev_name(ar->dev))
468		__string(driver, dev_driver_string(ar->dev))
469		__field(u8, type)
470		__field(u32, timestamp)
471		__field(u32, code)
472		__field(u16, len)
473		__dynamic_array(u8, data, len)
474	),
475
476	TP_fast_assign(
477		__assign_str(device, dev_name(ar->dev));
478		__assign_str(driver, dev_driver_string(ar->dev));
479		__entry->type = type;
480		__entry->timestamp = timestamp;
481		__entry->code = code;
482		__entry->len = len;
483		memcpy(__get_dynamic_array(data), data, len);
484	),
485
486	TP_printk(
487		"%s %s diag container type %hhu timestamp %u code %u len %d",
488		__get_str(driver),
489		__get_str(device),
490		__entry->type,
491		__entry->timestamp,
492		__entry->code,
493		__entry->len
494	)
495);
496
497TRACE_EVENT(ath10k_wmi_diag,
498	    TP_PROTO(struct ath10k *ar, const void *data, size_t len),
499
500	TP_ARGS(ar, data, len),
501
502	TP_STRUCT__entry(
503		__string(device, dev_name(ar->dev))
504		__string(driver, dev_driver_string(ar->dev))
505		__field(u16, len)
506		__dynamic_array(u8, data, len)
507	),
508
509	TP_fast_assign(
510		__assign_str(device, dev_name(ar->dev));
511		__assign_str(driver, dev_driver_string(ar->dev));
512		__entry->len = len;
513		memcpy(__get_dynamic_array(data), data, len);
514	),
515
516	TP_printk(
517		"%s %s tlv diag len %d",
518		__get_str(driver),
519		__get_str(device),
520		__entry->len
521	)
522);
523
524#endif /* _TRACE_H_ || TRACE_HEADER_MULTI_READ*/
525
526/* we don't want to use include/trace/events */
527#undef TRACE_INCLUDE_PATH
528#define TRACE_INCLUDE_PATH .
529#undef TRACE_INCLUDE_FILE
530#define TRACE_INCLUDE_FILE trace
531
532/* This part must be outside protection */
533#include <trace/define_trace.h>
534