The registers used in this function are located at different offsets in RTL8852CU compared to other chips. Use the right registers for each chip. Signed-off-by: Bitterblue Smith --- v2: - No change, messed up sending v1. --- drivers/net/wireless/realtek/rtw89/usb.c | 29 ++++++++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw89/usb.c b/drivers/net/wireless/realtek/rtw89/usb.c index eb9978a60d04..e749a37ac1b5 100644 --- a/drivers/net/wireless/realtek/rtw89/usb.c +++ b/drivers/net/wireless/realtek/rtw89/usb.c @@ -726,20 +726,39 @@ static int rtw89_usb_ops_deinit(struct rtw89_dev *rtwdev) static int rtw89_usb_ops_mac_pre_init(struct rtw89_dev *rtwdev) { + u32 usb_host_request_2, usb_wlan0_1, hci_func_en; u32 val32; - rtw89_write32_set(rtwdev, R_AX_USB_HOST_REQUEST_2, B_AX_R_USBIO_MODE); + switch (rtwdev->chip->chip_id) { + case RTL8851B: + case RTL8852A: + case RTL8852B: + usb_host_request_2 = R_AX_USB_HOST_REQUEST_2; + usb_wlan0_1 = R_AX_USB_WLAN0_1; + hci_func_en = R_AX_HCI_FUNC_EN; + break; + case RTL8852C: + usb_host_request_2 = R_AX_USB_HOST_REQUEST_2_V1; + usb_wlan0_1 = R_AX_USB_WLAN0_1_V1; + hci_func_en = R_AX_HCI_FUNC_EN_V1; + break; + default: + rtw89_err(rtwdev, "%s: unknown chip\n", __func__); + return -EOPNOTSUPP; + } + + rtw89_write32_set(rtwdev, usb_host_request_2, B_AX_R_USBIO_MODE); /* fix USB IO hang suggest by chihhanli@realtek.com */ - rtw89_write32_clr(rtwdev, R_AX_USB_WLAN0_1, + rtw89_write32_clr(rtwdev, usb_wlan0_1, B_AX_USBRX_RST | B_AX_USBTX_RST); - val32 = rtw89_read32(rtwdev, R_AX_HCI_FUNC_EN); + val32 = rtw89_read32(rtwdev, hci_func_en); val32 &= ~(B_AX_HCI_RXDMA_EN | B_AX_HCI_TXDMA_EN); - rtw89_write32(rtwdev, R_AX_HCI_FUNC_EN, val32); + rtw89_write32(rtwdev, hci_func_en, val32); val32 |= B_AX_HCI_RXDMA_EN | B_AX_HCI_TXDMA_EN; - rtw89_write32(rtwdev, R_AX_HCI_FUNC_EN, val32); + rtw89_write32(rtwdev, hci_func_en, val32); /* fix USB TRX hang suggest by chihhanli@realtek.com */ return 0; -- 2.50.0