1 From 0d2a88690e583168effb03c64fd217a323b2c444 Mon Sep 17 00:00:00 2001
2 From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
3 Date: Wed, 2 Apr 2025 18:31:12 +0300
4 Subject: [PATCH] wifi: rtw88: Set AMPDU factor to hardware for RTL8814A
6 Tell the chip the maximum AMPDU size supported by the AP. This greatly
7 improves the TX speed of RTL8814AU in the 2.4 GHz band. Before: ~90
8 Mbps. After: ~300 Mbps.
10 Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
11 Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
12 Link: https://patch.msgid.link/4edc2a63-81b3-431c-9a37-5a7d899a6cc2@gmail.com
14 drivers/net/wireless/realtek/rtw88/mac80211.c | 2 ++
15 drivers/net/wireless/realtek/rtw88/main.c | 32 +++++++++++++++++++
16 drivers/net/wireless/realtek/rtw88/main.h | 3 ++
17 drivers/net/wireless/realtek/rtw88/rtw8703b.c | 1 +
18 drivers/net/wireless/realtek/rtw88/rtw8723d.c | 1 +
19 drivers/net/wireless/realtek/rtw88/rtw8812a.c | 1 +
20 drivers/net/wireless/realtek/rtw88/rtw8814a.c | 11 +++++++
21 drivers/net/wireless/realtek/rtw88/rtw8821a.c | 1 +
22 drivers/net/wireless/realtek/rtw88/rtw8821c.c | 1 +
23 drivers/net/wireless/realtek/rtw88/rtw8822b.c | 1 +
24 drivers/net/wireless/realtek/rtw88/rtw8822c.c | 1 +
25 11 files changed, 55 insertions(+)
27 --- a/drivers/net/wireless/realtek/rtw88/mac80211.c
28 +++ b/drivers/net/wireless/realtek/rtw88/mac80211.c
29 @@ -396,6 +396,8 @@ static void rtw_ops_bss_info_changed(str
31 rtw_bf_assoc(rtwdev, vif, conf);
33 + rtw_set_ampdu_factor(rtwdev, vif, conf);
35 rtw_fw_beacon_filter_config(rtwdev, true, vif);
37 rtw_leave_lps(rtwdev);
38 --- a/drivers/net/wireless/realtek/rtw88/main.c
39 +++ b/drivers/net/wireless/realtek/rtw88/main.c
40 @@ -2447,6 +2447,38 @@ void rtw_core_enable_beacon(struct rtw_d
44 +void rtw_set_ampdu_factor(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
45 + struct ieee80211_bss_conf *bss_conf)
47 + const struct rtw_chip_ops *ops = rtwdev->chip->ops;
48 + struct ieee80211_sta *sta;
51 + if (!ops->set_ampdu_factor)
56 + sta = ieee80211_find_sta(vif, bss_conf->bssid);
59 + rtw_warn(rtwdev, "%s: failed to find station %pM\n",
60 + __func__, bss_conf->bssid);
64 + if (sta->deflink.vht_cap.vht_supported)
65 + factor = u32_get_bits(sta->deflink.vht_cap.cap,
66 + IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK);
67 + else if (sta->deflink.ht_cap.ht_supported)
68 + factor = sta->deflink.ht_cap.ampdu_factor;
73 + ops->set_ampdu_factor(rtwdev, factor);
76 MODULE_AUTHOR("Realtek Corporation");
77 MODULE_DESCRIPTION("Realtek 802.11ac wireless core module");
78 MODULE_LICENSE("Dual BSD/GPL");
79 --- a/drivers/net/wireless/realtek/rtw88/main.h
80 +++ b/drivers/net/wireless/realtek/rtw88/main.h
81 @@ -878,6 +878,7 @@ struct rtw_chip_ops {
83 void (*cfg_ldo25)(struct rtw_dev *rtwdev, bool enable);
84 void (*efuse_grant)(struct rtw_dev *rtwdev, bool enable);
85 + void (*set_ampdu_factor)(struct rtw_dev *rtwdev, u8 factor);
86 void (*false_alarm_statistics)(struct rtw_dev *rtwdev);
87 void (*phy_calibration)(struct rtw_dev *rtwdev);
88 void (*dpk_track)(struct rtw_dev *rtwdev);
89 @@ -2272,4 +2273,6 @@ void rtw_update_channel(struct rtw_dev *
90 void rtw_core_port_switch(struct rtw_dev *rtwdev, struct ieee80211_vif *vif);
91 bool rtw_core_check_sta_active(struct rtw_dev *rtwdev);
92 void rtw_core_enable_beacon(struct rtw_dev *rtwdev, bool enable);
93 +void rtw_set_ampdu_factor(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
94 + struct ieee80211_bss_conf *bss_conf);
96 --- a/drivers/net/wireless/realtek/rtw88/rtw8703b.c
97 +++ b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
98 @@ -1904,6 +1904,7 @@ static const struct rtw_chip_ops rtw8703
100 .cfg_ldo25 = rtw8723x_cfg_ldo25,
101 .efuse_grant = rtw8723x_efuse_grant,
102 + .set_ampdu_factor = NULL,
103 .false_alarm_statistics = rtw8723x_false_alarm_statistics,
104 .phy_calibration = rtw8703b_phy_calibration,
106 --- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
107 +++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
108 @@ -1404,6 +1404,7 @@ static const struct rtw_chip_ops rtw8723
110 .cfg_ldo25 = rtw8723x_cfg_ldo25,
111 .efuse_grant = rtw8723x_efuse_grant,
112 + .set_ampdu_factor = NULL,
113 .false_alarm_statistics = rtw8723x_false_alarm_statistics,
114 .phy_calibration = rtw8723d_phy_calibration,
115 .cck_pd_set = rtw8723d_phy_cck_pd_set,
116 --- a/drivers/net/wireless/realtek/rtw88/rtw8812a.c
117 +++ b/drivers/net/wireless/realtek/rtw88/rtw8812a.c
118 @@ -925,6 +925,7 @@ static const struct rtw_chip_ops rtw8812
119 .set_tx_power_index = rtw88xxa_set_tx_power_index,
120 .cfg_ldo25 = rtw8812a_cfg_ldo25,
121 .efuse_grant = rtw88xxa_efuse_grant,
122 + .set_ampdu_factor = NULL,
123 .false_alarm_statistics = rtw88xxa_false_alarm_statistics,
124 .phy_calibration = rtw8812a_phy_calibration,
125 .cck_pd_set = rtw88xxa_phy_cck_pd_set,
126 --- a/drivers/net/wireless/realtek/rtw88/rtw8814a.c
127 +++ b/drivers/net/wireless/realtek/rtw88/rtw8814a.c
128 @@ -1332,6 +1332,16 @@ static void rtw8814a_cfg_ldo25(struct rt
132 +/* Without this RTL8814A sends too many frames and (some?) 11n AP
133 + * can't handle it, resulting in low TX speed. Other chips seem fine.
135 +static void rtw8814a_set_ampdu_factor(struct rtw_dev *rtwdev, u8 factor)
137 + factor = min_t(u8, factor, IEEE80211_VHT_MAX_AMPDU_256K);
139 + rtw_write32(rtwdev, REG_AMPDU_MAX_LENGTH, (8192 << factor) - 1);
142 static void rtw8814a_false_alarm_statistics(struct rtw_dev *rtwdev)
144 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
145 @@ -2051,6 +2061,7 @@ static const struct rtw_chip_ops rtw8814
147 .cfg_ldo25 = rtw8814a_cfg_ldo25,
148 .efuse_grant = rtw8814a_efuse_grant,
149 + .set_ampdu_factor = rtw8814a_set_ampdu_factor,
150 .false_alarm_statistics = rtw8814a_false_alarm_statistics,
151 .phy_calibration = rtw8814a_phy_calibration,
152 .cck_pd_set = rtw8814a_phy_cck_pd_set,
153 --- a/drivers/net/wireless/realtek/rtw88/rtw8821a.c
154 +++ b/drivers/net/wireless/realtek/rtw88/rtw8821a.c
155 @@ -871,6 +871,7 @@ static const struct rtw_chip_ops rtw8821
156 .set_tx_power_index = rtw88xxa_set_tx_power_index,
157 .cfg_ldo25 = rtw8821a_cfg_ldo25,
158 .efuse_grant = rtw88xxa_efuse_grant,
159 + .set_ampdu_factor = NULL,
160 .false_alarm_statistics = rtw88xxa_false_alarm_statistics,
161 .phy_calibration = rtw8821a_phy_calibration,
162 .cck_pd_set = rtw88xxa_phy_cck_pd_set,
163 --- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
164 +++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
165 @@ -1668,6 +1668,7 @@ static const struct rtw_chip_ops rtw8821
167 .set_tx_power_index = rtw8821c_set_tx_power_index,
168 .cfg_ldo25 = rtw8821c_cfg_ldo25,
169 + .set_ampdu_factor = NULL,
170 .false_alarm_statistics = rtw8821c_false_alarm_statistics,
171 .phy_calibration = rtw8821c_phy_calibration,
172 .cck_pd_set = rtw8821c_phy_cck_pd_set,
173 --- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
174 +++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
175 @@ -2158,6 +2158,7 @@ static const struct rtw_chip_ops rtw8822
176 .set_tx_power_index = rtw8822b_set_tx_power_index,
177 .set_antenna = rtw8822b_set_antenna,
178 .cfg_ldo25 = rtw8822b_cfg_ldo25,
179 + .set_ampdu_factor = NULL,
180 .false_alarm_statistics = rtw8822b_false_alarm_statistics,
181 .phy_calibration = rtw8822b_phy_calibration,
182 .pwr_track = rtw8822b_pwr_track,
183 --- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
184 +++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
185 @@ -4968,6 +4968,7 @@ static const struct rtw_chip_ops rtw8822
186 .set_tx_power_index = rtw8822c_set_tx_power_index,
187 .set_antenna = rtw8822c_set_antenna,
188 .cfg_ldo25 = rtw8822c_cfg_ldo25,
189 + .set_ampdu_factor = NULL,
190 .false_alarm_statistics = rtw8822c_false_alarm_statistics,
191 .dpk_track = rtw8822c_dpk_track,
192 .phy_calibration = rtw8822c_phy_calibration,