iwlwifi: mvm: correct sta-state logic for TDLS
authorJohannes Berg <johannes.berg@intel.com>
Sun, 17 Oct 2021 09:40:10 +0000 (12:40 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Fri, 22 Oct 2021 07:48:59 +0000 (10:48 +0300)
For TDLS stations, much of the sta-state logic shouldn't apply,
since they don't affect the link to the AP. Fix that.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20211017123741.954001ec079f.I9deb8bc7520ad569a453f72c8d99adc9c99c9be3@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c

index 5374faa15684e88d04ee7481875dd404eabe90b0..56da2759777cc3dff3e493ebbd8143d24c7d1822 100644 (file)
@@ -3194,32 +3194,35 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
                if (iwl_mvm_phy_ctx_count(mvm) > 1)
                        iwl_mvm_teardown_tdls_peers(mvm);
 
-               if (sta->tdls)
+               if (sta->tdls) {
                        iwl_mvm_tdls_check_trigger(mvm, vif, sta->addr,
                                                   NL80211_TDLS_ENABLE_LINK);
+               } else {
+                       /* enable beacon filtering */
+                       WARN_ON(iwl_mvm_enable_beacon_filter(mvm, vif, 0));
 
-               /* enable beacon filtering */
-               WARN_ON(iwl_mvm_enable_beacon_filter(mvm, vif, 0));
-
-               /*
-                * Now that the station is authorized, i.e., keys were already
-                * installed, need to indicate to the FW that
-                * multicast data frames can be forwarded to the driver
-                */
-               iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
+                       /*
+                        * Now that the station is authorized, i.e., keys were already
+                        * installed, need to indicate to the FW that
+                        * multicast data frames can be forwarded to the driver
+                        */
+                       iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
+               }
 
                iwl_mvm_rs_rate_init(mvm, sta, mvmvif->phy_ctxt->channel->band,
                                     true);
        } else if (old_state == IEEE80211_STA_AUTHORIZED &&
                   new_state == IEEE80211_STA_ASSOC) {
-               /* Multicast data frames are no longer allowed */
-               iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
+               if (!sta->tdls) {
+                       /* Multicast data frames are no longer allowed */
+                       iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
 
-               /* disable beacon filtering */
-               ret = iwl_mvm_disable_beacon_filter(mvm, vif, 0);
-               WARN_ON(ret &&
-                       !test_bit(IWL_MVM_STATUS_HW_RESTART_REQUESTED,
-                                 &mvm->status));
+                       /* disable beacon filtering */
+                       ret = iwl_mvm_disable_beacon_filter(mvm, vif, 0);
+                       WARN_ON(ret &&
+                               !test_bit(IWL_MVM_STATUS_HW_RESTART_REQUESTED,
+                                         &mvm->status));
+               }
                ret = 0;
        } else if (old_state == IEEE80211_STA_ASSOC &&
                   new_state == IEEE80211_STA_AUTH) {