iwlwifi: mvm: protect session during CSA
authorLuciano Coelho <luciano.coelho@intel.com>
Mon, 10 Nov 2014 09:10:21 +0000 (11:10 +0200)
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Mon, 24 Nov 2014 06:30:35 +0000 (08:30 +0200)
When another vif is also running during a channel switch, we need to
use a session protection when we move to the new channel, so that we
don't miss the beacons.  Without this, sometimes the other vif
repeatedly gets time exactly when we should be hearing the beacons,
preventing channel switch from completing.  Adding a session
protection that lasts from the moment the channel changes until 2
TBTTs later, ensures that we will hear the beacons on the destination
channel.

Signed-off-by: Luciano Coelho <luciano.coelho@intel.com>
drivers/net/wireless/iwlwifi/mvm/mac80211.c
drivers/net/wireless/iwlwifi/mvm/mvm.h

index a62014ee90534ac368da2903d84ce45792c29557..6214133e08a6ec212c5650db10745a0fcf39e411 100644 (file)
@@ -2847,6 +2847,25 @@ static int __iwl_mvm_assign_vif_chanctx(struct iwl_mvm *mvm,
        }
 
        if (switching_chanctx && vif->type == NL80211_IFTYPE_STATION) {
+               u32 duration = 2 * vif->bss_conf.beacon_int;
+
+               /* iwl_mvm_protect_session() reads directly from the
+                * device (the system time), so make sure it is
+                * available.
+                */
+               ret = iwl_mvm_ref_sync(mvm, IWL_MVM_REF_PROTECT_CSA);
+               if (ret)
+                       goto out_remove_binding;
+
+               /* Protect the session to make sure we hear the first
+                * beacon on the new channel.
+                */
+               iwl_mvm_protect_session(mvm, vif, duration, duration,
+                                       vif->bss_conf.beacon_int / 2,
+                                       true);
+
+               iwl_mvm_unref(mvm, IWL_MVM_REF_PROTECT_CSA);
+
                iwl_mvm_update_quotas(mvm, NULL);
        }
 
@@ -3256,6 +3275,8 @@ static int iwl_mvm_post_channel_switch(struct ieee80211_hw *hw,
                ret = iwl_mvm_enable_beacon_filter(mvm, vif, 0);
                if (ret)
                        goto out_unlock;
+
+               iwl_mvm_stop_session_protection(mvm, vif);
        }
 
        mvmvif->ps_disabled = false;
index 99a25906bc92e9cb007cd3ca708532c948497b1a..7c62f80414ae41ce370c29944b7dcaca8a79afe8 100644 (file)
@@ -275,6 +275,7 @@ enum iwl_mvm_ref_type {
        IWL_MVM_REF_NMI,
        IWL_MVM_REF_TM_CMD,
        IWL_MVM_REF_EXIT_WORK,
+       IWL_MVM_REF_PROTECT_CSA,
 
        /* update debugfs.c when changing this */
 
This page took 0.029487 seconds and 5 git commands to generate.