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