]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: iwlwifi: mld: skip MLO scan trigger when AP has no QBSS Load IE
authorAvinash Bhatt <avinash.bhatt@intel.com>
Sun, 17 May 2026 07:59:48 +0000 (10:59 +0300)
committerMiri Korenblit <miriam.rachel.korenblit@intel.com>
Tue, 26 May 2026 12:17:13 +0000 (15:17 +0300)
When FW PHY statistics report high channel load (MCLM), the driver
triggers an internal MLO scan to find a better link. However, link grade
computation uses the QBSS Load IE from AP beacons, not MCLM data. If
the AP does not broadcast a QBSS Load IE, the scan produces no benefit
as the grade falls back to static band defaults regardless, and the same
bad link will be selected anyway as the active link.

Skip the MLO scan trigger when the AP does not advertise a QBSS Load IE.

Signed-off-by: Avinash Bhatt <avinash.bhatt@intel.com>
Link: https://patch.msgid.link/20260517100550.621538e20244.I7fdccb759508f32991cc06774cc7621725a58bd3@changeid
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
drivers/net/wireless/intel/iwlwifi/mld/link.c
drivers/net/wireless/intel/iwlwifi/mld/link.h
drivers/net/wireless/intel/iwlwifi/mld/mlo.c

index e5e9b7089c146c059d56b70635546e98d5dc52b7..549f1c1ea22f386c9d58774b46a749366844398c 100644 (file)
@@ -859,9 +859,8 @@ iwl_mld_apply_puncturing_penalty(const struct ieee80211_bss_conf *link_conf,
        *grade = *grade * (n_subchannels - n_punctured) / n_subchannels;
 }
 
-static int
-iwl_mld_get_chan_load_from_element(struct iwl_mld *mld,
-                                  struct ieee80211_bss_conf *link_conf)
+int iwl_mld_get_chan_load_from_element(struct iwl_mld *mld,
+                                      struct ieee80211_bss_conf *link_conf)
 {
        const struct cfg80211_bss_ies *ies;
        const struct element *bss_load_elem = NULL;
index 0b3974d86531aef80d4a13de39dd6c2a1bb9e9d8..f1997e2800584166409a617c1f72b26004bfaa85 100644 (file)
@@ -145,6 +145,9 @@ unsigned int iwl_mld_get_link_grade(struct iwl_mld *mld,
 unsigned int iwl_mld_get_chan_load(struct iwl_mld *mld,
                                   struct ieee80211_bss_conf *link_conf);
 
+int iwl_mld_get_chan_load_from_element(struct iwl_mld *mld,
+                                      struct ieee80211_bss_conf *link_conf);
+
 int iwl_mld_get_chan_load_by_others(struct iwl_mld *mld,
                                    struct ieee80211_bss_conf *link_conf,
                                    bool expect_active_link);
index 2a3b2c883fc4adbd107676bdabc0147b29bd5cf7..a2f8a69575350308d59c1720ddd185a8cab2b611 100644 (file)
@@ -1100,6 +1100,13 @@ static void iwl_mld_chan_load_update_iter(void *_data, u8 *mac,
                if (rcu_access_pointer(link_conf->chanctx_conf) != chanctx)
                        continue;
 
+               /* No QBSS IE - links will be selected based on default channel
+                * load values, so the same link will be selected again.
+                * No point in scan.
+                */
+               if (iwl_mld_get_chan_load_from_element(mld, link_conf) < 0)
+                       continue;
+
                if (iwl_mld_chan_load_requires_scan(mld,
                                                    link_conf,
                                                    new_chan_load)) {