summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2024-03-11 14:39:46 +0100
committeriwlwifi publisher <>2024-04-17 13:36:20 +0000
commit4459a7ece898d8acc887264cd1c49196f9a938fe (patch)
treeea1f5fc1d02dfcbf8a5ae903a75bac7b8ce7467d
parent731f5e2687561be5010aa0bfdbce0082913eca49 (diff)
downloadbackport-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.c6
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c2
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c14
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/mvm.h2
-rw-r--r--versions2
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;
diff --git a/versions b/versions
index fd971cddc4..b75e89a556 100644
--- a/versions
+++ b/versions
@@ -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"