1*4882a593Smuzhiyun /* SPDX-License-Identifier: ISC */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (c) 2005-2011 Atheros Communications Inc.
4*4882a593Smuzhiyun * Copyright (c) 2011-2016 Qualcomm Atheros, Inc.
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun #if !defined(_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ)
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include <linux/tracepoint.h>
10*4882a593Smuzhiyun #include "core.h"
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun #if !defined(_TRACE_H_)
ath10k_frm_hdr_len(const void * buf,size_t len)13*4882a593Smuzhiyun static inline u32 ath10k_frm_hdr_len(const void *buf, size_t len)
14*4882a593Smuzhiyun {
15*4882a593Smuzhiyun const struct ieee80211_hdr *hdr = buf;
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun /* In some rare cases (e.g. fcs error) device reports frame buffer
18*4882a593Smuzhiyun * shorter than what frame header implies (e.g. len = 0). The buffer
19*4882a593Smuzhiyun * can still be accessed so do a simple min() to guarantee caller
20*4882a593Smuzhiyun * doesn't get value greater than len.
21*4882a593Smuzhiyun */
22*4882a593Smuzhiyun return min_t(u32, len, ieee80211_hdrlen(hdr->frame_control));
23*4882a593Smuzhiyun }
24*4882a593Smuzhiyun #endif
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun #define _TRACE_H_
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun /* create empty functions when tracing is disabled */
29*4882a593Smuzhiyun #if !defined(CONFIG_ATH10K_TRACING)
30*4882a593Smuzhiyun #undef TRACE_EVENT
31*4882a593Smuzhiyun #define TRACE_EVENT(name, proto, ...) \
32*4882a593Smuzhiyun static inline void trace_ ## name(proto) {} \
33*4882a593Smuzhiyun static inline bool trace_##name##_enabled(void) \
34*4882a593Smuzhiyun { \
35*4882a593Smuzhiyun return false; \
36*4882a593Smuzhiyun }
37*4882a593Smuzhiyun #undef DECLARE_EVENT_CLASS
38*4882a593Smuzhiyun #define DECLARE_EVENT_CLASS(...)
39*4882a593Smuzhiyun #undef DEFINE_EVENT
40*4882a593Smuzhiyun #define DEFINE_EVENT(evt_class, name, proto, ...) \
41*4882a593Smuzhiyun static inline void trace_ ## name(proto) {}
42*4882a593Smuzhiyun #endif /* !CONFIG_ATH10K_TRACING || __CHECKER__ */
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun #undef TRACE_SYSTEM
45*4882a593Smuzhiyun #define TRACE_SYSTEM ath10k
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun #define ATH10K_MSG_MAX 400
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun DECLARE_EVENT_CLASS(ath10k_log_event,
50*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar, struct va_format *vaf),
51*4882a593Smuzhiyun TP_ARGS(ar, vaf),
52*4882a593Smuzhiyun TP_STRUCT__entry(
53*4882a593Smuzhiyun __string(device, dev_name(ar->dev))
54*4882a593Smuzhiyun __string(driver, dev_driver_string(ar->dev))
55*4882a593Smuzhiyun __dynamic_array(char, msg, ATH10K_MSG_MAX)
56*4882a593Smuzhiyun ),
57*4882a593Smuzhiyun TP_fast_assign(
58*4882a593Smuzhiyun __assign_str(device, dev_name(ar->dev));
59*4882a593Smuzhiyun __assign_str(driver, dev_driver_string(ar->dev));
60*4882a593Smuzhiyun WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
61*4882a593Smuzhiyun ATH10K_MSG_MAX,
62*4882a593Smuzhiyun vaf->fmt,
63*4882a593Smuzhiyun *vaf->va) >= ATH10K_MSG_MAX);
64*4882a593Smuzhiyun ),
65*4882a593Smuzhiyun TP_printk(
66*4882a593Smuzhiyun "%s %s %s",
67*4882a593Smuzhiyun __get_str(driver),
68*4882a593Smuzhiyun __get_str(device),
69*4882a593Smuzhiyun __get_str(msg)
70*4882a593Smuzhiyun )
71*4882a593Smuzhiyun );
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun DEFINE_EVENT(ath10k_log_event, ath10k_log_err,
74*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar, struct va_format *vaf),
75*4882a593Smuzhiyun TP_ARGS(ar, vaf)
76*4882a593Smuzhiyun );
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun DEFINE_EVENT(ath10k_log_event, ath10k_log_warn,
79*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar, struct va_format *vaf),
80*4882a593Smuzhiyun TP_ARGS(ar, vaf)
81*4882a593Smuzhiyun );
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun DEFINE_EVENT(ath10k_log_event, ath10k_log_info,
84*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar, struct va_format *vaf),
85*4882a593Smuzhiyun TP_ARGS(ar, vaf)
86*4882a593Smuzhiyun );
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun TRACE_EVENT(ath10k_log_dbg,
89*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar, unsigned int level, struct va_format *vaf),
90*4882a593Smuzhiyun TP_ARGS(ar, level, vaf),
91*4882a593Smuzhiyun TP_STRUCT__entry(
92*4882a593Smuzhiyun __string(device, dev_name(ar->dev))
93*4882a593Smuzhiyun __string(driver, dev_driver_string(ar->dev))
94*4882a593Smuzhiyun __field(unsigned int, level)
95*4882a593Smuzhiyun __dynamic_array(char, msg, ATH10K_MSG_MAX)
96*4882a593Smuzhiyun ),
97*4882a593Smuzhiyun TP_fast_assign(
98*4882a593Smuzhiyun __assign_str(device, dev_name(ar->dev));
99*4882a593Smuzhiyun __assign_str(driver, dev_driver_string(ar->dev));
100*4882a593Smuzhiyun __entry->level = level;
101*4882a593Smuzhiyun WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
102*4882a593Smuzhiyun ATH10K_MSG_MAX,
103*4882a593Smuzhiyun vaf->fmt,
104*4882a593Smuzhiyun *vaf->va) >= ATH10K_MSG_MAX);
105*4882a593Smuzhiyun ),
106*4882a593Smuzhiyun TP_printk(
107*4882a593Smuzhiyun "%s %s %s",
108*4882a593Smuzhiyun __get_str(driver),
109*4882a593Smuzhiyun __get_str(device),
110*4882a593Smuzhiyun __get_str(msg)
111*4882a593Smuzhiyun )
112*4882a593Smuzhiyun );
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun TRACE_EVENT(ath10k_log_dbg_dump,
115*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar, const char *msg, const char *prefix,
116*4882a593Smuzhiyun const void *buf, size_t buf_len),
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun TP_ARGS(ar, msg, prefix, buf, buf_len),
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun TP_STRUCT__entry(
121*4882a593Smuzhiyun __string(device, dev_name(ar->dev))
122*4882a593Smuzhiyun __string(driver, dev_driver_string(ar->dev))
123*4882a593Smuzhiyun __string(msg, msg)
124*4882a593Smuzhiyun __string(prefix, prefix)
125*4882a593Smuzhiyun __field(size_t, buf_len)
126*4882a593Smuzhiyun __dynamic_array(u8, buf, buf_len)
127*4882a593Smuzhiyun ),
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun TP_fast_assign(
130*4882a593Smuzhiyun __assign_str(device, dev_name(ar->dev));
131*4882a593Smuzhiyun __assign_str(driver, dev_driver_string(ar->dev));
132*4882a593Smuzhiyun __assign_str(msg, msg);
133*4882a593Smuzhiyun __assign_str(prefix, prefix);
134*4882a593Smuzhiyun __entry->buf_len = buf_len;
135*4882a593Smuzhiyun memcpy(__get_dynamic_array(buf), buf, buf_len);
136*4882a593Smuzhiyun ),
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun TP_printk(
139*4882a593Smuzhiyun "%s %s %s/%s\n",
140*4882a593Smuzhiyun __get_str(driver),
141*4882a593Smuzhiyun __get_str(device),
142*4882a593Smuzhiyun __get_str(prefix),
143*4882a593Smuzhiyun __get_str(msg)
144*4882a593Smuzhiyun )
145*4882a593Smuzhiyun );
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun TRACE_EVENT(ath10k_wmi_cmd,
148*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar, int id, const void *buf, size_t buf_len),
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun TP_ARGS(ar, id, buf, buf_len),
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun TP_STRUCT__entry(
153*4882a593Smuzhiyun __string(device, dev_name(ar->dev))
154*4882a593Smuzhiyun __string(driver, dev_driver_string(ar->dev))
155*4882a593Smuzhiyun __field(unsigned int, id)
156*4882a593Smuzhiyun __field(size_t, buf_len)
157*4882a593Smuzhiyun __dynamic_array(u8, buf, buf_len)
158*4882a593Smuzhiyun ),
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun TP_fast_assign(
161*4882a593Smuzhiyun __assign_str(device, dev_name(ar->dev));
162*4882a593Smuzhiyun __assign_str(driver, dev_driver_string(ar->dev));
163*4882a593Smuzhiyun __entry->id = id;
164*4882a593Smuzhiyun __entry->buf_len = buf_len;
165*4882a593Smuzhiyun memcpy(__get_dynamic_array(buf), buf, buf_len);
166*4882a593Smuzhiyun ),
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun TP_printk(
169*4882a593Smuzhiyun "%s %s id %d len %zu",
170*4882a593Smuzhiyun __get_str(driver),
171*4882a593Smuzhiyun __get_str(device),
172*4882a593Smuzhiyun __entry->id,
173*4882a593Smuzhiyun __entry->buf_len
174*4882a593Smuzhiyun )
175*4882a593Smuzhiyun );
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun TRACE_EVENT(ath10k_wmi_event,
178*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar, int id, const void *buf, size_t buf_len),
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun TP_ARGS(ar, id, buf, buf_len),
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun TP_STRUCT__entry(
183*4882a593Smuzhiyun __string(device, dev_name(ar->dev))
184*4882a593Smuzhiyun __string(driver, dev_driver_string(ar->dev))
185*4882a593Smuzhiyun __field(unsigned int, id)
186*4882a593Smuzhiyun __field(size_t, buf_len)
187*4882a593Smuzhiyun __dynamic_array(u8, buf, buf_len)
188*4882a593Smuzhiyun ),
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun TP_fast_assign(
191*4882a593Smuzhiyun __assign_str(device, dev_name(ar->dev));
192*4882a593Smuzhiyun __assign_str(driver, dev_driver_string(ar->dev));
193*4882a593Smuzhiyun __entry->id = id;
194*4882a593Smuzhiyun __entry->buf_len = buf_len;
195*4882a593Smuzhiyun memcpy(__get_dynamic_array(buf), buf, buf_len);
196*4882a593Smuzhiyun ),
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun TP_printk(
199*4882a593Smuzhiyun "%s %s id %d len %zu",
200*4882a593Smuzhiyun __get_str(driver),
201*4882a593Smuzhiyun __get_str(device),
202*4882a593Smuzhiyun __entry->id,
203*4882a593Smuzhiyun __entry->buf_len
204*4882a593Smuzhiyun )
205*4882a593Smuzhiyun );
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun TRACE_EVENT(ath10k_htt_stats,
208*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar, const void *buf, size_t buf_len),
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun TP_ARGS(ar, buf, buf_len),
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun TP_STRUCT__entry(
213*4882a593Smuzhiyun __string(device, dev_name(ar->dev))
214*4882a593Smuzhiyun __string(driver, dev_driver_string(ar->dev))
215*4882a593Smuzhiyun __field(size_t, buf_len)
216*4882a593Smuzhiyun __dynamic_array(u8, buf, buf_len)
217*4882a593Smuzhiyun ),
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun TP_fast_assign(
220*4882a593Smuzhiyun __assign_str(device, dev_name(ar->dev));
221*4882a593Smuzhiyun __assign_str(driver, dev_driver_string(ar->dev));
222*4882a593Smuzhiyun __entry->buf_len = buf_len;
223*4882a593Smuzhiyun memcpy(__get_dynamic_array(buf), buf, buf_len);
224*4882a593Smuzhiyun ),
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun TP_printk(
227*4882a593Smuzhiyun "%s %s len %zu",
228*4882a593Smuzhiyun __get_str(driver),
229*4882a593Smuzhiyun __get_str(device),
230*4882a593Smuzhiyun __entry->buf_len
231*4882a593Smuzhiyun )
232*4882a593Smuzhiyun );
233*4882a593Smuzhiyun
234*4882a593Smuzhiyun TRACE_EVENT(ath10k_wmi_dbglog,
235*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar, const void *buf, size_t buf_len),
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun TP_ARGS(ar, buf, buf_len),
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun TP_STRUCT__entry(
240*4882a593Smuzhiyun __string(device, dev_name(ar->dev))
241*4882a593Smuzhiyun __string(driver, dev_driver_string(ar->dev))
242*4882a593Smuzhiyun __field(u8, hw_type)
243*4882a593Smuzhiyun __field(size_t, buf_len)
244*4882a593Smuzhiyun __dynamic_array(u8, buf, buf_len)
245*4882a593Smuzhiyun ),
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun TP_fast_assign(
248*4882a593Smuzhiyun __assign_str(device, dev_name(ar->dev));
249*4882a593Smuzhiyun __assign_str(driver, dev_driver_string(ar->dev));
250*4882a593Smuzhiyun __entry->hw_type = ar->hw_rev;
251*4882a593Smuzhiyun __entry->buf_len = buf_len;
252*4882a593Smuzhiyun memcpy(__get_dynamic_array(buf), buf, buf_len);
253*4882a593Smuzhiyun ),
254*4882a593Smuzhiyun
255*4882a593Smuzhiyun TP_printk(
256*4882a593Smuzhiyun "%s %s %d len %zu",
257*4882a593Smuzhiyun __get_str(driver),
258*4882a593Smuzhiyun __get_str(device),
259*4882a593Smuzhiyun __entry->hw_type,
260*4882a593Smuzhiyun __entry->buf_len
261*4882a593Smuzhiyun )
262*4882a593Smuzhiyun );
263*4882a593Smuzhiyun
264*4882a593Smuzhiyun TRACE_EVENT(ath10k_htt_pktlog,
265*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar, const void *buf, u16 buf_len),
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun TP_ARGS(ar, buf, buf_len),
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun TP_STRUCT__entry(
270*4882a593Smuzhiyun __string(device, dev_name(ar->dev))
271*4882a593Smuzhiyun __string(driver, dev_driver_string(ar->dev))
272*4882a593Smuzhiyun __field(u8, hw_type)
273*4882a593Smuzhiyun __field(u16, buf_len)
274*4882a593Smuzhiyun __dynamic_array(u8, pktlog, buf_len)
275*4882a593Smuzhiyun ),
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun TP_fast_assign(
278*4882a593Smuzhiyun __assign_str(device, dev_name(ar->dev));
279*4882a593Smuzhiyun __assign_str(driver, dev_driver_string(ar->dev));
280*4882a593Smuzhiyun __entry->hw_type = ar->hw_rev;
281*4882a593Smuzhiyun __entry->buf_len = buf_len;
282*4882a593Smuzhiyun memcpy(__get_dynamic_array(pktlog), buf, buf_len);
283*4882a593Smuzhiyun ),
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun TP_printk(
286*4882a593Smuzhiyun "%s %s %d size %hu",
287*4882a593Smuzhiyun __get_str(driver),
288*4882a593Smuzhiyun __get_str(device),
289*4882a593Smuzhiyun __entry->hw_type,
290*4882a593Smuzhiyun __entry->buf_len
291*4882a593Smuzhiyun )
292*4882a593Smuzhiyun );
293*4882a593Smuzhiyun
294*4882a593Smuzhiyun TRACE_EVENT(ath10k_htt_tx,
295*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar, u16 msdu_id, u16 msdu_len,
296*4882a593Smuzhiyun u8 vdev_id, u8 tid),
297*4882a593Smuzhiyun
298*4882a593Smuzhiyun TP_ARGS(ar, msdu_id, msdu_len, vdev_id, tid),
299*4882a593Smuzhiyun
300*4882a593Smuzhiyun TP_STRUCT__entry(
301*4882a593Smuzhiyun __string(device, dev_name(ar->dev))
302*4882a593Smuzhiyun __string(driver, dev_driver_string(ar->dev))
303*4882a593Smuzhiyun __field(u16, msdu_id)
304*4882a593Smuzhiyun __field(u16, msdu_len)
305*4882a593Smuzhiyun __field(u8, vdev_id)
306*4882a593Smuzhiyun __field(u8, tid)
307*4882a593Smuzhiyun ),
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun TP_fast_assign(
310*4882a593Smuzhiyun __assign_str(device, dev_name(ar->dev));
311*4882a593Smuzhiyun __assign_str(driver, dev_driver_string(ar->dev));
312*4882a593Smuzhiyun __entry->msdu_id = msdu_id;
313*4882a593Smuzhiyun __entry->msdu_len = msdu_len;
314*4882a593Smuzhiyun __entry->vdev_id = vdev_id;
315*4882a593Smuzhiyun __entry->tid = tid;
316*4882a593Smuzhiyun ),
317*4882a593Smuzhiyun
318*4882a593Smuzhiyun TP_printk(
319*4882a593Smuzhiyun "%s %s msdu_id %d msdu_len %d vdev_id %d tid %d",
320*4882a593Smuzhiyun __get_str(driver),
321*4882a593Smuzhiyun __get_str(device),
322*4882a593Smuzhiyun __entry->msdu_id,
323*4882a593Smuzhiyun __entry->msdu_len,
324*4882a593Smuzhiyun __entry->vdev_id,
325*4882a593Smuzhiyun __entry->tid
326*4882a593Smuzhiyun )
327*4882a593Smuzhiyun );
328*4882a593Smuzhiyun
329*4882a593Smuzhiyun TRACE_EVENT(ath10k_txrx_tx_unref,
330*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar, u16 msdu_id),
331*4882a593Smuzhiyun
332*4882a593Smuzhiyun TP_ARGS(ar, msdu_id),
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun TP_STRUCT__entry(
335*4882a593Smuzhiyun __string(device, dev_name(ar->dev))
336*4882a593Smuzhiyun __string(driver, dev_driver_string(ar->dev))
337*4882a593Smuzhiyun __field(u16, msdu_id)
338*4882a593Smuzhiyun ),
339*4882a593Smuzhiyun
340*4882a593Smuzhiyun TP_fast_assign(
341*4882a593Smuzhiyun __assign_str(device, dev_name(ar->dev));
342*4882a593Smuzhiyun __assign_str(driver, dev_driver_string(ar->dev));
343*4882a593Smuzhiyun __entry->msdu_id = msdu_id;
344*4882a593Smuzhiyun ),
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun TP_printk(
347*4882a593Smuzhiyun "%s %s msdu_id %d",
348*4882a593Smuzhiyun __get_str(driver),
349*4882a593Smuzhiyun __get_str(device),
350*4882a593Smuzhiyun __entry->msdu_id
351*4882a593Smuzhiyun )
352*4882a593Smuzhiyun );
353*4882a593Smuzhiyun
354*4882a593Smuzhiyun DECLARE_EVENT_CLASS(ath10k_hdr_event,
355*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar, const void *data, size_t len),
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun TP_ARGS(ar, data, len),
358*4882a593Smuzhiyun
359*4882a593Smuzhiyun TP_STRUCT__entry(
360*4882a593Smuzhiyun __string(device, dev_name(ar->dev))
361*4882a593Smuzhiyun __string(driver, dev_driver_string(ar->dev))
362*4882a593Smuzhiyun __field(size_t, len)
363*4882a593Smuzhiyun __dynamic_array(u8, data, ath10k_frm_hdr_len(data, len))
364*4882a593Smuzhiyun ),
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun TP_fast_assign(
367*4882a593Smuzhiyun __assign_str(device, dev_name(ar->dev));
368*4882a593Smuzhiyun __assign_str(driver, dev_driver_string(ar->dev));
369*4882a593Smuzhiyun __entry->len = ath10k_frm_hdr_len(data, len);
370*4882a593Smuzhiyun memcpy(__get_dynamic_array(data), data, __entry->len);
371*4882a593Smuzhiyun ),
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun TP_printk(
374*4882a593Smuzhiyun "%s %s len %zu\n",
375*4882a593Smuzhiyun __get_str(driver),
376*4882a593Smuzhiyun __get_str(device),
377*4882a593Smuzhiyun __entry->len
378*4882a593Smuzhiyun )
379*4882a593Smuzhiyun );
380*4882a593Smuzhiyun
381*4882a593Smuzhiyun DECLARE_EVENT_CLASS(ath10k_payload_event,
382*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar, const void *data, size_t len),
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun TP_ARGS(ar, data, len),
385*4882a593Smuzhiyun
386*4882a593Smuzhiyun TP_STRUCT__entry(
387*4882a593Smuzhiyun __string(device, dev_name(ar->dev))
388*4882a593Smuzhiyun __string(driver, dev_driver_string(ar->dev))
389*4882a593Smuzhiyun __field(size_t, len)
390*4882a593Smuzhiyun __dynamic_array(u8, payload, (len -
391*4882a593Smuzhiyun ath10k_frm_hdr_len(data, len)))
392*4882a593Smuzhiyun ),
393*4882a593Smuzhiyun
394*4882a593Smuzhiyun TP_fast_assign(
395*4882a593Smuzhiyun __assign_str(device, dev_name(ar->dev));
396*4882a593Smuzhiyun __assign_str(driver, dev_driver_string(ar->dev));
397*4882a593Smuzhiyun __entry->len = len - ath10k_frm_hdr_len(data, len);
398*4882a593Smuzhiyun memcpy(__get_dynamic_array(payload),
399*4882a593Smuzhiyun data + ath10k_frm_hdr_len(data, len), __entry->len);
400*4882a593Smuzhiyun ),
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun TP_printk(
403*4882a593Smuzhiyun "%s %s len %zu\n",
404*4882a593Smuzhiyun __get_str(driver),
405*4882a593Smuzhiyun __get_str(device),
406*4882a593Smuzhiyun __entry->len
407*4882a593Smuzhiyun )
408*4882a593Smuzhiyun );
409*4882a593Smuzhiyun
410*4882a593Smuzhiyun DEFINE_EVENT(ath10k_hdr_event, ath10k_tx_hdr,
411*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar, const void *data, size_t len),
412*4882a593Smuzhiyun TP_ARGS(ar, data, len)
413*4882a593Smuzhiyun );
414*4882a593Smuzhiyun
415*4882a593Smuzhiyun DEFINE_EVENT(ath10k_payload_event, ath10k_tx_payload,
416*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar, const void *data, size_t len),
417*4882a593Smuzhiyun TP_ARGS(ar, data, len)
418*4882a593Smuzhiyun );
419*4882a593Smuzhiyun
420*4882a593Smuzhiyun DEFINE_EVENT(ath10k_hdr_event, ath10k_rx_hdr,
421*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar, const void *data, size_t len),
422*4882a593Smuzhiyun TP_ARGS(ar, data, len)
423*4882a593Smuzhiyun );
424*4882a593Smuzhiyun
425*4882a593Smuzhiyun DEFINE_EVENT(ath10k_payload_event, ath10k_rx_payload,
426*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar, const void *data, size_t len),
427*4882a593Smuzhiyun TP_ARGS(ar, data, len)
428*4882a593Smuzhiyun );
429*4882a593Smuzhiyun
430*4882a593Smuzhiyun TRACE_EVENT(ath10k_htt_rx_desc,
431*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar, const void *data, size_t len),
432*4882a593Smuzhiyun
433*4882a593Smuzhiyun TP_ARGS(ar, data, len),
434*4882a593Smuzhiyun
435*4882a593Smuzhiyun TP_STRUCT__entry(
436*4882a593Smuzhiyun __string(device, dev_name(ar->dev))
437*4882a593Smuzhiyun __string(driver, dev_driver_string(ar->dev))
438*4882a593Smuzhiyun __field(u8, hw_type)
439*4882a593Smuzhiyun __field(u16, len)
440*4882a593Smuzhiyun __dynamic_array(u8, rxdesc, len)
441*4882a593Smuzhiyun ),
442*4882a593Smuzhiyun
443*4882a593Smuzhiyun TP_fast_assign(
444*4882a593Smuzhiyun __assign_str(device, dev_name(ar->dev));
445*4882a593Smuzhiyun __assign_str(driver, dev_driver_string(ar->dev));
446*4882a593Smuzhiyun __entry->hw_type = ar->hw_rev;
447*4882a593Smuzhiyun __entry->len = len;
448*4882a593Smuzhiyun memcpy(__get_dynamic_array(rxdesc), data, len);
449*4882a593Smuzhiyun ),
450*4882a593Smuzhiyun
451*4882a593Smuzhiyun TP_printk(
452*4882a593Smuzhiyun "%s %s %d rxdesc len %d",
453*4882a593Smuzhiyun __get_str(driver),
454*4882a593Smuzhiyun __get_str(device),
455*4882a593Smuzhiyun __entry->hw_type,
456*4882a593Smuzhiyun __entry->len
457*4882a593Smuzhiyun )
458*4882a593Smuzhiyun );
459*4882a593Smuzhiyun
460*4882a593Smuzhiyun TRACE_EVENT(ath10k_wmi_diag_container,
461*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar,
462*4882a593Smuzhiyun u8 type,
463*4882a593Smuzhiyun u32 timestamp,
464*4882a593Smuzhiyun u32 code,
465*4882a593Smuzhiyun u16 len,
466*4882a593Smuzhiyun const void *data),
467*4882a593Smuzhiyun
468*4882a593Smuzhiyun TP_ARGS(ar, type, timestamp, code, len, data),
469*4882a593Smuzhiyun
470*4882a593Smuzhiyun TP_STRUCT__entry(
471*4882a593Smuzhiyun __string(device, dev_name(ar->dev))
472*4882a593Smuzhiyun __string(driver, dev_driver_string(ar->dev))
473*4882a593Smuzhiyun __field(u8, type)
474*4882a593Smuzhiyun __field(u32, timestamp)
475*4882a593Smuzhiyun __field(u32, code)
476*4882a593Smuzhiyun __field(u16, len)
477*4882a593Smuzhiyun __dynamic_array(u8, data, len)
478*4882a593Smuzhiyun ),
479*4882a593Smuzhiyun
480*4882a593Smuzhiyun TP_fast_assign(
481*4882a593Smuzhiyun __assign_str(device, dev_name(ar->dev));
482*4882a593Smuzhiyun __assign_str(driver, dev_driver_string(ar->dev));
483*4882a593Smuzhiyun __entry->type = type;
484*4882a593Smuzhiyun __entry->timestamp = timestamp;
485*4882a593Smuzhiyun __entry->code = code;
486*4882a593Smuzhiyun __entry->len = len;
487*4882a593Smuzhiyun memcpy(__get_dynamic_array(data), data, len);
488*4882a593Smuzhiyun ),
489*4882a593Smuzhiyun
490*4882a593Smuzhiyun TP_printk(
491*4882a593Smuzhiyun "%s %s diag container type %hhu timestamp %u code %u len %d",
492*4882a593Smuzhiyun __get_str(driver),
493*4882a593Smuzhiyun __get_str(device),
494*4882a593Smuzhiyun __entry->type,
495*4882a593Smuzhiyun __entry->timestamp,
496*4882a593Smuzhiyun __entry->code,
497*4882a593Smuzhiyun __entry->len
498*4882a593Smuzhiyun )
499*4882a593Smuzhiyun );
500*4882a593Smuzhiyun
501*4882a593Smuzhiyun TRACE_EVENT(ath10k_wmi_diag,
502*4882a593Smuzhiyun TP_PROTO(struct ath10k *ar, const void *data, size_t len),
503*4882a593Smuzhiyun
504*4882a593Smuzhiyun TP_ARGS(ar, data, len),
505*4882a593Smuzhiyun
506*4882a593Smuzhiyun TP_STRUCT__entry(
507*4882a593Smuzhiyun __string(device, dev_name(ar->dev))
508*4882a593Smuzhiyun __string(driver, dev_driver_string(ar->dev))
509*4882a593Smuzhiyun __field(u16, len)
510*4882a593Smuzhiyun __dynamic_array(u8, data, len)
511*4882a593Smuzhiyun ),
512*4882a593Smuzhiyun
513*4882a593Smuzhiyun TP_fast_assign(
514*4882a593Smuzhiyun __assign_str(device, dev_name(ar->dev));
515*4882a593Smuzhiyun __assign_str(driver, dev_driver_string(ar->dev));
516*4882a593Smuzhiyun __entry->len = len;
517*4882a593Smuzhiyun memcpy(__get_dynamic_array(data), data, len);
518*4882a593Smuzhiyun ),
519*4882a593Smuzhiyun
520*4882a593Smuzhiyun TP_printk(
521*4882a593Smuzhiyun "%s %s tlv diag len %d",
522*4882a593Smuzhiyun __get_str(driver),
523*4882a593Smuzhiyun __get_str(device),
524*4882a593Smuzhiyun __entry->len
525*4882a593Smuzhiyun )
526*4882a593Smuzhiyun );
527*4882a593Smuzhiyun
528*4882a593Smuzhiyun #endif /* _TRACE_H_ || TRACE_HEADER_MULTI_READ*/
529*4882a593Smuzhiyun
530*4882a593Smuzhiyun /* we don't want to use include/trace/events */
531*4882a593Smuzhiyun #undef TRACE_INCLUDE_PATH
532*4882a593Smuzhiyun #define TRACE_INCLUDE_PATH .
533*4882a593Smuzhiyun #undef TRACE_INCLUDE_FILE
534*4882a593Smuzhiyun #define TRACE_INCLUDE_FILE trace
535*4882a593Smuzhiyun
536*4882a593Smuzhiyun /* This part must be outside protection */
537*4882a593Smuzhiyun #include <trace/define_trace.h>
538