1 From ce5dea83ee8f945203144fb891fdcb978216e45a Mon Sep 17 00:00:00 2001
2 From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
3 Date: Thu, 14 Nov 2024 17:48:09 +0200
4 Subject: [PATCH] wifi: rtw88: usb: Enable RX aggregation for 8821au/8812au
6 USB RX aggregation improves the RX speed on certain ARM systems, like
7 the NanoPi NEO Core2. With RTL8811AU, before: 30 Mbps, after: 224 Mbps.
9 The out-of-tree driver uses aggregation size of 7 in USB 3 mode, but
10 that doesn't work here. rtw88 advertises support for receiving AMSDU
11 in AMPDU, so the AP sends larger frames, up to ~5100 bytes. With a size
12 of 7 RTL8812AU frequently tries to aggregate more frames than will fit
13 in 32768 bytes. Use a size of 6 instead.
15 Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
16 Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
17 Link: https://patch.msgid.link/63012163-a425-4b15-b830-43f279c06b73@gmail.com
19 drivers/net/wireless/realtek/rtw88/usb.c | 28 ++++++++++++++++++++++++
20 1 file changed, 28 insertions(+)
22 --- a/drivers/net/wireless/realtek/rtw88/usb.c
23 +++ b/drivers/net/wireless/realtek/rtw88/usb.c
24 @@ -789,6 +789,30 @@ static void rtw_usb_dynamic_rx_agg_v1(st
25 rtw_write16(rtwdev, REG_RXDMA_AGG_PG_TH, val16);
28 +static void rtw_usb_dynamic_rx_agg_v2(struct rtw_dev *rtwdev, bool enable)
30 + struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
37 + } else if (rtwusb->udev->speed == USB_SPEED_SUPER) {
45 + val16 = u16_encode_bits(size, BIT_RXDMA_AGG_PG_TH) |
46 + u16_encode_bits(timeout, BIT_DMA_AGG_TO_V1);
48 + rtw_write16(rtwdev, REG_RXDMA_AGG_PG_TH, val16);
49 + rtw_write8_set(rtwdev, REG_TXDMA_PQ_MAP, BIT_RXDMA_AGG_EN);
52 static void rtw_usb_dynamic_rx_agg(struct rtw_dev *rtwdev, bool enable)
54 switch (rtwdev->chip->id) {
55 @@ -797,6 +821,10 @@ static void rtw_usb_dynamic_rx_agg(struc
56 case RTW_CHIP_TYPE_8821C:
57 rtw_usb_dynamic_rx_agg_v1(rtwdev, enable);
59 + case RTW_CHIP_TYPE_8821A:
60 + case RTW_CHIP_TYPE_8812A:
61 + rtw_usb_dynamic_rx_agg_v2(rtwdev, enable);
63 case RTW_CHIP_TYPE_8723D:
64 /* Doesn't like aggregation. */