]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: iwlwifi: mld: don't exit EMLSR when we shouldn't
authorMiri Korenblit <miriam.rachel.korenblit@intel.com>
Thu, 12 Jun 2025 11:48:57 +0000 (14:48 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 20 Aug 2025 16:41:15 +0000 (18:41 +0200)
[ Upstream commit 0cdb8ff6ebbac55f38933f4621215784887b400e ]

There is a requirement to exit EMLSR if there wasn't enough throughput
in the secondary link.
This is checked in check_tpt_wk, which runs every 5 seconds in a high
throughput scenario (when the throughput blocker isn't set)

It can happen that this worker is running immediately after we entered
EMLSR, and in that case the secondary link didn't have a chance to have
throughput. In that case we will exit EMLSR for no good reason.

Fix this by tracking the time we entered EMLSR, and in the worker make
sure that 5 seconds passed from when we entered EMLSR. If not, don't
check the secondary link throughput.

Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250612144708.c680f8d7dc37.I8a02d1e8d99df3789da8d5714f19b31a865a61ff@changeid
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/intel/iwlwifi/mld/iface.h
drivers/net/wireless/intel/iwlwifi/mld/mac80211.c
drivers/net/wireless/intel/iwlwifi/mld/mlo.c

index 49e2ce65557d6e5dde2df82ae0ca7b7ede09820f..f64d0dcbb178946a234f0e4ab86e5d0295f458d2 100644 (file)
@@ -87,6 +87,8 @@ enum iwl_mld_emlsr_exit {
  * @last_exit_reason: Reason for the last EMLSR exit
  * @last_exit_ts: Time of the last EMLSR exit (if @last_exit_reason is non-zero)
  * @exit_repeat_count: Number of times EMLSR was exited for the same reason
+ * @last_entry_ts: the time of the last EMLSR entry (if iwl_mld_emlsr_active()
+ *     is true)
  * @unblock_tpt_wk: Unblock EMLSR because the throughput limit was reached
  * @check_tpt_wk: a worker to check if IWL_MLD_EMLSR_BLOCKED_TPT should be
  *     added, for example if there is no longer enough traffic.
@@ -105,6 +107,7 @@ struct iwl_mld_emlsr {
                enum iwl_mld_emlsr_exit last_exit_reason;
                unsigned long last_exit_ts;
                u8 exit_repeat_count;
+               unsigned long last_entry_ts;
        );
 
        struct wiphy_work unblock_tpt_wk;
index 4ba050397632aa273840d13d4570d1534e734f16..c1e56c4010da16c6dcad0335a52275a9c7af8cde 100644 (file)
@@ -1002,6 +1002,7 @@ int iwl_mld_assign_vif_chanctx(struct ieee80211_hw *hw,
 
                /* Indicate to mac80211 that EML is enabled */
                vif->driver_flags |= IEEE80211_VIF_EML_ACTIVE;
+               mld_vif->emlsr.last_entry_ts = jiffies;
 
                if (vif->active_links & BIT(mld_vif->emlsr.selected_links))
                        mld_vif->emlsr.primary = mld_vif->emlsr.selected_primary;
index dba5379ed0090c7ba4fcce4cc767a66c1ecbb969..d71259ce1db171fdea3237885c3984590f136ca7 100644 (file)
@@ -530,10 +530,12 @@ void iwl_mld_emlsr_check_tpt(struct wiphy *wiphy, struct wiphy_work *wk)
        /*
         * TPT is unblocked, need to check if the TPT criteria is still met.
         *
-        * If EMLSR is active, then we also need to check the secondar link
-        * requirements.
+        * If EMLSR is active for at least 5 seconds, then we also
+        * need to check the secondary link requirements.
         */
-       if (iwl_mld_emlsr_active(vif)) {
+       if (iwl_mld_emlsr_active(vif) &&
+           time_is_before_jiffies(mld_vif->emlsr.last_entry_ts +
+                                  IWL_MLD_TPT_COUNT_WINDOW)) {
                sec_link_id = iwl_mld_get_other_link(vif, iwl_mld_get_primary_link(vif));
                sec_link = iwl_mld_link_dereference_check(mld_vif, sec_link_id);
                if (WARN_ON_ONCE(!sec_link))