OSDN Git Service

iwlwifi: mvm: enable TX on new CSA channel before disconnecting
authorSara Sharon <sara.sharon@intel.com>
Tue, 30 Mar 2021 13:24:49 +0000 (16:24 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Wed, 14 Apr 2021 09:05:26 +0000 (12:05 +0300)
When moving to the new channel, we block TX until we hear the
first beacon. if it is not heard, we proceed to disconnect.
Since TX is blocked (without mac80211 being aware of it) the frame
is stuck, resulting with queue hang.

Instead, reenable TX before reporting on the connection loss.
As we are on the new channel, there is no problem with that,
even if the original CSA had quiet mode.

Signed-off-by: Sara Sharon <sara.sharon@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20210330162204.eb4f2ff1b863.Ib16238106b33d58b2b7688dc6297018b915ecef4@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/time-event.c

index 0b012f8..1418a64 100644 (file)
@@ -151,6 +151,16 @@ static bool iwl_mvm_te_check_disconnect(struct iwl_mvm *mvm,
        if (errmsg)
                IWL_ERR(mvm, "%s\n", errmsg);
 
+       if (mvmvif->csa_bcn_pending) {
+               struct iwl_mvm_sta *mvmsta;
+
+               rcu_read_lock();
+               mvmsta = iwl_mvm_sta_from_staid_rcu(mvm, mvmvif->ap_sta_id);
+               if (!WARN_ON(!mvmsta))
+                       iwl_mvm_sta_modify_disable_tx(mvm, mvmsta, false);
+               rcu_read_unlock();
+       }
+
        iwl_mvm_connection_loss(mvm, vif, errmsg);
        return true;
 }