]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: iwlwifi: mld: add an helper to update an EMLSR blocker
authorMiri Korenblit <miriam.rachel.korenblit@intel.com>
Sun, 11 Jan 2026 17:39:15 +0000 (19:39 +0200)
committerMiri Korenblit <miriam.rachel.korenblit@intel.com>
Wed, 21 Jan 2026 12:23:02 +0000 (14:23 +0200)
Add an helper function that iterates over all (relevant) interfaces and
sets/unsets a given EMLSR blocker.
For now use it only for IWL_MLD_EMLSR_BLOCKED_NON_BSS.

Reviewed-by: Ilan Peer <ilan.peer@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20260111193638.f87b347a5cf0.I6836ba40d21cca49401d1f88e03a37b00dd9f5c2@changeid
drivers/net/wireless/intel/iwlwifi/mld/mlo.c

index 1efefc737248f7202217d7b85d98561d716329e5..87f67ddfced479efc8dfdafb400ada2bbee94cc7 100644 (file)
@@ -451,29 +451,49 @@ static void iwl_mld_count_non_bss_links(void *_data, u8 *mac,
 
 struct iwl_mld_update_emlsr_block_data {
        bool block;
+       enum iwl_mld_emlsr_blocked reason;
        int result;
 };
 
 static void
-iwl_mld_vif_iter_update_emlsr_non_bss_block(void *_data, u8 *mac,
-                                           struct ieee80211_vif *vif)
+iwl_mld_vif_iter_update_emlsr_block(void *_data, u8 *mac,
+                                   struct ieee80211_vif *vif)
 {
        struct iwl_mld_update_emlsr_block_data *data = _data;
        struct iwl_mld_vif *mld_vif = iwl_mld_vif_from_mac80211(vif);
        int ret;
 
+       if (!iwl_mld_vif_has_emlsr_cap(vif))
+               return;
+
        if (data->block) {
                ret = iwl_mld_block_emlsr_sync(mld_vif->mld, vif,
-                                              IWL_MLD_EMLSR_BLOCKED_NON_BSS,
+                                              data->reason,
                                               iwl_mld_get_primary_link(vif));
                if (ret)
                        data->result = ret;
        } else {
                iwl_mld_unblock_emlsr(mld_vif->mld, vif,
-                                     IWL_MLD_EMLSR_BLOCKED_NON_BSS);
+                                     data->reason);
        }
 }
 
+static int iwl_mld_update_emlsr_block(struct iwl_mld *mld, bool block,
+                                     enum iwl_mld_emlsr_blocked reason)
+{
+       struct iwl_mld_update_emlsr_block_data block_data = {
+               .block = block,
+               .reason = reason,
+       };
+
+       ieee80211_iterate_active_interfaces_mtx(mld->hw,
+                                               IEEE80211_IFACE_ITER_NORMAL,
+                                               iwl_mld_vif_iter_update_emlsr_block,
+                                               &block_data);
+
+       return block_data.result;
+}
+
 int iwl_mld_emlsr_check_non_bss_block(struct iwl_mld *mld,
                                      int pending_link_changes)
 {
@@ -481,7 +501,6 @@ int iwl_mld_emlsr_check_non_bss_block(struct iwl_mld *mld,
         * block EMLSR on the bss vif. Upon deactivation, check if this link
         * was the last non-station link active, and if so unblock the bss vif
         */
-       struct iwl_mld_update_emlsr_block_data block_data = {};
        int count = pending_link_changes;
 
        /* No need to count if we are activating a non-BSS link */
@@ -495,14 +514,8 @@ int iwl_mld_emlsr_check_non_bss_block(struct iwl_mld *mld,
         * We could skip updating it if the block change did not change (and
         * pending_link_changes is non-zero).
         */
-       block_data.block = !!count;
-
-       ieee80211_iterate_active_interfaces_mtx(mld->hw,
-                                               IEEE80211_IFACE_ITER_NORMAL,
-                                               iwl_mld_vif_iter_update_emlsr_non_bss_block,
-                                               &block_data);
-
-       return block_data.result;
+       return iwl_mld_update_emlsr_block(mld, !!count,
+                                         IWL_MLD_EMLSR_BLOCKED_NON_BSS);
 }
 
 #define EMLSR_SEC_LINK_MIN_PERC 10