GNU Linux-libre 4.14.290-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(u8, hw_type);
250                 __field(size_t, buf_len)
251                 __dynamic_array(u8, buf, buf_len)
252         ),
253
254         TP_fast_assign(
255                 __assign_str(device, dev_name(ar->dev));
256                 __assign_str(driver, dev_driver_string(ar->dev));
257                 __entry->hw_type = ar->hw_rev;
258                 __entry->buf_len = buf_len;
259                 memcpy(__get_dynamic_array(buf), buf, buf_len);
260         ),
261
262         TP_printk(
263                 "%s %s %d len %zu",
264                 __get_str(driver),
265                 __get_str(device),
266                 __entry->hw_type,
267                 __entry->buf_len
268         )
269 );
270
271 TRACE_EVENT(ath10k_htt_pktlog,
272             TP_PROTO(struct ath10k *ar, const void *buf, u16 buf_len),
273
274         TP_ARGS(ar, buf, buf_len),
275
276         TP_STRUCT__entry(
277                 __string(device, dev_name(ar->dev))
278                 __string(driver, dev_driver_string(ar->dev))
279                 __field(u8, hw_type);
280                 __field(u16, buf_len)
281                 __dynamic_array(u8, pktlog, buf_len)
282         ),
283
284         TP_fast_assign(
285                 __assign_str(device, dev_name(ar->dev));
286                 __assign_str(driver, dev_driver_string(ar->dev));
287                 __entry->hw_type = ar->hw_rev;
288                 __entry->buf_len = buf_len;
289                 memcpy(__get_dynamic_array(pktlog), buf, buf_len);
290         ),
291
292         TP_printk(
293                 "%s %s %d size %hu",
294                 __get_str(driver),
295                 __get_str(device),
296                 __entry->hw_type,
297                 __entry->buf_len
298          )
299 );
300
301 TRACE_EVENT(ath10k_htt_tx,
302             TP_PROTO(struct ath10k *ar, u16 msdu_id, u16 msdu_len,
303                      u8 vdev_id, u8 tid),
304
305         TP_ARGS(ar, msdu_id, msdu_len, vdev_id, tid),
306
307         TP_STRUCT__entry(
308                 __string(device, dev_name(ar->dev))
309                 __string(driver, dev_driver_string(ar->dev))
310                 __field(u16, msdu_id)
311                 __field(u16, msdu_len)
312                 __field(u8, vdev_id)
313                 __field(u8, tid)
314         ),
315
316         TP_fast_assign(
317                 __assign_str(device, dev_name(ar->dev));
318                 __assign_str(driver, dev_driver_string(ar->dev));
319                 __entry->msdu_id = msdu_id;
320                 __entry->msdu_len = msdu_len;
321                 __entry->vdev_id = vdev_id;
322                 __entry->tid = tid;
323         ),
324
325         TP_printk(
326                 "%s %s msdu_id %d msdu_len %d vdev_id %d tid %d",
327                 __get_str(driver),
328                 __get_str(device),
329                 __entry->msdu_id,
330                 __entry->msdu_len,
331                 __entry->vdev_id,
332                 __entry->tid
333          )
334 );
335
336 TRACE_EVENT(ath10k_txrx_tx_unref,
337             TP_PROTO(struct ath10k *ar, u16 msdu_id),
338
339         TP_ARGS(ar, msdu_id),
340
341         TP_STRUCT__entry(
342                 __string(device, dev_name(ar->dev))
343                 __string(driver, dev_driver_string(ar->dev))
344                 __field(u16, msdu_id)
345         ),
346
347         TP_fast_assign(
348                 __assign_str(device, dev_name(ar->dev));
349                 __assign_str(driver, dev_driver_string(ar->dev));
350                 __entry->msdu_id = msdu_id;
351         ),
352
353         TP_printk(
354                 "%s %s msdu_id %d",
355                 __get_str(driver),
356                 __get_str(device),
357                 __entry->msdu_id
358          )
359 );
360
361 DECLARE_EVENT_CLASS(ath10k_hdr_event,
362                     TP_PROTO(struct ath10k *ar, const void *data, size_t len),
363
364         TP_ARGS(ar, data, len),
365
366         TP_STRUCT__entry(
367                 __string(device, dev_name(ar->dev))
368                 __string(driver, dev_driver_string(ar->dev))
369                 __field(size_t, len)
370                 __dynamic_array(u8, data, ath10k_frm_hdr_len(data, len))
371         ),
372
373         TP_fast_assign(
374                 __assign_str(device, dev_name(ar->dev));
375                 __assign_str(driver, dev_driver_string(ar->dev));
376                 __entry->len = ath10k_frm_hdr_len(data, len);
377                 memcpy(__get_dynamic_array(data), data, __entry->len);
378         ),
379
380         TP_printk(
381                 "%s %s len %zu\n",
382                 __get_str(driver),
383                 __get_str(device),
384                 __entry->len
385         )
386 );
387
388 DECLARE_EVENT_CLASS(ath10k_payload_event,
389                     TP_PROTO(struct ath10k *ar, const void *data, size_t len),
390
391         TP_ARGS(ar, data, len),
392
393         TP_STRUCT__entry(
394                 __string(device, dev_name(ar->dev))
395                 __string(driver, dev_driver_string(ar->dev))
396                 __field(size_t, len)
397                 __dynamic_array(u8, payload, (len -
398                                               ath10k_frm_hdr_len(data, len)))
399         ),
400
401         TP_fast_assign(
402                 __assign_str(device, dev_name(ar->dev));
403                 __assign_str(driver, dev_driver_string(ar->dev));
404                 __entry->len = len - ath10k_frm_hdr_len(data, len);
405                 memcpy(__get_dynamic_array(payload),
406                        data + ath10k_frm_hdr_len(data, len), __entry->len);
407         ),
408
409         TP_printk(
410                 "%s %s len %zu\n",
411                 __get_str(driver),
412                 __get_str(device),
413                 __entry->len
414         )
415 );
416
417 DEFINE_EVENT(ath10k_hdr_event, ath10k_tx_hdr,
418              TP_PROTO(struct ath10k *ar, const void *data, size_t len),
419              TP_ARGS(ar, data, len)
420 );
421
422 DEFINE_EVENT(ath10k_payload_event, ath10k_tx_payload,
423              TP_PROTO(struct ath10k *ar, const void *data, size_t len),
424              TP_ARGS(ar, data, len)
425 );
426
427 DEFINE_EVENT(ath10k_hdr_event, ath10k_rx_hdr,
428              TP_PROTO(struct ath10k *ar, const void *data, size_t len),
429              TP_ARGS(ar, data, len)
430 );
431
432 DEFINE_EVENT(ath10k_payload_event, ath10k_rx_payload,
433              TP_PROTO(struct ath10k *ar, const void *data, size_t len),
434              TP_ARGS(ar, data, len)
435 );
436
437 TRACE_EVENT(ath10k_htt_rx_desc,
438             TP_PROTO(struct ath10k *ar, const void *data, size_t len),
439
440         TP_ARGS(ar, data, len),
441
442         TP_STRUCT__entry(
443                 __string(device, dev_name(ar->dev))
444                 __string(driver, dev_driver_string(ar->dev))
445                 __field(u8, hw_type);
446                 __field(u16, len)
447                 __dynamic_array(u8, rxdesc, len)
448         ),
449
450         TP_fast_assign(
451                 __assign_str(device, dev_name(ar->dev));
452                 __assign_str(driver, dev_driver_string(ar->dev));
453                 __entry->hw_type = ar->hw_rev;
454                 __entry->len = len;
455                 memcpy(__get_dynamic_array(rxdesc), data, len);
456         ),
457
458         TP_printk(
459                 "%s %s %d rxdesc len %d",
460                 __get_str(driver),
461                 __get_str(device),
462                 __entry->hw_type,
463                 __entry->len
464          )
465 );
466
467 TRACE_EVENT(ath10k_wmi_diag_container,
468             TP_PROTO(struct ath10k *ar,
469                      u8 type,
470                      u32 timestamp,
471                      u32 code,
472                      u16 len,
473                      const void *data),
474
475         TP_ARGS(ar, type, timestamp, code, len, data),
476
477         TP_STRUCT__entry(
478                 __string(device, dev_name(ar->dev))
479                 __string(driver, dev_driver_string(ar->dev))
480                 __field(u8, type)
481                 __field(u32, timestamp)
482                 __field(u32, code)
483                 __field(u16, len)
484                 __dynamic_array(u8, data, len)
485         ),
486
487         TP_fast_assign(
488                 __assign_str(device, dev_name(ar->dev));
489                 __assign_str(driver, dev_driver_string(ar->dev));
490                 __entry->type = type;
491                 __entry->timestamp = timestamp;
492                 __entry->code = code;
493                 __entry->len = len;
494                 memcpy(__get_dynamic_array(data), data, len);
495         ),
496
497         TP_printk(
498                 "%s %s diag container type %hhu timestamp %u code %u len %d",
499                 __get_str(driver),
500                 __get_str(device),
501                 __entry->type,
502                 __entry->timestamp,
503                 __entry->code,
504                 __entry->len
505         )
506 );
507
508 TRACE_EVENT(ath10k_wmi_diag,
509             TP_PROTO(struct ath10k *ar, const void *data, size_t len),
510
511         TP_ARGS(ar, data, len),
512
513         TP_STRUCT__entry(
514                 __string(device, dev_name(ar->dev))
515                 __string(driver, dev_driver_string(ar->dev))
516                 __field(u16, len)
517                 __dynamic_array(u8, data, len)
518         ),
519
520         TP_fast_assign(
521                 __assign_str(device, dev_name(ar->dev));
522                 __assign_str(driver, dev_driver_string(ar->dev));
523                 __entry->len = len;
524                 memcpy(__get_dynamic_array(data), data, len);
525         ),
526
527         TP_printk(
528                 "%s %s tlv diag len %d",
529                 __get_str(driver),
530                 __get_str(device),
531                 __entry->len
532         )
533 );
534
535 #endif /* _TRACE_H_ || TRACE_HEADER_MULTI_READ*/
536
537 /* we don't want to use include/trace/events */
538 #undef TRACE_INCLUDE_PATH
539 #define TRACE_INCLUDE_PATH .
540 #undef TRACE_INCLUDE_FILE
541 #define TRACE_INCLUDE_FILE trace
542
543 /* This part must be outside protection */
544 #include <trace/define_trace.h>