]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
wifi: rtw88: usb: Init RX burst length according to USB speed
authorBitterblue Smith <rtl8821cerfe2@gmail.com>
Wed, 7 Aug 2024 22:19:36 +0000 (01:19 +0300)
committerPing-Ke Shih <pkshih@realtek.com>
Fri, 9 Aug 2024 01:11:57 +0000 (09:11 +0800)
This is needed in order to make USB RX aggregation work with RTL8811CU
(and presumably RTL8822BU and RTL8822CU also).

I don't know what BIT_DMA_BURST_CNT, BIT_DMA_MODE, and BIT_DROP_DATA_EN
are doing.

Tested with RTL8822CU, RTL8811CU, and RTL8723DU.

The RX speed is unchanged in my tests.

Tested-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/ac569c6f-7129-4341-b523-901fe10cabff@gmail.com
drivers/net/wireless/realtek/rtw88/reg.h
drivers/net/wireless/realtek/rtw88/usb.c

index e7b24465f549e418fd0e4c9a4c41f32cb37540ec..4d9b8668e8b047fe21da9045c1b75c6d98bccb47 100644 (file)
 #define REG_RXDMA_DPR          0x028C
 #define REG_RXDMA_MODE         0x0290
 #define BIT_DMA_MODE           BIT(1)
+#define BIT_DMA_BURST_CNT      GENMASK(3, 2)
+#define BIT_DMA_BURST_SIZE     GENMASK(5, 4)
+#define BIT_DMA_BURST_SIZE_64  2
+#define BIT_DMA_BURST_SIZE_512 1
+#define BIT_DMA_BURST_SIZE_1024        0
+
 #define REG_RXPKTNUM           0x02B0
 
 #define REG_INT_MIG            0x0304
index 9145c11a063ea72fe00472f71662ff0440f149eb..1c40d46a7eb4ed1bfbefed2aa1c5263c256f2bd1 100644 (file)
@@ -720,9 +720,30 @@ static void rtw_usb_link_ps(struct rtw_dev *rtwdev, bool enter)
        /* empty function for rtw_hci_ops */
 }
 
+static void rtw_usb_init_burst_pkt_len(struct rtw_dev *rtwdev)
+{
+       struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
+       enum usb_device_speed speed = rtwusb->udev->speed;
+       u8 rxdma, burst_size;
+
+       rxdma = BIT_DMA_BURST_CNT | BIT_DMA_MODE;
+
+       if (speed == USB_SPEED_SUPER)
+               burst_size = BIT_DMA_BURST_SIZE_1024;
+       else if (speed == USB_SPEED_HIGH)
+               burst_size = BIT_DMA_BURST_SIZE_512;
+       else
+               burst_size = BIT_DMA_BURST_SIZE_64;
+
+       u8p_replace_bits(&rxdma, burst_size, BIT_DMA_BURST_SIZE);
+
+       rtw_write8(rtwdev, REG_RXDMA_MODE, rxdma);
+       rtw_write16_set(rtwdev, REG_TXDMA_OFFSET_CHK, BIT_DROP_DATA_EN);
+}
+
 static void rtw_usb_interface_cfg(struct rtw_dev *rtwdev)
 {
-       /* empty function for rtw_hci_ops */
+       rtw_usb_init_burst_pkt_len(rtwdev);
 }
 
 static struct rtw_hci_ops rtw_usb_ops = {