Commit fbbd8cb3 authored by Bitterblue Smith's avatar Bitterblue Smith Committed by Ping-Ke Shih
Browse files

wifi: rtw88: usb: Init RX burst length according to USB speed



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: default avatarSascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: default avatarBitterblue Smith <rtl8821cerfe2@gmail.com>
Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/ac569c6f-7129-4341-b523-901fe10cabff@gmail.com
parent e24f825a
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -322,6 +322,12 @@
#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
+22 −1
Original line number Diff line number Diff line
@@ -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 = {