1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Portions of this file
4 * Copyright(c) 2016-2017 Intel Deutschland GmbH
5 * Copyright (C) 2018 - 2024 Intel Corporation
6 */
7
8#if !defined(__MAC80211_DRIVER_TRACE) || defined(TRACE_HEADER_MULTI_READ)
9#define __MAC80211_DRIVER_TRACE
10
11#include <linux/tracepoint.h>
12#include <net/mac80211.h>
13#include "ieee80211_i.h"
14
15#undef TRACE_SYSTEM
16#define TRACE_SYSTEM mac80211
17
18#define MAXNAME		32
19#define LOCAL_ENTRY	__array(char, wiphy_name, 32)
20#define LOCAL_ASSIGN	strscpy(__entry->wiphy_name, wiphy_name(local->hw.wiphy), MAXNAME)
21#define LOCAL_PR_FMT	"%s"
22#define LOCAL_PR_ARG	__entry->wiphy_name
23
24#define STA_ENTRY	__array(char, sta_addr, ETH_ALEN)
25#define STA_ASSIGN	(sta ? memcpy(__entry->sta_addr, sta->addr, ETH_ALEN) : \
26				eth_zero_addr(__entry->sta_addr))
27#define STA_NAMED_ASSIGN(s)	memcpy(__entry->sta_addr, (s)->addr, ETH_ALEN)
28#define STA_PR_FMT	" sta:%pM"
29#define STA_PR_ARG	__entry->sta_addr
30
31#define VIF_ENTRY	__field(enum nl80211_iftype, vif_type) __field(void *, sdata)	\
32			__field(bool, p2p)						\
33			__string(vif_name, sdata->name)
34#define VIF_ASSIGN	__entry->vif_type = sdata->vif.type; __entry->sdata = sdata;	\
35			__entry->p2p = sdata->vif.p2p;					\
36			__assign_str(vif_name, sdata->name)
37#define VIF_PR_FMT	" vif:%s(%d%s)"
38#define VIF_PR_ARG	__get_str(vif_name), __entry->vif_type, __entry->p2p ? "/p2p" : ""
39
40#define CHANDEF_ENTRY	__field(u32, control_freq)					\
41			__field(u32, freq_offset)					\
42			__field(u32, chan_width)					\
43			__field(u32, center_freq1)					\
44			__field(u32, freq1_offset)					\
45			__field(u32, center_freq2)
46#define CHANDEF_ASSIGN(c)							\
47			__entry->control_freq = (c) ? ((c)->chan ? (c)->chan->center_freq : 0) : 0;	\
48			__entry->freq_offset = (c) ? ((c)->chan ? (c)->chan->freq_offset : 0) : 0;	\
49			__entry->chan_width = (c) ? (c)->width : 0;			\
50			__entry->center_freq1 = (c) ? (c)->center_freq1 : 0;		\
51			__entry->freq1_offset = (c) ? (c)->freq1_offset : 0;		\
52			__entry->center_freq2 = (c) ? (c)->center_freq2 : 0;
53#define CHANDEF_PR_FMT	" chandef(%d.%03d MHz,width:%d,center: %d.%03d/%d MHz)"
54#define CHANDEF_PR_ARG	__entry->control_freq, __entry->freq_offset, __entry->chan_width, \
55			__entry->center_freq1, __entry->freq1_offset, __entry->center_freq2
56
57#define MIN_CHANDEF_ENTRY								\
58			__field(u32, min_control_freq)					\
59			__field(u32, min_freq_offset)					\
60			__field(u32, min_chan_width)					\
61			__field(u32, min_center_freq1)					\
62			__field(u32, min_freq1_offset)					\
63			__field(u32, min_center_freq2)
64
65#define MIN_CHANDEF_ASSIGN(c)								\
66			__entry->min_control_freq = (c)->chan ? (c)->chan->center_freq : 0;	\
67			__entry->min_freq_offset = (c)->chan ? (c)->chan->freq_offset : 0;	\
68			__entry->min_chan_width = (c)->width;				\
69			__entry->min_center_freq1 = (c)->center_freq1;			\
70			__entry->min_freq1_offset = (c)->freq1_offset;			\
71			__entry->min_center_freq2 = (c)->center_freq2;
72#define MIN_CHANDEF_PR_FMT	" mindef(%d.%03d MHz,width:%d,center: %d.%03d/%d MHz)"
73#define MIN_CHANDEF_PR_ARG	__entry->min_control_freq, __entry->min_freq_offset,	\
74			__entry->min_chan_width,					\
75			__entry->min_center_freq1, __entry->min_freq1_offset,		\
76			__entry->min_center_freq2
77
78#define AP_CHANDEF_ENTRY								\
79			__field(u32, ap_control_freq)					\
80			__field(u32, ap_freq_offset)					\
81			__field(u32, ap_chan_width)					\
82			__field(u32, ap_center_freq1)					\
83			__field(u32, ap_freq1_offset)					\
84			__field(u32, ap_center_freq2)
85
86#define AP_CHANDEF_ASSIGN(c)								\
87			__entry->ap_control_freq = (c)->chan ? (c)->chan->center_freq : 0;\
88			__entry->ap_freq_offset = (c)->chan ? (c)->chan->freq_offset : 0;\
89			__entry->ap_chan_width = (c)->chan ? (c)->width : 0;		\
90			__entry->ap_center_freq1 = (c)->chan ? (c)->center_freq1 : 0;	\
91			__entry->ap_freq1_offset = (c)->chan ? (c)->freq1_offset : 0;	\
92			__entry->ap_center_freq2 = (c)->chan ? (c)->center_freq2 : 0;
93#define AP_CHANDEF_PR_FMT	" ap(%d.%03d MHz,width:%d,center: %d.%03d/%d MHz)"
94#define AP_CHANDEF_PR_ARG	__entry->ap_control_freq, __entry->ap_freq_offset,	\
95			__entry->ap_chan_width,						\
96			__entry->ap_center_freq1, __entry->ap_freq1_offset,		\
97			__entry->ap_center_freq2
98
99#define CHANCTX_ENTRY	CHANDEF_ENTRY							\
100			MIN_CHANDEF_ENTRY						\
101			AP_CHANDEF_ENTRY						\
102			__field(u8, rx_chains_static)					\
103			__field(u8, rx_chains_dynamic)
104#define CHANCTX_ASSIGN	CHANDEF_ASSIGN(&ctx->conf.def)					\
105			MIN_CHANDEF_ASSIGN(&ctx->conf.min_def)				\
106			AP_CHANDEF_ASSIGN(&ctx->conf.ap)				\
107			__entry->rx_chains_static = ctx->conf.rx_chains_static;		\
108			__entry->rx_chains_dynamic = ctx->conf.rx_chains_dynamic
109#define CHANCTX_PR_FMT	CHANDEF_PR_FMT MIN_CHANDEF_PR_FMT AP_CHANDEF_PR_FMT " chains:%d/%d"
110#define CHANCTX_PR_ARG	CHANDEF_PR_ARG,	MIN_CHANDEF_PR_ARG, AP_CHANDEF_PR_ARG,		\
111			__entry->rx_chains_static, __entry->rx_chains_dynamic
112
113#define KEY_ENTRY	__field(u32, cipher)						\
114			__field(u8, hw_key_idx)						\
115			__field(u8, flags)						\
116			__field(s8, keyidx)
117#define KEY_ASSIGN(k)	__entry->cipher = (k)->cipher;					\
118			__entry->flags = (k)->flags;					\
119			__entry->keyidx = (k)->keyidx;					\
120			__entry->hw_key_idx = (k)->hw_key_idx;
121#define KEY_PR_FMT	" cipher:0x%x, flags=%#x, keyidx=%d, hw_key_idx=%d"
122#define KEY_PR_ARG	__entry->cipher, __entry->flags, __entry->keyidx, __entry->hw_key_idx
123
124#define AMPDU_ACTION_ENTRY	__field(enum ieee80211_ampdu_mlme_action,		\
125					ieee80211_ampdu_mlme_action)			\
126				STA_ENTRY						\
127				__field(u16, tid)					\
128				__field(u16, ssn)					\
129				__field(u16, buf_size)					\
130				__field(bool, amsdu)					\
131				__field(u16, timeout)					\
132				__field(u16, action)
133#define AMPDU_ACTION_ASSIGN	STA_NAMED_ASSIGN(params->sta);				\
134				__entry->tid = params->tid;				\
135				__entry->ssn = params->ssn;				\
136				__entry->buf_size = params->buf_size;			\
137				__entry->amsdu = params->amsdu;				\
138				__entry->timeout = params->timeout;			\
139				__entry->action = params->action;
140#define AMPDU_ACTION_PR_FMT	STA_PR_FMT " tid %d, ssn %d, buf_size %u, amsdu %d, timeout %d action %d"
141#define AMPDU_ACTION_PR_ARG	STA_PR_ARG, __entry->tid, __entry->ssn,			\
142				__entry->buf_size, __entry->amsdu, __entry->timeout,	\
143				__entry->action
144
145/*
146 * Tracing for driver callbacks.
147 */
148
149DECLARE_EVENT_CLASS(local_only_evt,
150	TP_PROTO(struct ieee80211_local *local),
151	TP_ARGS(local),
152	TP_STRUCT__entry(
153		LOCAL_ENTRY
154	),
155	TP_fast_assign(
156		LOCAL_ASSIGN;
157	),
158	TP_printk(LOCAL_PR_FMT, LOCAL_PR_ARG)
159);
160
161DECLARE_EVENT_CLASS(local_sdata_addr_evt,
162	TP_PROTO(struct ieee80211_local *local,
163		 struct ieee80211_sub_if_data *sdata),
164	TP_ARGS(local, sdata),
165
166	TP_STRUCT__entry(
167		LOCAL_ENTRY
168		VIF_ENTRY
169		__array(char, addr, ETH_ALEN)
170	),
171
172	TP_fast_assign(
173		LOCAL_ASSIGN;
174		VIF_ASSIGN;
175		memcpy(__entry->addr, sdata->vif.addr, ETH_ALEN);
176	),
177
178	TP_printk(
179		LOCAL_PR_FMT  VIF_PR_FMT " addr:%pM",
180		LOCAL_PR_ARG, VIF_PR_ARG, __entry->addr
181	)
182);
183
184DECLARE_EVENT_CLASS(local_u32_evt,
185	TP_PROTO(struct ieee80211_local *local, u32 value),
186	TP_ARGS(local, value),
187
188	TP_STRUCT__entry(
189		LOCAL_ENTRY
190		__field(u32, value)
191	),
192
193	TP_fast_assign(
194		LOCAL_ASSIGN;
195		__entry->value = value;
196	),
197
198	TP_printk(
199		LOCAL_PR_FMT " value:%d",
200		LOCAL_PR_ARG, __entry->value
201	)
202);
203
204DECLARE_EVENT_CLASS(local_sdata_evt,
205	TP_PROTO(struct ieee80211_local *local,
206		 struct ieee80211_sub_if_data *sdata),
207	TP_ARGS(local, sdata),
208
209	TP_STRUCT__entry(
210		LOCAL_ENTRY
211		VIF_ENTRY
212	),
213
214	TP_fast_assign(
215		LOCAL_ASSIGN;
216		VIF_ASSIGN;
217	),
218
219	TP_printk(
220		LOCAL_PR_FMT VIF_PR_FMT,
221		LOCAL_PR_ARG, VIF_PR_ARG
222	)
223);
224
225DEFINE_EVENT(local_only_evt, drv_return_void,
226	TP_PROTO(struct ieee80211_local *local),
227	TP_ARGS(local)
228);
229
230TRACE_EVENT(drv_return_int,
231	TP_PROTO(struct ieee80211_local *local, int ret),
232	TP_ARGS(local, ret),
233	TP_STRUCT__entry(
234		LOCAL_ENTRY
235		__field(int, ret)
236	),
237	TP_fast_assign(
238		LOCAL_ASSIGN;
239		__entry->ret = ret;
240	),
241	TP_printk(LOCAL_PR_FMT " - %d", LOCAL_PR_ARG, __entry->ret)
242);
243
244TRACE_EVENT(drv_return_bool,
245	TP_PROTO(struct ieee80211_local *local, bool ret),
246	TP_ARGS(local, ret),
247	TP_STRUCT__entry(
248		LOCAL_ENTRY
249		__field(bool, ret)
250	),
251	TP_fast_assign(
252		LOCAL_ASSIGN;
253		__entry->ret = ret;
254	),
255	TP_printk(LOCAL_PR_FMT " - %s", LOCAL_PR_ARG, (__entry->ret) ?
256		  "true" : "false")
257);
258
259TRACE_EVENT(drv_return_u32,
260	TP_PROTO(struct ieee80211_local *local, u32 ret),
261	TP_ARGS(local, ret),
262	TP_STRUCT__entry(
263		LOCAL_ENTRY
264		__field(u32, ret)
265	),
266	TP_fast_assign(
267		LOCAL_ASSIGN;
268		__entry->ret = ret;
269	),
270	TP_printk(LOCAL_PR_FMT " - %u", LOCAL_PR_ARG, __entry->ret)
271);
272
273TRACE_EVENT(drv_return_u64,
274	TP_PROTO(struct ieee80211_local *local, u64 ret),
275	TP_ARGS(local, ret),
276	TP_STRUCT__entry(
277		LOCAL_ENTRY
278		__field(u64, ret)
279	),
280	TP_fast_assign(
281		LOCAL_ASSIGN;
282		__entry->ret = ret;
283	),
284	TP_printk(LOCAL_PR_FMT " - %llu", LOCAL_PR_ARG, __entry->ret)
285);
286
287DEFINE_EVENT(local_only_evt, drv_start,
288	TP_PROTO(struct ieee80211_local *local),
289	TP_ARGS(local)
290);
291
292DEFINE_EVENT(local_u32_evt, drv_get_et_strings,
293	     TP_PROTO(struct ieee80211_local *local, u32 sset),
294	     TP_ARGS(local, sset)
295);
296
297DEFINE_EVENT(local_u32_evt, drv_get_et_sset_count,
298	     TP_PROTO(struct ieee80211_local *local, u32 sset),
299	     TP_ARGS(local, sset)
300);
301
302DEFINE_EVENT(local_only_evt, drv_get_et_stats,
303	     TP_PROTO(struct ieee80211_local *local),
304	     TP_ARGS(local)
305);
306
307DEFINE_EVENT(local_only_evt, drv_suspend,
308	TP_PROTO(struct ieee80211_local *local),
309	TP_ARGS(local)
310);
311
312DEFINE_EVENT(local_only_evt, drv_resume,
313	TP_PROTO(struct ieee80211_local *local),
314	TP_ARGS(local)
315);
316
317TRACE_EVENT(drv_set_wakeup,
318	TP_PROTO(struct ieee80211_local *local, bool enabled),
319	TP_ARGS(local, enabled),
320	TP_STRUCT__entry(
321		LOCAL_ENTRY
322		__field(bool, enabled)
323	),
324	TP_fast_assign(
325		LOCAL_ASSIGN;
326		__entry->enabled = enabled;
327	),
328	TP_printk(LOCAL_PR_FMT " enabled:%d", LOCAL_PR_ARG, __entry->enabled)
329);
330
331DEFINE_EVENT(local_only_evt, drv_stop,
332	TP_PROTO(struct ieee80211_local *local),
333	TP_ARGS(local)
334);
335
336DEFINE_EVENT(local_sdata_addr_evt, drv_add_interface,
337	TP_PROTO(struct ieee80211_local *local,
338		 struct ieee80211_sub_if_data *sdata),
339	TP_ARGS(local, sdata)
340);
341
342TRACE_EVENT(drv_change_interface,
343	TP_PROTO(struct ieee80211_local *local,
344		 struct ieee80211_sub_if_data *sdata,
345		 enum nl80211_iftype type, bool p2p),
346
347	TP_ARGS(local, sdata, type, p2p),
348
349	TP_STRUCT__entry(
350		LOCAL_ENTRY
351		VIF_ENTRY
352		__field(u32, new_type)
353		__field(bool, new_p2p)
354	),
355
356	TP_fast_assign(
357		LOCAL_ASSIGN;
358		VIF_ASSIGN;
359		__entry->new_type = type;
360		__entry->new_p2p = p2p;
361	),
362
363	TP_printk(
364		LOCAL_PR_FMT  VIF_PR_FMT " new type:%d%s",
365		LOCAL_PR_ARG, VIF_PR_ARG, __entry->new_type,
366		__entry->new_p2p ? "/p2p" : ""
367	)
368);
369
370DEFINE_EVENT(local_sdata_addr_evt, drv_remove_interface,
371	TP_PROTO(struct ieee80211_local *local,
372		 struct ieee80211_sub_if_data *sdata),
373	TP_ARGS(local, sdata)
374);
375
376TRACE_EVENT(drv_config,
377	TP_PROTO(struct ieee80211_local *local,
378		 u32 changed),
379
380	TP_ARGS(local, changed),
381
382	TP_STRUCT__entry(
383		LOCAL_ENTRY
384		__field(u32, changed)
385		__field(u32, flags)
386		__field(int, power_level)
387		__field(int, dynamic_ps_timeout)
388		__field(u16, listen_interval)
389		__field(u8, long_frame_max_tx_count)
390		__field(u8, short_frame_max_tx_count)
391		CHANDEF_ENTRY
392		__field(int, smps)
393	),
394
395	TP_fast_assign(
396		LOCAL_ASSIGN;
397		__entry->changed = changed;
398		__entry->flags = local->hw.conf.flags;
399		__entry->power_level = local->hw.conf.power_level;
400		__entry->dynamic_ps_timeout = local->hw.conf.dynamic_ps_timeout;
401		__entry->listen_interval = local->hw.conf.listen_interval;
402		__entry->long_frame_max_tx_count =
403			local->hw.conf.long_frame_max_tx_count;
404		__entry->short_frame_max_tx_count =
405			local->hw.conf.short_frame_max_tx_count;
406		CHANDEF_ASSIGN(&local->hw.conf.chandef)
407		__entry->smps = local->hw.conf.smps_mode;
408	),
409
410	TP_printk(
411		LOCAL_PR_FMT " ch:%#x" CHANDEF_PR_FMT,
412		LOCAL_PR_ARG, __entry->changed, CHANDEF_PR_ARG
413	)
414);
415
416TRACE_EVENT(drv_vif_cfg_changed,
417	TP_PROTO(struct ieee80211_local *local,
418		 struct ieee80211_sub_if_data *sdata,
419		 u64 changed),
420
421	TP_ARGS(local, sdata, changed),
422
423	TP_STRUCT__entry(
424		LOCAL_ENTRY
425		VIF_ENTRY
426		__field(u64, changed)
427		__field(bool, assoc)
428		__field(bool, ibss_joined)
429		__field(bool, ibss_creator)
430		__field(u16, aid)
431		__dynamic_array(u32, arp_addr_list,
432				sdata->vif.cfg.arp_addr_cnt > IEEE80211_BSS_ARP_ADDR_LIST_LEN ?
433					IEEE80211_BSS_ARP_ADDR_LIST_LEN :
434					sdata->vif.cfg.arp_addr_cnt)
435		__field(int, arp_addr_cnt)
436		__dynamic_array(u8, ssid, sdata->vif.cfg.ssid_len)
437		__field(int, s1g)
438		__field(bool, idle)
439		__field(bool, ps)
440	),
441
442	TP_fast_assign(
443		LOCAL_ASSIGN;
444		VIF_ASSIGN;
445		__entry->changed = changed;
446		__entry->aid = sdata->vif.cfg.aid;
447		__entry->assoc = sdata->vif.cfg.assoc;
448		__entry->ibss_joined = sdata->vif.cfg.ibss_joined;
449		__entry->ibss_creator = sdata->vif.cfg.ibss_creator;
450		__entry->ps = sdata->vif.cfg.ps;
451
452		__entry->arp_addr_cnt = sdata->vif.cfg.arp_addr_cnt;
453		memcpy(__get_dynamic_array(arp_addr_list),
454		       sdata->vif.cfg.arp_addr_list,
455		       sizeof(u32) * (sdata->vif.cfg.arp_addr_cnt > IEEE80211_BSS_ARP_ADDR_LIST_LEN ?
456					IEEE80211_BSS_ARP_ADDR_LIST_LEN :
457					sdata->vif.cfg.arp_addr_cnt));
458		memcpy(__get_dynamic_array(ssid),
459		       sdata->vif.cfg.ssid,
460		       sdata->vif.cfg.ssid_len);
461		__entry->s1g = sdata->vif.cfg.s1g;
462		__entry->idle = sdata->vif.cfg.idle;
463	),
464
465	TP_printk(
466		LOCAL_PR_FMT  VIF_PR_FMT " changed:%#llx",
467		LOCAL_PR_ARG, VIF_PR_ARG, __entry->changed
468	)
469);
470
471TRACE_EVENT(drv_link_info_changed,
472	TP_PROTO(struct ieee80211_local *local,
473		 struct ieee80211_sub_if_data *sdata,
474		 struct ieee80211_bss_conf *link_conf,
475		 u64 changed),
476
477	TP_ARGS(local, sdata, link_conf, changed),
478
479	TP_STRUCT__entry(
480		LOCAL_ENTRY
481		VIF_ENTRY
482		__field(u64, changed)
483		__field(int, link_id)
484		__field(bool, cts)
485		__field(bool, shortpre)
486		__field(bool, shortslot)
487		__field(bool, enable_beacon)
488		__field(u8, dtimper)
489		__field(u16, bcnint)
490		__field(u16, assoc_cap)
491		__field(u64, sync_tsf)
492		__field(u32, sync_device_ts)
493		__field(u8, sync_dtim_count)
494		__field(u32, basic_rates)
495		__array(int, mcast_rate, NUM_NL80211_BANDS)
496		__field(u16, ht_operation_mode)
497		__field(s32, cqm_rssi_thold)
498		__field(s32, cqm_rssi_hyst)
499		__field(u32, channel_width)
500		__field(u32, channel_cfreq1)
501		__field(u32, channel_cfreq1_offset)
502		__field(bool, qos)
503		__field(bool, hidden_ssid)
504		__field(int, txpower)
505		__field(u8, p2p_oppps_ctwindow)
506	),
507
508	TP_fast_assign(
509		LOCAL_ASSIGN;
510		VIF_ASSIGN;
511		__entry->changed = changed;
512		__entry->link_id = link_conf->link_id;
513		__entry->shortpre = link_conf->use_short_preamble;
514		__entry->cts = link_conf->use_cts_prot;
515		__entry->shortslot = link_conf->use_short_slot;
516		__entry->enable_beacon = link_conf->enable_beacon;
517		__entry->dtimper = link_conf->dtim_period;
518		__entry->bcnint = link_conf->beacon_int;
519		__entry->assoc_cap = link_conf->assoc_capability;
520		__entry->sync_tsf = link_conf->sync_tsf;
521		__entry->sync_device_ts = link_conf->sync_device_ts;
522		__entry->sync_dtim_count = link_conf->sync_dtim_count;
523		__entry->basic_rates = link_conf->basic_rates;
524		memcpy(__entry->mcast_rate, link_conf->mcast_rate,
525		       sizeof(__entry->mcast_rate));
526		__entry->ht_operation_mode = link_conf->ht_operation_mode;
527		__entry->cqm_rssi_thold = link_conf->cqm_rssi_thold;
528		__entry->cqm_rssi_hyst = link_conf->cqm_rssi_hyst;
529		__entry->channel_width = link_conf->chanreq.oper.width;
530		__entry->channel_cfreq1 = link_conf->chanreq.oper.center_freq1;
531		__entry->channel_cfreq1_offset = link_conf->chanreq.oper.freq1_offset;
532		__entry->qos = link_conf->qos;
533		__entry->hidden_ssid = link_conf->hidden_ssid;
534		__entry->txpower = link_conf->txpower;
535		__entry->p2p_oppps_ctwindow = link_conf->p2p_noa_attr.oppps_ctwindow;
536	),
537
538	TP_printk(
539		LOCAL_PR_FMT  VIF_PR_FMT " link_id:%d, changed:%#llx",
540		LOCAL_PR_ARG, VIF_PR_ARG, __entry->link_id,
541		__entry->changed
542	)
543);
544
545TRACE_EVENT(drv_prepare_multicast,
546	TP_PROTO(struct ieee80211_local *local, int mc_count),
547
548	TP_ARGS(local, mc_count),
549
550	TP_STRUCT__entry(
551		LOCAL_ENTRY
552		__field(int, mc_count)
553	),
554
555	TP_fast_assign(
556		LOCAL_ASSIGN;
557		__entry->mc_count = mc_count;
558	),
559
560	TP_printk(
561		LOCAL_PR_FMT " prepare mc (%d)",
562		LOCAL_PR_ARG, __entry->mc_count
563	)
564);
565
566TRACE_EVENT(drv_configure_filter,
567	TP_PROTO(struct ieee80211_local *local,
568		 unsigned int changed_flags,
569		 unsigned int *total_flags,
570		 u64 multicast),
571
572	TP_ARGS(local, changed_flags, total_flags, multicast),
573
574	TP_STRUCT__entry(
575		LOCAL_ENTRY
576		__field(unsigned int, changed)
577		__field(unsigned int, total)
578		__field(u64, multicast)
579	),
580
581	TP_fast_assign(
582		LOCAL_ASSIGN;
583		__entry->changed = changed_flags;
584		__entry->total = *total_flags;
585		__entry->multicast = multicast;
586	),
587
588	TP_printk(
589		LOCAL_PR_FMT " changed:%#x total:%#x",
590		LOCAL_PR_ARG, __entry->changed, __entry->total
591	)
592);
593
594TRACE_EVENT(drv_config_iface_filter,
595	TP_PROTO(struct ieee80211_local *local,
596		 struct ieee80211_sub_if_data *sdata,
597		 unsigned int filter_flags,
598		 unsigned int changed_flags),
599
600	TP_ARGS(local, sdata, filter_flags, changed_flags),
601
602	TP_STRUCT__entry(
603		LOCAL_ENTRY
604		VIF_ENTRY
605		__field(unsigned int, filter_flags)
606		__field(unsigned int, changed_flags)
607	),
608
609	TP_fast_assign(
610		LOCAL_ASSIGN;
611		VIF_ASSIGN;
612		__entry->filter_flags = filter_flags;
613		__entry->changed_flags = changed_flags;
614	),
615
616	TP_printk(
617		LOCAL_PR_FMT VIF_PR_FMT
618		" filter_flags: %#x changed_flags: %#x",
619		LOCAL_PR_ARG, VIF_PR_ARG, __entry->filter_flags,
620		__entry->changed_flags
621	)
622);
623
624TRACE_EVENT(drv_set_tim,
625	TP_PROTO(struct ieee80211_local *local,
626		 struct ieee80211_sta *sta, bool set),
627
628	TP_ARGS(local, sta, set),
629
630	TP_STRUCT__entry(
631		LOCAL_ENTRY
632		STA_ENTRY
633		__field(bool, set)
634	),
635
636	TP_fast_assign(
637		LOCAL_ASSIGN;
638		STA_ASSIGN;
639		__entry->set = set;
640	),
641
642	TP_printk(
643		LOCAL_PR_FMT STA_PR_FMT " set:%d",
644		LOCAL_PR_ARG, STA_PR_ARG, __entry->set
645	)
646);
647
648TRACE_EVENT(drv_set_key,
649	TP_PROTO(struct ieee80211_local *local,
650		 enum set_key_cmd cmd, struct ieee80211_sub_if_data *sdata,
651		 struct ieee80211_sta *sta,
652		 struct ieee80211_key_conf *key),
653
654	TP_ARGS(local, cmd, sdata, sta, key),
655
656	TP_STRUCT__entry(
657		LOCAL_ENTRY
658		VIF_ENTRY
659		STA_ENTRY
660		__field(u32, cmd)
661		KEY_ENTRY
662	),
663
664	TP_fast_assign(
665		LOCAL_ASSIGN;
666		VIF_ASSIGN;
667		STA_ASSIGN;
668		__entry->cmd = cmd;
669		KEY_ASSIGN(key);
670	),
671
672	TP_printk(
673		LOCAL_PR_FMT  VIF_PR_FMT  STA_PR_FMT " cmd: %d" KEY_PR_FMT,
674		LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->cmd, KEY_PR_ARG
675	)
676);
677
678TRACE_EVENT(drv_update_tkip_key,
679	TP_PROTO(struct ieee80211_local *local,
680		 struct ieee80211_sub_if_data *sdata,
681		 struct ieee80211_key_conf *conf,
682		 struct ieee80211_sta *sta, u32 iv32),
683
684	TP_ARGS(local, sdata, conf, sta, iv32),
685
686	TP_STRUCT__entry(
687		LOCAL_ENTRY
688		VIF_ENTRY
689		STA_ENTRY
690		__field(u32, iv32)
691	),
692
693	TP_fast_assign(
694		LOCAL_ASSIGN;
695		VIF_ASSIGN;
696		STA_ASSIGN;
697		__entry->iv32 = iv32;
698	),
699
700	TP_printk(
701		LOCAL_PR_FMT VIF_PR_FMT STA_PR_FMT " iv32:%#x",
702		LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->iv32
703	)
704);
705
706DEFINE_EVENT(local_sdata_evt, drv_hw_scan,
707	TP_PROTO(struct ieee80211_local *local,
708		 struct ieee80211_sub_if_data *sdata),
709	TP_ARGS(local, sdata)
710);
711
712DEFINE_EVENT(local_sdata_evt, drv_cancel_hw_scan,
713	TP_PROTO(struct ieee80211_local *local,
714		 struct ieee80211_sub_if_data *sdata),
715	TP_ARGS(local, sdata)
716);
717
718DEFINE_EVENT(local_sdata_evt, drv_sched_scan_start,
719	TP_PROTO(struct ieee80211_local *local,
720		 struct ieee80211_sub_if_data *sdata),
721	TP_ARGS(local, sdata)
722);
723
724DEFINE_EVENT(local_sdata_evt, drv_sched_scan_stop,
725	TP_PROTO(struct ieee80211_local *local,
726		 struct ieee80211_sub_if_data *sdata),
727	TP_ARGS(local, sdata)
728);
729
730TRACE_EVENT(drv_sw_scan_start,
731	TP_PROTO(struct ieee80211_local *local,
732		 struct ieee80211_sub_if_data *sdata,
733		 const u8 *mac_addr),
734
735	TP_ARGS(local, sdata, mac_addr),
736
737	TP_STRUCT__entry(
738		LOCAL_ENTRY
739		VIF_ENTRY
740		__array(char, mac_addr, ETH_ALEN)
741	),
742
743	TP_fast_assign(
744		LOCAL_ASSIGN;
745		VIF_ASSIGN;
746		memcpy(__entry->mac_addr, mac_addr, ETH_ALEN);
747	),
748
749	TP_printk(LOCAL_PR_FMT ", " VIF_PR_FMT ", addr:%pM",
750		  LOCAL_PR_ARG, VIF_PR_ARG, __entry->mac_addr)
751);
752
753DEFINE_EVENT(local_sdata_evt, drv_sw_scan_complete,
754	TP_PROTO(struct ieee80211_local *local,
755		 struct ieee80211_sub_if_data *sdata),
756	TP_ARGS(local, sdata)
757);
758
759TRACE_EVENT(drv_get_stats,
760	TP_PROTO(struct ieee80211_local *local,
761		 struct ieee80211_low_level_stats *stats,
762		 int ret),
763
764	TP_ARGS(local, stats, ret),
765
766	TP_STRUCT__entry(
767		LOCAL_ENTRY
768		__field(int, ret)
769		__field(unsigned int, ackfail)
770		__field(unsigned int, rtsfail)
771		__field(unsigned int, fcserr)
772		__field(unsigned int, rtssucc)
773	),
774
775	TP_fast_assign(
776		LOCAL_ASSIGN;
777		__entry->ret = ret;
778		__entry->ackfail = stats->dot11ACKFailureCount;
779		__entry->rtsfail = stats->dot11RTSFailureCount;
780		__entry->fcserr = stats->dot11FCSErrorCount;
781		__entry->rtssucc = stats->dot11RTSSuccessCount;
782	),
783
784	TP_printk(
785		LOCAL_PR_FMT " ret:%d",
786		LOCAL_PR_ARG, __entry->ret
787	)
788);
789
790TRACE_EVENT(drv_get_key_seq,
791	TP_PROTO(struct ieee80211_local *local,
792		 struct ieee80211_key_conf *key),
793
794	TP_ARGS(local, key),
795
796	TP_STRUCT__entry(
797		LOCAL_ENTRY
798		KEY_ENTRY
799	),
800
801	TP_fast_assign(
802		LOCAL_ASSIGN;
803		KEY_ASSIGN(key);
804	),
805
806	TP_printk(
807		LOCAL_PR_FMT KEY_PR_FMT,
808		LOCAL_PR_ARG, KEY_PR_ARG
809	)
810);
811
812DEFINE_EVENT(local_u32_evt, drv_set_frag_threshold,
813	TP_PROTO(struct ieee80211_local *local, u32 value),
814	TP_ARGS(local, value)
815);
816
817DEFINE_EVENT(local_u32_evt, drv_set_rts_threshold,
818	TP_PROTO(struct ieee80211_local *local, u32 value),
819	TP_ARGS(local, value)
820);
821
822TRACE_EVENT(drv_set_coverage_class,
823	TP_PROTO(struct ieee80211_local *local, s16 value),
824
825	TP_ARGS(local, value),
826
827	TP_STRUCT__entry(
828		LOCAL_ENTRY
829		__field(s16, value)
830	),
831
832	TP_fast_assign(
833		LOCAL_ASSIGN;
834		__entry->value = value;
835	),
836
837	TP_printk(
838		LOCAL_PR_FMT " value:%d",
839		LOCAL_PR_ARG, __entry->value
840	)
841);
842
843TRACE_EVENT(drv_sta_notify,
844	TP_PROTO(struct ieee80211_local *local,
845		 struct ieee80211_sub_if_data *sdata,
846		 enum sta_notify_cmd cmd,
847		 struct ieee80211_sta *sta),
848
849	TP_ARGS(local, sdata, cmd, sta),
850
851	TP_STRUCT__entry(
852		LOCAL_ENTRY
853		VIF_ENTRY
854		STA_ENTRY
855		__field(u32, cmd)
856	),
857
858	TP_fast_assign(
859		LOCAL_ASSIGN;
860		VIF_ASSIGN;
861		STA_ASSIGN;
862		__entry->cmd = cmd;
863	),
864
865	TP_printk(
866		LOCAL_PR_FMT  VIF_PR_FMT  STA_PR_FMT " cmd:%d",
867		LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->cmd
868	)
869);
870
871TRACE_EVENT(drv_sta_state,
872	TP_PROTO(struct ieee80211_local *local,
873		 struct ieee80211_sub_if_data *sdata,
874		 struct ieee80211_sta *sta,
875		 enum ieee80211_sta_state old_state,
876		 enum ieee80211_sta_state new_state),
877
878	TP_ARGS(local, sdata, sta, old_state, new_state),
879
880	TP_STRUCT__entry(
881		LOCAL_ENTRY
882		VIF_ENTRY
883		STA_ENTRY
884		__field(u32, old_state)
885		__field(u32, new_state)
886	),
887
888	TP_fast_assign(
889		LOCAL_ASSIGN;
890		VIF_ASSIGN;
891		STA_ASSIGN;
892		__entry->old_state = old_state;
893		__entry->new_state = new_state;
894	),
895
896	TP_printk(
897		LOCAL_PR_FMT  VIF_PR_FMT  STA_PR_FMT " state: %d->%d",
898		LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG,
899		__entry->old_state, __entry->new_state
900	)
901);
902
903TRACE_EVENT(drv_sta_set_txpwr,
904	TP_PROTO(struct ieee80211_local *local,
905		 struct ieee80211_sub_if_data *sdata,
906		 struct ieee80211_sta *sta),
907
908	TP_ARGS(local, sdata, sta),
909
910	TP_STRUCT__entry(
911		LOCAL_ENTRY
912		VIF_ENTRY
913		STA_ENTRY
914		__field(s16, txpwr)
915		__field(u8, type)
916	),
917
918	TP_fast_assign(
919		LOCAL_ASSIGN;
920		VIF_ASSIGN;
921		STA_ASSIGN;
922		__entry->txpwr = sta->deflink.txpwr.power;
923		__entry->type = sta->deflink.txpwr.type;
924	),
925
926	TP_printk(
927		LOCAL_PR_FMT  VIF_PR_FMT  STA_PR_FMT " txpwr: %d type %d",
928		LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG,
929		__entry->txpwr,  __entry->type
930	)
931);
932
933TRACE_EVENT(drv_sta_rc_update,
934	TP_PROTO(struct ieee80211_local *local,
935		 struct ieee80211_sub_if_data *sdata,
936		 struct ieee80211_sta *sta,
937		 u32 changed),
938
939	TP_ARGS(local, sdata, sta, changed),
940
941	TP_STRUCT__entry(
942		LOCAL_ENTRY
943		VIF_ENTRY
944		STA_ENTRY
945		__field(u32, changed)
946	),
947
948	TP_fast_assign(
949		LOCAL_ASSIGN;
950		VIF_ASSIGN;
951		STA_ASSIGN;
952		__entry->changed = changed;
953	),
954
955	TP_printk(
956		LOCAL_PR_FMT  VIF_PR_FMT  STA_PR_FMT " changed: 0x%x",
957		LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->changed
958	)
959);
960
961DECLARE_EVENT_CLASS(sta_event,
962	TP_PROTO(struct ieee80211_local *local,
963		 struct ieee80211_sub_if_data *sdata,
964		 struct ieee80211_sta *sta),
965
966	TP_ARGS(local, sdata, sta),
967
968	TP_STRUCT__entry(
969		LOCAL_ENTRY
970		VIF_ENTRY
971		STA_ENTRY
972	),
973
974	TP_fast_assign(
975		LOCAL_ASSIGN;
976		VIF_ASSIGN;
977		STA_ASSIGN;
978	),
979
980	TP_printk(
981		LOCAL_PR_FMT  VIF_PR_FMT  STA_PR_FMT,
982		LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG
983	)
984);
985
986DEFINE_EVENT(sta_event, drv_sta_statistics,
987	TP_PROTO(struct ieee80211_local *local,
988		 struct ieee80211_sub_if_data *sdata,
989		 struct ieee80211_sta *sta),
990	TP_ARGS(local, sdata, sta)
991);
992
993DEFINE_EVENT(sta_event, drv_sta_add,
994	TP_PROTO(struct ieee80211_local *local,
995		 struct ieee80211_sub_if_data *sdata,
996		 struct ieee80211_sta *sta),
997	TP_ARGS(local, sdata, sta)
998);
999
1000DEFINE_EVENT(sta_event, drv_sta_remove,
1001	TP_PROTO(struct ieee80211_local *local,
1002		 struct ieee80211_sub_if_data *sdata,
1003		 struct ieee80211_sta *sta),
1004	TP_ARGS(local, sdata, sta)
1005);
1006
1007DEFINE_EVENT(sta_event, drv_sta_pre_rcu_remove,
1008	TP_PROTO(struct ieee80211_local *local,
1009		 struct ieee80211_sub_if_data *sdata,
1010		 struct ieee80211_sta *sta),
1011	TP_ARGS(local, sdata, sta)
1012);
1013
1014DEFINE_EVENT(sta_event, drv_sync_rx_queues,
1015	TP_PROTO(struct ieee80211_local *local,
1016		 struct ieee80211_sub_if_data *sdata,
1017		 struct ieee80211_sta *sta),
1018	TP_ARGS(local, sdata, sta)
1019);
1020
1021DEFINE_EVENT(sta_event, drv_sta_rate_tbl_update,
1022	TP_PROTO(struct ieee80211_local *local,
1023		 struct ieee80211_sub_if_data *sdata,
1024		 struct ieee80211_sta *sta),
1025	TP_ARGS(local, sdata, sta)
1026);
1027
1028TRACE_EVENT(drv_conf_tx,
1029	TP_PROTO(struct ieee80211_local *local,
1030		 struct ieee80211_sub_if_data *sdata,
1031		 unsigned int link_id,
1032		 u16 ac, const struct ieee80211_tx_queue_params *params),
1033
1034	TP_ARGS(local, sdata, link_id, ac, params),
1035
1036	TP_STRUCT__entry(
1037		LOCAL_ENTRY
1038		VIF_ENTRY
1039		__field(unsigned int, link_id)
1040		__field(u16, ac)
1041		__field(u16, txop)
1042		__field(u16, cw_min)
1043		__field(u16, cw_max)
1044		__field(u8, aifs)
1045		__field(bool, uapsd)
1046	),
1047
1048	TP_fast_assign(
1049		LOCAL_ASSIGN;
1050		VIF_ASSIGN;
1051		__entry->link_id = link_id;
1052		__entry->ac = ac;
1053		__entry->txop = params->txop;
1054		__entry->cw_max = params->cw_max;
1055		__entry->cw_min = params->cw_min;
1056		__entry->aifs = params->aifs;
1057		__entry->uapsd = params->uapsd;
1058	),
1059
1060	TP_printk(
1061		LOCAL_PR_FMT  VIF_PR_FMT  " link_id: %d, AC:%d",
1062		LOCAL_PR_ARG, VIF_PR_ARG, __entry->link_id, __entry->ac
1063	)
1064);
1065
1066DEFINE_EVENT(local_sdata_evt, drv_get_tsf,
1067	TP_PROTO(struct ieee80211_local *local,
1068		 struct ieee80211_sub_if_data *sdata),
1069	TP_ARGS(local, sdata)
1070);
1071
1072TRACE_EVENT(drv_set_tsf,
1073	TP_PROTO(struct ieee80211_local *local,
1074		 struct ieee80211_sub_if_data *sdata,
1075		 u64 tsf),
1076
1077	TP_ARGS(local, sdata, tsf),
1078
1079	TP_STRUCT__entry(
1080		LOCAL_ENTRY
1081		VIF_ENTRY
1082		__field(u64, tsf)
1083	),
1084
1085	TP_fast_assign(
1086		LOCAL_ASSIGN;
1087		VIF_ASSIGN;
1088		__entry->tsf = tsf;
1089	),
1090
1091	TP_printk(
1092		LOCAL_PR_FMT  VIF_PR_FMT  " tsf:%llu",
1093		LOCAL_PR_ARG, VIF_PR_ARG, (unsigned long long)__entry->tsf
1094	)
1095);
1096
1097TRACE_EVENT(drv_offset_tsf,
1098	TP_PROTO(struct ieee80211_local *local,
1099		 struct ieee80211_sub_if_data *sdata,
1100		 s64 offset),
1101
1102	TP_ARGS(local, sdata, offset),
1103
1104	TP_STRUCT__entry(
1105		LOCAL_ENTRY
1106		VIF_ENTRY
1107		__field(s64, tsf_offset)
1108	),
1109
1110	TP_fast_assign(
1111		LOCAL_ASSIGN;
1112		VIF_ASSIGN;
1113		__entry->tsf_offset = offset;
1114	),
1115
1116	TP_printk(
1117		LOCAL_PR_FMT  VIF_PR_FMT  " tsf offset:%lld",
1118		LOCAL_PR_ARG, VIF_PR_ARG,
1119		(unsigned long long)__entry->tsf_offset
1120	)
1121);
1122
1123DEFINE_EVENT(local_sdata_evt, drv_reset_tsf,
1124	TP_PROTO(struct ieee80211_local *local,
1125		 struct ieee80211_sub_if_data *sdata),
1126	TP_ARGS(local, sdata)
1127);
1128
1129DEFINE_EVENT(local_only_evt, drv_tx_last_beacon,
1130	TP_PROTO(struct ieee80211_local *local),
1131	TP_ARGS(local)
1132);
1133
1134TRACE_EVENT(drv_ampdu_action,
1135	TP_PROTO(struct ieee80211_local *local,
1136		 struct ieee80211_sub_if_data *sdata,
1137		 struct ieee80211_ampdu_params *params),
1138
1139	TP_ARGS(local, sdata, params),
1140
1141	TP_STRUCT__entry(
1142		LOCAL_ENTRY
1143		VIF_ENTRY
1144		AMPDU_ACTION_ENTRY
1145	),
1146
1147	TP_fast_assign(
1148		LOCAL_ASSIGN;
1149		VIF_ASSIGN;
1150		AMPDU_ACTION_ASSIGN;
1151	),
1152
1153	TP_printk(
1154		LOCAL_PR_FMT VIF_PR_FMT AMPDU_ACTION_PR_FMT,
1155		LOCAL_PR_ARG, VIF_PR_ARG, AMPDU_ACTION_PR_ARG
1156	)
1157);
1158
1159TRACE_EVENT(drv_get_survey,
1160	TP_PROTO(struct ieee80211_local *local, int _idx,
1161		 struct survey_info *survey),
1162
1163	TP_ARGS(local, _idx, survey),
1164
1165	TP_STRUCT__entry(
1166		LOCAL_ENTRY
1167		__field(int, idx)
1168	),
1169
1170	TP_fast_assign(
1171		LOCAL_ASSIGN;
1172		__entry->idx = _idx;
1173	),
1174
1175	TP_printk(
1176		LOCAL_PR_FMT " idx:%d",
1177		LOCAL_PR_ARG, __entry->idx
1178	)
1179);
1180
1181TRACE_EVENT(drv_flush,
1182	TP_PROTO(struct ieee80211_local *local,
1183		 u32 queues, bool drop),
1184
1185	TP_ARGS(local, queues, drop),
1186
1187	TP_STRUCT__entry(
1188		LOCAL_ENTRY
1189		__field(bool, drop)
1190		__field(u32, queues)
1191	),
1192
1193	TP_fast_assign(
1194		LOCAL_ASSIGN;
1195		__entry->drop = drop;
1196		__entry->queues = queues;
1197	),
1198
1199	TP_printk(
1200		LOCAL_PR_FMT " queues:0x%x drop:%d",
1201		LOCAL_PR_ARG, __entry->queues, __entry->drop
1202	)
1203);
1204
1205DEFINE_EVENT(sta_event, drv_flush_sta,
1206	TP_PROTO(struct ieee80211_local *local,
1207		 struct ieee80211_sub_if_data *sdata,
1208		 struct ieee80211_sta *sta),
1209	TP_ARGS(local, sdata, sta)
1210);
1211
1212DECLARE_EVENT_CLASS(chanswitch_evt,
1213	TP_PROTO(struct ieee80211_local *local,
1214		 struct ieee80211_sub_if_data *sdata,
1215		 struct ieee80211_channel_switch *ch_switch),
1216
1217	TP_ARGS(local, sdata, ch_switch),
1218
1219	TP_STRUCT__entry(
1220		LOCAL_ENTRY
1221		VIF_ENTRY
1222		CHANDEF_ENTRY
1223		__field(u64, timestamp)
1224		__field(u32, device_timestamp)
1225		__field(bool, block_tx)
1226		__field(u8, count)
1227		__field(u8, link_id)
1228	),
1229
1230	TP_fast_assign(
1231		LOCAL_ASSIGN;
1232		VIF_ASSIGN;
1233		CHANDEF_ASSIGN(&ch_switch->chandef)
1234		__entry->timestamp = ch_switch->timestamp;
1235		__entry->device_timestamp = ch_switch->device_timestamp;
1236		__entry->block_tx = ch_switch->block_tx;
1237		__entry->count = ch_switch->count;
1238		__entry->link_id = ch_switch->link_id;
1239	),
1240
1241	TP_printk(
1242		LOCAL_PR_FMT VIF_PR_FMT CHANDEF_PR_FMT  " count:%d block_tx:%d timestamp:%llu device_ts:%u link_id:%d",
1243		LOCAL_PR_ARG, VIF_PR_ARG, CHANDEF_PR_ARG, __entry->count,
1244		__entry->block_tx, __entry->timestamp,
1245		__entry->device_timestamp, __entry->link_id
1246	)
1247);
1248
1249DEFINE_EVENT(chanswitch_evt, drv_channel_switch,
1250	TP_PROTO(struct ieee80211_local *local,
1251		 struct ieee80211_sub_if_data *sdata,
1252		 struct ieee80211_channel_switch *ch_switch),
1253	TP_ARGS(local, sdata, ch_switch)
1254);
1255
1256TRACE_EVENT(drv_set_antenna,
1257	TP_PROTO(struct ieee80211_local *local, u32 tx_ant, u32 rx_ant, int ret),
1258
1259	TP_ARGS(local, tx_ant, rx_ant, ret),
1260
1261	TP_STRUCT__entry(
1262		LOCAL_ENTRY
1263		__field(u32, tx_ant)
1264		__field(u32, rx_ant)
1265		__field(int, ret)
1266	),
1267
1268	TP_fast_assign(
1269		LOCAL_ASSIGN;
1270		__entry->tx_ant = tx_ant;
1271		__entry->rx_ant = rx_ant;
1272		__entry->ret = ret;
1273	),
1274
1275	TP_printk(
1276		LOCAL_PR_FMT " tx_ant:%d rx_ant:%d ret:%d",
1277		LOCAL_PR_ARG, __entry->tx_ant, __entry->rx_ant, __entry->ret
1278	)
1279);
1280
1281TRACE_EVENT(drv_get_antenna,
1282	TP_PROTO(struct ieee80211_local *local, u32 tx_ant, u32 rx_ant, int ret),
1283
1284	TP_ARGS(local, tx_ant, rx_ant, ret),
1285
1286	TP_STRUCT__entry(
1287		LOCAL_ENTRY
1288		__field(u32, tx_ant)
1289		__field(u32, rx_ant)
1290		__field(int, ret)
1291	),
1292
1293	TP_fast_assign(
1294		LOCAL_ASSIGN;
1295		__entry->tx_ant = tx_ant;
1296		__entry->rx_ant = rx_ant;
1297		__entry->ret = ret;
1298	),
1299
1300	TP_printk(
1301		LOCAL_PR_FMT " tx_ant:%d rx_ant:%d ret:%d",
1302		LOCAL_PR_ARG, __entry->tx_ant, __entry->rx_ant, __entry->ret
1303	)
1304);
1305
1306TRACE_EVENT(drv_remain_on_channel,
1307	TP_PROTO(struct ieee80211_local *local,
1308		 struct ieee80211_sub_if_data *sdata,
1309		 struct ieee80211_channel *chan,
1310		 unsigned int duration,
1311		 enum ieee80211_roc_type type),
1312
1313	TP_ARGS(local, sdata, chan, duration, type),
1314
1315	TP_STRUCT__entry(
1316		LOCAL_ENTRY
1317		VIF_ENTRY
1318		__field(int, center_freq)
1319		__field(int, freq_offset)
1320		__field(unsigned int, duration)
1321		__field(u32, type)
1322	),
1323
1324	TP_fast_assign(
1325		LOCAL_ASSIGN;
1326		VIF_ASSIGN;
1327		__entry->center_freq = chan->center_freq;
1328		__entry->freq_offset = chan->freq_offset;
1329		__entry->duration = duration;
1330		__entry->type = type;
1331	),
1332
1333	TP_printk(
1334		LOCAL_PR_FMT  VIF_PR_FMT " freq:%d.%03dMHz duration:%dms type=%d",
1335		LOCAL_PR_ARG, VIF_PR_ARG,
1336		__entry->center_freq, __entry->freq_offset,
1337		__entry->duration, __entry->type
1338	)
1339);
1340
1341DEFINE_EVENT(local_sdata_evt, drv_cancel_remain_on_channel,
1342	TP_PROTO(struct ieee80211_local *local,
1343		 struct ieee80211_sub_if_data *sdata),
1344	TP_ARGS(local, sdata)
1345);
1346
1347TRACE_EVENT(drv_set_ringparam,
1348	TP_PROTO(struct ieee80211_local *local, u32 tx, u32 rx),
1349
1350	TP_ARGS(local, tx, rx),
1351
1352	TP_STRUCT__entry(
1353		LOCAL_ENTRY
1354		__field(u32, tx)
1355		__field(u32, rx)
1356	),
1357
1358	TP_fast_assign(
1359		LOCAL_ASSIGN;
1360		__entry->tx = tx;
1361		__entry->rx = rx;
1362	),
1363
1364	TP_printk(
1365		LOCAL_PR_FMT " tx:%d rx %d",
1366		LOCAL_PR_ARG, __entry->tx, __entry->rx
1367	)
1368);
1369
1370TRACE_EVENT(drv_get_ringparam,
1371	TP_PROTO(struct ieee80211_local *local, u32 *tx, u32 *tx_max,
1372		 u32 *rx, u32 *rx_max),
1373
1374	TP_ARGS(local, tx, tx_max, rx, rx_max),
1375
1376	TP_STRUCT__entry(
1377		LOCAL_ENTRY
1378		__field(u32, tx)
1379		__field(u32, tx_max)
1380		__field(u32, rx)
1381		__field(u32, rx_max)
1382	),
1383
1384	TP_fast_assign(
1385		LOCAL_ASSIGN;
1386		__entry->tx = *tx;
1387		__entry->tx_max = *tx_max;
1388		__entry->rx = *rx;
1389		__entry->rx_max = *rx_max;
1390	),
1391
1392	TP_printk(
1393		LOCAL_PR_FMT " tx:%d tx_max %d rx %d rx_max %d",
1394		LOCAL_PR_ARG,
1395		__entry->tx, __entry->tx_max, __entry->rx, __entry->rx_max
1396	)
1397);
1398
1399DEFINE_EVENT(local_only_evt, drv_tx_frames_pending,
1400	TP_PROTO(struct ieee80211_local *local),
1401	TP_ARGS(local)
1402);
1403
1404DEFINE_EVENT(local_only_evt, drv_offchannel_tx_cancel_wait,
1405	TP_PROTO(struct ieee80211_local *local),
1406	TP_ARGS(local)
1407);
1408
1409TRACE_EVENT(drv_set_bitrate_mask,
1410	TP_PROTO(struct ieee80211_local *local,
1411		 struct ieee80211_sub_if_data *sdata,
1412		 const struct cfg80211_bitrate_mask *mask),
1413
1414	TP_ARGS(local, sdata, mask),
1415
1416	TP_STRUCT__entry(
1417		LOCAL_ENTRY
1418		VIF_ENTRY
1419		__field(u32, legacy_2g)
1420		__field(u32, legacy_5g)
1421	),
1422
1423	TP_fast_assign(
1424		LOCAL_ASSIGN;
1425		VIF_ASSIGN;
1426		__entry->legacy_2g = mask->control[NL80211_BAND_2GHZ].legacy;
1427		__entry->legacy_5g = mask->control[NL80211_BAND_5GHZ].legacy;
1428	),
1429
1430	TP_printk(
1431		LOCAL_PR_FMT  VIF_PR_FMT " 2G Mask:0x%x 5G Mask:0x%x",
1432		LOCAL_PR_ARG, VIF_PR_ARG, __entry->legacy_2g, __entry->legacy_5g
1433	)
1434);
1435
1436TRACE_EVENT(drv_set_rekey_data,
1437	TP_PROTO(struct ieee80211_local *local,
1438		 struct ieee80211_sub_if_data *sdata,
1439		 struct cfg80211_gtk_rekey_data *data),
1440
1441	TP_ARGS(local, sdata, data),
1442
1443	TP_STRUCT__entry(
1444		LOCAL_ENTRY
1445		VIF_ENTRY
1446		__array(u8, kek, NL80211_KEK_LEN)
1447		__array(u8, kck, NL80211_KCK_LEN)
1448		__array(u8, replay_ctr, NL80211_REPLAY_CTR_LEN)
1449	),
1450
1451	TP_fast_assign(
1452		LOCAL_ASSIGN;
1453		VIF_ASSIGN;
1454		memcpy(__entry->kek, data->kek, NL80211_KEK_LEN);
1455		memcpy(__entry->kck, data->kck, NL80211_KCK_LEN);
1456		memcpy(__entry->replay_ctr, data->replay_ctr,
1457		       NL80211_REPLAY_CTR_LEN);
1458	),
1459
1460	TP_printk(LOCAL_PR_FMT VIF_PR_FMT,
1461		  LOCAL_PR_ARG, VIF_PR_ARG)
1462);
1463
1464TRACE_EVENT(drv_event_callback,
1465	TP_PROTO(struct ieee80211_local *local,
1466		 struct ieee80211_sub_if_data *sdata,
1467		 const struct ieee80211_event *_event),
1468
1469	TP_ARGS(local, sdata, _event),
1470
1471	TP_STRUCT__entry(
1472		LOCAL_ENTRY
1473		VIF_ENTRY
1474		__field(u32, type)
1475	),
1476
1477	TP_fast_assign(
1478		LOCAL_ASSIGN;
1479		VIF_ASSIGN;
1480		__entry->type = _event->type;
1481	),
1482
1483	TP_printk(
1484		LOCAL_PR_FMT VIF_PR_FMT " event:%d",
1485		LOCAL_PR_ARG, VIF_PR_ARG, __entry->type
1486	)
1487);
1488
1489DECLARE_EVENT_CLASS(release_evt,
1490	TP_PROTO(struct ieee80211_local *local,
1491		 struct ieee80211_sta *sta,
1492		 u16 tids, int num_frames,
1493		 enum ieee80211_frame_release_type reason,
1494		 bool more_data),
1495
1496	TP_ARGS(local, sta, tids, num_frames, reason, more_data),
1497
1498	TP_STRUCT__entry(
1499		LOCAL_ENTRY
1500		STA_ENTRY
1501		__field(u16, tids)
1502		__field(int, num_frames)
1503		__field(int, reason)
1504		__field(bool, more_data)
1505	),
1506
1507	TP_fast_assign(
1508		LOCAL_ASSIGN;
1509		STA_ASSIGN;
1510		__entry->tids = tids;
1511		__entry->num_frames = num_frames;
1512		__entry->reason = reason;
1513		__entry->more_data = more_data;
1514	),
1515
1516	TP_printk(
1517		LOCAL_PR_FMT STA_PR_FMT
1518		" TIDs:0x%.4x frames:%d reason:%d more:%d",
1519		LOCAL_PR_ARG, STA_PR_ARG, __entry->tids, __entry->num_frames,
1520		__entry->reason, __entry->more_data
1521	)
1522);
1523
1524DEFINE_EVENT(release_evt, drv_release_buffered_frames,
1525	TP_PROTO(struct ieee80211_local *local,
1526		 struct ieee80211_sta *sta,
1527		 u16 tids, int num_frames,
1528		 enum ieee80211_frame_release_type reason,
1529		 bool more_data),
1530
1531	TP_ARGS(local, sta, tids, num_frames, reason, more_data)
1532);
1533
1534DEFINE_EVENT(release_evt, drv_allow_buffered_frames,
1535	TP_PROTO(struct ieee80211_local *local,
1536		 struct ieee80211_sta *sta,
1537		 u16 tids, int num_frames,
1538		 enum ieee80211_frame_release_type reason,
1539		 bool more_data),
1540
1541	TP_ARGS(local, sta, tids, num_frames, reason, more_data)
1542);
1543
1544DECLARE_EVENT_CLASS(mgd_prepare_complete_tx_evt,
1545	TP_PROTO(struct ieee80211_local *local,
1546		 struct ieee80211_sub_if_data *sdata,
1547		 u16 duration, u16 subtype, bool success),
1548
1549	TP_ARGS(local, sdata, duration, subtype, success),
1550
1551	TP_STRUCT__entry(
1552		LOCAL_ENTRY
1553		VIF_ENTRY
1554		__field(u32, duration)
1555		__field(u16, subtype)
1556		__field(u8, success)
1557	),
1558
1559	TP_fast_assign(
1560		LOCAL_ASSIGN;
1561		VIF_ASSIGN;
1562		__entry->duration = duration;
1563		__entry->subtype = subtype;
1564		__entry->success = success;
1565	),
1566
1567	TP_printk(
1568		LOCAL_PR_FMT VIF_PR_FMT " duration: %u, subtype:0x%x, success:%d",
1569		LOCAL_PR_ARG, VIF_PR_ARG, __entry->duration,
1570		__entry->subtype, __entry->success
1571	)
1572);
1573
1574DEFINE_EVENT(mgd_prepare_complete_tx_evt, drv_mgd_prepare_tx,
1575	TP_PROTO(struct ieee80211_local *local,
1576		 struct ieee80211_sub_if_data *sdata,
1577		 u16 duration, u16 subtype, bool success),
1578
1579	TP_ARGS(local, sdata, duration, subtype, success)
1580);
1581
1582DEFINE_EVENT(mgd_prepare_complete_tx_evt, drv_mgd_complete_tx,
1583	TP_PROTO(struct ieee80211_local *local,
1584		 struct ieee80211_sub_if_data *sdata,
1585		 u16 duration, u16 subtype, bool success),
1586
1587	TP_ARGS(local, sdata, duration, subtype, success)
1588);
1589
1590DEFINE_EVENT(local_sdata_evt, drv_mgd_protect_tdls_discover,
1591	TP_PROTO(struct ieee80211_local *local,
1592		 struct ieee80211_sub_if_data *sdata),
1593
1594	TP_ARGS(local, sdata)
1595);
1596
1597DECLARE_EVENT_CLASS(local_chanctx,
1598	TP_PROTO(struct ieee80211_local *local,
1599		 struct ieee80211_chanctx *ctx),
1600
1601	TP_ARGS(local, ctx),
1602
1603	TP_STRUCT__entry(
1604		LOCAL_ENTRY
1605		CHANCTX_ENTRY
1606	),
1607
1608	TP_fast_assign(
1609		LOCAL_ASSIGN;
1610		CHANCTX_ASSIGN;
1611	),
1612
1613	TP_printk(
1614		LOCAL_PR_FMT CHANCTX_PR_FMT,
1615		LOCAL_PR_ARG, CHANCTX_PR_ARG
1616	)
1617);
1618
1619DEFINE_EVENT(local_chanctx, drv_add_chanctx,
1620	TP_PROTO(struct ieee80211_local *local,
1621		 struct ieee80211_chanctx *ctx),
1622	TP_ARGS(local, ctx)
1623);
1624
1625DEFINE_EVENT(local_chanctx, drv_remove_chanctx,
1626	TP_PROTO(struct ieee80211_local *local,
1627		 struct ieee80211_chanctx *ctx),
1628	TP_ARGS(local, ctx)
1629);
1630
1631TRACE_EVENT(drv_change_chanctx,
1632	TP_PROTO(struct ieee80211_local *local,
1633		 struct ieee80211_chanctx *ctx,
1634		 u32 changed),
1635
1636	TP_ARGS(local, ctx, changed),
1637
1638	TP_STRUCT__entry(
1639		LOCAL_ENTRY
1640		CHANCTX_ENTRY
1641		__field(u32, changed)
1642	),
1643
1644	TP_fast_assign(
1645		LOCAL_ASSIGN;
1646		CHANCTX_ASSIGN;
1647		__entry->changed = changed;
1648	),
1649
1650	TP_printk(
1651		LOCAL_PR_FMT CHANCTX_PR_FMT " changed:%#x",
1652		LOCAL_PR_ARG, CHANCTX_PR_ARG, __entry->changed
1653	)
1654);
1655
1656#if !defined(__TRACE_VIF_ENTRY)
1657#define __TRACE_VIF_ENTRY
1658struct trace_vif_entry {
1659	enum nl80211_iftype vif_type;
1660	bool p2p;
1661	char vif_name[IFNAMSIZ];
1662} __packed;
1663
1664struct trace_chandef_entry {
1665	u32 control_freq;
1666	u32 freq_offset;
1667	u32 chan_width;
1668	u32 center_freq1;
1669	u32 freq1_offset;
1670	u32 center_freq2;
1671} __packed;
1672
1673struct trace_switch_entry {
1674	struct trace_vif_entry vif;
1675	unsigned int link_id;
1676	struct trace_chandef_entry old_chandef;
1677	struct trace_chandef_entry new_chandef;
1678} __packed;
1679
1680#define SWITCH_ENTRY_ASSIGN(to, from) local_vifs[i].to = vifs[i].from
1681#endif
1682
1683TRACE_EVENT(drv_switch_vif_chanctx,
1684	TP_PROTO(struct ieee80211_local *local,
1685		 struct ieee80211_vif_chanctx_switch *vifs,
1686		 int n_vifs, enum ieee80211_chanctx_switch_mode mode),
1687	    TP_ARGS(local, vifs, n_vifs, mode),
1688
1689	TP_STRUCT__entry(
1690		LOCAL_ENTRY
1691		__field(int, n_vifs)
1692		__field(u32, mode)
1693		__dynamic_array(u8, vifs,
1694				sizeof(struct trace_switch_entry) * n_vifs)
1695	),
1696
1697	TP_fast_assign(
1698		LOCAL_ASSIGN;
1699		__entry->n_vifs = n_vifs;
1700		__entry->mode = mode;
1701		{
1702			struct trace_switch_entry *local_vifs =
1703				__get_dynamic_array(vifs);
1704			int i;
1705
1706			for (i = 0; i < n_vifs; i++) {
1707				struct ieee80211_sub_if_data *sdata;
1708
1709				sdata = container_of(vifs[i].vif,
1710						struct ieee80211_sub_if_data,
1711						vif);
1712
1713				SWITCH_ENTRY_ASSIGN(vif.vif_type, vif->type);
1714				SWITCH_ENTRY_ASSIGN(vif.p2p, vif->p2p);
1715				SWITCH_ENTRY_ASSIGN(link_id, link_conf->link_id);
1716				strncpy(local_vifs[i].vif.vif_name,
1717					sdata->name,
1718					sizeof(local_vifs[i].vif.vif_name));
1719				SWITCH_ENTRY_ASSIGN(old_chandef.control_freq,
1720						old_ctx->def.chan->center_freq);
1721				SWITCH_ENTRY_ASSIGN(old_chandef.freq_offset,
1722						old_ctx->def.chan->freq_offset);
1723				SWITCH_ENTRY_ASSIGN(old_chandef.chan_width,
1724						    old_ctx->def.width);
1725				SWITCH_ENTRY_ASSIGN(old_chandef.center_freq1,
1726						    old_ctx->def.center_freq1);
1727				SWITCH_ENTRY_ASSIGN(old_chandef.freq1_offset,
1728						    old_ctx->def.freq1_offset);
1729				SWITCH_ENTRY_ASSIGN(old_chandef.center_freq2,
1730						    old_ctx->def.center_freq2);
1731				SWITCH_ENTRY_ASSIGN(new_chandef.control_freq,
1732						new_ctx->def.chan->center_freq);
1733				SWITCH_ENTRY_ASSIGN(new_chandef.freq_offset,
1734						new_ctx->def.chan->freq_offset);
1735				SWITCH_ENTRY_ASSIGN(new_chandef.chan_width,
1736						    new_ctx->def.width);
1737				SWITCH_ENTRY_ASSIGN(new_chandef.center_freq1,
1738						    new_ctx->def.center_freq1);
1739				SWITCH_ENTRY_ASSIGN(new_chandef.freq1_offset,
1740						    new_ctx->def.freq1_offset);
1741				SWITCH_ENTRY_ASSIGN(new_chandef.center_freq2,
1742						    new_ctx->def.center_freq2);
1743			}
1744		}
1745	),
1746
1747	TP_printk(
1748		LOCAL_PR_FMT " n_vifs:%d mode:%d",
1749		LOCAL_PR_ARG, __entry->n_vifs, __entry->mode
1750	)
1751);
1752
1753DECLARE_EVENT_CLASS(local_sdata_chanctx,
1754	TP_PROTO(struct ieee80211_local *local,
1755		 struct ieee80211_sub_if_data *sdata,
1756		 struct ieee80211_bss_conf *link_conf,
1757		 struct ieee80211_chanctx *ctx),
1758
1759	TP_ARGS(local, sdata, link_conf, ctx),
1760
1761	TP_STRUCT__entry(
1762		LOCAL_ENTRY
1763		VIF_ENTRY
1764		CHANCTX_ENTRY
1765		__field(unsigned int, link_id)
1766	),
1767
1768	TP_fast_assign(
1769		LOCAL_ASSIGN;
1770		VIF_ASSIGN;
1771		CHANCTX_ASSIGN;
1772		__entry->link_id = link_conf->link_id;
1773	),
1774
1775	TP_printk(
1776		LOCAL_PR_FMT VIF_PR_FMT " link_id:%d" CHANCTX_PR_FMT,
1777		LOCAL_PR_ARG, VIF_PR_ARG, __entry->link_id, CHANCTX_PR_ARG
1778	)
1779);
1780
1781DEFINE_EVENT(local_sdata_chanctx, drv_assign_vif_chanctx,
1782	TP_PROTO(struct ieee80211_local *local,
1783		 struct ieee80211_sub_if_data *sdata,
1784		 struct ieee80211_bss_conf *link_conf,
1785		 struct ieee80211_chanctx *ctx),
1786	TP_ARGS(local, sdata, link_conf, ctx)
1787);
1788
1789DEFINE_EVENT(local_sdata_chanctx, drv_unassign_vif_chanctx,
1790	TP_PROTO(struct ieee80211_local *local,
1791		 struct ieee80211_sub_if_data *sdata,
1792		 struct ieee80211_bss_conf *link_conf,
1793		 struct ieee80211_chanctx *ctx),
1794	TP_ARGS(local, sdata, link_conf, ctx)
1795);
1796
1797TRACE_EVENT(drv_start_ap,
1798	TP_PROTO(struct ieee80211_local *local,
1799		 struct ieee80211_sub_if_data *sdata,
1800		 struct ieee80211_bss_conf *link_conf),
1801
1802	TP_ARGS(local, sdata, link_conf),
1803
1804	TP_STRUCT__entry(
1805		LOCAL_ENTRY
1806		VIF_ENTRY
1807		__field(u32, link_id)
1808		__field(u8, dtimper)
1809		__field(u16, bcnint)
1810		__dynamic_array(u8, ssid, sdata->vif.cfg.ssid_len)
1811		__field(bool, hidden_ssid)
1812	),
1813
1814	TP_fast_assign(
1815		LOCAL_ASSIGN;
1816		VIF_ASSIGN;
1817		__entry->link_id = link_conf->link_id;
1818		__entry->dtimper = link_conf->dtim_period;
1819		__entry->bcnint = link_conf->beacon_int;
1820		__entry->hidden_ssid = link_conf->hidden_ssid;
1821		memcpy(__get_dynamic_array(ssid),
1822		       sdata->vif.cfg.ssid,
1823		       sdata->vif.cfg.ssid_len);
1824	),
1825
1826	TP_printk(
1827		LOCAL_PR_FMT  VIF_PR_FMT " link id %u",
1828		LOCAL_PR_ARG, VIF_PR_ARG, __entry->link_id
1829	)
1830);
1831
1832TRACE_EVENT(drv_stop_ap,
1833	TP_PROTO(struct ieee80211_local *local,
1834		 struct ieee80211_sub_if_data *sdata,
1835		 struct ieee80211_bss_conf *link_conf),
1836
1837	TP_ARGS(local, sdata, link_conf),
1838
1839	TP_STRUCT__entry(
1840		LOCAL_ENTRY
1841		VIF_ENTRY
1842		__field(u32, link_id)
1843	),
1844
1845	TP_fast_assign(
1846		LOCAL_ASSIGN;
1847		VIF_ASSIGN;
1848		__entry->link_id = link_conf->link_id;
1849	),
1850
1851	TP_printk(
1852		LOCAL_PR_FMT  VIF_PR_FMT " link id %u",
1853		LOCAL_PR_ARG, VIF_PR_ARG, __entry->link_id
1854	)
1855);
1856
1857TRACE_EVENT(drv_reconfig_complete,
1858	TP_PROTO(struct ieee80211_local *local,
1859		 enum ieee80211_reconfig_type reconfig_type),
1860	TP_ARGS(local, reconfig_type),
1861
1862	TP_STRUCT__entry(
1863		LOCAL_ENTRY
1864		__field(u8, reconfig_type)
1865	),
1866
1867	TP_fast_assign(
1868		LOCAL_ASSIGN;
1869		__entry->reconfig_type = reconfig_type;
1870	),
1871
1872	TP_printk(
1873		LOCAL_PR_FMT  " reconfig_type:%d",
1874		LOCAL_PR_ARG, __entry->reconfig_type
1875	)
1876
1877);
1878
1879#if IS_ENABLED(CONFIG_IPV6)
1880DEFINE_EVENT(local_sdata_evt, drv_ipv6_addr_change,
1881	TP_PROTO(struct ieee80211_local *local,
1882		 struct ieee80211_sub_if_data *sdata),
1883	TP_ARGS(local, sdata)
1884);
1885#endif
1886
1887TRACE_EVENT(drv_join_ibss,
1888	TP_PROTO(struct ieee80211_local *local,
1889		 struct ieee80211_sub_if_data *sdata,
1890		 struct ieee80211_bss_conf *info),
1891
1892	TP_ARGS(local, sdata, info),
1893
1894	TP_STRUCT__entry(
1895		LOCAL_ENTRY
1896		VIF_ENTRY
1897		__field(u8, dtimper)
1898		__field(u16, bcnint)
1899		__dynamic_array(u8, ssid, sdata->vif.cfg.ssid_len)
1900	),
1901
1902	TP_fast_assign(
1903		LOCAL_ASSIGN;
1904		VIF_ASSIGN;
1905		__entry->dtimper = info->dtim_period;
1906		__entry->bcnint = info->beacon_int;
1907		memcpy(__get_dynamic_array(ssid),
1908		       sdata->vif.cfg.ssid,
1909		       sdata->vif.cfg.ssid_len);
1910	),
1911
1912	TP_printk(
1913		LOCAL_PR_FMT  VIF_PR_FMT,
1914		LOCAL_PR_ARG, VIF_PR_ARG
1915	)
1916);
1917
1918DEFINE_EVENT(local_sdata_evt, drv_leave_ibss,
1919	TP_PROTO(struct ieee80211_local *local,
1920		 struct ieee80211_sub_if_data *sdata),
1921	TP_ARGS(local, sdata)
1922);
1923
1924TRACE_EVENT(drv_get_expected_throughput,
1925	TP_PROTO(struct ieee80211_sta *sta),
1926
1927	TP_ARGS(sta),
1928
1929	TP_STRUCT__entry(
1930		STA_ENTRY
1931	),
1932
1933	TP_fast_assign(
1934		STA_ASSIGN;
1935	),
1936
1937	TP_printk(
1938		STA_PR_FMT, STA_PR_ARG
1939	)
1940);
1941
1942TRACE_EVENT(drv_start_nan,
1943	TP_PROTO(struct ieee80211_local *local,
1944		 struct ieee80211_sub_if_data *sdata,
1945		 struct cfg80211_nan_conf *conf),
1946
1947	TP_ARGS(local, sdata, conf),
1948	TP_STRUCT__entry(
1949		LOCAL_ENTRY
1950		VIF_ENTRY
1951		__field(u8, master_pref)
1952		__field(u8, bands)
1953	),
1954
1955	TP_fast_assign(
1956		LOCAL_ASSIGN;
1957		VIF_ASSIGN;
1958		__entry->master_pref = conf->master_pref;
1959		__entry->bands = conf->bands;
1960	),
1961
1962	TP_printk(
1963		LOCAL_PR_FMT  VIF_PR_FMT
1964		", master preference: %u, bands: 0x%0x",
1965		LOCAL_PR_ARG, VIF_PR_ARG, __entry->master_pref,
1966		__entry->bands
1967	)
1968);
1969
1970TRACE_EVENT(drv_stop_nan,
1971	TP_PROTO(struct ieee80211_local *local,
1972		 struct ieee80211_sub_if_data *sdata),
1973
1974	TP_ARGS(local, sdata),
1975
1976	TP_STRUCT__entry(
1977		LOCAL_ENTRY
1978		VIF_ENTRY
1979	),
1980
1981	TP_fast_assign(
1982		LOCAL_ASSIGN;
1983		VIF_ASSIGN;
1984	),
1985
1986	TP_printk(
1987		LOCAL_PR_FMT  VIF_PR_FMT,
1988		LOCAL_PR_ARG, VIF_PR_ARG
1989	)
1990);
1991
1992TRACE_EVENT(drv_nan_change_conf,
1993	TP_PROTO(struct ieee80211_local *local,
1994		 struct ieee80211_sub_if_data *sdata,
1995		 struct cfg80211_nan_conf *conf,
1996		 u32 changes),
1997
1998	TP_ARGS(local, sdata, conf, changes),
1999	TP_STRUCT__entry(
2000		LOCAL_ENTRY
2001		VIF_ENTRY
2002		__field(u8, master_pref)
2003		__field(u8, bands)
2004		__field(u32, changes)
2005	),
2006
2007	TP_fast_assign(
2008		LOCAL_ASSIGN;
2009		VIF_ASSIGN;
2010		__entry->master_pref = conf->master_pref;
2011		__entry->bands = conf->bands;
2012		__entry->changes = changes;
2013	),
2014
2015	TP_printk(
2016		LOCAL_PR_FMT  VIF_PR_FMT
2017		", master preference: %u, bands: 0x%0x, changes: 0x%x",
2018		LOCAL_PR_ARG, VIF_PR_ARG, __entry->master_pref,
2019		__entry->bands, __entry->changes
2020	)
2021);
2022
2023TRACE_EVENT(drv_add_nan_func,
2024	TP_PROTO(struct ieee80211_local *local,
2025		 struct ieee80211_sub_if_data *sdata,
2026		 const struct cfg80211_nan_func *func),
2027
2028	TP_ARGS(local, sdata, func),
2029	TP_STRUCT__entry(
2030		LOCAL_ENTRY
2031		VIF_ENTRY
2032		__field(u8, type)
2033		__field(u8, inst_id)
2034	),
2035
2036	TP_fast_assign(
2037		LOCAL_ASSIGN;
2038		VIF_ASSIGN;
2039		__entry->type = func->type;
2040		__entry->inst_id = func->instance_id;
2041	),
2042
2043	TP_printk(
2044		LOCAL_PR_FMT  VIF_PR_FMT
2045		", type: %u, inst_id: %u",
2046		LOCAL_PR_ARG, VIF_PR_ARG, __entry->type, __entry->inst_id
2047	)
2048);
2049
2050TRACE_EVENT(drv_del_nan_func,
2051	TP_PROTO(struct ieee80211_local *local,
2052		 struct ieee80211_sub_if_data *sdata,
2053		 u8 instance_id),
2054
2055	TP_ARGS(local, sdata, instance_id),
2056	TP_STRUCT__entry(
2057		LOCAL_ENTRY
2058		VIF_ENTRY
2059		__field(u8, instance_id)
2060	),
2061
2062	TP_fast_assign(
2063		LOCAL_ASSIGN;
2064		VIF_ASSIGN;
2065		__entry->instance_id = instance_id;
2066	),
2067
2068	TP_printk(
2069		LOCAL_PR_FMT  VIF_PR_FMT
2070		", instance_id: %u",
2071		LOCAL_PR_ARG, VIF_PR_ARG, __entry->instance_id
2072	)
2073);
2074
2075DEFINE_EVENT(local_sdata_evt, drv_start_pmsr,
2076	TP_PROTO(struct ieee80211_local *local,
2077		 struct ieee80211_sub_if_data *sdata),
2078	TP_ARGS(local, sdata)
2079);
2080
2081DEFINE_EVENT(local_sdata_evt, drv_abort_pmsr,
2082	TP_PROTO(struct ieee80211_local *local,
2083		 struct ieee80211_sub_if_data *sdata),
2084	TP_ARGS(local, sdata)
2085);
2086
2087TRACE_EVENT(drv_set_default_unicast_key,
2088	TP_PROTO(struct ieee80211_local *local,
2089		 struct ieee80211_sub_if_data *sdata,
2090		 int key_idx),
2091
2092	TP_ARGS(local, sdata, key_idx),
2093
2094	TP_STRUCT__entry(
2095		LOCAL_ENTRY
2096		VIF_ENTRY
2097		__field(int, key_idx)
2098	),
2099
2100	TP_fast_assign(
2101		LOCAL_ASSIGN;
2102		VIF_ASSIGN;
2103		__entry->key_idx = key_idx;
2104	),
2105
2106	TP_printk(LOCAL_PR_FMT VIF_PR_FMT " key_idx:%d",
2107		  LOCAL_PR_ARG, VIF_PR_ARG, __entry->key_idx)
2108);
2109
2110TRACE_EVENT(drv_channel_switch_beacon,
2111	TP_PROTO(struct ieee80211_local *local,
2112		 struct ieee80211_sub_if_data *sdata,
2113		 struct cfg80211_chan_def *chandef),
2114
2115	TP_ARGS(local, sdata, chandef),
2116
2117	TP_STRUCT__entry(
2118		LOCAL_ENTRY
2119		VIF_ENTRY
2120		CHANDEF_ENTRY
2121	),
2122
2123	TP_fast_assign(
2124		LOCAL_ASSIGN;
2125		VIF_ASSIGN;
2126		CHANDEF_ASSIGN(chandef);
2127	),
2128
2129	TP_printk(
2130		LOCAL_PR_FMT VIF_PR_FMT " channel switch to " CHANDEF_PR_FMT,
2131		LOCAL_PR_ARG, VIF_PR_ARG, CHANDEF_PR_ARG
2132	)
2133);
2134
2135DEFINE_EVENT(chanswitch_evt, drv_pre_channel_switch,
2136	TP_PROTO(struct ieee80211_local *local,
2137		 struct ieee80211_sub_if_data *sdata,
2138		 struct ieee80211_channel_switch *ch_switch),
2139	TP_ARGS(local, sdata, ch_switch)
2140);
2141
2142DEFINE_EVENT(local_sdata_evt, drv_post_channel_switch,
2143	     TP_PROTO(struct ieee80211_local *local,
2144		      struct ieee80211_sub_if_data *sdata),
2145	     TP_ARGS(local, sdata)
2146);
2147
2148DEFINE_EVENT(local_sdata_evt, drv_abort_channel_switch,
2149	     TP_PROTO(struct ieee80211_local *local,
2150		      struct ieee80211_sub_if_data *sdata),
2151	     TP_ARGS(local, sdata)
2152);
2153
2154DEFINE_EVENT(chanswitch_evt, drv_channel_switch_rx_beacon,
2155	TP_PROTO(struct ieee80211_local *local,
2156		 struct ieee80211_sub_if_data *sdata,
2157		 struct ieee80211_channel_switch *ch_switch),
2158	TP_ARGS(local, sdata, ch_switch)
2159);
2160
2161TRACE_EVENT(drv_get_txpower,
2162	TP_PROTO(struct ieee80211_local *local,
2163		 struct ieee80211_sub_if_data *sdata,
2164		 int dbm, int ret),
2165
2166	TP_ARGS(local, sdata, dbm, ret),
2167
2168	TP_STRUCT__entry(
2169		LOCAL_ENTRY
2170		VIF_ENTRY
2171		__field(int, dbm)
2172		__field(int, ret)
2173	),
2174
2175	TP_fast_assign(
2176		LOCAL_ASSIGN;
2177		VIF_ASSIGN;
2178		__entry->dbm = dbm;
2179		__entry->ret = ret;
2180	),
2181
2182	TP_printk(
2183		LOCAL_PR_FMT VIF_PR_FMT " dbm:%d ret:%d",
2184		LOCAL_PR_ARG, VIF_PR_ARG, __entry->dbm, __entry->ret
2185	)
2186);
2187
2188TRACE_EVENT(drv_tdls_channel_switch,
2189	TP_PROTO(struct ieee80211_local *local,
2190		 struct ieee80211_sub_if_data *sdata,
2191		 struct ieee80211_sta *sta, u8 oper_class,
2192		 struct cfg80211_chan_def *chandef),
2193
2194	TP_ARGS(local, sdata, sta, oper_class, chandef),
2195
2196	TP_STRUCT__entry(
2197		LOCAL_ENTRY
2198		VIF_ENTRY
2199		STA_ENTRY
2200		__field(u8, oper_class)
2201		CHANDEF_ENTRY
2202	),
2203
2204	TP_fast_assign(
2205		LOCAL_ASSIGN;
2206		VIF_ASSIGN;
2207		STA_ASSIGN;
2208		__entry->oper_class = oper_class;
2209		CHANDEF_ASSIGN(chandef)
2210	),
2211
2212	TP_printk(
2213		LOCAL_PR_FMT VIF_PR_FMT " tdls channel switch to"
2214		CHANDEF_PR_FMT  " oper_class:%d " STA_PR_FMT,
2215		LOCAL_PR_ARG, VIF_PR_ARG, CHANDEF_PR_ARG, __entry->oper_class,
2216		STA_PR_ARG
2217	)
2218);
2219
2220TRACE_EVENT(drv_tdls_cancel_channel_switch,
2221	TP_PROTO(struct ieee80211_local *local,
2222		 struct ieee80211_sub_if_data *sdata,
2223		 struct ieee80211_sta *sta),
2224
2225	TP_ARGS(local, sdata, sta),
2226
2227	TP_STRUCT__entry(
2228		LOCAL_ENTRY
2229		VIF_ENTRY
2230		STA_ENTRY
2231	),
2232
2233	TP_fast_assign(
2234		LOCAL_ASSIGN;
2235		VIF_ASSIGN;
2236		STA_ASSIGN;
2237	),
2238
2239	TP_printk(
2240		LOCAL_PR_FMT VIF_PR_FMT
2241		" tdls cancel channel switch with " STA_PR_FMT,
2242		LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG
2243	)
2244);
2245
2246TRACE_EVENT(drv_tdls_recv_channel_switch,
2247	TP_PROTO(struct ieee80211_local *local,
2248		 struct ieee80211_sub_if_data *sdata,
2249		 struct ieee80211_tdls_ch_sw_params *params),
2250
2251	TP_ARGS(local, sdata, params),
2252
2253	TP_STRUCT__entry(
2254		LOCAL_ENTRY
2255		VIF_ENTRY
2256		__field(u8, action_code)
2257		STA_ENTRY
2258		CHANDEF_ENTRY
2259		__field(u32, status)
2260		__field(bool, peer_initiator)
2261		__field(u32, timestamp)
2262		__field(u16, switch_time)
2263		__field(u16, switch_timeout)
2264	),
2265
2266	TP_fast_assign(
2267		LOCAL_ASSIGN;
2268		VIF_ASSIGN;
2269		STA_NAMED_ASSIGN(params->sta);
2270		CHANDEF_ASSIGN(params->chandef)
2271		__entry->peer_initiator = params->sta->tdls_initiator;
2272		__entry->action_code = params->action_code;
2273		__entry->status = params->status;
2274		__entry->timestamp = params->timestamp;
2275		__entry->switch_time = params->switch_time;
2276		__entry->switch_timeout = params->switch_timeout;
2277	),
2278
2279	TP_printk(
2280		LOCAL_PR_FMT VIF_PR_FMT " received tdls channel switch packet"
2281		" action:%d status:%d time:%d switch time:%d switch"
2282		" timeout:%d initiator: %d chan:" CHANDEF_PR_FMT STA_PR_FMT,
2283		LOCAL_PR_ARG, VIF_PR_ARG, __entry->action_code, __entry->status,
2284		__entry->timestamp, __entry->switch_time,
2285		__entry->switch_timeout, __entry->peer_initiator,
2286		CHANDEF_PR_ARG, STA_PR_ARG
2287	)
2288);
2289
2290TRACE_EVENT(drv_wake_tx_queue,
2291	TP_PROTO(struct ieee80211_local *local,
2292		 struct ieee80211_sub_if_data *sdata,
2293		 struct txq_info *txq),
2294
2295	TP_ARGS(local, sdata, txq),
2296
2297	TP_STRUCT__entry(
2298		LOCAL_ENTRY
2299		VIF_ENTRY
2300		STA_ENTRY
2301		__field(u8, ac)
2302		__field(u8, tid)
2303	),
2304
2305	TP_fast_assign(
2306		struct ieee80211_sta *sta = txq->txq.sta;
2307
2308		LOCAL_ASSIGN;
2309		VIF_ASSIGN;
2310		STA_ASSIGN;
2311		__entry->ac = txq->txq.ac;
2312		__entry->tid = txq->txq.tid;
2313	),
2314
2315	TP_printk(
2316		LOCAL_PR_FMT  VIF_PR_FMT  STA_PR_FMT " ac:%d tid:%d",
2317		LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->ac, __entry->tid
2318	)
2319);
2320
2321TRACE_EVENT(drv_get_ftm_responder_stats,
2322	TP_PROTO(struct ieee80211_local *local,
2323		 struct ieee80211_sub_if_data *sdata,
2324		 struct cfg80211_ftm_responder_stats *ftm_stats),
2325
2326	TP_ARGS(local, sdata, ftm_stats),
2327
2328	TP_STRUCT__entry(
2329		LOCAL_ENTRY
2330		VIF_ENTRY
2331	),
2332
2333	TP_fast_assign(
2334		LOCAL_ASSIGN;
2335		VIF_ASSIGN;
2336	),
2337
2338	TP_printk(
2339		LOCAL_PR_FMT VIF_PR_FMT,
2340		LOCAL_PR_ARG, VIF_PR_ARG
2341	)
2342);
2343
2344DEFINE_EVENT(local_sdata_addr_evt, drv_update_vif_offload,
2345	TP_PROTO(struct ieee80211_local *local,
2346		 struct ieee80211_sub_if_data *sdata),
2347	TP_ARGS(local, sdata)
2348);
2349
2350DECLARE_EVENT_CLASS(sta_flag_evt,
2351	TP_PROTO(struct ieee80211_local *local,
2352		 struct ieee80211_sub_if_data *sdata,
2353		 struct ieee80211_sta *sta, bool enabled),
2354
2355	TP_ARGS(local, sdata, sta, enabled),
2356
2357	TP_STRUCT__entry(
2358		LOCAL_ENTRY
2359		VIF_ENTRY
2360		STA_ENTRY
2361		__field(bool, enabled)
2362	),
2363
2364	TP_fast_assign(
2365		LOCAL_ASSIGN;
2366		VIF_ASSIGN;
2367		STA_ASSIGN;
2368		__entry->enabled = enabled;
2369	),
2370
2371	TP_printk(
2372		LOCAL_PR_FMT  VIF_PR_FMT  STA_PR_FMT " enabled:%d",
2373		LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->enabled
2374	)
2375);
2376
2377DEFINE_EVENT(sta_flag_evt, drv_sta_set_4addr,
2378	TP_PROTO(struct ieee80211_local *local,
2379		 struct ieee80211_sub_if_data *sdata,
2380		 struct ieee80211_sta *sta, bool enabled),
2381
2382	TP_ARGS(local, sdata, sta, enabled)
2383);
2384
2385DEFINE_EVENT(sta_flag_evt, drv_sta_set_decap_offload,
2386	TP_PROTO(struct ieee80211_local *local,
2387		 struct ieee80211_sub_if_data *sdata,
2388		 struct ieee80211_sta *sta, bool enabled),
2389
2390	TP_ARGS(local, sdata, sta, enabled)
2391);
2392
2393TRACE_EVENT(drv_add_twt_setup,
2394	TP_PROTO(struct ieee80211_local *local,
2395		 struct ieee80211_sta *sta,
2396		 struct ieee80211_twt_setup *twt,
2397		 struct ieee80211_twt_params *twt_agrt),
2398
2399	TP_ARGS(local, sta, twt, twt_agrt),
2400
2401	TP_STRUCT__entry(
2402		LOCAL_ENTRY
2403		STA_ENTRY
2404		__field(u8, dialog_token)
2405		__field(u8, control)
2406		__field(__le16, req_type)
2407		__field(__le64, twt)
2408		__field(u8, duration)
2409		__field(__le16, mantissa)
2410		__field(u8, channel)
2411	),
2412
2413	TP_fast_assign(
2414		LOCAL_ASSIGN;
2415		STA_ASSIGN;
2416		__entry->dialog_token = twt->dialog_token;
2417		__entry->control = twt->control;
2418		__entry->req_type = twt_agrt->req_type;
2419		__entry->twt = twt_agrt->twt;
2420		__entry->duration = twt_agrt->min_twt_dur;
2421		__entry->mantissa = twt_agrt->mantissa;
2422		__entry->channel = twt_agrt->channel;
2423	),
2424
2425	TP_printk(
2426		LOCAL_PR_FMT STA_PR_FMT
2427		" token:%d control:0x%02x req_type:0x%04x"
2428		" twt:%llu duration:%d mantissa:%d channel:%d",
2429		LOCAL_PR_ARG, STA_PR_ARG, __entry->dialog_token,
2430		__entry->control, le16_to_cpu(__entry->req_type),
2431		le64_to_cpu(__entry->twt), __entry->duration,
2432		le16_to_cpu(__entry->mantissa), __entry->channel
2433	)
2434);
2435
2436TRACE_EVENT(drv_twt_teardown_request,
2437	TP_PROTO(struct ieee80211_local *local,
2438		 struct ieee80211_sta *sta, u8 flowid),
2439
2440	TP_ARGS(local, sta, flowid),
2441
2442	TP_STRUCT__entry(
2443		LOCAL_ENTRY
2444		STA_ENTRY
2445		__field(u8, flowid)
2446	),
2447
2448	TP_fast_assign(
2449		LOCAL_ASSIGN;
2450		STA_ASSIGN;
2451		__entry->flowid = flowid;
2452	),
2453
2454	TP_printk(
2455		LOCAL_PR_FMT STA_PR_FMT " flowid:%d",
2456		LOCAL_PR_ARG, STA_PR_ARG, __entry->flowid
2457	)
2458);
2459
2460DEFINE_EVENT(sta_event, drv_net_fill_forward_path,
2461	TP_PROTO(struct ieee80211_local *local,
2462		 struct ieee80211_sub_if_data *sdata,
2463		 struct ieee80211_sta *sta),
2464	TP_ARGS(local, sdata, sta)
2465);
2466
2467TRACE_EVENT(drv_net_setup_tc,
2468	TP_PROTO(struct ieee80211_local *local,
2469		 struct ieee80211_sub_if_data *sdata,
2470		 u8 type),
2471
2472	TP_ARGS(local, sdata, type),
2473
2474	TP_STRUCT__entry(
2475		LOCAL_ENTRY
2476		VIF_ENTRY
2477		__field(u8, type)
2478	),
2479
2480	TP_fast_assign(
2481		LOCAL_ASSIGN;
2482		VIF_ASSIGN;
2483		__entry->type = type;
2484	),
2485
2486	TP_printk(
2487		LOCAL_PR_FMT VIF_PR_FMT " type:%d\n",
2488		LOCAL_PR_ARG, VIF_PR_ARG, __entry->type
2489	)
2490);
2491
2492TRACE_EVENT(drv_can_activate_links,
2493	TP_PROTO(struct ieee80211_local *local,
2494		 struct ieee80211_sub_if_data *sdata,
2495		 u16 active_links),
2496
2497	TP_ARGS(local, sdata, active_links),
2498
2499	TP_STRUCT__entry(
2500		LOCAL_ENTRY
2501		VIF_ENTRY
2502		__field(u16, active_links)
2503	),
2504
2505	TP_fast_assign(
2506		LOCAL_ASSIGN;
2507		VIF_ASSIGN;
2508		__entry->active_links = active_links;
2509	),
2510
2511	TP_printk(
2512		LOCAL_PR_FMT VIF_PR_FMT " requested active_links:0x%04x\n",
2513		LOCAL_PR_ARG, VIF_PR_ARG, __entry->active_links
2514	)
2515);
2516
2517TRACE_EVENT(drv_change_vif_links,
2518	TP_PROTO(struct ieee80211_local *local,
2519		 struct ieee80211_sub_if_data *sdata,
2520		 u16 old_links, u16 new_links),
2521
2522	TP_ARGS(local, sdata, old_links, new_links),
2523
2524	TP_STRUCT__entry(
2525		LOCAL_ENTRY
2526		VIF_ENTRY
2527		__field(u16, old_links)
2528		__field(u16, new_links)
2529	),
2530
2531	TP_fast_assign(
2532		LOCAL_ASSIGN;
2533		VIF_ASSIGN;
2534		__entry->old_links = old_links;
2535		__entry->new_links = new_links;
2536	),
2537
2538	TP_printk(
2539		LOCAL_PR_FMT VIF_PR_FMT " old_links:0x%04x, new_links:0x%04x\n",
2540		LOCAL_PR_ARG, VIF_PR_ARG, __entry->old_links, __entry->new_links
2541	)
2542);
2543
2544TRACE_EVENT(drv_change_sta_links,
2545	TP_PROTO(struct ieee80211_local *local,
2546		 struct ieee80211_sub_if_data *sdata,
2547		 struct ieee80211_sta *sta,
2548		 u16 old_links, u16 new_links),
2549
2550	TP_ARGS(local, sdata, sta, old_links, new_links),
2551
2552	TP_STRUCT__entry(
2553		LOCAL_ENTRY
2554		VIF_ENTRY
2555		STA_ENTRY
2556		__field(u16, old_links)
2557		__field(u16, new_links)
2558	),
2559
2560	TP_fast_assign(
2561		LOCAL_ASSIGN;
2562		VIF_ASSIGN;
2563		STA_ASSIGN;
2564		__entry->old_links = old_links;
2565		__entry->new_links = new_links;
2566	),
2567
2568	TP_printk(
2569		LOCAL_PR_FMT VIF_PR_FMT STA_PR_FMT " old_links:0x%04x, new_links:0x%04x\n",
2570		LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG,
2571		__entry->old_links, __entry->new_links
2572	)
2573);
2574
2575/*
2576 * Tracing for API calls that drivers call.
2577 */
2578
2579TRACE_EVENT(api_start_tx_ba_session,
2580	TP_PROTO(struct ieee80211_sta *sta, u16 tid),
2581
2582	TP_ARGS(sta, tid),
2583
2584	TP_STRUCT__entry(
2585		STA_ENTRY
2586		__field(u16, tid)
2587	),
2588
2589	TP_fast_assign(
2590		STA_ASSIGN;
2591		__entry->tid = tid;
2592	),
2593
2594	TP_printk(
2595		STA_PR_FMT " tid:%d",
2596		STA_PR_ARG, __entry->tid
2597	)
2598);
2599
2600TRACE_EVENT(api_start_tx_ba_cb,
2601	TP_PROTO(struct ieee80211_sub_if_data *sdata, const u8 *ra, u16 tid),
2602
2603	TP_ARGS(sdata, ra, tid),
2604
2605	TP_STRUCT__entry(
2606		VIF_ENTRY
2607		__array(u8, ra, ETH_ALEN)
2608		__field(u16, tid)
2609	),
2610
2611	TP_fast_assign(
2612		VIF_ASSIGN;
2613		memcpy(__entry->ra, ra, ETH_ALEN);
2614		__entry->tid = tid;
2615	),
2616
2617	TP_printk(
2618		VIF_PR_FMT " ra:%pM tid:%d",
2619		VIF_PR_ARG, __entry->ra, __entry->tid
2620	)
2621);
2622
2623TRACE_EVENT(api_stop_tx_ba_session,
2624	TP_PROTO(struct ieee80211_sta *sta, u16 tid),
2625
2626	TP_ARGS(sta, tid),
2627
2628	TP_STRUCT__entry(
2629		STA_ENTRY
2630		__field(u16, tid)
2631	),
2632
2633	TP_fast_assign(
2634		STA_ASSIGN;
2635		__entry->tid = tid;
2636	),
2637
2638	TP_printk(
2639		STA_PR_FMT " tid:%d",
2640		STA_PR_ARG, __entry->tid
2641	)
2642);
2643
2644TRACE_EVENT(api_stop_tx_ba_cb,
2645	TP_PROTO(struct ieee80211_sub_if_data *sdata, const u8 *ra, u16 tid),
2646
2647	TP_ARGS(sdata, ra, tid),
2648
2649	TP_STRUCT__entry(
2650		VIF_ENTRY
2651		__array(u8, ra, ETH_ALEN)
2652		__field(u16, tid)
2653	),
2654
2655	TP_fast_assign(
2656		VIF_ASSIGN;
2657		memcpy(__entry->ra, ra, ETH_ALEN);
2658		__entry->tid = tid;
2659	),
2660
2661	TP_printk(
2662		VIF_PR_FMT " ra:%pM tid:%d",
2663		VIF_PR_ARG, __entry->ra, __entry->tid
2664	)
2665);
2666
2667DEFINE_EVENT(local_only_evt, api_restart_hw,
2668	TP_PROTO(struct ieee80211_local *local),
2669	TP_ARGS(local)
2670);
2671
2672TRACE_EVENT(api_beacon_loss,
2673	TP_PROTO(struct ieee80211_sub_if_data *sdata),
2674
2675	TP_ARGS(sdata),
2676
2677	TP_STRUCT__entry(
2678		VIF_ENTRY
2679	),
2680
2681	TP_fast_assign(
2682		VIF_ASSIGN;
2683	),
2684
2685	TP_printk(
2686		VIF_PR_FMT,
2687		VIF_PR_ARG
2688	)
2689);
2690
2691TRACE_EVENT(api_connection_loss,
2692	TP_PROTO(struct ieee80211_sub_if_data *sdata),
2693
2694	TP_ARGS(sdata),
2695
2696	TP_STRUCT__entry(
2697		VIF_ENTRY
2698	),
2699
2700	TP_fast_assign(
2701		VIF_ASSIGN;
2702	),
2703
2704	TP_printk(
2705		VIF_PR_FMT,
2706		VIF_PR_ARG
2707	)
2708);
2709
2710TRACE_EVENT(api_disconnect,
2711	TP_PROTO(struct ieee80211_sub_if_data *sdata, bool reconnect),
2712
2713	TP_ARGS(sdata, reconnect),
2714
2715	TP_STRUCT__entry(
2716		VIF_ENTRY
2717		__field(int, reconnect)
2718	),
2719
2720	TP_fast_assign(
2721		VIF_ASSIGN;
2722		__entry->reconnect = reconnect;
2723	),
2724
2725	TP_printk(
2726		VIF_PR_FMT " reconnect:%d",
2727		VIF_PR_ARG, __entry->reconnect
2728	)
2729);
2730
2731TRACE_EVENT(api_cqm_rssi_notify,
2732	TP_PROTO(struct ieee80211_sub_if_data *sdata,
2733		 enum nl80211_cqm_rssi_threshold_event rssi_event,
2734		 s32 rssi_level),
2735
2736	TP_ARGS(sdata, rssi_event, rssi_level),
2737
2738	TP_STRUCT__entry(
2739		VIF_ENTRY
2740		__field(u32, rssi_event)
2741		__field(s32, rssi_level)
2742	),
2743
2744	TP_fast_assign(
2745		VIF_ASSIGN;
2746		__entry->rssi_event = rssi_event;
2747		__entry->rssi_level = rssi_level;
2748	),
2749
2750	TP_printk(
2751		VIF_PR_FMT " event:%d rssi:%d",
2752		VIF_PR_ARG, __entry->rssi_event, __entry->rssi_level
2753	)
2754);
2755
2756DEFINE_EVENT(local_sdata_evt, api_cqm_beacon_loss_notify,
2757	TP_PROTO(struct ieee80211_local *local,
2758		 struct ieee80211_sub_if_data *sdata),
2759	TP_ARGS(local, sdata)
2760);
2761
2762TRACE_EVENT(api_scan_completed,
2763	TP_PROTO(struct ieee80211_local *local, bool aborted),
2764
2765	TP_ARGS(local, aborted),
2766
2767	TP_STRUCT__entry(
2768		LOCAL_ENTRY
2769		__field(bool, aborted)
2770	),
2771
2772	TP_fast_assign(
2773		LOCAL_ASSIGN;
2774		__entry->aborted = aborted;
2775	),
2776
2777	TP_printk(
2778		LOCAL_PR_FMT " aborted:%d",
2779		LOCAL_PR_ARG, __entry->aborted
2780	)
2781);
2782
2783TRACE_EVENT(api_sched_scan_results,
2784	TP_PROTO(struct ieee80211_local *local),
2785
2786	TP_ARGS(local),
2787
2788	TP_STRUCT__entry(
2789		LOCAL_ENTRY
2790	),
2791
2792	TP_fast_assign(
2793		LOCAL_ASSIGN;
2794	),
2795
2796	TP_printk(
2797		LOCAL_PR_FMT, LOCAL_PR_ARG
2798	)
2799);
2800
2801TRACE_EVENT(api_sched_scan_stopped,
2802	TP_PROTO(struct ieee80211_local *local),
2803
2804	TP_ARGS(local),
2805
2806	TP_STRUCT__entry(
2807		LOCAL_ENTRY
2808	),
2809
2810	TP_fast_assign(
2811		LOCAL_ASSIGN;
2812	),
2813
2814	TP_printk(
2815		LOCAL_PR_FMT, LOCAL_PR_ARG
2816	)
2817);
2818
2819TRACE_EVENT(api_sta_block_awake,
2820	TP_PROTO(struct ieee80211_local *local,
2821		 struct ieee80211_sta *sta, bool block),
2822
2823	TP_ARGS(local, sta, block),
2824
2825	TP_STRUCT__entry(
2826		LOCAL_ENTRY
2827		STA_ENTRY
2828		__field(bool, block)
2829	),
2830
2831	TP_fast_assign(
2832		LOCAL_ASSIGN;
2833		STA_ASSIGN;
2834		__entry->block = block;
2835	),
2836
2837	TP_printk(
2838		LOCAL_PR_FMT STA_PR_FMT " block:%d",
2839		LOCAL_PR_ARG, STA_PR_ARG, __entry->block
2840	)
2841);
2842
2843TRACE_EVENT(api_chswitch_done,
2844	TP_PROTO(struct ieee80211_sub_if_data *sdata, bool success,
2845		 unsigned int link_id),
2846
2847	TP_ARGS(sdata, success, link_id),
2848
2849	TP_STRUCT__entry(
2850		VIF_ENTRY
2851		__field(bool, success)
2852		__field(unsigned int, link_id)
2853	),
2854
2855	TP_fast_assign(
2856		VIF_ASSIGN;
2857		__entry->success = success;
2858		__entry->link_id = link_id;
2859	),
2860
2861	TP_printk(
2862		VIF_PR_FMT " success=%d link_id=%d",
2863		VIF_PR_ARG, __entry->success, __entry->link_id
2864	)
2865);
2866
2867DEFINE_EVENT(local_only_evt, api_ready_on_channel,
2868	TP_PROTO(struct ieee80211_local *local),
2869	TP_ARGS(local)
2870);
2871
2872DEFINE_EVENT(local_only_evt, api_remain_on_channel_expired,
2873	TP_PROTO(struct ieee80211_local *local),
2874	TP_ARGS(local)
2875);
2876
2877TRACE_EVENT(api_gtk_rekey_notify,
2878	TP_PROTO(struct ieee80211_sub_if_data *sdata,
2879		 const u8 *bssid, const u8 *replay_ctr),
2880
2881	TP_ARGS(sdata, bssid, replay_ctr),
2882
2883	TP_STRUCT__entry(
2884		VIF_ENTRY
2885		__array(u8, bssid, ETH_ALEN)
2886		__array(u8, replay_ctr, NL80211_REPLAY_CTR_LEN)
2887	),
2888
2889	TP_fast_assign(
2890		VIF_ASSIGN;
2891		memcpy(__entry->bssid, bssid, ETH_ALEN);
2892		memcpy(__entry->replay_ctr, replay_ctr, NL80211_REPLAY_CTR_LEN);
2893	),
2894
2895	TP_printk(VIF_PR_FMT, VIF_PR_ARG)
2896);
2897
2898TRACE_EVENT(api_enable_rssi_reports,
2899	TP_PROTO(struct ieee80211_sub_if_data *sdata,
2900		 int rssi_min_thold, int rssi_max_thold),
2901
2902	TP_ARGS(sdata, rssi_min_thold, rssi_max_thold),
2903
2904	TP_STRUCT__entry(
2905		VIF_ENTRY
2906		__field(int, rssi_min_thold)
2907		__field(int, rssi_max_thold)
2908	),
2909
2910	TP_fast_assign(
2911		VIF_ASSIGN;
2912		__entry->rssi_min_thold = rssi_min_thold;
2913		__entry->rssi_max_thold = rssi_max_thold;
2914	),
2915
2916	TP_printk(
2917		VIF_PR_FMT " rssi_min_thold =%d, rssi_max_thold = %d",
2918		VIF_PR_ARG, __entry->rssi_min_thold, __entry->rssi_max_thold
2919	)
2920);
2921
2922TRACE_EVENT(api_eosp,
2923	TP_PROTO(struct ieee80211_local *local,
2924		 struct ieee80211_sta *sta),
2925
2926	TP_ARGS(local, sta),
2927
2928	TP_STRUCT__entry(
2929		LOCAL_ENTRY
2930		STA_ENTRY
2931	),
2932
2933	TP_fast_assign(
2934		LOCAL_ASSIGN;
2935		STA_ASSIGN;
2936	),
2937
2938	TP_printk(
2939		LOCAL_PR_FMT STA_PR_FMT,
2940		LOCAL_PR_ARG, STA_PR_ARG
2941	)
2942);
2943
2944TRACE_EVENT(api_send_eosp_nullfunc,
2945	TP_PROTO(struct ieee80211_local *local,
2946		 struct ieee80211_sta *sta,
2947		 u8 tid),
2948
2949	TP_ARGS(local, sta, tid),
2950
2951	TP_STRUCT__entry(
2952		LOCAL_ENTRY
2953		STA_ENTRY
2954		__field(u8, tid)
2955	),
2956
2957	TP_fast_assign(
2958		LOCAL_ASSIGN;
2959		STA_ASSIGN;
2960		__entry->tid = tid;
2961	),
2962
2963	TP_printk(
2964		LOCAL_PR_FMT STA_PR_FMT " tid:%d",
2965		LOCAL_PR_ARG, STA_PR_ARG, __entry->tid
2966	)
2967);
2968
2969TRACE_EVENT(api_sta_set_buffered,
2970	TP_PROTO(struct ieee80211_local *local,
2971		 struct ieee80211_sta *sta,
2972		 u8 tid, bool buffered),
2973
2974	TP_ARGS(local, sta, tid, buffered),
2975
2976	TP_STRUCT__entry(
2977		LOCAL_ENTRY
2978		STA_ENTRY
2979		__field(u8, tid)
2980		__field(bool, buffered)
2981	),
2982
2983	TP_fast_assign(
2984		LOCAL_ASSIGN;
2985		STA_ASSIGN;
2986		__entry->tid = tid;
2987		__entry->buffered = buffered;
2988	),
2989
2990	TP_printk(
2991		LOCAL_PR_FMT STA_PR_FMT " tid:%d buffered:%d",
2992		LOCAL_PR_ARG, STA_PR_ARG, __entry->tid, __entry->buffered
2993	)
2994);
2995
2996TRACE_EVENT(api_radar_detected,
2997	TP_PROTO(struct ieee80211_local *local),
2998
2999	TP_ARGS(local),
3000
3001	TP_STRUCT__entry(
3002		LOCAL_ENTRY
3003	),
3004
3005	TP_fast_assign(
3006		LOCAL_ASSIGN;
3007	),
3008
3009	TP_printk(
3010		LOCAL_PR_FMT " radar detected",
3011		LOCAL_PR_ARG
3012	)
3013);
3014
3015TRACE_EVENT(api_request_smps,
3016	TP_PROTO(struct ieee80211_local *local,
3017		 struct ieee80211_sub_if_data *sdata,
3018		 struct ieee80211_link_data *link,
3019		 enum ieee80211_smps_mode smps_mode),
3020
3021	TP_ARGS(local, sdata, link, smps_mode),
3022
3023	TP_STRUCT__entry(
3024		LOCAL_ENTRY
3025		VIF_ENTRY
3026		__field(int, link_id)
3027		__field(u32, smps_mode)
3028	),
3029
3030	TP_fast_assign(
3031		LOCAL_ASSIGN;
3032		VIF_ASSIGN;
3033		__entry->link_id = link->link_id,
3034		__entry->smps_mode = smps_mode;
3035	),
3036
3037	TP_printk(
3038		LOCAL_PR_FMT " " VIF_PR_FMT " link:%d, smps_mode:%d",
3039		LOCAL_PR_ARG, VIF_PR_ARG, __entry->link_id, __entry->smps_mode
3040	)
3041);
3042
3043/*
3044 * Tracing for internal functions
3045 * (which may also be called in response to driver calls)
3046 */
3047
3048TRACE_EVENT(wake_queue,
3049	TP_PROTO(struct ieee80211_local *local, u16 queue,
3050		 enum queue_stop_reason reason),
3051
3052	TP_ARGS(local, queue, reason),
3053
3054	TP_STRUCT__entry(
3055		LOCAL_ENTRY
3056		__field(u16, queue)
3057		__field(u32, reason)
3058	),
3059
3060	TP_fast_assign(
3061		LOCAL_ASSIGN;
3062		__entry->queue = queue;
3063		__entry->reason = reason;
3064	),
3065
3066	TP_printk(
3067		LOCAL_PR_FMT " queue:%d, reason:%d",
3068		LOCAL_PR_ARG, __entry->queue, __entry->reason
3069	)
3070);
3071
3072TRACE_EVENT(stop_queue,
3073	TP_PROTO(struct ieee80211_local *local, u16 queue,
3074		 enum queue_stop_reason reason),
3075
3076	TP_ARGS(local, queue, reason),
3077
3078	TP_STRUCT__entry(
3079		LOCAL_ENTRY
3080		__field(u16, queue)
3081		__field(u32, reason)
3082	),
3083
3084	TP_fast_assign(
3085		LOCAL_ASSIGN;
3086		__entry->queue = queue;
3087		__entry->reason = reason;
3088	),
3089
3090	TP_printk(
3091		LOCAL_PR_FMT " queue:%d, reason:%d",
3092		LOCAL_PR_ARG, __entry->queue, __entry->reason
3093	)
3094);
3095
3096TRACE_EVENT(drv_can_neg_ttlm,
3097	    TP_PROTO(struct ieee80211_local *local,
3098		     struct ieee80211_sub_if_data *sdata,
3099		     struct ieee80211_neg_ttlm *neg_ttlm),
3100
3101	TP_ARGS(local, sdata, neg_ttlm),
3102
3103	TP_STRUCT__entry(LOCAL_ENTRY
3104			 VIF_ENTRY
3105			 __array(u16, downlink, sizeof(u16) * 8)
3106			 __array(u16, uplink, sizeof(u16) * 8)
3107	),
3108
3109	TP_fast_assign(LOCAL_ASSIGN;
3110		       VIF_ASSIGN;
3111		       memcpy(__entry->downlink, neg_ttlm->downlink,
3112			      sizeof(neg_ttlm->downlink));
3113		       memcpy(__entry->uplink, neg_ttlm->uplink,
3114			      sizeof(neg_ttlm->uplink));
3115	),
3116
3117	TP_printk(LOCAL_PR_FMT ", " VIF_PR_FMT, LOCAL_PR_ARG, VIF_PR_ARG)
3118);
3119
3120TRACE_EVENT(drv_neg_ttlm_res,
3121	    TP_PROTO(struct ieee80211_local *local,
3122		     struct ieee80211_sub_if_data *sdata,
3123		     enum ieee80211_neg_ttlm_res res,
3124		     struct ieee80211_neg_ttlm *neg_ttlm),
3125
3126	TP_ARGS(local, sdata, res, neg_ttlm),
3127
3128	TP_STRUCT__entry(LOCAL_ENTRY
3129			 VIF_ENTRY
3130			 __field(u32, res)
3131			 __array(u16, downlink, sizeof(u16) * 8)
3132			 __array(u16, uplink, sizeof(u16) * 8)
3133	),
3134
3135	TP_fast_assign(LOCAL_ASSIGN;
3136		       VIF_ASSIGN;
3137		       __entry->res = res;
3138		       memcpy(__entry->downlink, neg_ttlm->downlink,
3139			      sizeof(neg_ttlm->downlink));
3140		       memcpy(__entry->uplink, neg_ttlm->uplink,
3141			      sizeof(neg_ttlm->uplink));
3142	),
3143
3144	TP_printk(LOCAL_PR_FMT  VIF_PR_FMT " response: %d\n ",
3145		  LOCAL_PR_ARG, VIF_PR_ARG, __entry->res
3146	)
3147);
3148#endif /* !__MAC80211_DRIVER_TRACE || TRACE_HEADER_MULTI_READ */
3149
3150#undef TRACE_INCLUDE_PATH
3151#define TRACE_INCLUDE_PATH .
3152#undef TRACE_INCLUDE_FILE
3153#define TRACE_INCLUDE_FILE trace
3154#include <trace/define_trace.h>
3155