diff options
author | Johannes Berg <johannes.berg@intel.com> | 2024-03-11 14:39:46 +0100 |
---|---|---|
committer | iwlwifi publisher <> | 2024-04-17 13:36:20 +0000 |
commit | 4459a7ece898d8acc887264cd1c49196f9a938fe (patch) | |
tree | ea1f5fc1d02dfcbf8a5ae903a75bac7b8ce7467d | |
parent | 731f5e2687561be5010aa0bfdbce0082913eca49 (diff) | |
download | backport-iwlwifi-4459a7ece898d8acc887264cd1c49196f9a938fe.tar.gz |
[BUGFIX] wifi: iwlwifi: mvm: always assign primary_link
The driver is currently setting the primary_link only if it's
actually doing link selection itself. If active links change
via mac80211 debugfs, we may end up with primary_link set to
one that's not even active later. Additionally, activation is
async, so the primary_link is set incorrectly before it runs
or if it fails.
Save the decision logic's primary link and use it when the
link selection result is actually applied; if something else
is applied, just pick arbitrarily.
type=bugfix
fixes=Ia00cf593a7264aaac8faab53ca4628330df7c696
fixes=I5baf0c293c89a5a28bd1a6386bf9ca6d2bf61ab8
ticket=jira:WIFI-393580
Change-Id: Ib218ca98c752004aaf1a994e1252cd82472bf8ab
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Reviewed-on: https://gerritwcs.ir.intel.com/c/iwlwifi-stack-dev/+/98576
tested: iil_jenkins iil_jenkins <EC.GER.UNIX.IIL.JENKINS@INTEL.COM>
Reviewed-by: Miriam Rachel Korenblit <miriam.rachel.korenblit@intel.com>
Reviewed-on: https://gerritwcs.ir.intel.com/c/iwlwifi-stack-dev/+/99152
Reviewed-by: Golan Ben Ami <golan.ben.ami@intel.com>
x-iwlwifi-stack-dev: 6119d719e631d2ff05a1a2c2a17baae808946871
-rw-r--r-- | drivers/net/wireless/intel/iwlwifi/mvm/link.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c | 14 | ||||
-rw-r--r-- | drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 2 | ||||
-rw-r--r-- | versions | 2 |
5 files changed, 21 insertions, 5 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/link.c b/drivers/net/wireless/intel/iwlwifi/mvm/link.c index 9f6da138e8..a25554fc4a 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/link.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/link.c @@ -797,10 +797,8 @@ void iwl_mvm_select_links(struct iwl_mvm *mvm, struct ieee80211_vif *vif) if (!mvmvif->authorized || !ieee80211_vif_is_mld(vif)) return; - if (!IWL_MVM_AUTO_EML_ENABLE) { - mvmvif->primary_link = __ffs(vif->active_links); + if (!IWL_MVM_AUTO_EML_ENABLE) return; - } /* The logic below is a simple version that doesn't suit more than 2 * links @@ -850,8 +848,8 @@ set_active: IWL_DEBUG_INFO(mvm, "Link selection result: 0x%x. Primary = %d\n", new_active_links, primary_link); ieee80211_set_active_links_async(vif, new_active_links); - mvmvif->primary_link = primary_link; mvmvif->link_selection_res = new_active_links; + mvmvif->link_selection_primary = primary_link; } u8 iwl_mvm_get_primary_link(struct ieee80211_vif *vif) diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c index 71c8332b47..f585787cf1 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c @@ -4121,6 +4121,8 @@ iwl_mvm_sta_state_assoc_to_authorized(struct iwl_mvm *mvm, mvmvif->authorized = 1; mvmvif->link_selection_res = vif->active_links; + mvmvif->link_selection_primary = + vif->active_links ? __ffs(vif->active_links) : 0; callbacks->mac_ctxt_changed(mvm, vif, false); iwl_mvm_mei_host_associated(mvm, vif, mvm_sta); diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c index 32d48e1049..cc191231d7 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c @@ -278,6 +278,12 @@ static int iwl_mvm_esr_mode_active(struct iwl_mvm *mvm, link->phy_ctxt->rlc_disabled = true; } + if (vif->active_links == mvmvif->link_selection_res && + !WARN_ON(!(vif->active_links & BIT(mvmvif->link_selection_primary)))) + mvmvif->primary_link = mvmvif->link_selection_primary; + else + mvmvif->primary_link = __ffs(vif->active_links); + /* Needed for tracking RSSI */ iwl_mvm_request_periodic_system_statistics(mvm, true); @@ -1209,6 +1215,14 @@ iwl_mvm_mld_change_vif_links(struct ieee80211_hw *hw, if (new_links == 0) { mvmvif->link[0] = &mvmvif->deflink; err = iwl_mvm_add_link(mvm, vif, &vif->bss_conf); + if (err == 0) + mvmvif->primary_link = 0; + } else if (!(new_links & BIT(mvmvif->primary_link))) { + /* + * Ensure we always have a valid primary_link, the real + * decision happens later when PHY is activated. + */ + mvmvif->primary_link = BIT(__ffs(new_links)); } out_err: diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h index c924037a81..7f304af3fb 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h @@ -435,6 +435,7 @@ struct iwl_mvm_esr_exit { * @link_selection_res: bitmap of active links as it was decided in the last * link selection. Valid only for a MLO vif after assoc. 0 if there wasn't * any link selection yet. + * @link_selection_primary: primary link selected by link selection * @primary_link: primary link in eSR. Valid only for an associated MLD vif, * and in eSR mode. Valid only for a STA. * @last_esr_exit: Details of the last exit from EMLSR. @@ -537,6 +538,7 @@ struct iwl_mvm_vif { u16 max_tx_op; u16 link_selection_res; + u8 link_selection_primary; u8 primary_link; struct iwl_mvm_esr_exit last_esr_exit; u8 exit_same_reason_count; @@ -2,5 +2,5 @@ BACKPORTS_VERSION="(see git)" BACKPORTED_KERNEL_VERSION="(see git)" BACKPORTED_KERNEL_NAME="iwlwifi" BACKPORTS_BUILD_TSTAMP=__DATE__ \" \" __TIME__ -BACKPORTS_GIT_TRACKED="iwlwifi-stack-public:release/core87:12015:49d204b1" +BACKPORTS_GIT_TRACKED="iwlwifi-stack-public:release/core87:12016:6119d719" BACKPORTS_BRANCH_TSTAMP="Apr 17 2024 13:11:40" |