]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: iwlwifi: w/a FW SMPS mode selection
authorDaniel Gabay <daniel.gabay@intel.com>
Sat, 8 Mar 2025 21:19:19 +0000 (23:19 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 11 Mar 2025 09:54:01 +0000 (10:54 +0100)
The FW is now responsible of determining the SMPS mode.
If the user disabled power save in a certain vif, we send the vif-level
power command to clear out the POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK bit
for that vif.
But erroneously, the FW checks DEVICE_POWER_FLAGS_POWER_SAVE_ENA_MSK in
the device-level command to determine the SMPS mode.

To W/A this, send also the device-level command when the power save of a
vif changes, and disable power save if there is any vif that has power
save disabled.

Signed-off-by: Daniel Gabay <daniel.gabay@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250308231427.7bf205efa027.I2c793ff1fc2a6779a95faaee1ded348100fd97f1@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h

index 20aaef913e3f1129ef2115b3b936283716165d64..1e916a0ce0824cf7eff1103a661ca0c15fd10eeb 100644 (file)
@@ -4100,6 +4100,20 @@ iwl_mvm_sta_state_authorized_to_assoc(struct iwl_mvm *mvm,
        return 0;
 }
 
+void iwl_mvm_smps_workaround(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
+                            bool update)
+{
+       struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
+
+       if (!iwl_mvm_has_rlc_offload(mvm))
+               return;
+
+       mvmvif->ps_disabled = !vif->cfg.ps;
+
+       if (update)
+               iwl_mvm_power_update_mac(mvm);
+}
+
 /* Common part for MLD and non-MLD modes */
 int iwl_mvm_mac_sta_state_common(struct ieee80211_hw *hw,
                                 struct ieee80211_vif *vif,
@@ -4192,6 +4206,7 @@ int iwl_mvm_mac_sta_state_common(struct ieee80211_hw *hw,
                   new_state == IEEE80211_STA_AUTHORIZED) {
                ret = iwl_mvm_sta_state_assoc_to_authorized(mvm, vif, sta,
                                                            callbacks);
+               iwl_mvm_smps_workaround(mvm, vif, true);
        } else if (old_state == IEEE80211_STA_AUTHORIZED &&
                   new_state == IEEE80211_STA_ASSOC) {
                ret = iwl_mvm_sta_state_authorized_to_assoc(mvm, vif, sta,
index 341a2a7a49ec9be7f58801e7d75fd18db050ad72..78d7153a0cfca00969a747e251b16c38d74756bd 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
 /*
- * Copyright (C) 2022-2024 Intel Corporation
+ * Copyright (C) 2022-2025 Intel Corporation
  */
 #include "mvm.h"
 
@@ -887,6 +887,7 @@ static void iwl_mvm_mld_vif_cfg_changed_station(struct iwl_mvm *mvm,
        }
 
        if (changes & BSS_CHANGED_PS) {
+               iwl_mvm_smps_workaround(mvm, vif, false);
                ret = iwl_mvm_power_update_mac(mvm);
                if (ret)
                        IWL_ERR(mvm, "failed to update power mode\n");
index b6e0b63cbd3c17332189565364bae71cd5f98c8c..f6391c7a3e29693646c3ae2213116a2d15762ff6 100644 (file)
@@ -3031,4 +3031,7 @@ iwl_mvm_send_ap_tx_power_constraint_cmd(struct iwl_mvm *mvm,
                                        struct ieee80211_vif *vif,
                                        struct ieee80211_bss_conf *bss_conf,
                                        bool is_ap);
+
+void iwl_mvm_smps_workaround(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
+                            bool update);
 #endif /* __IWL_MVM_H__ */