Skip to content

Commit 73d427d

Browse files
MocLGgregkh
authored andcommitted
wifi: rtw88: increase TX report timeout to fix race condition
commit c80788f upstream. The driver expects the firmware to report TX status within 500ms. However, a timeout can be triggered when the hardware performs background scans while under TX load. During these scans, the firmware stays off-channel for periods exceeding 500ms, delaying the delivery of TX reports back to the driver. When this occurs, the purge timer fires prematurely and drops the tracking skbs from the queue. This results in the host stack interpreting the missing status as packet loss, leading to TCP window collapse. In testing with iperf3, this causes throughput to drop from ~90 Mbps to near-zero for approximately 2 seconds until the connection recovers. Increase RTW_TX_PROBE_TIMEOUT to 2500ms for RTL8723DU. This duration is sufficient to accommodate off-channel dwell time during full background scans, ensuring the purge timer only trips during genuine firmware lockups and preventing unnecessary TCP retransmission cycles. Fixes: a82dfd3 ("wifi: rtw88: Add common USB chip support") Cc: stable@vger.kernel.org Acked-by: Ping-Ke Shih <pkshih@realtek.com> Tested-by: Luka Gejak <luka.gejak@linux.dev> Signed-off-by: Luka Gejak <luka.gejak@linux.dev> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com> Link: https://patch.msgid.link/20260518142311.10328-1-luka.gejak@linux.dev Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 0aeb4d3 commit 73d427d

1 file changed

Lines changed: 6 additions & 1 deletion

File tree

  • drivers/net/wireless/realtek/rtw88

drivers/net/wireless/realtek/rtw88/tx.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ void rtw_tx_report_purge_timer(struct timer_list *t)
196196
void rtw_tx_report_enqueue(struct rtw_dev *rtwdev, struct sk_buff *skb, u8 sn)
197197
{
198198
struct rtw_tx_report *tx_report = &rtwdev->tx_report;
199+
unsigned long timeout = RTW_TX_PROBE_TIMEOUT;
199200
unsigned long flags;
200201
u8 *drv_data;
201202

@@ -207,7 +208,11 @@ void rtw_tx_report_enqueue(struct rtw_dev *rtwdev, struct sk_buff *skb, u8 sn)
207208
__skb_queue_tail(&tx_report->queue, skb);
208209
spin_unlock_irqrestore(&tx_report->q_lock, flags);
209210

210-
mod_timer(&tx_report->purge_timer, jiffies + RTW_TX_PROBE_TIMEOUT);
211+
if (rtwdev->chip->id == RTW_CHIP_TYPE_8723D &&
212+
rtwdev->hci.type == RTW_HCI_TYPE_USB)
213+
timeout = msecs_to_jiffies(2500);
214+
215+
mod_timer(&tx_report->purge_timer, jiffies + timeout);
211216
}
212217
EXPORT_SYMBOL(rtw_tx_report_enqueue);
213218

0 commit comments

Comments
 (0)