Wi-Fi Alliance Certificate WFA129313 (RTL8922AE 802.11be and Bluetooth combo module, 2024-05-23, FW 6102.24.109.0) certifies EMLSR (Enhanced Multilink Single-Radio) and STR (Simultaneous Transmit and Receive) for this chip. The driver currently sets eml_capabilities = 0 and mld_capa_and_ops = 0 in the Station iftype-ext-cap, which prevents the AP from negotiating EMLSR mode with this STA — multi-link association either falls back to MLSR (single-link) or fails entirely. Populate eml_capabilities with IEEE80211_EML_CAP_EMLSR_SUPP plus EML padding delay (256 us, IEEE80211_EML_CAP_EML_PADDING_DELAY_256US since commit 5858f5e1588f ("wifi: Rename EMLSR delay constants and add EMLMR helpers and definitions")) and EMLSR transition delay (32 us) to match the EMLSR negotiation parameters Realtek's certified silicon supports. mld_capa_and_ops is left at 0 (= MAX_SIMUL_LINKS field 0 = "1 max simultaneous link"), consistent with the EMLSR-only operating mode the driver implements per enum rtw89_mlo_mode {MLSR, EMLSR} (no STR mode in the driver despite WFA-cert silicon support). Also add IEEE80211_EHT_MAC_CAP0_RESTRICTED_TWT to mac_cap_info[0]. The RTL8922A EHT MAC supports R-TWT for latency-sensitive scheduling; the cap bit was hard-zeroed alongside the other EHT mac/phy caps in rtw89_init_eht_cap(). Tested on RTL8922AU (USB variant, same MAC + RF as cert'd PCIe AE) against TP-Link Deco BE63 mesh: dual-link MLO assoc works (active_links = 0x4 confirms expected EMLSR mode, Link 2 / 6 GHz active), 60h+ stable association, 11/11 wifi-health-check probes pass, no kernel warnings or wpa_supplicant errors. Note on EMLMR (EML Cap bit 7, IEEE80211_EML_CAP_EMLMR_SUPPORT): not advertised. The WFA cert does NOT list EMLMR for this chip. RTL8922A has rf_path_num=2 (single 2T2R RF block shared across 2.4, 5, 6 GHz), and the driver has no EMLMR enum, firmware H2C path, or PHY register block. EMLSR is the architectural ceiling for this silicon. Link: https://api.cert.wi-fi.org/api/certificate/download/public?variantId=129706 [WFA cert WFA129313] Signed-off-by: Louis Kotze --- drivers/net/wireless/realtek/rtw89/core.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c index 70feab97dccb..056639db1dfa 100644 --- a/drivers/net/wireless/realtek/rtw89/core.c +++ b/drivers/net/wireless/realtek/rtw89/core.c @@ -217,7 +217,10 @@ static const struct wiphy_iftype_ext_capab rtw89_iftypes_ext_capa[] = { .extended_capabilities_mask = rtw89_ext_capa_sta, .extended_capabilities_len = sizeof(rtw89_ext_capa_sta), /* relevant only if EHT is supported */ - .eml_capabilities = 0, + .eml_capabilities = + IEEE80211_EML_CAP_EMLSR_SUPP | + (IEEE80211_EML_CAP_EML_PADDING_DELAY_256US << 1) | + (IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY_32US << 4), .mld_capa_and_ops = 0, }, }; @@ -5557,7 +5560,8 @@ static void rtw89_init_eht_cap(struct rtw89_dev *rtwdev, eht_cap_elem->mac_cap_info[0] = u8_encode_bits(chip->max_eht_mpdu_cap, - IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_MASK); + IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_MASK) | + IEEE80211_EHT_MAC_CAP0_RESTRICTED_TWT; eht_cap_elem->mac_cap_info[1] = 0; eht_cap_elem->phy_cap_info[0] = -- 2.54.0