]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: rtw89: 8852b: Fix rtw8852b_pwr_{on,off}_func() for USB
authorBitterblue Smith <rtl8821cerfe2@gmail.com>
Sat, 5 Jul 2025 19:37:32 +0000 (22:37 +0300)
committerPing-Ke Shih <pkshih@realtek.com>
Sun, 6 Jul 2025 05:11:41 +0000 (13:11 +0800)
There are a few differences in the power on/off functions between PCIE
and USB. The changes in the power off function in particular are needed
for the RTL8832BU to be able to power on again after it's powered off.

While the RTL8832BU appears to work without the changes in the power on
function, it's probably best to implement them, in case they are needed
in some situations.

Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/c12da54f-88e6-4b11-8587-36f9cac13bf3@gmail.com
drivers/net/wireless/realtek/rtw89/rtw8852b.c

index b0b73a4a70a076b74df1f84fb2a58a72f87d4df7..85b6849db7986e8fae6aa87afd32a10055b4af37 100644 (file)
@@ -299,7 +299,8 @@ static int rtw8852b_pwr_on_func(struct rtw89_dev *rtwdev)
        rtw89_write8_clr(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
 
        rtw89_write8_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
-       rtw89_write32_clr(rtwdev, R_AX_SYS_SDIO_CTRL, B_AX_PCIE_CALIB_EN_V1);
+       if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE)
+               rtw89_write32_clr(rtwdev, R_AX_SYS_SDIO_CTRL, B_AX_PCIE_CALIB_EN_V1);
 
        rtw89_write32_set(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_PTA_1P3);
 
@@ -361,7 +362,7 @@ static int rtw8852b_pwr_on_func(struct rtw89_dev *rtwdev)
        rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_VOL_L1_MASK, 0x9);
        rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_VREFPFM_L_MASK, 0xA);
 
-       if (rtwdev->hal.cv == CHIP_CBV) {
+       if (rtwdev->hal.cv == CHIP_CBV && rtwdev->hci.type == RTW89_HCI_TYPE_PCIE) {
                rtw89_write32_set(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK);
                rtw89_write16_mask(rtwdev, R_AX_HCI_LDO_CTRL, B_AX_R_AX_VADJ_MASK, 0xA);
                rtw89_write32_clr(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK);
@@ -443,10 +444,22 @@ static int rtw8852b_pwr_off_func(struct rtw89_dev *rtwdev)
        if (ret)
                return ret;
 
-       rtw89_write32(rtwdev, R_AX_WLLPS_CTRL, SW_LPS_OPTION);
+       if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE)
+               rtw89_write32(rtwdev, R_AX_WLLPS_CTRL, SW_LPS_OPTION);
+       else if (rtwdev->hci.type == RTW89_HCI_TYPE_USB)
+               rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_SOP_EDSWR);
+
        rtw89_write32_set(rtwdev, R_AX_SYS_SWR_CTRL1, B_AX_SYM_CTRL_SPS_PWMFREQ);
        rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_REG_ZCDC_H_MASK, 0x3);
-       rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
+
+       if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE) {
+               rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
+       } else if (rtwdev->hci.type == RTW89_HCI_TYPE_USB) {
+               val32 = rtw89_read32(rtwdev, R_AX_SYS_PW_CTRL);
+               val32 &= ~B_AX_AFSM_PCIE_SUS_EN;
+               val32 |= B_AX_AFSM_WLSUS_EN;
+               rtw89_write32(rtwdev, R_AX_SYS_PW_CTRL, val32);
+       }
 
        return 0;
 }