linux/drivers/net/wireless/ath/ath10k/trace.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2005-2011 Atheros Communications Inc.
   3 * Copyright (c) 2011-2016 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, 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, ...) \
  43static 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, ...) \
  48static 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
  56DECLARE_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
  80DEFINE_EVENT(ath10k_log_event, ath10k_log_err,
  81             TP_PROTO(struct ath10k *ar, struct va_format *vaf),
  82             TP_ARGS(ar, vaf)
  83);
  84
  85DEFINE_EVENT(ath10k_log_event, ath10k_log_warn,
  86             TP_PROTO(struct ath10k *ar, struct va_format *vaf),
  87             TP_ARGS(ar, vaf)
  88);
  89
  90DEFINE_EVENT(ath10k_log_event, ath10k_log_info,
  91             TP_PROTO(struct ath10k *ar, struct va_format *vaf),
  92             TP_ARGS(ar, vaf)
  93);
  94
  95TRACE_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
 121TRACE_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
 154TRACE_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
 184TRACE_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
 214TRACE_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
 241TRACE_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
 271TRACE_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
 301TRACE_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
 336TRACE_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
 361DECLARE_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
 388DECLARE_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
 417DEFINE_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
 422DEFINE_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
 427DEFINE_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
 432DEFINE_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
 437TRACE_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
 467TRACE_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
 508TRACE_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>
 545