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;
79 		__entry->seq = __le16_to_cpu(hdr->sw_hdr.cmd.seq_num);
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);
126 		__entry->seq = __le16_to_cpu(hdr->sw_hdr.cmd.seq_num);
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, embedded_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>
284