Consider the sta maximum AMSDU subframes as a factor to set agg_wait to 0
to avoid TX work waiting to yield better latency if real-time application
lets AMSDU off by
iw dev wlan0 set tidconf tids 0xff amsdu off
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/phy.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/realtek/rtw89/phy.c b/drivers/net/wireless/realtek/rtw89/phy.c
index 501923d97971..c33b888bc0e3 100644
--- a/drivers/net/wireless/realtek/rtw89/phy.c
+++ b/drivers/net/wireless/realtek/rtw89/phy.c
@@ -3221,6 +3221,17 @@ static void rtw89_phy_set_txpwr_limit_ru_ax(struct rtw89_dev *rtwdev,
}
}
+static int get_max_agg_wait(struct ieee80211_link_sta *link_sta, u16 amsdu_len)
+{
+ struct ieee80211_sta *sta = link_sta->sta;
+ int max_agg_wait = amsdu_len / 1500 - 1;
+
+ if (sta->max_amsdu_subframes)
+ max_agg_wait = min(max_agg_wait, sta->max_amsdu_subframes - 1);
+
+ return max_agg_wait;
+}
+
struct rtw89_phy_iter_ra_data {
struct rtw89_dev *rtwdev;
struct sk_buff *c2h;@@ -3345,7 +3356,7 @@ static void __rtw89_phy_c2h_ra_rpt_iter(struct rtw89_sta_link *rtwsta_link,
*changed = true;
}
- rtwsta_link->max_agg_wait = link_sta->agg.max_rc_amsdu_len / 1500 - 1;
+ rtwsta_link->max_agg_wait = get_max_agg_wait(link_sta, amsdu_len);
}
static void rtw89_phy_c2h_ra_rpt_iter(void *data, struct ieee80211_sta *sta)
--
2.25.1