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