iwl-devtrace.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2009 - 2012 Intel Corporation. All rights reserved.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of version 2 of the GNU General Public License as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. * You should have received a copy of the GNU General Public License along with
  15. * this program; if not, write to the Free Software Foundation, Inc.,
  16. * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  17. *
  18. * The full GNU General Public License is included in this distribution in the
  19. * file called LICENSE.
  20. *
  21. * Contact Information:
  22. * Intel Linux Wireless <ilw@linux.intel.com>
  23. * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
  24. *
  25. *****************************************************************************/
  26. #if !defined(__IWLWIFI_DEVICE_TRACE) || defined(TRACE_HEADER_MULTI_READ)
  27. #define __IWLWIFI_DEVICE_TRACE
  28. #include <linux/tracepoint.h>
  29. #include <linux/device.h>
  30. #include "iwl-trans.h"
  31. #if !defined(CONFIG_IWLWIFI_DEVICE_TRACING) || defined(__CHECKER__)
  32. #undef TRACE_EVENT
  33. #define TRACE_EVENT(name, proto, ...) \
  34. static inline void trace_ ## name(proto) {}
  35. #undef DECLARE_EVENT_CLASS
  36. #define DECLARE_EVENT_CLASS(...)
  37. #undef DEFINE_EVENT
  38. #define DEFINE_EVENT(evt_class, name, proto, ...) \
  39. static inline void trace_ ## name(proto) {}
  40. #endif
  41. #define DEV_ENTRY __string(dev, dev_name(dev))
  42. #define DEV_ASSIGN __assign_str(dev, dev_name(dev))
  43. #undef TRACE_SYSTEM
  44. #define TRACE_SYSTEM iwlwifi_io
  45. TRACE_EVENT(iwlwifi_dev_ioread32,
  46. TP_PROTO(const struct device *dev, u32 offs, u32 val),
  47. TP_ARGS(dev, offs, val),
  48. TP_STRUCT__entry(
  49. DEV_ENTRY
  50. __field(u32, offs)
  51. __field(u32, val)
  52. ),
  53. TP_fast_assign(
  54. DEV_ASSIGN;
  55. __entry->offs = offs;
  56. __entry->val = val;
  57. ),
  58. TP_printk("[%s] read io[%#x] = %#x",
  59. __get_str(dev), __entry->offs, __entry->val)
  60. );
  61. TRACE_EVENT(iwlwifi_dev_iowrite8,
  62. TP_PROTO(const struct device *dev, u32 offs, u8 val),
  63. TP_ARGS(dev, offs, val),
  64. TP_STRUCT__entry(
  65. DEV_ENTRY
  66. __field(u32, offs)
  67. __field(u8, val)
  68. ),
  69. TP_fast_assign(
  70. DEV_ASSIGN;
  71. __entry->offs = offs;
  72. __entry->val = val;
  73. ),
  74. TP_printk("[%s] write io[%#x] = %#x)",
  75. __get_str(dev), __entry->offs, __entry->val)
  76. );
  77. TRACE_EVENT(iwlwifi_dev_iowrite32,
  78. TP_PROTO(const struct device *dev, u32 offs, u32 val),
  79. TP_ARGS(dev, offs, val),
  80. TP_STRUCT__entry(
  81. DEV_ENTRY
  82. __field(u32, offs)
  83. __field(u32, val)
  84. ),
  85. TP_fast_assign(
  86. DEV_ASSIGN;
  87. __entry->offs = offs;
  88. __entry->val = val;
  89. ),
  90. TP_printk("[%s] write io[%#x] = %#x)",
  91. __get_str(dev), __entry->offs, __entry->val)
  92. );
  93. TRACE_EVENT(iwlwifi_dev_irq,
  94. TP_PROTO(const struct device *dev),
  95. TP_ARGS(dev),
  96. TP_STRUCT__entry(
  97. DEV_ENTRY
  98. ),
  99. TP_fast_assign(
  100. DEV_ASSIGN;
  101. ),
  102. /* TP_printk("") doesn't compile */
  103. TP_printk("%d", 0)
  104. );
  105. TRACE_EVENT(iwlwifi_dev_ict_read,
  106. TP_PROTO(const struct device *dev, u32 index, u32 value),
  107. TP_ARGS(dev, index, value),
  108. TP_STRUCT__entry(
  109. DEV_ENTRY
  110. __field(u32, index)
  111. __field(u32, value)
  112. ),
  113. TP_fast_assign(
  114. DEV_ASSIGN;
  115. __entry->index = index;
  116. __entry->value = value;
  117. ),
  118. TP_printk("[%s] read ict[%d] = %#.8x",
  119. __get_str(dev), __entry->index, __entry->value)
  120. );
  121. #undef TRACE_SYSTEM
  122. #define TRACE_SYSTEM iwlwifi_ucode
  123. TRACE_EVENT(iwlwifi_dev_ucode_cont_event,
  124. TP_PROTO(const struct device *dev, u32 time, u32 data, u32 ev),
  125. TP_ARGS(dev, time, data, ev),
  126. TP_STRUCT__entry(
  127. DEV_ENTRY
  128. __field(u32, time)
  129. __field(u32, data)
  130. __field(u32, ev)
  131. ),
  132. TP_fast_assign(
  133. DEV_ASSIGN;
  134. __entry->time = time;
  135. __entry->data = data;
  136. __entry->ev = ev;
  137. ),
  138. TP_printk("[%s] EVT_LOGT:%010u:0x%08x:%04u",
  139. __get_str(dev), __entry->time, __entry->data, __entry->ev)
  140. );
  141. TRACE_EVENT(iwlwifi_dev_ucode_wrap_event,
  142. TP_PROTO(const struct device *dev, u32 wraps, u32 n_entry, u32 p_entry),
  143. TP_ARGS(dev, wraps, n_entry, p_entry),
  144. TP_STRUCT__entry(
  145. DEV_ENTRY
  146. __field(u32, wraps)
  147. __field(u32, n_entry)
  148. __field(u32, p_entry)
  149. ),
  150. TP_fast_assign(
  151. DEV_ASSIGN;
  152. __entry->wraps = wraps;
  153. __entry->n_entry = n_entry;
  154. __entry->p_entry = p_entry;
  155. ),
  156. TP_printk("[%s] wraps=#%02d n=0x%X p=0x%X",
  157. __get_str(dev), __entry->wraps, __entry->n_entry,
  158. __entry->p_entry)
  159. );
  160. #undef TRACE_SYSTEM
  161. #define TRACE_SYSTEM iwlwifi_msg
  162. #define MAX_MSG_LEN 110
  163. DECLARE_EVENT_CLASS(iwlwifi_msg_event,
  164. TP_PROTO(struct va_format *vaf),
  165. TP_ARGS(vaf),
  166. TP_STRUCT__entry(
  167. __dynamic_array(char, msg, MAX_MSG_LEN)
  168. ),
  169. TP_fast_assign(
  170. WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
  171. MAX_MSG_LEN, vaf->fmt,
  172. *vaf->va) >= MAX_MSG_LEN);
  173. ),
  174. TP_printk("%s", __get_str(msg))
  175. );
  176. DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_err,
  177. TP_PROTO(struct va_format *vaf),
  178. TP_ARGS(vaf)
  179. );
  180. DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_warn,
  181. TP_PROTO(struct va_format *vaf),
  182. TP_ARGS(vaf)
  183. );
  184. DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_info,
  185. TP_PROTO(struct va_format *vaf),
  186. TP_ARGS(vaf)
  187. );
  188. DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_crit,
  189. TP_PROTO(struct va_format *vaf),
  190. TP_ARGS(vaf)
  191. );
  192. TRACE_EVENT(iwlwifi_dbg,
  193. TP_PROTO(u32 level, bool in_interrupt, const char *function,
  194. struct va_format *vaf),
  195. TP_ARGS(level, in_interrupt, function, vaf),
  196. TP_STRUCT__entry(
  197. __field(u32, level)
  198. __field(u8, in_interrupt)
  199. __string(function, function)
  200. __dynamic_array(char, msg, MAX_MSG_LEN)
  201. ),
  202. TP_fast_assign(
  203. __entry->level = level;
  204. __entry->in_interrupt = in_interrupt;
  205. __assign_str(function, function);
  206. WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
  207. MAX_MSG_LEN, vaf->fmt,
  208. *vaf->va) >= MAX_MSG_LEN);
  209. ),
  210. TP_printk("%s", (char *)__get_dynamic_array(msg))
  211. );
  212. #undef TRACE_SYSTEM
  213. #define TRACE_SYSTEM iwlwifi
  214. TRACE_EVENT(iwlwifi_dev_hcmd,
  215. TP_PROTO(const struct device *dev,
  216. struct iwl_host_cmd *cmd, u16 total_size,
  217. const void *hdr, size_t hdr_len),
  218. TP_ARGS(dev, cmd, total_size, hdr, hdr_len),
  219. TP_STRUCT__entry(
  220. DEV_ENTRY
  221. __dynamic_array(u8, hcmd, total_size)
  222. __field(u32, flags)
  223. ),
  224. TP_fast_assign(
  225. int i, offset = hdr_len;
  226. DEV_ASSIGN;
  227. __entry->flags = cmd->flags;
  228. memcpy(__get_dynamic_array(hcmd), hdr, hdr_len);
  229. for (i = 0; i < IWL_MAX_CMD_TFDS; i++) {
  230. if (!cmd->len[i])
  231. continue;
  232. if (!(cmd->dataflags[i] & IWL_HCMD_DFL_NOCOPY))
  233. continue;
  234. memcpy((u8 *)__get_dynamic_array(hcmd) + offset,
  235. cmd->data[i], cmd->len[i]);
  236. offset += cmd->len[i];
  237. }
  238. ),
  239. TP_printk("[%s] hcmd %#.2x (%ssync)",
  240. __get_str(dev), ((u8 *)__get_dynamic_array(hcmd))[0],
  241. __entry->flags & CMD_ASYNC ? "a" : "")
  242. );
  243. TRACE_EVENT(iwlwifi_dev_rx,
  244. TP_PROTO(const struct device *dev, void *rxbuf, size_t len),
  245. TP_ARGS(dev, rxbuf, len),
  246. TP_STRUCT__entry(
  247. DEV_ENTRY
  248. __dynamic_array(u8, rxbuf, len)
  249. ),
  250. TP_fast_assign(
  251. DEV_ASSIGN;
  252. memcpy(__get_dynamic_array(rxbuf), rxbuf, len);
  253. ),
  254. TP_printk("[%s] RX cmd %#.2x",
  255. __get_str(dev), ((u8 *)__get_dynamic_array(rxbuf))[4])
  256. );
  257. TRACE_EVENT(iwlwifi_dev_tx,
  258. TP_PROTO(const struct device *dev, void *tfd, size_t tfdlen,
  259. void *buf0, size_t buf0_len,
  260. void *buf1, size_t buf1_len),
  261. TP_ARGS(dev, tfd, tfdlen, buf0, buf0_len, buf1, buf1_len),
  262. TP_STRUCT__entry(
  263. DEV_ENTRY
  264. __field(size_t, framelen)
  265. __dynamic_array(u8, tfd, tfdlen)
  266. /*
  267. * Do not insert between or below these items,
  268. * we want to keep the frame together (except
  269. * for the possible padding).
  270. */
  271. __dynamic_array(u8, buf0, buf0_len)
  272. __dynamic_array(u8, buf1, buf1_len)
  273. ),
  274. TP_fast_assign(
  275. DEV_ASSIGN;
  276. __entry->framelen = buf0_len + buf1_len;
  277. memcpy(__get_dynamic_array(tfd), tfd, tfdlen);
  278. memcpy(__get_dynamic_array(buf0), buf0, buf0_len);
  279. memcpy(__get_dynamic_array(buf1), buf1, buf1_len);
  280. ),
  281. TP_printk("[%s] TX %.2x (%zu bytes)",
  282. __get_str(dev), ((u8 *)__get_dynamic_array(buf0))[0],
  283. __entry->framelen)
  284. );
  285. TRACE_EVENT(iwlwifi_dev_ucode_error,
  286. TP_PROTO(const struct device *dev, u32 desc, u32 tsf_low,
  287. u32 data1, u32 data2, u32 line, u32 blink1,
  288. u32 blink2, u32 ilink1, u32 ilink2, u32 bcon_time,
  289. u32 gp1, u32 gp2, u32 gp3, u32 ucode_ver, u32 hw_ver,
  290. u32 brd_ver),
  291. TP_ARGS(dev, desc, tsf_low, data1, data2, line,
  292. blink1, blink2, ilink1, ilink2, bcon_time, gp1, gp2,
  293. gp3, ucode_ver, hw_ver, brd_ver),
  294. TP_STRUCT__entry(
  295. DEV_ENTRY
  296. __field(u32, desc)
  297. __field(u32, tsf_low)
  298. __field(u32, data1)
  299. __field(u32, data2)
  300. __field(u32, line)
  301. __field(u32, blink1)
  302. __field(u32, blink2)
  303. __field(u32, ilink1)
  304. __field(u32, ilink2)
  305. __field(u32, bcon_time)
  306. __field(u32, gp1)
  307. __field(u32, gp2)
  308. __field(u32, gp3)
  309. __field(u32, ucode_ver)
  310. __field(u32, hw_ver)
  311. __field(u32, brd_ver)
  312. ),
  313. TP_fast_assign(
  314. DEV_ASSIGN;
  315. __entry->desc = desc;
  316. __entry->tsf_low = tsf_low;
  317. __entry->data1 = data1;
  318. __entry->data2 = data2;
  319. __entry->line = line;
  320. __entry->blink1 = blink1;
  321. __entry->blink2 = blink2;
  322. __entry->ilink1 = ilink1;
  323. __entry->ilink2 = ilink2;
  324. __entry->bcon_time = bcon_time;
  325. __entry->gp1 = gp1;
  326. __entry->gp2 = gp2;
  327. __entry->gp3 = gp3;
  328. __entry->ucode_ver = ucode_ver;
  329. __entry->hw_ver = hw_ver;
  330. __entry->brd_ver = brd_ver;
  331. ),
  332. TP_printk("[%s] #%02d %010u data 0x%08X 0x%08X line %u, "
  333. "blink 0x%05X 0x%05X ilink 0x%05X 0x%05X "
  334. "bcon_tm %010u gp 0x%08X 0x%08X 0x%08X uCode 0x%08X "
  335. "hw 0x%08X brd 0x%08X",
  336. __get_str(dev), __entry->desc, __entry->tsf_low,
  337. __entry->data1,
  338. __entry->data2, __entry->line, __entry->blink1,
  339. __entry->blink2, __entry->ilink1, __entry->ilink2,
  340. __entry->bcon_time, __entry->gp1, __entry->gp2,
  341. __entry->gp3, __entry->ucode_ver, __entry->hw_ver,
  342. __entry->brd_ver)
  343. );
  344. TRACE_EVENT(iwlwifi_dev_ucode_event,
  345. TP_PROTO(const struct device *dev, u32 time, u32 data, u32 ev),
  346. TP_ARGS(dev, time, data, ev),
  347. TP_STRUCT__entry(
  348. DEV_ENTRY
  349. __field(u32, time)
  350. __field(u32, data)
  351. __field(u32, ev)
  352. ),
  353. TP_fast_assign(
  354. DEV_ASSIGN;
  355. __entry->time = time;
  356. __entry->data = data;
  357. __entry->ev = ev;
  358. ),
  359. TP_printk("[%s] EVT_LOGT:%010u:0x%08x:%04u",
  360. __get_str(dev), __entry->time, __entry->data, __entry->ev)
  361. );
  362. #endif /* __IWLWIFI_DEVICE_TRACE */
  363. #undef TRACE_INCLUDE_PATH
  364. #define TRACE_INCLUDE_PATH .
  365. #undef TRACE_INCLUDE_FILE
  366. #define TRACE_INCLUDE_FILE iwl-devtrace
  367. #include <trace/define_trace.h>