10766789bSKalle Valo /* SPDX-License-Identifier: ISC */
2416cf0b4SKalle Valo #if !defined(_ATH6KL_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
3416cf0b4SKalle Valo 
4416cf0b4SKalle Valo #include <net/cfg80211.h>
5416cf0b4SKalle Valo #include <linux/skbuff.h>
6416cf0b4SKalle Valo #include <linux/tracepoint.h>
7416cf0b4SKalle Valo #include "wmi.h"
8e60c8154SKalle Valo #include "hif.h"
9416cf0b4SKalle Valo 
10416cf0b4SKalle Valo #if !defined(_ATH6KL_TRACE_H)
ath6kl_get_wmi_id(void * buf,size_t buf_len)11416cf0b4SKalle Valo static inline unsigned int ath6kl_get_wmi_id(void *buf, size_t buf_len)
12416cf0b4SKalle Valo {
13416cf0b4SKalle Valo 	struct wmi_cmd_hdr *hdr = buf;
14416cf0b4SKalle Valo 
15416cf0b4SKalle Valo 	if (buf_len < sizeof(*hdr))
16416cf0b4SKalle Valo 		return 0;
17416cf0b4SKalle Valo 
18416cf0b4SKalle Valo 	return le16_to_cpu(hdr->cmd_id);
19416cf0b4SKalle Valo }
20416cf0b4SKalle Valo #endif /* __ATH6KL_TRACE_H */
21416cf0b4SKalle Valo 
22416cf0b4SKalle Valo #define _ATH6KL_TRACE_H
23416cf0b4SKalle Valo 
24416cf0b4SKalle Valo /* create empty functions when tracing is disabled */
25416cf0b4SKalle Valo #if !defined(CONFIG_ATH6KL_TRACING)
26416cf0b4SKalle Valo #undef TRACE_EVENT
27416cf0b4SKalle Valo #define TRACE_EVENT(name, proto, ...) \
28416cf0b4SKalle Valo static inline void trace_ ## name(proto) {}
29da01d53cSKalle Valo #undef DECLARE_EVENT_CLASS
30da01d53cSKalle Valo #define DECLARE_EVENT_CLASS(...)
31da01d53cSKalle Valo #undef DEFINE_EVENT
32da01d53cSKalle Valo #define DEFINE_EVENT(evt_class, name, proto, ...) \
33da01d53cSKalle Valo static inline void trace_ ## name(proto) {}
34416cf0b4SKalle Valo #endif /* !CONFIG_ATH6KL_TRACING || __CHECKER__ */
35416cf0b4SKalle Valo 
36416cf0b4SKalle Valo #undef TRACE_SYSTEM
37416cf0b4SKalle Valo #define TRACE_SYSTEM ath6kl
38416cf0b4SKalle Valo 
39416cf0b4SKalle Valo TRACE_EVENT(ath6kl_wmi_cmd,
40416cf0b4SKalle Valo 	TP_PROTO(void *buf, size_t buf_len),
41416cf0b4SKalle Valo 
42416cf0b4SKalle Valo 	TP_ARGS(buf, buf_len),
43416cf0b4SKalle Valo 
44416cf0b4SKalle Valo 	TP_STRUCT__entry(
45416cf0b4SKalle Valo 		__field(unsigned int, id)
46416cf0b4SKalle Valo 		__field(size_t, buf_len)
47416cf0b4SKalle Valo 		__dynamic_array(u8, buf, buf_len)
48416cf0b4SKalle Valo 	),
49416cf0b4SKalle Valo 
50416cf0b4SKalle Valo 	TP_fast_assign(
51416cf0b4SKalle Valo 		__entry->id = ath6kl_get_wmi_id(buf, buf_len);
52416cf0b4SKalle Valo 		__entry->buf_len = buf_len;
53416cf0b4SKalle Valo 		memcpy(__get_dynamic_array(buf), buf, buf_len);
54416cf0b4SKalle Valo 	),
55416cf0b4SKalle Valo 
56416cf0b4SKalle Valo 	TP_printk(
570d4e6717SKalle Valo 		"id %d len %zd",
58416cf0b4SKalle Valo 		__entry->id, __entry->buf_len
59416cf0b4SKalle Valo 	)
60416cf0b4SKalle Valo );
61416cf0b4SKalle Valo 
62416cf0b4SKalle Valo TRACE_EVENT(ath6kl_wmi_event,
63416cf0b4SKalle Valo 	TP_PROTO(void *buf, size_t buf_len),
64416cf0b4SKalle Valo 
65416cf0b4SKalle Valo 	TP_ARGS(buf, buf_len),
66416cf0b4SKalle Valo 
67416cf0b4SKalle Valo 	TP_STRUCT__entry(
68416cf0b4SKalle Valo 		__field(unsigned int, id)
69416cf0b4SKalle Valo 		__field(size_t, buf_len)
70416cf0b4SKalle Valo 		__dynamic_array(u8, buf, buf_len)
71416cf0b4SKalle Valo 	),
72416cf0b4SKalle Valo 
73416cf0b4SKalle Valo 	TP_fast_assign(
74416cf0b4SKalle Valo 		__entry->id = ath6kl_get_wmi_id(buf, buf_len);
75416cf0b4SKalle Valo 		__entry->buf_len = buf_len;
76416cf0b4SKalle Valo 		memcpy(__get_dynamic_array(buf), buf, buf_len);
77416cf0b4SKalle Valo 	),
78416cf0b4SKalle Valo 
79416cf0b4SKalle Valo 	TP_printk(
800d4e6717SKalle Valo 		"id %d len %zd",
81416cf0b4SKalle Valo 		__entry->id, __entry->buf_len
82416cf0b4SKalle Valo 	)
83416cf0b4SKalle Valo );
84416cf0b4SKalle Valo 
85e60c8154SKalle Valo TRACE_EVENT(ath6kl_sdio,
86e60c8154SKalle Valo 	TP_PROTO(unsigned int addr, int flags,
87e60c8154SKalle Valo 		 void *buf, size_t buf_len),
88e60c8154SKalle Valo 
89e60c8154SKalle Valo 	TP_ARGS(addr, flags, buf, buf_len),
90e60c8154SKalle Valo 
91e60c8154SKalle Valo 	TP_STRUCT__entry(
92e60c8154SKalle Valo 		__field(unsigned int, tx)
93e60c8154SKalle Valo 		__field(unsigned int, addr)
94e60c8154SKalle Valo 		__field(int, flags)
95e60c8154SKalle Valo 		__field(size_t, buf_len)
96e60c8154SKalle Valo 		__dynamic_array(u8, buf, buf_len)
97e60c8154SKalle Valo 	),
98e60c8154SKalle Valo 
99e60c8154SKalle Valo 	TP_fast_assign(
100e60c8154SKalle Valo 		__entry->addr = addr;
101e60c8154SKalle Valo 		__entry->flags = flags;
102e60c8154SKalle Valo 		__entry->buf_len = buf_len;
103e60c8154SKalle Valo 		memcpy(__get_dynamic_array(buf), buf, buf_len);
104e60c8154SKalle Valo 
105e60c8154SKalle Valo 		if (flags & HIF_WRITE)
106e60c8154SKalle Valo 			__entry->tx = 1;
107e60c8154SKalle Valo 		else
108e60c8154SKalle Valo 			__entry->tx = 0;
109e60c8154SKalle Valo 	),
110e60c8154SKalle Valo 
111e60c8154SKalle Valo 	TP_printk(
1120d4e6717SKalle Valo 		"%s addr 0x%x flags 0x%x len %zd\n",
113e60c8154SKalle Valo 		__entry->tx ? "tx" : "rx",
114e60c8154SKalle Valo 		__entry->addr,
115e60c8154SKalle Valo 		__entry->flags,
116e60c8154SKalle Valo 		__entry->buf_len
117e60c8154SKalle Valo 	)
118e60c8154SKalle Valo );
119e60c8154SKalle Valo 
120e60c8154SKalle Valo TRACE_EVENT(ath6kl_sdio_scat,
121e60c8154SKalle Valo 	TP_PROTO(unsigned int addr, int flags, unsigned int total_len,
122e60c8154SKalle Valo 		 unsigned int entries, struct hif_scatter_item *list),
123e60c8154SKalle Valo 
124e60c8154SKalle Valo 	TP_ARGS(addr, flags, total_len, entries, list),
125e60c8154SKalle Valo 
126e60c8154SKalle Valo 	TP_STRUCT__entry(
127e60c8154SKalle Valo 		__field(unsigned int, tx)
128e60c8154SKalle Valo 		__field(unsigned int, addr)
129e60c8154SKalle Valo 		__field(int, flags)
130e60c8154SKalle Valo 		__field(unsigned int, entries)
131e60c8154SKalle Valo 		__field(size_t, total_len)
132e60c8154SKalle Valo 		__dynamic_array(unsigned int, len_array, entries)
133e60c8154SKalle Valo 		__dynamic_array(u8, data, total_len)
134e60c8154SKalle Valo 	),
135e60c8154SKalle Valo 
136e60c8154SKalle Valo 	TP_fast_assign(
137e60c8154SKalle Valo 		unsigned int *len_array;
138e60c8154SKalle Valo 		int i, offset = 0;
139e60c8154SKalle Valo 		size_t len;
140e60c8154SKalle Valo 
141e60c8154SKalle Valo 		__entry->addr = addr;
142e60c8154SKalle Valo 		__entry->flags = flags;
143e60c8154SKalle Valo 		__entry->entries = entries;
144e60c8154SKalle Valo 		__entry->total_len = total_len;
145e60c8154SKalle Valo 
146e60c8154SKalle Valo 		if (flags & HIF_WRITE)
147e60c8154SKalle Valo 			__entry->tx = 1;
148e60c8154SKalle Valo 		else
149e60c8154SKalle Valo 			__entry->tx = 0;
150e60c8154SKalle Valo 
151e60c8154SKalle Valo 		len_array = __get_dynamic_array(len_array);
152e60c8154SKalle Valo 
153e60c8154SKalle Valo 		for (i = 0; i < entries; i++) {
154e60c8154SKalle Valo 			len = list[i].len;
155e60c8154SKalle Valo 
156e60c8154SKalle Valo 			memcpy((u8 *) __get_dynamic_array(data) + offset,
157e60c8154SKalle Valo 			       list[i].buf, len);
158e60c8154SKalle Valo 
159e60c8154SKalle Valo 			len_array[i] = len;
160e60c8154SKalle Valo 			offset += len;
161e60c8154SKalle Valo 		}
162e60c8154SKalle Valo 	),
163e60c8154SKalle Valo 
164e60c8154SKalle Valo 	TP_printk(
1650d4e6717SKalle Valo 		"%s addr 0x%x flags 0x%x entries %d total_len %zd\n",
166e60c8154SKalle Valo 		__entry->tx ? "tx" : "rx",
167e60c8154SKalle Valo 		__entry->addr,
168e60c8154SKalle Valo 		__entry->flags,
169e60c8154SKalle Valo 		__entry->entries,
170e60c8154SKalle Valo 		__entry->total_len
171e60c8154SKalle Valo 	)
172e60c8154SKalle Valo );
173e60c8154SKalle Valo 
174d57f093aSKalle Valo TRACE_EVENT(ath6kl_sdio_irq,
175d57f093aSKalle Valo 	TP_PROTO(void *buf, size_t buf_len),
176d57f093aSKalle Valo 
177d57f093aSKalle Valo 	TP_ARGS(buf, buf_len),
178d57f093aSKalle Valo 
179d57f093aSKalle Valo 	TP_STRUCT__entry(
180d57f093aSKalle Valo 		__field(size_t, buf_len)
181d57f093aSKalle Valo 		__dynamic_array(u8, buf, buf_len)
182d57f093aSKalle Valo 	),
183d57f093aSKalle Valo 
184d57f093aSKalle Valo 	TP_fast_assign(
185d57f093aSKalle Valo 		__entry->buf_len = buf_len;
186d57f093aSKalle Valo 		memcpy(__get_dynamic_array(buf), buf, buf_len);
187d57f093aSKalle Valo 	),
188d57f093aSKalle Valo 
189d57f093aSKalle Valo 	TP_printk(
1900d4e6717SKalle Valo 		"irq len %zd\n", __entry->buf_len
191d57f093aSKalle Valo 	)
192d57f093aSKalle Valo );
193d57f093aSKalle Valo 
1944771979aSKalle Valo TRACE_EVENT(ath6kl_htc_rx,
1954771979aSKalle Valo 	TP_PROTO(int status, int endpoint, void *buf,
1964771979aSKalle Valo 		 size_t buf_len),
1974771979aSKalle Valo 
1984771979aSKalle Valo 	TP_ARGS(status, endpoint, buf, buf_len),
1994771979aSKalle Valo 
2004771979aSKalle Valo 	TP_STRUCT__entry(
2014771979aSKalle Valo 		__field(int, status)
2024771979aSKalle Valo 		__field(int, endpoint)
2034771979aSKalle Valo 		__field(size_t, buf_len)
2044771979aSKalle Valo 		__dynamic_array(u8, buf, buf_len)
2054771979aSKalle Valo 	),
2064771979aSKalle Valo 
2074771979aSKalle Valo 	TP_fast_assign(
2084771979aSKalle Valo 		__entry->status = status;
2094771979aSKalle Valo 		__entry->endpoint = endpoint;
2104771979aSKalle Valo 		__entry->buf_len = buf_len;
2114771979aSKalle Valo 		memcpy(__get_dynamic_array(buf), buf, buf_len);
2124771979aSKalle Valo 	),
2134771979aSKalle Valo 
2144771979aSKalle Valo 	TP_printk(
2150d4e6717SKalle Valo 		"status %d endpoint %d len %zd\n",
2164771979aSKalle Valo 		__entry->status,
2174771979aSKalle Valo 		__entry->endpoint,
2184771979aSKalle Valo 		__entry->buf_len
2194771979aSKalle Valo 	)
2204771979aSKalle Valo );
2214771979aSKalle Valo 
2224771979aSKalle Valo TRACE_EVENT(ath6kl_htc_tx,
2234771979aSKalle Valo 	TP_PROTO(int status, int endpoint, void *buf,
2244771979aSKalle Valo 		 size_t buf_len),
2254771979aSKalle Valo 
2264771979aSKalle Valo 	TP_ARGS(status, endpoint, buf, buf_len),
2274771979aSKalle Valo 
2284771979aSKalle Valo 	TP_STRUCT__entry(
2294771979aSKalle Valo 		__field(int, status)
2304771979aSKalle Valo 		__field(int, endpoint)
2314771979aSKalle Valo 		__field(size_t, buf_len)
2324771979aSKalle Valo 		__dynamic_array(u8, buf, buf_len)
2334771979aSKalle Valo 	),
2344771979aSKalle Valo 
2354771979aSKalle Valo 	TP_fast_assign(
2364771979aSKalle Valo 		__entry->status = status;
2374771979aSKalle Valo 		__entry->endpoint = endpoint;
2384771979aSKalle Valo 		__entry->buf_len = buf_len;
2394771979aSKalle Valo 		memcpy(__get_dynamic_array(buf), buf, buf_len);
2404771979aSKalle Valo 	),
2414771979aSKalle Valo 
2424771979aSKalle Valo 	TP_printk(
2430d4e6717SKalle Valo 		"status %d endpoint %d len %zd\n",
2444771979aSKalle Valo 		__entry->status,
2454771979aSKalle Valo 		__entry->endpoint,
2464771979aSKalle Valo 		__entry->buf_len
2474771979aSKalle Valo 	)
2484771979aSKalle Valo );
2494771979aSKalle Valo 
250da01d53cSKalle Valo #define ATH6KL_MSG_MAX 200
251da01d53cSKalle Valo 
252da01d53cSKalle Valo DECLARE_EVENT_CLASS(ath6kl_log_event,
253da01d53cSKalle Valo 	TP_PROTO(struct va_format *vaf),
254da01d53cSKalle Valo 	TP_ARGS(vaf),
255da01d53cSKalle Valo 	TP_STRUCT__entry(
256*c01406f8SSteven Rostedt (Google) 		__vstring(msg, vaf->fmt, vaf->va)
257da01d53cSKalle Valo 	),
258da01d53cSKalle Valo 	TP_fast_assign(
259*c01406f8SSteven Rostedt (Google) 		__assign_vstr(msg, vaf->fmt, vaf->va);
260da01d53cSKalle Valo 	),
261da01d53cSKalle Valo 	TP_printk("%s", __get_str(msg))
262da01d53cSKalle Valo );
263da01d53cSKalle Valo 
264da01d53cSKalle Valo DEFINE_EVENT(ath6kl_log_event, ath6kl_log_err,
265da01d53cSKalle Valo 	     TP_PROTO(struct va_format *vaf),
266da01d53cSKalle Valo 	     TP_ARGS(vaf)
267da01d53cSKalle Valo );
268da01d53cSKalle Valo 
269da01d53cSKalle Valo DEFINE_EVENT(ath6kl_log_event, ath6kl_log_warn,
270da01d53cSKalle Valo 	     TP_PROTO(struct va_format *vaf),
271da01d53cSKalle Valo 	     TP_ARGS(vaf)
272da01d53cSKalle Valo );
273da01d53cSKalle Valo 
274da01d53cSKalle Valo DEFINE_EVENT(ath6kl_log_event, ath6kl_log_info,
275da01d53cSKalle Valo 	     TP_PROTO(struct va_format *vaf),
276da01d53cSKalle Valo 	     TP_ARGS(vaf)
277da01d53cSKalle Valo );
278da01d53cSKalle Valo 
279aa8705fcSKalle Valo TRACE_EVENT(ath6kl_log_dbg,
280aa8705fcSKalle Valo 	TP_PROTO(unsigned int level, struct va_format *vaf),
281aa8705fcSKalle Valo 	TP_ARGS(level, vaf),
282aa8705fcSKalle Valo 	TP_STRUCT__entry(
283aa8705fcSKalle Valo 		__field(unsigned int, level)
284*c01406f8SSteven Rostedt (Google) 		__vstring(msg, vaf->fmt, vaf->va)
285aa8705fcSKalle Valo 	),
286aa8705fcSKalle Valo 	TP_fast_assign(
287aa8705fcSKalle Valo 		__entry->level = level;
288*c01406f8SSteven Rostedt (Google) 		__assign_vstr(msg, vaf->fmt, vaf->va);
289aa8705fcSKalle Valo 	),
290aa8705fcSKalle Valo 	TP_printk("%s", __get_str(msg))
291aa8705fcSKalle Valo );
292aa8705fcSKalle Valo 
293aa8705fcSKalle Valo TRACE_EVENT(ath6kl_log_dbg_dump,
294aa8705fcSKalle Valo 	TP_PROTO(const char *msg, const char *prefix,
295aa8705fcSKalle Valo 		 const void *buf, size_t buf_len),
296aa8705fcSKalle Valo 
297aa8705fcSKalle Valo 	TP_ARGS(msg, prefix, buf, buf_len),
298aa8705fcSKalle Valo 
299aa8705fcSKalle Valo 	TP_STRUCT__entry(
300aa8705fcSKalle Valo 		__string(msg, msg)
301aa8705fcSKalle Valo 		__string(prefix, prefix)
302aa8705fcSKalle Valo 		__field(size_t, buf_len)
303aa8705fcSKalle Valo 		__dynamic_array(u8, buf, buf_len)
304aa8705fcSKalle Valo 	),
305aa8705fcSKalle Valo 
306aa8705fcSKalle Valo 	TP_fast_assign(
307aa8705fcSKalle Valo 		__assign_str(msg, msg);
308aa8705fcSKalle Valo 		__assign_str(prefix, prefix);
309aa8705fcSKalle Valo 		__entry->buf_len = buf_len;
310aa8705fcSKalle Valo 		memcpy(__get_dynamic_array(buf), buf, buf_len);
311aa8705fcSKalle Valo 	),
312aa8705fcSKalle Valo 
313aa8705fcSKalle Valo 	TP_printk(
314aa8705fcSKalle Valo 		"%s/%s\n", __get_str(prefix), __get_str(msg)
315aa8705fcSKalle Valo 	)
316aa8705fcSKalle Valo );
317aa8705fcSKalle Valo 
318416cf0b4SKalle Valo #endif /* _ ATH6KL_TRACE_H || TRACE_HEADER_MULTI_READ*/
319416cf0b4SKalle Valo 
320416cf0b4SKalle Valo /* we don't want to use include/trace/events */
321416cf0b4SKalle Valo #undef TRACE_INCLUDE_PATH
322416cf0b4SKalle Valo #define TRACE_INCLUDE_PATH .
323416cf0b4SKalle Valo #undef TRACE_INCLUDE_FILE
324416cf0b4SKalle Valo #define TRACE_INCLUDE_FILE trace
325416cf0b4SKalle Valo 
326416cf0b4SKalle Valo /* This part must be outside protection */
327416cf0b4SKalle Valo #include <trace/define_trace.h>
328