Commit e6ee3a37 authored by Johannes Berg's avatar Johannes Berg

wifi: mac80211: pass link_id to channel switch ops

For CSA to work correctly in multi-link scenarios, pass
the link_id to the relevant callbacks.

While at it, unify/deduplicate the tracing for them.
Reviewed-by: default avatarMiriam Rachel Korenblit <miriam.rachel.korenblit@intel.com>
Reviewed-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Link: https://msgid.link/20240228095718.b7726635c054.I0be5d00af4acb48cfbd23a9dbf067f9aeb66469d@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 8ade3356
...@@ -1763,8 +1763,9 @@ struct ieee80211_conf { ...@@ -1763,8 +1763,9 @@ struct ieee80211_conf {
* @chandef: the new channel to switch to * @chandef: the new channel to switch to
* @count: the number of TBTT's until the channel switch event * @count: the number of TBTT's until the channel switch event
* @delay: maximum delay between the time the AP transmitted the last beacon in * @delay: maximum delay between the time the AP transmitted the last beacon in
* current channel and the expected time of the first beacon in the new * current channel and the expected time of the first beacon in the new
* channel, expressed in TU. * channel, expressed in TU.
* @link_id: the link ID of the link doing the channel switch, 0 for non-MLO
*/ */
struct ieee80211_channel_switch { struct ieee80211_channel_switch {
u64 timestamp; u64 timestamp;
...@@ -1772,6 +1773,7 @@ struct ieee80211_channel_switch { ...@@ -1772,6 +1773,7 @@ struct ieee80211_channel_switch {
bool block_tx; bool block_tx;
struct cfg80211_chan_def chandef; struct cfg80211_chan_def chandef;
u8 count; u8 count;
u8 link_id;
u32 delay; u32 delay;
}; };
......
...@@ -3931,7 +3931,9 @@ __ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev, ...@@ -3931,7 +3931,9 @@ __ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
struct ieee80211_chan_req chanreq = { .oper = params->chandef }; struct ieee80211_chan_req chanreq = { .oper = params->chandef };
struct ieee80211_local *local = sdata->local; struct ieee80211_local *local = sdata->local;
struct ieee80211_channel_switch ch_switch; struct ieee80211_channel_switch ch_switch = {
.link_id = params->link_id,
};
struct ieee80211_chanctx_conf *conf; struct ieee80211_chanctx_conf *conf;
struct ieee80211_chanctx *chanctx; struct ieee80211_chanctx *chanctx;
struct ieee80211_bss_conf *link_conf; struct ieee80211_bss_conf *link_conf;
......
...@@ -2021,7 +2021,9 @@ ieee80211_sta_process_chanswitch(struct ieee80211_link_data *link, ...@@ -2021,7 +2021,9 @@ ieee80211_sta_process_chanswitch(struct ieee80211_link_data *link,
struct ieee80211_chanctx *chanctx; struct ieee80211_chanctx *chanctx;
enum nl80211_band current_band; enum nl80211_band current_band;
struct ieee80211_csa_ie csa_ie; struct ieee80211_csa_ie csa_ie;
struct ieee80211_channel_switch ch_switch; struct ieee80211_channel_switch ch_switch = {
.link_id = link->link_id,
};
struct ieee80211_bss *bss; struct ieee80211_bss *bss;
unsigned long timeout; unsigned long timeout;
int res; int res;
......
...@@ -1209,7 +1209,7 @@ DEFINE_EVENT(sta_event, drv_flush_sta, ...@@ -1209,7 +1209,7 @@ DEFINE_EVENT(sta_event, drv_flush_sta,
TP_ARGS(local, sdata, sta) TP_ARGS(local, sdata, sta)
); );
TRACE_EVENT(drv_channel_switch, DECLARE_EVENT_CLASS(chanswitch_evt,
TP_PROTO(struct ieee80211_local *local, TP_PROTO(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata, struct ieee80211_sub_if_data *sdata,
struct ieee80211_channel_switch *ch_switch), struct ieee80211_channel_switch *ch_switch),
...@@ -1224,6 +1224,7 @@ TRACE_EVENT(drv_channel_switch, ...@@ -1224,6 +1224,7 @@ TRACE_EVENT(drv_channel_switch,
__field(u32, device_timestamp) __field(u32, device_timestamp)
__field(bool, block_tx) __field(bool, block_tx)
__field(u8, count) __field(u8, count)
__field(u8, link_id)
), ),
TP_fast_assign( TP_fast_assign(
...@@ -1234,14 +1235,24 @@ TRACE_EVENT(drv_channel_switch, ...@@ -1234,14 +1235,24 @@ TRACE_EVENT(drv_channel_switch,
__entry->device_timestamp = ch_switch->device_timestamp; __entry->device_timestamp = ch_switch->device_timestamp;
__entry->block_tx = ch_switch->block_tx; __entry->block_tx = ch_switch->block_tx;
__entry->count = ch_switch->count; __entry->count = ch_switch->count;
__entry->link_id = ch_switch->link_id;
), ),
TP_printk( TP_printk(
LOCAL_PR_FMT VIF_PR_FMT " new " CHANDEF_PR_FMT " count:%d", LOCAL_PR_FMT VIF_PR_FMT CHANDEF_PR_FMT " count:%d block_tx:%d timestamp:%llu device_ts:%u link_id:%d",
LOCAL_PR_ARG, VIF_PR_ARG, CHANDEF_PR_ARG, __entry->count LOCAL_PR_ARG, VIF_PR_ARG, CHANDEF_PR_ARG, __entry->count,
__entry->block_tx, __entry->timestamp,
__entry->device_timestamp, __entry->link_id
) )
); );
DEFINE_EVENT(chanswitch_evt, drv_channel_switch,
TP_PROTO(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata,
struct ieee80211_channel_switch *ch_switch),
TP_ARGS(local, sdata, ch_switch)
);
TRACE_EVENT(drv_set_antenna, TRACE_EVENT(drv_set_antenna,
TP_PROTO(struct ieee80211_local *local, u32 tx_ant, u32 rx_ant, int ret), TP_PROTO(struct ieee80211_local *local, u32 tx_ant, u32 rx_ant, int ret),
...@@ -2121,39 +2132,11 @@ TRACE_EVENT(drv_channel_switch_beacon, ...@@ -2121,39 +2132,11 @@ TRACE_EVENT(drv_channel_switch_beacon,
) )
); );
TRACE_EVENT(drv_pre_channel_switch, DEFINE_EVENT(chanswitch_evt, drv_pre_channel_switch,
TP_PROTO(struct ieee80211_local *local, TP_PROTO(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata, struct ieee80211_sub_if_data *sdata,
struct ieee80211_channel_switch *ch_switch), struct ieee80211_channel_switch *ch_switch),
TP_ARGS(local, sdata, ch_switch)
TP_ARGS(local, sdata, ch_switch),
TP_STRUCT__entry(
LOCAL_ENTRY
VIF_ENTRY
CHANDEF_ENTRY
__field(u64, timestamp)
__field(u32, device_timestamp)
__field(bool, block_tx)
__field(u8, count)
),
TP_fast_assign(
LOCAL_ASSIGN;
VIF_ASSIGN;
CHANDEF_ASSIGN(&ch_switch->chandef)
__entry->timestamp = ch_switch->timestamp;
__entry->device_timestamp = ch_switch->device_timestamp;
__entry->block_tx = ch_switch->block_tx;
__entry->count = ch_switch->count;
),
TP_printk(
LOCAL_PR_FMT VIF_PR_FMT " prepare channel switch to "
CHANDEF_PR_FMT " count:%d block_tx:%d timestamp:%llu",
LOCAL_PR_ARG, VIF_PR_ARG, CHANDEF_PR_ARG, __entry->count,
__entry->block_tx, __entry->timestamp
)
); );
DEFINE_EVENT(local_sdata_evt, drv_post_channel_switch, DEFINE_EVENT(local_sdata_evt, drv_post_channel_switch,
...@@ -2168,40 +2151,11 @@ DEFINE_EVENT(local_sdata_evt, drv_abort_channel_switch, ...@@ -2168,40 +2151,11 @@ DEFINE_EVENT(local_sdata_evt, drv_abort_channel_switch,
TP_ARGS(local, sdata) TP_ARGS(local, sdata)
); );
TRACE_EVENT(drv_channel_switch_rx_beacon, DEFINE_EVENT(chanswitch_evt, drv_channel_switch_rx_beacon,
TP_PROTO(struct ieee80211_local *local, TP_PROTO(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata, struct ieee80211_sub_if_data *sdata,
struct ieee80211_channel_switch *ch_switch), struct ieee80211_channel_switch *ch_switch),
TP_ARGS(local, sdata, ch_switch)
TP_ARGS(local, sdata, ch_switch),
TP_STRUCT__entry(
LOCAL_ENTRY
VIF_ENTRY
CHANDEF_ENTRY
__field(u64, timestamp)
__field(u32, device_timestamp)
__field(bool, block_tx)
__field(u8, count)
),
TP_fast_assign(
LOCAL_ASSIGN;
VIF_ASSIGN;
CHANDEF_ASSIGN(&ch_switch->chandef)
__entry->timestamp = ch_switch->timestamp;
__entry->device_timestamp = ch_switch->device_timestamp;
__entry->block_tx = ch_switch->block_tx;
__entry->count = ch_switch->count;
),
TP_printk(
LOCAL_PR_FMT VIF_PR_FMT
" received a channel switch beacon to "
CHANDEF_PR_FMT " count:%d block_tx:%d timestamp:%llu",
LOCAL_PR_ARG, VIF_PR_ARG, CHANDEF_PR_ARG, __entry->count,
__entry->block_tx, __entry->timestamp
)
); );
TRACE_EVENT(drv_get_txpower, TRACE_EVENT(drv_get_txpower,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment