trace.h 13 KB

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