|
@@ -1389,6 +1389,91 @@ TRACE_EVENT(drv_change_chanctx,
|
|
|
)
|
|
|
);
|
|
|
|
|
|
+#if !defined(__TRACE_VIF_ENTRY)
|
|
|
+#define __TRACE_VIF_ENTRY
|
|
|
+struct trace_vif_entry {
|
|
|
+ enum nl80211_iftype vif_type;
|
|
|
+ bool p2p;
|
|
|
+ char vif_name[IFNAMSIZ];
|
|
|
+} __packed;
|
|
|
+
|
|
|
+struct trace_chandef_entry {
|
|
|
+ u32 control_freq;
|
|
|
+ u32 chan_width;
|
|
|
+ u32 center_freq1;
|
|
|
+ u32 center_freq2;
|
|
|
+} __packed;
|
|
|
+
|
|
|
+struct trace_switch_entry {
|
|
|
+ struct trace_vif_entry vif;
|
|
|
+ struct trace_chandef_entry old_chandef;
|
|
|
+ struct trace_chandef_entry new_chandef;
|
|
|
+} __packed;
|
|
|
+
|
|
|
+#define SWITCH_ENTRY_ASSIGN(to, from) local_vifs[i].to = vifs[i].from
|
|
|
+#endif
|
|
|
+
|
|
|
+TRACE_EVENT(drv_switch_vif_chanctx,
|
|
|
+ TP_PROTO(struct ieee80211_local *local,
|
|
|
+ struct ieee80211_vif_chanctx_switch *vifs,
|
|
|
+ int n_vifs, enum ieee80211_chanctx_switch_mode mode),
|
|
|
+ TP_ARGS(local, vifs, n_vifs, mode),
|
|
|
+
|
|
|
+ TP_STRUCT__entry(
|
|
|
+ LOCAL_ENTRY
|
|
|
+ __field(int, n_vifs)
|
|
|
+ __field(u32, mode)
|
|
|
+ __dynamic_array(u8, vifs,
|
|
|
+ sizeof(struct trace_switch_entry) * n_vifs)
|
|
|
+ ),
|
|
|
+
|
|
|
+ TP_fast_assign(
|
|
|
+ LOCAL_ASSIGN;
|
|
|
+ __entry->n_vifs = n_vifs;
|
|
|
+ __entry->mode = mode;
|
|
|
+ {
|
|
|
+ struct trace_switch_entry *local_vifs =
|
|
|
+ __get_dynamic_array(vifs);
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; i < n_vifs; i++) {
|
|
|
+ struct ieee80211_sub_if_data *sdata;
|
|
|
+
|
|
|
+ sdata = container_of(vifs[i].vif,
|
|
|
+ struct ieee80211_sub_if_data,
|
|
|
+ vif);
|
|
|
+
|
|
|
+ SWITCH_ENTRY_ASSIGN(vif.vif_type, vif->type);
|
|
|
+ SWITCH_ENTRY_ASSIGN(vif.p2p, vif->p2p);
|
|
|
+ strncpy(local_vifs[i].vif.vif_name,
|
|
|
+ sdata->name,
|
|
|
+ sizeof(local_vifs[i].vif.vif_name));
|
|
|
+ SWITCH_ENTRY_ASSIGN(old_chandef.control_freq,
|
|
|
+ old_ctx->def.chan->center_freq);
|
|
|
+ SWITCH_ENTRY_ASSIGN(old_chandef.chan_width,
|
|
|
+ old_ctx->def.width);
|
|
|
+ SWITCH_ENTRY_ASSIGN(old_chandef.center_freq1,
|
|
|
+ old_ctx->def.center_freq1);
|
|
|
+ SWITCH_ENTRY_ASSIGN(old_chandef.center_freq2,
|
|
|
+ old_ctx->def.center_freq2);
|
|
|
+ SWITCH_ENTRY_ASSIGN(new_chandef.control_freq,
|
|
|
+ new_ctx->def.chan->center_freq);
|
|
|
+ SWITCH_ENTRY_ASSIGN(new_chandef.chan_width,
|
|
|
+ new_ctx->def.width);
|
|
|
+ SWITCH_ENTRY_ASSIGN(new_chandef.center_freq1,
|
|
|
+ new_ctx->def.center_freq1);
|
|
|
+ SWITCH_ENTRY_ASSIGN(new_chandef.center_freq2,
|
|
|
+ new_ctx->def.center_freq2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ),
|
|
|
+
|
|
|
+ TP_printk(
|
|
|
+ LOCAL_PR_FMT " n_vifs:%d mode:%d",
|
|
|
+ LOCAL_PR_ARG, __entry->n_vifs, __entry->mode
|
|
|
+ )
|
|
|
+);
|
|
|
+
|
|
|
DECLARE_EVENT_CLASS(local_sdata_chanctx,
|
|
|
TP_PROTO(struct ieee80211_local *local,
|
|
|
struct ieee80211_sub_if_data *sdata,
|