mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
wifi: Rename EMLSR delay constants and add EMLMR helpers and definitions
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>
This commit is contained in:
parent
53f24921d8
commit
5858f5e158
|
|
@ -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) | \
|
||||
|
|
|
|||
|
|
@ -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) | \
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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) |
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user