mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 18:43:33 +02:00
wifi: iwlwifi: w/a FW SMPS mode selection
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>
This commit is contained in:
parent
eb29b4ffaf
commit
b2e709805c
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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__ */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user