]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: Rename EMLSR delay constants and add EMLMR helpers and definitions
authorPablo Martin-Gomez <pmartin-gomez@freebox.fr>
Fri, 10 Apr 2026 17:04:25 +0000 (19:04 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 28 Apr 2026 07:24:32 +0000 (09:24 +0200)
In the final version of 802.11be-2024, Transition Delay and Padding
Delay subfield are for both EMLSR and EMLMR. Depending if the mode is
EMLSR or EMLMR, the interpretation of the encoded value might change.

Define all the constants and helpers to interpret delay subfields both
in EMLSR and EMLMR mode.

Signed-off-by: Pablo Martin-Gomez <pmartin-gomez@freebox.fr>
Link: https://patch.msgid.link/20260410170429.343617-4-pmartin-gomez@freebox.fr
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mld/mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
drivers/net/wireless/realtek/rtw89/fw.c
include/linux/ieee80211-eht.h
net/mac80211/eht.c

index da6fd74715688f9743a26e226894369516a2a8d8..b48ebec18dd595889763d19617019287f75b57bb 100644 (file)
@@ -114,10 +114,10 @@ static const u8 ext_capa_base[IWL_MLD_STA_EXT_CAPA_SIZE] = {
 };
 
 #define IWL_MLD_EMLSR_CAPA     (IEEE80211_EML_CAP_EMLSR_SUPP | \
-                                IEEE80211_EML_CAP_EMLSR_PADDING_DELAY_32US << \
-                                       __bf_shf(IEEE80211_EML_CAP_EMLSR_PADDING_DELAY) | \
+                                IEEE80211_EML_CAP_EML_PADDING_DELAY_32US << \
+                                       __bf_shf(IEEE80211_EML_CAP_EML_PADDING_DELAY) | \
                                 IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY_64US << \
-                                       __bf_shf(IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY))
+                                       __bf_shf(IEEE80211_EML_CAP_EML_TRANSITION_DELAY))
 #define IWL_MLD_CAPA_OPS (FIELD_PREP_CONST( \
                        IEEE80211_MLD_CAP_OP_TID_TO_LINK_MAP_NEG_SUPP, \
                        IEEE80211_MLD_CAP_OP_TID_TO_LINK_MAP_NEG_SUPP_SAME) | \
index 1ec9807e48272b9e62c70992ee9d610552d2919c..214e6d10081b13bf4a9b23ef613809746660bd2e 100644 (file)
@@ -263,10 +263,10 @@ static const u8 tm_if_types_ext_capa_sta[] = {
  */
 
 #define IWL_MVM_EMLSR_CAPA     (IEEE80211_EML_CAP_EMLSR_SUPP | \
-                                IEEE80211_EML_CAP_EMLSR_PADDING_DELAY_32US << \
-                                       __bf_shf(IEEE80211_EML_CAP_EMLSR_PADDING_DELAY) | \
+                                IEEE80211_EML_CAP_EML_PADDING_DELAY_32US << \
+                                       __bf_shf(IEEE80211_EML_CAP_EML_PADDING_DELAY) | \
                                 IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY_64US << \
-                                       __bf_shf(IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY))
+                                       __bf_shf(IEEE80211_EML_CAP_EML_TRANSITION_DELAY))
 #define IWL_MVM_MLD_CAPA_OPS (FIELD_PREP_CONST( \
                        IEEE80211_MLD_CAP_OP_TID_TO_LINK_MAP_NEG_SUPP, \
                        IEEE80211_MLD_CAP_OP_TID_TO_LINK_MAP_NEG_SUPP_SAME) | \
