iwlwifi: mvm: re-enable ps when monitor interfaces are removed
authorLuciano Coelho <luciano.coelho@intel.com>
Fri, 8 Aug 2014 14:12:07 +0000 (17:12 +0300)
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Wed, 3 Sep 2014 19:48:57 +0000 (22:48 +0300)
If a monitor interface is added and then removed, we don't reset the
mvm->ps_disabled flag, so we never re-enable power saving.  Fix that
and rearrange the code a bit.

Additionally, fix a small indentation mistake in the
iwl_mvm_power_set_pm() function declaration.

Signed-off-by: Luciano Coelho <luciano.coelho@intel.com>
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
drivers/net/wireless/iwlwifi/mvm/mac80211.c
drivers/net/wireless/iwlwifi/mvm/power.c

index de4ae94f07e023376bdecf01fcf0421bca561f4f..531540c54efb9370a5fac44805b1eb8961f980eb 100644 (file)
@@ -776,6 +776,7 @@ static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm)
        iwl_trans_stop_device(mvm->trans);
 
        mvm->scan_status = IWL_MVM_SCAN_NONE;
+       mvm->ps_disabled = false;
 
        /* just in case one was running */
        ieee80211_remain_on_channel_expired(mvm->hw);
index 8cbe7ea01a6995a4def19493a0737054636e418d..754f2b3eae649f3e87ccc6062ac399d2785333db 100644 (file)
@@ -566,9 +566,8 @@ static void iwl_mvm_power_iterator(void *_data, u8 *mac,
        }
 }
 
-static void
-iwl_mvm_power_set_pm(struct iwl_mvm *mvm,
-                                   struct iwl_power_vifs *vifs)
+static void iwl_mvm_power_set_pm(struct iwl_mvm *mvm,
+                                struct iwl_power_vifs *vifs)
 {
        struct iwl_mvm_vif *bss_mvmvif = NULL;
        struct iwl_mvm_vif *p2p_mvmvif = NULL;
@@ -830,7 +829,7 @@ int iwl_mvm_power_update_mac(struct iwl_mvm *mvm)
        struct iwl_power_vifs vifs = {
                .mvm = mvm,
        };
-       bool ba_enable;
+       bool ba_enable, disable_ps;
        int ret;
 
        lockdep_assert_held(&mvm->mutex);
@@ -838,16 +837,19 @@ int iwl_mvm_power_update_mac(struct iwl_mvm *mvm)
        iwl_mvm_power_set_pm(mvm, &vifs);
 
        /* disable PS if CAM */
-       if (iwlmvm_mod_params.power_scheme == IWL_POWER_SCHEME_CAM) {
-               mvm->ps_disabled = true;
-       } else {
-       /* don't update device power state unless we add / remove monitor */
-               if (vifs.monitor_vif) {
-                       if (vifs.monitor_active)
-                               mvm->ps_disabled = true;
-                       ret = iwl_mvm_power_update_device(mvm);
-                       if (ret)
-                               return ret;
+       disable_ps = (iwlmvm_mod_params.power_scheme == IWL_POWER_SCHEME_CAM);
+       /* ...or if there is an active monitor vif */
+       disable_ps |= (vifs.monitor_vif && vifs.monitor_active);
+
+       /* update device power state if it has changed */
+       if (mvm->ps_disabled != disable_ps) {
+               bool old_ps_disabled = mvm->ps_disabled;
+
+               mvm->ps_disabled = disable_ps;
+               ret = iwl_mvm_power_update_device(mvm);
+               if (ret) {
+                       mvm->ps_disabled = old_ps_disabled;
+                       return ret;
                }
        }