1 /*
2  * Copyright (C) 2014 Felix Fietkau <nbd@openwrt.org>
3  * Copyright (C) 2015 Jakub Kicinski <kubakici@wp.pl>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2
7  * as published by the Free Software Foundation
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  */
14 
15 #if !defined(__MT76X0U_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
16 #define __MT76X0U_TRACE_H
17 
18 #include <linux/tracepoint.h>
19 #include "mt76x0.h"
20 #include "mac.h"
21 
22 #undef TRACE_SYSTEM
23 #define TRACE_SYSTEM mt76x0
24 
25 #define MAXNAME		32
26 #define DEV_ENTRY	__array(char, wiphy_name, 32)
27 #define DEV_ASSIGN	strlcpy(__entry->wiphy_name,			\
28 				wiphy_name(dev->hw->wiphy), MAXNAME)
29 #define DEV_PR_FMT	"%s "
30 #define DEV_PR_ARG	__entry->wiphy_name
31 
32 #define REG_ENTRY	__field(u32, reg) __field(u32, val)
33 #define REG_ASSIGN	__entry->reg = reg; __entry->val = val
34 #define REG_PR_FMT	"%04x=%08x"
35 #define REG_PR_ARG	__entry->reg, __entry->val
36 
37 DECLARE_EVENT_CLASS(dev_reg_evt,
38 	TP_PROTO(struct mt76_dev *dev, u32 reg, u32 val),
39 	TP_ARGS(dev, reg, val),
40 	TP_STRUCT__entry(
41 		DEV_ENTRY
42 		REG_ENTRY
43 	),
44 	TP_fast_assign(
45 		DEV_ASSIGN;
46 		REG_ASSIGN;
47 	),
48 	TP_printk(
49 		DEV_PR_FMT REG_PR_FMT,
50 		DEV_PR_ARG, REG_PR_ARG
51 	)
52 );
53 
54 DEFINE_EVENT(dev_reg_evt, mt76x0_reg_read,
55 	TP_PROTO(struct mt76_dev *dev, u32 reg, u32 val),
56 	TP_ARGS(dev, reg, val)
57 );
58 
59 DEFINE_EVENT(dev_reg_evt, mt76x0_reg_write,
60 	TP_PROTO(struct mt76_dev *dev, u32 reg, u32 val),
61 	TP_ARGS(dev, reg, val)
62 );
63 
64 TRACE_EVENT(mt76x0_submit_urb,
65 	TP_PROTO(struct mt76_dev *dev, struct urb *u),
66 	TP_ARGS(dev, u),
67 	TP_STRUCT__entry(
68 		DEV_ENTRY __field(unsigned, pipe) __field(u32, len)
69 	),
70 	TP_fast_assign(
71 		DEV_ASSIGN;
72 		__entry->pipe = u->pipe;
73 		__entry->len = u->transfer_buffer_length;
74 	),
75 	TP_printk(DEV_PR_FMT "p:%08x len:%u",
76 		  DEV_PR_ARG, __entry->pipe, __entry->len)
77 );
78 
79 #define trace_mt76x0_submit_urb_sync(__dev, __pipe, __len) ({	\
80 	struct urb u;					\
81 	u.pipe = __pipe;				\
82 	u.transfer_buffer_length = __len;		\
83 	trace_mt76x0_submit_urb(__dev, &u);			\
84 })
85 
86 TRACE_EVENT(mt76x0_mcu_msg_send,
87 	TP_PROTO(struct mt76_dev *dev,
88 		 struct sk_buff *skb, u32 csum, bool resp),
89 	TP_ARGS(dev, skb, csum, resp),
90 	TP_STRUCT__entry(
91 		DEV_ENTRY
92 		__field(u32, info)
93 		__field(u32, csum)
94 		__field(bool, resp)
95 	),
96 	TP_fast_assign(
97 		DEV_ASSIGN;
98 		__entry->info = *(u32 *)skb->data;
99 		__entry->csum = csum;
100 		__entry->resp = resp;
101 	),
102 	TP_printk(DEV_PR_FMT "i:%08x c:%08x r:%d",
103 		  DEV_PR_ARG, __entry->info, __entry->csum, __entry->resp)
104 );
105 
106 TRACE_EVENT(mt76x0_vend_req,
107 	TP_PROTO(struct mt76_dev *dev, unsigned pipe, u8 req, u8 req_type,
108 		 u16 val, u16 offset, void *buf, size_t buflen, int ret),
109 	TP_ARGS(dev, pipe, req, req_type, val, offset, buf, buflen, ret),
110 	TP_STRUCT__entry(
111 		DEV_ENTRY
112 		__field(unsigned, pipe) __field(u8, req) __field(u8, req_type)
113 		__field(u16, val) __field(u16, offset) __field(void*, buf)
114 		__field(int, buflen) __field(int, ret)
115 	),
116 	TP_fast_assign(
117 		DEV_ASSIGN;
118 		__entry->pipe = pipe;
119 		__entry->req = req;
120 		__entry->req_type = req_type;
121 		__entry->val = val;
122 		__entry->offset = offset;
123 		__entry->buf = buf;
124 		__entry->buflen = buflen;
125 		__entry->ret = ret;
126 	),
127 	TP_printk(DEV_PR_FMT
128 		  "%d p:%08x req:%02hhx %02hhx val:%04hx %04hx buf:%d %d",
129 		  DEV_PR_ARG, __entry->ret, __entry->pipe, __entry->req,
130 		  __entry->req_type, __entry->val, __entry->offset,
131 		  !!__entry->buf, __entry->buflen)
132 );
133 
134 DECLARE_EVENT_CLASS(dev_rf_reg_evt,
135 	TP_PROTO(struct mt76_dev *dev, u8 bank, u8 reg, u8 val),
136 	TP_ARGS(dev, bank, reg, val),
137 	TP_STRUCT__entry(
138 		DEV_ENTRY
139 		__field(u8, bank)
140 		__field(u8, reg)
141 		__field(u8, val)
142 	),
143 	TP_fast_assign(
144 		DEV_ASSIGN;
145 		REG_ASSIGN;
146 		__entry->bank = bank;
147 	),
148 	TP_printk(
149 		DEV_PR_FMT "%02hhx:%02hhx=%02hhx",
150 		DEV_PR_ARG, __entry->bank, __entry->reg, __entry->val
151 	)
152 );
153 
154 DEFINE_EVENT(dev_rf_reg_evt, mt76x0_rf_read,
155 	TP_PROTO(struct mt76_dev *dev, u8 bank, u8 reg, u8 val),
156 	TP_ARGS(dev, bank, reg, val)
157 );
158 
159 DEFINE_EVENT(dev_rf_reg_evt, mt76x0_rf_write,
160 	TP_PROTO(struct mt76_dev *dev, u8 bank, u8 reg, u8 val),
161 	TP_ARGS(dev, bank, reg, val)
162 );
163 
164 DECLARE_EVENT_CLASS(dev_simple_evt,
165 	TP_PROTO(struct mt76_dev *dev, u8 val),
166 	TP_ARGS(dev, val),
167 	TP_STRUCT__entry(
168 		DEV_ENTRY
169 		__field(u8, val)
170 	),
171 	TP_fast_assign(
172 		DEV_ASSIGN;
173 		__entry->val = val;
174 	),
175 	TP_printk(
176 		DEV_PR_FMT "%02hhx", DEV_PR_ARG, __entry->val
177 	)
178 );
179 
180 TRACE_EVENT(mt76x0_rx,
181 	TP_PROTO(struct mt76_dev *dev, struct mt76x0_rxwi *rxwi, u32 f),
182 	TP_ARGS(dev, rxwi, f),
183 	TP_STRUCT__entry(
184 		DEV_ENTRY
185 		__field_struct(struct mt76x0_rxwi, rxwi)
186 		__field(u32, fce_info)
187 	),
188 	TP_fast_assign(
189 		DEV_ASSIGN;
190 		__entry->rxwi = *rxwi;
191 		__entry->fce_info = f;
192 	),
193 	TP_printk(DEV_PR_FMT "rxi:%08x ctl:%08x", DEV_PR_ARG,
194 		  le32_to_cpu(__entry->rxwi.rxinfo),
195 		  le32_to_cpu(__entry->rxwi.ctl))
196 );
197 
198 TRACE_EVENT(mt76x0_tx,
199 	TP_PROTO(struct mt76_dev *dev, struct sk_buff *skb,
200 		 struct mt76_sta *sta, struct mt76_txwi *h),
201 	TP_ARGS(dev, skb, sta, h),
202 	TP_STRUCT__entry(
203 		DEV_ENTRY
204 		__field_struct(struct mt76_txwi, h)
205 		__field(struct sk_buff *, skb)
206 		__field(struct mt76_sta *, sta)
207 	),
208 	TP_fast_assign(
209 		DEV_ASSIGN;
210 		__entry->h = *h;
211 		__entry->skb = skb;
212 		__entry->sta = sta;
213 	),
214 	TP_printk(DEV_PR_FMT "skb:%p sta:%p  flg:%04hx rate_ctl:%04hx "
215 		  "ack:%02hhx wcid:%02hhx len_ctl:%05hx", DEV_PR_ARG,
216 		  __entry->skb, __entry->sta,
217 		  le16_to_cpu(__entry->h.flags),
218 		  le16_to_cpu(__entry->h.rate_ctl),
219 		  __entry->h.ack_ctl, __entry->h.wcid,
220 		  le16_to_cpu(__entry->h.len_ctl))
221 );
222 
223 TRACE_EVENT(mt76x0_tx_dma_done,
224 	TP_PROTO(struct mt76_dev *dev, struct sk_buff *skb),
225 	TP_ARGS(dev, skb),
226 	TP_STRUCT__entry(
227 		DEV_ENTRY
228 		__field(struct sk_buff *, skb)
229 	),
230 	TP_fast_assign(
231 		DEV_ASSIGN;
232 		__entry->skb = skb;
233 	),
234 	TP_printk(DEV_PR_FMT "%p", DEV_PR_ARG, __entry->skb)
235 );
236 
237 TRACE_EVENT(mt76x0_tx_status_cleaned,
238 	TP_PROTO(struct mt76_dev *dev, int cleaned),
239 	TP_ARGS(dev, cleaned),
240 	TP_STRUCT__entry(
241 		DEV_ENTRY
242 		__field(int, cleaned)
243 	),
244 	TP_fast_assign(
245 		DEV_ASSIGN;
246 		__entry->cleaned = cleaned;
247 	),
248 	TP_printk(DEV_PR_FMT "%d", DEV_PR_ARG, __entry->cleaned)
249 );
250 
251 TRACE_EVENT(mt76x0_tx_status,
252 	TP_PROTO(struct mt76_dev *dev, u32 stat1, u32 stat2),
253 	TP_ARGS(dev, stat1, stat2),
254 	TP_STRUCT__entry(
255 		DEV_ENTRY
256 		__field(u32, stat1)	__field(u32, stat2)
257 	),
258 	TP_fast_assign(
259 		DEV_ASSIGN;
260 		__entry->stat1 = stat1;
261 		__entry->stat2 = stat2;
262 	),
263 	TP_printk(DEV_PR_FMT "%08x %08x",
264 		  DEV_PR_ARG, __entry->stat1, __entry->stat2)
265 );
266 
267 TRACE_EVENT(mt76x0_rx_dma_aggr,
268 	TP_PROTO(struct mt76_dev *dev, int cnt, bool paged),
269 	TP_ARGS(dev, cnt, paged),
270 	TP_STRUCT__entry(
271 		DEV_ENTRY
272 		__field(u8, cnt)
273 		__field(bool, paged)
274 	),
275 	TP_fast_assign(
276 		DEV_ASSIGN;
277 		__entry->cnt = cnt;
278 		__entry->paged = paged;
279 	),
280 	TP_printk(DEV_PR_FMT "cnt:%d paged:%d",
281 		  DEV_PR_ARG, __entry->cnt, __entry->paged)
282 );
283 
284 DEFINE_EVENT(dev_simple_evt, mt76x0_set_key,
285 	TP_PROTO(struct mt76_dev *dev, u8 val),
286 	TP_ARGS(dev, val)
287 );
288 
289 TRACE_EVENT(mt76x0_set_shared_key,
290 	TP_PROTO(struct mt76_dev *dev, u8 vid, u8 key),
291 	TP_ARGS(dev, vid, key),
292 	TP_STRUCT__entry(
293 		DEV_ENTRY
294 		__field(u8, vid)
295 		__field(u8, key)
296 	),
297 	TP_fast_assign(
298 		DEV_ASSIGN;
299 		__entry->vid = vid;
300 		__entry->key = key;
301 	),
302 	TP_printk(DEV_PR_FMT "phy:%02hhx off:%02hhx",
303 		  DEV_PR_ARG, __entry->vid, __entry->key)
304 );
305 
306 #endif
307 
308 #undef TRACE_INCLUDE_PATH
309 #define TRACE_INCLUDE_PATH .
310 #undef TRACE_INCLUDE_FILE
311 #define TRACE_INCLUDE_FILE trace
312 
313 #include <trace/define_trace.h>
314