Bitterblue Smith <rtl8821cerfe2@xxxxxxxxx> wrote: > Add the function to automatically switch the RTL8812AU into USB 3 mode. > > Signed-off-by: Bitterblue Smith <rtl8821cerfe2@xxxxxxxxx> > --- > drivers/net/wireless/realtek/rtw88/usb.c | 34 ++++++++++++++++++++++-- > 1 file changed, 32 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c > index 6fa3c37205f5..752bca05b9af 100644 > --- a/drivers/net/wireless/realtek/rtw88/usb.c > +++ b/drivers/net/wireless/realtek/rtw88/usb.c > @@ -931,6 +931,32 @@ static void rtw_usb_intf_deinit(struct rtw_dev *rtwdev, > usb_set_intfdata(intf, NULL); > } > > +static int rtw_usb_switch_mode_old(struct rtw_dev *rtwdev) > +{ > + struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); > + enum usb_device_speed cur_speed = rtwusb->udev->speed; > + u8 hci_opt; > + > + if (cur_speed == USB_SPEED_HIGH) { > + hci_opt = rtw_read8(rtwdev, REG_HCI_OPT_CTRL); > + > + if ((hci_opt & (BIT(2) | BIT(3))) != BIT(3)) { > + rtw_write8(rtwdev, REG_HCI_OPT_CTRL, 0x8); > + rtw_write8(rtwdev, REG_SYS_SDIO_CTRL, 0x2); > + rtw_write8(rtwdev, REG_ACLK_MON, 0x1); > + rtw_write8(rtwdev, 0x3d, 0x3); > + /* usb disconnect */ > + rtw_write8(rtwdev, REG_SYS_PW_CTRL + 1, 0x80); > + return 1; > + } > + } else if (cur_speed == USB_SPEED_SUPER) { > + rtw_write8_clr(rtwdev, REG_SYS_SDIO_CTRL, BIT(1)); > + rtw_write8_clr(rtwdev, REG_ACLK_MON, BIT(0)); > + } > + > + return 0; > +} > + > static int rtw_usb_switch_mode_new(struct rtw_dev *rtwdev) > { > enum usb_device_speed cur_speed; > @@ -984,7 +1010,8 @@ static int rtw_usb_switch_mode(struct rtw_dev *rtwdev) > { > u8 id = rtwdev->chip->id; > > - if (id != RTW_CHIP_TYPE_8822C && id != RTW_CHIP_TYPE_8822B) > + if (id != RTW_CHIP_TYPE_8822C && id != RTW_CHIP_TYPE_8822B && > + id != RTW_CHIP_TYPE_8812A) Would it be clear to list positive chips in a function? and return new/old type chip is using for latter condition. > return 0; > > if (!rtwdev->efuse.usb_mode_switch) { > @@ -999,7 +1026,10 @@ static int rtw_usb_switch_mode(struct rtw_dev *rtwdev) > return 0; > } > > - return rtw_usb_switch_mode_new(rtwdev); > + if (id == RTW_CHIP_TYPE_8812A) > + return rtw_usb_switch_mode_old(rtwdev); > + else /* RTL8822CU, RTL8822BU */ > + return rtw_usb_switch_mode_new(rtwdev); > }