iwlwifi: mvm: Fix CSA received immediately after association
authorAvraham Stern <avraham.stern@intel.com>
Mon, 9 Jan 2017 13:39:15 +0000 (15:39 +0200)
committerLuca Coelho <luciano.coelho@intel.com>
Wed, 8 Feb 2017 15:54:22 +0000 (17:54 +0200)
The session protection set for association is only removed when
BSS_CHANGED_BEACON_INFO is set and BSS_CHANGED_ASSOC is not set.

However, mac80211 may set both on association (in case a beacon was
already received). In this case, mac80211 will not set
BSS_CHANGED_BEACON_INFO on the next beacons because it has already
notified the beacon change, so the session protection is never removed
(until the session protection ends).

When a CSA is received within this time, the station will fail to
folllow the channel switch because it cannot schedule the time event.

Fix this by removing the session protection when
BSS_CHANGED_BEACON_INFO and BSS_CHANGED_ASSOC are both set.

Signed-off-by: Avraham Stern <avraham.stern@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c

index 15ecd3aba71b47024f8ad4951088a404fdccc096..7253b92792bf533c3cfe671e1293db504e353760 100644 (file)
@@ -2008,16 +2008,16 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
                if (fw_has_capa(&mvm->fw->ucode_capa,
                                IWL_UCODE_TLV_CAPA_UMAC_SCAN))
                        iwl_mvm_config_scan(mvm);
-       } else if (changes & BSS_CHANGED_BEACON_INFO) {
+       }
+
+       if (changes & BSS_CHANGED_BEACON_INFO) {
                /*
-                * We received a beacon _after_ association so
+                * We received a beacon from the associated AP so
                 * remove the session protection.
                 */
                iwl_mvm_remove_time_event(mvm, mvmvif,
                                          &mvmvif->time_event_data);
-       }
 
-       if (changes & BSS_CHANGED_BEACON_INFO) {
                iwl_mvm_sf_update(mvm, vif, false);
                WARN_ON(iwl_mvm_enable_beacon_filter(mvm, vif, 0));
        }