trace.h 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. #if !defined(__IWM_TRACE_H__) || defined(TRACE_HEADER_MULTI_READ)
  2. #define __IWM_TRACE_H__
  3. #include <linux/tracepoint.h>
  4. #if !defined(CONFIG_IWM_TRACING)
  5. #undef TRACE_EVENT
  6. #define TRACE_EVENT(name, proto, ...) \
  7. static inline void trace_ ## name(proto) {}
  8. #endif
  9. #undef TRACE_SYSTEM
  10. #define TRACE_SYSTEM iwm
  11. #define IWM_ENTRY __array(char, ndev_name, 16)
  12. #define IWM_ASSIGN strlcpy(__entry->ndev_name, iwm_to_ndev(iwm)->name, 16)
  13. #define IWM_PR_FMT "%s"
  14. #define IWM_PR_ARG __entry->ndev_name
  15. TRACE_EVENT(iwm_tx_nonwifi_cmd,
  16. TP_PROTO(struct iwm_priv *iwm, struct iwm_udma_out_nonwifi_hdr *hdr),
  17. TP_ARGS(iwm, hdr),
  18. TP_STRUCT__entry(
  19. IWM_ENTRY
  20. __field(u8, opcode)
  21. __field(u8, resp)
  22. __field(u8, eot)
  23. __field(u8, hw)
  24. __field(u16, seq)
  25. __field(u32, addr)
  26. __field(u32, op1)
  27. __field(u32, op2)
  28. ),
  29. TP_fast_assign(
  30. IWM_ASSIGN;
  31. __entry->opcode = GET_VAL32(hdr->cmd, UMAC_HDI_OUT_CMD_OPCODE);
  32. __entry->resp = GET_VAL32(hdr->cmd, UDMA_HDI_OUT_NW_CMD_RESP);
  33. __entry->eot = GET_VAL32(hdr->cmd, UMAC_HDI_OUT_CMD_EOT);
  34. __entry->hw = GET_VAL32(hdr->cmd, UDMA_HDI_OUT_NW_CMD_HANDLE_BY_HW);
  35. __entry->seq = GET_VAL32(hdr->cmd, UDMA_HDI_OUT_CMD_NON_WIFI_HW_SEQ_NUM);
  36. __entry->addr = le32_to_cpu(hdr->addr);
  37. __entry->op1 = le32_to_cpu(hdr->op1_sz);
  38. __entry->op2 = le32_to_cpu(hdr->op2);
  39. ),
  40. TP_printk(
  41. IWM_PR_FMT " Tx TARGET CMD: opcode 0x%x, resp %d, eot %d, "
  42. "hw %d, seq 0x%x, addr 0x%x, op1 0x%x, op2 0x%x",
  43. IWM_PR_ARG, __entry->opcode, __entry->resp, __entry->eot,
  44. __entry->hw, __entry->seq, __entry->addr, __entry->op1,
  45. __entry->op2
  46. )
  47. );
  48. TRACE_EVENT(iwm_tx_wifi_cmd,
  49. TP_PROTO(struct iwm_priv *iwm, struct iwm_umac_wifi_out_hdr *hdr),
  50. TP_ARGS(iwm, hdr),
  51. TP_STRUCT__entry(
  52. IWM_ENTRY
  53. __field(u8, opcode)
  54. __field(u8, lmac)
  55. __field(u8, resp)
  56. __field(u8, eot)
  57. __field(u8, ra_tid)
  58. __field(u8, credit_group)
  59. __field(u8, color)
  60. __field(u16, seq)
  61. ),
  62. TP_fast_assign(
  63. IWM_ASSIGN;
  64. __entry->opcode = hdr->sw_hdr.cmd.cmd;
  65. __entry->lmac = 0;
  66. __entry->seq = __le16_to_cpu(hdr->sw_hdr.cmd.seq_num);
  67. __entry->resp = GET_VAL8(hdr->sw_hdr.cmd.flags, UMAC_DEV_CMD_FLAGS_RESP_REQ);
  68. __entry->color = GET_VAL32(hdr->sw_hdr.meta_data, UMAC_FW_CMD_TX_STA_COLOR);
  69. __entry->eot = GET_VAL32(hdr->hw_hdr.cmd, UMAC_HDI_OUT_CMD_EOT);
  70. __entry->ra_tid = GET_VAL32(hdr->hw_hdr.meta_data, UMAC_HDI_OUT_RATID);
  71. __entry->credit_group = GET_VAL32(hdr->hw_hdr.meta_data, UMAC_HDI_OUT_CREDIT_GRP);
  72. if (__entry->opcode == UMAC_CMD_OPCODE_WIFI_PASS_THROUGH ||
  73. __entry->opcode == UMAC_CMD_OPCODE_WIFI_IF_WRAPPER) {
  74. __entry->lmac = 1;
  75. __entry->opcode = ((struct iwm_lmac_hdr *)(hdr + 1))->id;
  76. }
  77. ),
  78. TP_printk(
  79. IWM_PR_FMT " Tx %cMAC CMD: opcode 0x%x, resp %d, eot %d, "
  80. "seq 0x%x, sta_color 0x%x, ra_tid 0x%x, credit_group 0x%x",
  81. IWM_PR_ARG, __entry->lmac ? 'L' : 'U', __entry->opcode,
  82. __entry->resp, __entry->eot, __entry->seq, __entry->color,
  83. __entry->ra_tid, __entry->credit_group
  84. )
  85. );
  86. TRACE_EVENT(iwm_tx_packets,
  87. TP_PROTO(struct iwm_priv *iwm, u8 *buf, int len),
  88. TP_ARGS(iwm, buf, len),
  89. TP_STRUCT__entry(
  90. IWM_ENTRY
  91. __field(u8, eot)
  92. __field(u8, ra_tid)
  93. __field(u8, credit_group)
  94. __field(u8, color)
  95. __field(u16, seq)
  96. __field(u8, npkt)
  97. __field(u32, bytes)
  98. ),
  99. TP_fast_assign(
  100. struct iwm_umac_wifi_out_hdr *hdr =
  101. (struct iwm_umac_wifi_out_hdr *)buf;
  102. IWM_ASSIGN;
  103. __entry->eot = GET_VAL32(hdr->hw_hdr.cmd, UMAC_HDI_OUT_CMD_EOT);
  104. __entry->ra_tid = GET_VAL32(hdr->hw_hdr.meta_data, UMAC_HDI_OUT_RATID);
  105. __entry->credit_group = GET_VAL32(hdr->hw_hdr.meta_data, UMAC_HDI_OUT_CREDIT_GRP);
  106. __entry->color = GET_VAL32(hdr->sw_hdr.meta_data, UMAC_FW_CMD_TX_STA_COLOR);
  107. __entry->seq = __le16_to_cpu(hdr->sw_hdr.cmd.seq_num);
  108. __entry->npkt = 1;
  109. __entry->bytes = len;
  110. if (!__entry->eot) {
  111. int count;
  112. u8 *ptr = buf;
  113. __entry->npkt = 0;
  114. while (ptr < buf + len) {
  115. count = GET_VAL32(hdr->sw_hdr.meta_data,
  116. UMAC_FW_CMD_BYTE_COUNT);
  117. ptr += ALIGN(sizeof(*hdr) + count, 16);
  118. hdr = (struct iwm_umac_wifi_out_hdr *)ptr;
  119. __entry->npkt++;
  120. }
  121. }
  122. ),
  123. TP_printk(
  124. IWM_PR_FMT " Tx %spacket: eot %d, seq 0x%x, sta_color 0x%x, "
  125. "ra_tid 0x%x, credit_group 0x%x, embedded_packets %d, %d bytes",
  126. IWM_PR_ARG, !__entry->eot ? "concatenated " : "",
  127. __entry->eot, __entry->seq, __entry->color, __entry->ra_tid,
  128. __entry->credit_group, __entry->npkt, __entry->bytes
  129. )
  130. );
  131. TRACE_EVENT(iwm_rx_nonwifi_cmd,
  132. TP_PROTO(struct iwm_priv *iwm, void *buf, int len),
  133. TP_ARGS(iwm, buf, len),
  134. TP_STRUCT__entry(
  135. IWM_ENTRY
  136. __field(u8, opcode)
  137. __field(u16, seq)
  138. __field(u32, len)
  139. ),
  140. TP_fast_assign(
  141. struct iwm_udma_in_hdr *hdr = buf;
  142. IWM_ASSIGN;
  143. __entry->opcode = GET_VAL32(hdr->cmd, UDMA_HDI_IN_NW_CMD_OPCODE);
  144. __entry->seq = GET_VAL32(hdr->cmd, UDMA_HDI_IN_CMD_NON_WIFI_HW_SEQ_NUM);
  145. __entry->len = len;
  146. ),
  147. TP_printk(
  148. IWM_PR_FMT " Rx TARGET RESP: opcode 0x%x, seq 0x%x, len 0x%x",
  149. IWM_PR_ARG, __entry->opcode, __entry->seq, __entry->len
  150. )
  151. );
  152. TRACE_EVENT(iwm_rx_wifi_cmd,
  153. TP_PROTO(struct iwm_priv *iwm, struct iwm_umac_wifi_in_hdr *hdr),
  154. TP_ARGS(iwm, hdr),
  155. TP_STRUCT__entry(
  156. IWM_ENTRY
  157. __field(u8, cmd)
  158. __field(u8, source)
  159. __field(u16, seq)
  160. __field(u32, count)
  161. ),
  162. TP_fast_assign(
  163. IWM_ASSIGN;
  164. __entry->cmd = hdr->sw_hdr.cmd.cmd;
  165. __entry->source = GET_VAL32(hdr->hw_hdr.cmd, UMAC_HDI_IN_CMD_SOURCE);
  166. __entry->count = GET_VAL32(hdr->sw_hdr.meta_data, UMAC_FW_CMD_BYTE_COUNT);
  167. __entry->seq = le16_to_cpu(hdr->sw_hdr.cmd.seq_num);
  168. ),
  169. TP_printk(
  170. IWM_PR_FMT " Rx %s RESP: cmd 0x%x, seq 0x%x, count 0x%x",
  171. IWM_PR_ARG, __entry->source == UMAC_HDI_IN_SOURCE_FHRX ? "LMAC" :
  172. __entry->source == UMAC_HDI_IN_SOURCE_FW ? "UMAC" : "UDMA",
  173. __entry->cmd, __entry->seq, __entry->count
  174. )
  175. );
  176. #define iwm_ticket_action_symbol \
  177. { IWM_RX_TICKET_DROP, "DROP" }, \
  178. { IWM_RX_TICKET_RELEASE, "RELEASE" }, \
  179. { IWM_RX_TICKET_SNIFFER, "SNIFFER" }, \
  180. { IWM_RX_TICKET_ENQUEUE, "ENQUEUE" }
  181. TRACE_EVENT(iwm_rx_ticket,
  182. TP_PROTO(struct iwm_priv *iwm, void *buf, int len),
  183. TP_ARGS(iwm, buf, len),
  184. TP_STRUCT__entry(
  185. IWM_ENTRY
  186. __field(u8, action)
  187. __field(u8, reason)
  188. __field(u16, id)
  189. __field(u16, flags)
  190. ),
  191. TP_fast_assign(
  192. struct iwm_rx_ticket *ticket =
  193. ((struct iwm_umac_notif_rx_ticket *)buf)->tickets;
  194. IWM_ASSIGN;
  195. __entry->id = le16_to_cpu(ticket->id);
  196. __entry->action = le16_to_cpu(ticket->action);
  197. __entry->flags = le16_to_cpu(ticket->flags);
  198. __entry->reason = (__entry->flags & IWM_RX_TICKET_DROP_REASON_MSK) >> IWM_RX_TICKET_DROP_REASON_POS;
  199. ),
  200. TP_printk(
  201. IWM_PR_FMT " Rx ticket: id 0x%x, action %s, %s 0x%x%s",
  202. IWM_PR_ARG, __entry->id,
  203. __print_symbolic(__entry->action, iwm_ticket_action_symbol),
  204. __entry->reason ? "reason" : "flags",
  205. __entry->reason ? __entry->reason : __entry->flags,
  206. __entry->flags & IWM_RX_TICKET_AMSDU_MSK ? ", AMSDU frame" : ""
  207. )
  208. );
  209. TRACE_EVENT(iwm_rx_packet,
  210. TP_PROTO(struct iwm_priv *iwm, void *buf, int len),
  211. TP_ARGS(iwm, buf, len),
  212. TP_STRUCT__entry(
  213. IWM_ENTRY
  214. __field(u8, source)
  215. __field(u16, id)
  216. __field(u32, len)
  217. ),
  218. TP_fast_assign(
  219. struct iwm_umac_wifi_in_hdr *hdr = buf;
  220. IWM_ASSIGN;
  221. __entry->source = GET_VAL32(hdr->hw_hdr.cmd, UMAC_HDI_IN_CMD_SOURCE);
  222. __entry->id = le16_to_cpu(hdr->sw_hdr.cmd.seq_num);
  223. __entry->len = len - sizeof(*hdr);
  224. ),
  225. TP_printk(
  226. IWM_PR_FMT " Rx %s packet: id 0x%x, %d bytes",
  227. IWM_PR_ARG, __entry->source == UMAC_HDI_IN_SOURCE_FHRX ?
  228. "LMAC" : "UMAC", __entry->id, __entry->len
  229. )
  230. );
  231. #endif
  232. #undef TRACE_INCLUDE_PATH
  233. #define TRACE_INCLUDE_PATH .
  234. #undef TRACE_INCLUDE_FILE
  235. #define TRACE_INCLUDE_FILE trace
  236. #include <trace/define_trace.h>