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