trace.h 12 KB

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