]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: mac80211: pass link conf to abort_channel_switch
authorJohannes Berg <johannes.berg@intel.com>
Wed, 28 Feb 2024 08:55:44 +0000 (09:55 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 4 Mar 2024 13:33:56 +0000 (14:33 +0100)
Pass the link conf to the abort_channel_switch driver
method so the driver can handle things correctly.

Reviewed-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Reviewed-by: Miriam Rachel Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240228095718.27f621106ddd.Iadd3d69b722ffe5934779a32a0e4e596a4e33ed4@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
include/net/mac80211.h
net/mac80211/driver-ops.h
net/mac80211/mlme.c

index 69f6a96b0cfbece46545f4bf29f0829aca65714c..1935630d3def0092a15b5e0ce755cef1149cdd9f 100644 (file)
@@ -1470,7 +1470,8 @@ out_unlock:
 }
 
 void iwl_mvm_abort_channel_switch(struct ieee80211_hw *hw,
-                                 struct ieee80211_vif *vif)
+                                 struct ieee80211_vif *vif,
+                                 struct ieee80211_bss_conf *link_conf)
 {
        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
@@ -5551,8 +5552,16 @@ void iwl_mvm_channel_switch_rx_beacon(struct ieee80211_hw *hw,
 
        if (chsw->count >= mvmvif->csa_count && chsw->block_tx) {
                if (mvmvif->csa_misbehave) {
+                       struct ieee80211_bss_conf *link_conf;
+
                        /* Second time, give up on this AP*/
-                       iwl_mvm_abort_channel_switch(hw, vif);
+
+                       link_conf = wiphy_dereference(hw->wiphy,
+                                                     vif->link_conf[chsw->link_id]);
+                       if (WARN_ON(!link_conf))
+                               return;
+
+                       iwl_mvm_abort_channel_switch(hw, vif, link_conf);
                        ieee80211_chswitch_done(vif, false, 0);
                        mvmvif->csa_misbehave = false;
                        return;
index c85d9e460ad2e3989288c58c2b23ef67289faa5b..63c80271259649a6bd8564713a7be670354034ff 100644 (file)
@@ -2709,7 +2709,8 @@ int iwl_mvm_pre_channel_switch(struct ieee80211_hw *hw,
                               struct ieee80211_vif *vif,
                               struct ieee80211_channel_switch *chsw);
 void iwl_mvm_abort_channel_switch(struct ieee80211_hw *hw,
-                                 struct ieee80211_vif *vif);
+                                 struct ieee80211_vif *vif,
+                                 struct ieee80211_bss_conf *link_conf);
 void iwl_mvm_channel_switch_rx_beacon(struct ieee80211_hw *hw,
                                      struct ieee80211_vif *vif,
                                      struct ieee80211_channel_switch *chsw);
index 8ea9fa81e68c59cf9d8f61fabc1514e234c270f1..c622450ac012508c6db1f6a8952672b32e8b82cf 100644 (file)
@@ -4268,7 +4268,7 @@ struct ieee80211_prep_tx_info {
  *     after a channel switch procedure is completed, allowing the
  *     driver to go back to a normal configuration.
  * @abort_channel_switch: This is an optional callback that is called
- *     when channel switch procedure was completed, allowing the
+ *     when channel switch procedure was aborted, allowing the
  *     driver to go back to a normal configuration.
  * @channel_switch_rx_beacon: This is an optional callback that is called
  *     when channel switch procedure is in progress and additional beacon with
@@ -4664,7 +4664,8 @@ struct ieee80211_ops {
                                   struct ieee80211_vif *vif,
                                   struct ieee80211_bss_conf *link_conf);
        void (*abort_channel_switch)(struct ieee80211_hw *hw,
-                                    struct ieee80211_vif *vif);
+                                    struct ieee80211_vif *vif,
+                                    struct ieee80211_bss_conf *link_conf);
        void (*channel_switch_rx_beacon)(struct ieee80211_hw *hw,
                                         struct ieee80211_vif *vif,
                                         struct ieee80211_channel_switch *ch_switch);
index e20c64edb880ce156fb7668a723c1a1bf1343765..5d078c0a23236cf796a93090ff139ddf1a8e04a2 100644 (file)
@@ -2,7 +2,7 @@
 /*
 * Portions of this file
 * Copyright(c) 2016 Intel Deutschland GmbH
-* Copyright (C) 2018 - 2019, 2021 - 2023 Intel Corporation
+* Copyright (C) 2018-2019, 2021-2024 Intel Corporation
 */
 
 #ifndef __MAC80211_DRIVER_OPS
@@ -1180,8 +1180,9 @@ drv_post_channel_switch(struct ieee80211_link_data *link)
 }
 
 static inline void
-drv_abort_channel_switch(struct ieee80211_sub_if_data *sdata)
+drv_abort_channel_switch(struct ieee80211_link_data *link)
 {
+       struct ieee80211_sub_if_data *sdata = link->sdata;
        struct ieee80211_local *local = sdata->local;
 
        might_sleep();
@@ -1193,7 +1194,8 @@ drv_abort_channel_switch(struct ieee80211_sub_if_data *sdata)
        trace_drv_abort_channel_switch(local, sdata);
 
        if (local->ops->abort_channel_switch)
-               local->ops->abort_channel_switch(&local->hw, &sdata->vif);
+               local->ops->abort_channel_switch(&local->hw, &sdata->vif,
+                                                link->conf);
 }
 
 static inline void
index d1d4480c0352d25be25ba93eeb489b018c1dfccd..c5c7575141796fe67561d38e857af5ee18f186ef 100644 (file)
@@ -2004,7 +2004,7 @@ ieee80211_sta_abort_chanswitch(struct ieee80211_link_data *link)
        link->csa_block_tx = false;
        link->conf->csa_active = false;
 
-       drv_abort_channel_switch(sdata);
+       drv_abort_channel_switch(link);
 }
 
 static void