From: Ping-Ke Shih <pkshih@realtek.com>
To: <linux-wireless@vger.kernel.org>
Cc: <echuang@realtek.com>, <kevin_yang@realtek.com>
Subject: [PATCH rtw-next 3/8] wifi: rtw89: 8922d: add TX time limit for 2GHz band
Date: Sun, 12 Jul 2026 11:45:01 +0800 [thread overview]
Message-ID: <20260712034506.53209-4-pkshih@realtek.com> (raw)
In-Reply-To: <20260712034506.53209-1-pkshih@realtek.com>
Fix 2.4GHz specific L-SIG length TX issue, causing interoperability problem
with certain APs. Limit the A-MPDU duration to be workaround.
For 8922DE, the MAC limit is 164 ticks, and BB limit is 4608 us. The
conversion is 32.768us / tick. Since smaller limit should be adopted,
BB limit is filled into newly added field.
The units of register and CCTL table are tick and us/512 respectively.
Convert to target unit when filling values.
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/core.h | 1 +
drivers/net/wireless/realtek/rtw89/mac.c | 20 +++++++++++++++++--
drivers/net/wireless/realtek/rtw89/rtw8851b.c | 1 +
drivers/net/wireless/realtek/rtw89/rtw8852a.c | 1 +
drivers/net/wireless/realtek/rtw89/rtw8852b.c | 1 +
.../net/wireless/realtek/rtw89/rtw8852bt.c | 1 +
drivers/net/wireless/realtek/rtw89/rtw8852c.c | 1 +
drivers/net/wireless/realtek/rtw89/rtw8922a.c | 1 +
drivers/net/wireless/realtek/rtw89/rtw8922d.c | 9 +++++++++
9 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
index 0f6d4ad66fe2..b7536288c084 100644
--- a/drivers/net/wireless/realtek/rtw89/core.h
+++ b/drivers/net/wireless/realtek/rtw89/core.h
@@ -5012,6 +5012,7 @@ struct rtw89_chip_info {
const struct wiphy_wowlan_support *wowlan_stub;
const struct rtw89_xtal_info *xtal_info;
unsigned long default_quirks; /* bitmap of rtw89_quirks */
+ u16 txtime_limit_2ghz;
};
struct rtw89_chip_variant {
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
index b58d9439ee6d..a63f34440554 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.c
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
@@ -7047,11 +7047,23 @@ __rtw89_mac_set_tx_time(struct rtw89_dev *rtwdev, struct rtw89_sta_link *rtwsta_
{
#define MAC_AX_DFLT_TX_TIME 5280
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
+ const struct rtw89_chip_info *chip = rtwdev->chip;
u8 mac_idx = rtwsta_link->rtwvif_link->mac_idx;
u32 max_tx_time = tx_time == 0 ? MAC_AX_DFLT_TX_TIME : tx_time;
+ struct rtw89_entity_conf conf;
+ const struct rtw89_chan *chan;
u32 reg;
int ret = 0;
+ if (chip->txtime_limit_2ghz) {
+ rtw89_entity_get_conf(rtwdev, &conf);
+ chan = conf.chans[mac_idx];
+
+ if (chan->band_type == RTW89_BAND_2G)
+ max_tx_time = min_t(u32, max_tx_time,
+ chip->txtime_limit_2ghz);
+ }
+
if (rtwsta_link->cctl_tx_time) {
rtwsta_link->ampdu_max_time = (max_tx_time - 512) >> 9;
ret = rtw89_chip_h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
@@ -7062,9 +7074,13 @@ __rtw89_mac_set_tx_time(struct rtw89_dev *rtwdev, struct rtw89_sta_link *rtwsta_
return ret;
}
+ if (chip->chip_gen == RTW89_CHIP_AX)
+ max_tx_time >>= 5;
+ else
+ max_tx_time = max_tx_time * 1000 >> 15;
+
reg = rtw89_mac_reg_by_idx(rtwdev, mac->agg_limit.addr, mac_idx);
- rtw89_write32_mask(rtwdev, reg, mac->agg_limit.mask,
- max_tx_time >> 5);
+ rtw89_write32_mask(rtwdev, reg, mac->agg_limit.mask, max_tx_time);
}
return ret;
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8851b.c b/drivers/net/wireless/realtek/rtw89/rtw8851b.c
index 50480f72c96d..8dd909fc4754 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8851b.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8851b.c
@@ -2779,6 +2779,7 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
#endif
.xtal_info = &rtw8851b_xtal_info,
.default_quirks = 0,
+ .txtime_limit_2ghz = 0,
};
EXPORT_SYMBOL(rtw8851b_chip_info);
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a.c b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
index 0c7794742650..66e8035703a6 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852a.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
@@ -2517,6 +2517,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
#endif
.xtal_info = &rtw8852a_xtal_info,
.default_quirks = 0,
+ .txtime_limit_2ghz = 0,
};
EXPORT_SYMBOL(rtw8852a_chip_info);
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852b.c b/drivers/net/wireless/realtek/rtw89/rtw8852b.c
index 5904127cc836..19f35b87d42e 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852b.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852b.c
@@ -1115,6 +1115,7 @@ const struct rtw89_chip_info rtw8852b_chip_info = {
#endif
.xtal_info = NULL,
.default_quirks = 0,
+ .txtime_limit_2ghz = 0,
};
EXPORT_SYMBOL(rtw8852b_chip_info);
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852bt.c b/drivers/net/wireless/realtek/rtw89/rtw8852bt.c
index e68f73827fa5..3da95beddc1f 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852bt.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852bt.c
@@ -951,6 +951,7 @@ const struct rtw89_chip_info rtw8852bt_chip_info = {
#endif
.xtal_info = NULL,
.default_quirks = 0,
+ .txtime_limit_2ghz = 0,
};
EXPORT_SYMBOL(rtw8852bt_chip_info);
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
index 968666280c89..54425d707bc6 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
@@ -3320,6 +3320,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
#endif
.xtal_info = NULL,
.default_quirks = 0,
+ .txtime_limit_2ghz = 0,
};
EXPORT_SYMBOL(rtw8852c_chip_info);
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8922a.c b/drivers/net/wireless/realtek/rtw89/rtw8922a.c
index fe87b4929ddc..900aa20cf6ac 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8922a.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8922a.c
@@ -3302,6 +3302,7 @@ const struct rtw89_chip_info rtw8922a_chip_info = {
#endif
.xtal_info = NULL,
.default_quirks = 0,
+ .txtime_limit_2ghz = 0,
};
EXPORT_SYMBOL(rtw8922a_chip_info);
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8922d.c b/drivers/net/wireless/realtek/rtw89/rtw8922d.c
index 768434db14c6..27e148b4213a 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8922d.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8922d.c
@@ -1173,8 +1173,10 @@ static void rtw8922d_set_channel_mac(struct rtw89_dev *rtwdev,
u32 sub_carr = rtw89_mac_reg_by_idx(rtwdev, R_BE_TX_SUB_BAND_VALUE, mac_idx);
u32 chk_rate = rtw89_mac_reg_by_idx(rtwdev, R_BE_TXRATE_CHK, mac_idx);
u32 rf_mod = rtw89_mac_reg_by_idx(rtwdev, R_BE_WMAC_RFMOD, mac_idx);
+ const struct rtw89_chip_info *chip = rtwdev->chip;
u8 txsb20 = 0, txsb40 = 0, txsb80 = 0;
u8 rf_mod_val, chk_rate_mask, sifs;
+ u16 tx_time = AMPDU_MAX_TIME_V1;
u32 txsb;
u32 reg;
@@ -1255,6 +1257,12 @@ static void rtw8922d_set_channel_mac(struct rtw89_dev *rtwdev,
reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_MUEDCA_EN, mac_idx);
rtw89_write32_mask(rtwdev, reg, B_BE_SIFS_MACTXEN_TB_T1_DOT05US_MASK, sifs);
+
+ if (chan->band_type == RTW89_BAND_2G && chip->txtime_limit_2ghz)
+ tx_time = min_t(u32, tx_time, chip->txtime_limit_2ghz * 1000 >> 15);
+
+ reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_AMPDU_AGG_LIMIT, mac_idx);
+ rtw89_write32_mask(rtwdev, reg, B_BE_AMPDU_MAX_TIME_MASK, tx_time);
}
static const u32 rtw8922d_sco_barker_threshold[14] = {
@@ -3591,6 +3599,7 @@ const struct rtw89_chip_info rtw8922d_chip_info = {
#endif
.xtal_info = NULL,
.default_quirks = BIT(RTW89_QUIRK_THERMAL_PROT_120C),
+ .txtime_limit_2ghz = 4608,
};
EXPORT_SYMBOL(rtw8922d_chip_info);
--
2.25.1
next prev parent reply other threads:[~2026-07-12 3:46 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-12 3:44 [PATCH rtw-next 0/8] wifi: rtw89: add RF diagnosis and update random patches Ping-Ke Shih
2026-07-12 3:44 ` [PATCH rtw-next 1/8] wifi: rtw89: pack I/O during bb_sethw to reduce API execution time Ping-Ke Shih
2026-07-12 3:45 ` [PATCH rtw-next 2/8] wifi: rtw89: mac: abstract register definition of firmware boot debug Ping-Ke Shih
2026-07-12 3:45 ` Ping-Ke Shih [this message]
2026-07-12 3:45 ` [PATCH rtw-next 4/8] wifi: rtw89: introduce helper to get tx shape index Ping-Ke Shih
2026-07-12 3:45 ` [PATCH rtw-next 5/8] wifi: rtw89: add tx shape v0 to keep built-in arrays compatible during transitions Ping-Ke Shih
2026-07-12 3:45 ` [PATCH rtw-next 6/8] wifi: rtw89: extend tx shape format for regulatory 6 GHz power type Ping-Ke Shih
2026-07-12 3:45 ` [PATCH rtw-next 7/8] wifi: rtw89: fw: do bb_preinit before downloading firmware Ping-Ke Shih
2026-07-12 3:45 ` [PATCH rtw-next 8/8] wifi: rtw89: debug: add diagnosis for RF Ping-Ke Shih
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260712034506.53209-4-pkshih@realtek.com \
--to=pkshih@realtek.com \
--cc=echuang@realtek.com \
--cc=kevin_yang@realtek.com \
--cc=linux-wireless@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox