1debe2dc73d070953850567958236c1c4d166b27
[openwrt/staging/nbd.git] /
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
5
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.
8
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.
14
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
18 ---
19 drivers/net/wireless/realtek/rtw88/usb.c | 28 ++++++++++++++++++++++++
20 1 file changed, 28 insertions(+)
21
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);
26 }
27
28 +static void rtw_usb_dynamic_rx_agg_v2(struct rtw_dev *rtwdev, bool enable)
29 +{
30 + struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
31 + u8 size, timeout;
32 + u16 val16;
33 +
34 + if (!enable) {
35 + size = 0x0;
36 + timeout = 0x1;
37 + } else if (rtwusb->udev->speed == USB_SPEED_SUPER) {
38 + size = 0x6;
39 + timeout = 0x1a;
40 + } else {
41 + size = 0x5;
42 + timeout = 0x20;
43 + }
44 +
45 + val16 = u16_encode_bits(size, BIT_RXDMA_AGG_PG_TH) |
46 + u16_encode_bits(timeout, BIT_DMA_AGG_TO_V1);
47 +
48 + rtw_write16(rtwdev, REG_RXDMA_AGG_PG_TH, val16);
49 + rtw_write8_set(rtwdev, REG_TXDMA_PQ_MAP, BIT_RXDMA_AGG_EN);
50 +}
51 +
52 static void rtw_usb_dynamic_rx_agg(struct rtw_dev *rtwdev, bool enable)
53 {
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);
58 break;
59 + case RTW_CHIP_TYPE_8821A:
60 + case RTW_CHIP_TYPE_8812A:
61 + rtw_usb_dynamic_rx_agg_v2(rtwdev, enable);
62 + break;
63 case RTW_CHIP_TYPE_8723D:
64 /* Doesn't like aggregation. */
65 break;