]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: rtw89: set force HE TB mode when connecting to 11ax AP
authorDian-Syuan Yang <dian_syuan0116@realtek.com>
Thu, 6 Mar 2025 02:11:44 +0000 (10:11 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 29 May 2025 09:12:45 +0000 (11:12 +0200)
[ Upstream commit a9b56f219a0fa550f92e65ac58443a7892380e09 ]

Some of 11ax AP set the UL HE-SIG-A2 reserved subfield to all 0s, which
will cause the 11be chip to recognize trigger frame as EHT. We propose
a method to bypass the "UL HE-SIG-A2 reserved subfield" and always uses
HE TB in response to the AP's trigger frame.

Signed-off-by: Dian-Syuan Yang <dian_syuan0116@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20250306021144.12854-6-pkshih@realtek.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/realtek/rtw89/mac.c
drivers/net/wireless/realtek/rtw89/mac.h
drivers/net/wireless/realtek/rtw89/mac80211.c
drivers/net/wireless/realtek/rtw89/reg.h

index a37c6d525d6f0a895a0ad5095648f18075de6cf5..2c74d7781bd405e9faea83e135914916e1711025 100644 (file)
@@ -4826,6 +4826,32 @@ void rtw89_mac_set_he_obss_narrow_bw_ru(struct rtw89_dev *rtwdev,
                rtw89_write32_set(rtwdev, reg, mac->narrow_bw_ru_dis.mask);
 }
 
+void rtw89_mac_set_he_tb(struct rtw89_dev *rtwdev,
+                        struct rtw89_vif_link *rtwvif_link)
+{
+       struct ieee80211_bss_conf *bss_conf;
+       bool set;
+       u32 reg;
+
+       if (rtwdev->chip->chip_gen != RTW89_CHIP_BE)
+               return;
+
+       rcu_read_lock();
+
+       bss_conf = rtw89_vif_rcu_dereference_link(rtwvif_link, true);
+       set = bss_conf->he_support && !bss_conf->eht_support;
+
+       rcu_read_unlock();
+
+       reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_CLIENT_OM_CTRL,
+                                  rtwvif_link->mac_idx);
+
+       if (set)
+               rtw89_write32_set(rtwdev, reg, B_BE_TRIG_DIS_EHTTB);
+       else
+               rtw89_write32_clr(rtwdev, reg, B_BE_TRIG_DIS_EHTTB);
+}
+
 void rtw89_mac_stop_ap(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link)
 {
        rtw89_mac_port_cfg_func_sw(rtwdev, rtwvif_link);
index 8edea96d037f64b62bba527d88160d2f1747e92c..373366a602e0b758f8b42d32ec7861eeab80a2c7 100644 (file)
@@ -1185,6 +1185,8 @@ void rtw89_mac_port_cfg_rx_sync(struct rtw89_dev *rtwdev,
                                struct rtw89_vif_link *rtwvif_link, bool en);
 void rtw89_mac_set_he_obss_narrow_bw_ru(struct rtw89_dev *rtwdev,
                                        struct rtw89_vif_link *rtwvif_link);
+void rtw89_mac_set_he_tb(struct rtw89_dev *rtwdev,
+                        struct rtw89_vif_link *rtwvif_link);
 void rtw89_mac_stop_ap(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link);
 void rtw89_mac_enable_beacon_for_ap_vifs(struct rtw89_dev *rtwdev, bool en);
 int rtw89_mac_remove_vif(struct rtw89_dev *rtwdev, struct rtw89_vif_link *vif);
index b3669e0074df9d45de0de5eebd30ff678f1eafb6..7c9b53a9ba3b7671784ccf6a3e30117261bce297 100644 (file)
@@ -670,6 +670,7 @@ static void __rtw89_ops_bss_link_assoc(struct rtw89_dev *rtwdev,
        rtw89_chip_cfg_txpwr_ul_tb_offset(rtwdev, rtwvif_link);
        rtw89_mac_port_update(rtwdev, rtwvif_link);
        rtw89_mac_set_he_obss_narrow_bw_ru(rtwdev, rtwvif_link);
+       rtw89_mac_set_he_tb(rtwdev, rtwvif_link);
 }
 
 static void __rtw89_ops_bss_assoc(struct rtw89_dev *rtwdev,
index 10d0efa7a58efd7313faadbf7cb2d30bbb45f4cb..850ae5bf50ef394b5cb9ebf0cade8901f7a66c3c 100644 (file)
 #define B_BE_MACLBK_RDY_NUM_MASK GENMASK(7, 3)
 #define B_BE_MACLBK_EN BIT(0)
 
+#define R_BE_CLIENT_OM_CTRL 0x11040
+#define R_BE_CLIENT_OM_CTRL_C1 0x15040
+#define B_BE_TRIG_DIS_EHTTB BIT(24)
+
 #define R_BE_WMAC_NAV_CTL 0x11080
 #define R_BE_WMAC_NAV_CTL_C1 0x15080
 #define B_BE_WMAC_NAV_UPPER_EN BIT(26)