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