index 37cdf3e8a06706d4b66afb23c4af752dffc6a0da..22bad3cba8dfe319ec12cce437413116db28c40d 100644 (file)
@@ -1880,8 +1880,8 @@ mt7925_mcu_sta_eht_mld_tlv(struct sk_buff *skb,
 
        eml_cap = (vif->cfg.eml_cap & (IEEE80211_EML_CAP_EMLSR_SUPP |
                                       IEEE80211_EML_CAP_TRANSITION_TIMEOUT)) |
-                 (ext_capa->eml_capabilities & (IEEE80211_EML_CAP_EMLSR_PADDING_DELAY |
-                                               IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY));
+                 (ext_capa->eml_capabilities & (IEEE80211_EML_CAP_EML_PADDING_DELAY |
+                                               IEEE80211_EML_CAP_EML_TRANSITION_DELAY));
 
        if (eml_cap & IEEE80211_EML_CAP_EMLSR_SUPP) {
                eht_mld->eml_cap[0] = u16_get_bits(eml_cap, GENMASK(7, 0));
index 17704f054727a9540921b0b885c45fc8646d2084..ffa04315a62b62e88eedeb96239fddaa318722df 100644 (file)
@@ -5050,7 +5050,7 @@ int rtw89_fw_h2c_join_info(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwv
                     le32_encode_bits(0, RTW89_H2C_JOININFO_W1_EMLSR_CAB) |
                     le32_encode_bits(0, RTW89_H2C_JOININFO_W1_NSTR_EN) |
                     le32_encode_bits(init_ps, RTW89_H2C_JOININFO_W1_INIT_PWR_STATE) |
-                    le32_encode_bits(IEEE80211_EML_CAP_EMLSR_PADDING_DELAY_256US,
+                    le32_encode_bits(IEEE80211_EML_CAP_EML_PADDING_DELAY_256US,
                                      RTW89_H2C_JOININFO_W1_EMLSR_PADDING) |
                     le32_encode_bits(IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY_256US,
                                      RTW89_H2C_JOININFO_W1_EMLSR_TRANS_DELAY) |
index 6324d888073b3ce1f496da129e681583154db1ae..e24f95db608747a7f76bcb79d0ccde21fa7595ac 100644 (file)
@@ -485,19 +485,27 @@ struct ieee80211_multi_link_elem {
 #define IEEE80211_MED_SYNC_DELAY_DEFAULT               0x10ac
 
 #define IEEE80211_EML_CAP_EMLSR_SUPP                   0x0001
-#define IEEE80211_EML_CAP_EMLSR_PADDING_DELAY          0x000e
-#define  IEEE80211_EML_CAP_EMLSR_PADDING_DELAY_0US             0
-#define  IEEE80211_EML_CAP_EMLSR_PADDING_DELAY_32US            1
-#define  IEEE80211_EML_CAP_EMLSR_PADDING_DELAY_64US            2
-#define  IEEE80211_EML_CAP_EMLSR_PADDING_DELAY_128US           3
-#define  IEEE80211_EML_CAP_EMLSR_PADDING_DELAY_256US           4
-#define IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY       0x0070
+#define IEEE80211_EML_CAP_EML_PADDING_DELAY            0x000e
+/* Described Tables 9-417i & 9-417k in 802.11be-2024, which have the same values */
+#define  IEEE80211_EML_CAP_EML_PADDING_DELAY_0US               0
+#define  IEEE80211_EML_CAP_EML_PADDING_DELAY_32US              1
+#define  IEEE80211_EML_CAP_EML_PADDING_DELAY_64US              2
+#define  IEEE80211_EML_CAP_EML_PADDING_DELAY_128US             3
+#define  IEEE80211_EML_CAP_EML_PADDING_DELAY_256US             4
+#define IEEE80211_EML_CAP_EML_TRANSITION_DELAY 0x0070
+/* Described in Table 9-417j in 802.11be-2024 */
 #define  IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY_0US          0
 #define  IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY_16US         1
 #define  IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY_32US         2
 #define  IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY_64US         3
 #define  IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY_128US                4
 #define  IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY_256US                5
+/* Described in Table 9-417l in 802.11be-2024 */
+#define  IEEE80211_EML_CAP_EMLMR_TRANSITION_DELAY_0US          0
+#define  IEEE80211_EML_CAP_EMLMR_TRANSITION_DELAY_32US         1
+#define  IEEE80211_EML_CAP_EMLMR_TRANSITION_DELAY_64US         2
+#define  IEEE80211_EML_CAP_EMLMR_TRANSITION_DELAY_128US                3
+#define  IEEE80211_EML_CAP_EMLMR_TRANSITION_DELAY_256US                4
 #define IEEE80211_EML_CAP_EMLMR_SUPPORT                        0x0080
 #define IEEE80211_EML_CAP_TRANSITION_TIMEOUT           0x7800
 #define  IEEE80211_EML_CAP_TRANSITION_TIMEOUT_0                        0
@@ -1114,14 +1122,20 @@ static inline bool ieee80211_tid_to_link_map_size_ok(const u8 *data, size_t len)
 
 static inline u32 ieee80211_emlsr_pad_delay_in_us(u16 eml_cap)
 {
+       u32 emlsr_supp =
+               u16_get_bits(eml_cap, IEEE80211_EML_CAP_EMLSR_SUPP);
+
+       if (!emlsr_supp)
+               return 0;
+
        /* IEEE Std 802.11be-2024 Table 9-417i—Encoding of the EMLSR
         * Padding Delay subfield.
         */
        u32 pad_delay = u16_get_bits(eml_cap,
-                                    IEEE80211_EML_CAP_EMLSR_PADDING_DELAY);
+                                    IEEE80211_EML_CAP_EML_PADDING_DELAY);
 
        if (!pad_delay ||
-           pad_delay > IEEE80211_EML_CAP_EMLSR_PADDING_DELAY_256US)
+           pad_delay > IEEE80211_EML_CAP_EML_PADDING_DELAY_256US)
                return 0;
 
        return 32 * (1 << (pad_delay - 1));
@@ -1138,12 +1152,18 @@ static inline u32 ieee80211_emlsr_pad_delay_in_us(u16 eml_cap)
 
 static inline u32 ieee80211_emlsr_trans_delay_in_us(u16 eml_cap)
 {
+       u32 emlsr_supp =
+               u16_get_bits(eml_cap, IEEE80211_EML_CAP_EMLSR_SUPP);
+
+       if (!emlsr_supp)
+               return 0;
+
        /* IEEE Std 802.11be-2024 Table 9-417j—Encoding of the EMLSR
         * Transition Delay subfield.
         */
        u32 trans_delay =
                u16_get_bits(eml_cap,
-                            IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY);
+                            IEEE80211_EML_CAP_EML_TRANSITION_DELAY);
 
        /* invalid values also just use 0 */
        if (!trans_delay ||
@@ -1153,6 +1173,68 @@ static inline u32 ieee80211_emlsr_trans_delay_in_us(u16 eml_cap)
        return 16 * (1 << (trans_delay - 1));
 }
 
+/**
+ * ieee80211_emlmr_pad_delay_in_us - Fetch the EMLMR Padding delay
+ *     in microseconds
+ * @eml_cap: EML capabilities field value from common info field of
+ *     the Multi-link element
+ * Return: the EMLMR Padding delay (in microseconds) encoded in the
+ *     EML Capabilities field
+ */
+
+static inline u32 ieee80211_emlmr_pad_delay_in_us(u16 eml_cap)
+{
+       u32 emlmr_supp =
+               u16_get_bits(eml_cap, IEEE80211_EML_CAP_EMLMR_SUPPORT);
+
+       if (!emlmr_supp)
+               return 0;
+
+       /* IEEE Std 802.11be-2024 Table 9-417k—Encoding of the EMLMR
+        * Padding Delay subfield.
+        */
+       u32 pad_delay = u16_get_bits(eml_cap,
+                                    IEEE80211_EML_CAP_EML_PADDING_DELAY);
+
+       if (!pad_delay ||
+           pad_delay > IEEE80211_EML_CAP_EML_PADDING_DELAY_256US)
+               return 0;
+
+       return 32 * (1 << (pad_delay - 1));
+}
+
+/**
+ * ieee80211_emlmr_trans_delay_in_us - Fetch the EMLMR Transition
+ *     delay in microseconds
+ * @eml_cap: EML capabilities field value from common info field of
+ *     the Multi-link element
+ * Return: the EMLMR Transition delay (in microseconds) encoded in the
+ *     EML Capabilities field
+ */
+
+static inline u32 ieee80211_emlmr_trans_delay_in_us(u16 eml_cap)
+{
+       u32 emlmr_supp =
+               u16_get_bits(eml_cap, IEEE80211_EML_CAP_EMLMR_SUPPORT);
+
+       if (!emlmr_supp)
+               return 0;
+
+       /* IEEE Std 802.11be-2024 Table 9-417l—Encoding of the EMLMR
+        * Transition Delay subfield.
+        */
+       u32 trans_delay =
+               u16_get_bits(eml_cap,
+                            IEEE80211_EML_CAP_EML_TRANSITION_DELAY);
+
+       /* invalid values also just use 0 */
+       if (!trans_delay ||
+           trans_delay > IEEE80211_EML_CAP_EMLMR_TRANSITION_DELAY_256US)
+               return 0;
+
+       return 32 * (1 << (trans_delay - 1));
+}
+
 /**
  * ieee80211_eml_trans_timeout_in_us - Fetch the EMLSR Transition
  *     timeout value in microseconds
index 768bfc4e737d3ac15d9c530b5ad38ddfbd067b23..e88f28edfd57d536f77c37e4d1b706483a9b0d5e 100644 (file)
@@ -204,7 +204,7 @@ void ieee80211_rx_eml_op_mode_notif(struct ieee80211_sub_if_data *sdata,
                        pad_delay = u8_get_bits(ptr[2],
                                                IEEE80211_EML_EMLSR_PAD_DELAY);
                        if (pad_delay >
-                           IEEE80211_EML_CAP_EMLSR_PADDING_DELAY_256US)
+                           IEEE80211_EML_CAP_EML_PADDING_DELAY_256US)
                                return;
 
                        trans_delay = u8_get_bits(ptr[2],
@@ -217,11 +217,11 @@ void ieee80211_rx_eml_op_mode_notif(struct ieee80211_sub_if_data *sdata,
                        sta->sta.eml_cap =
                                u8_replace_bits(sta->sta.eml_cap,
                                                pad_delay,
-                                               IEEE80211_EML_CAP_EMLSR_PADDING_DELAY);
+                                               IEEE80211_EML_CAP_EML_PADDING_DELAY);
                        sta->sta.eml_cap =
                                u8_replace_bits(sta->sta.eml_cap,
                                                trans_delay,
-                                               IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY);
+                                               IEEE80211_EML_CAP_EML_TRANSITION_DELAY);
                }
        }