Skip to content

Commit 273acf3

Browse files
committed
wifi: rtw89: 8852b: Fix rtw8852b_pwr_{on,off}_func() for USB
JIRA: https://issues.redhat.com/browse/RHEL-114889 commit 0980de0 Author: Bitterblue Smith <rtl8821cerfe2@gmail.com> Date: Sat Jul 5 22:37:32 2025 +0300 wifi: rtw89: 8852b: Fix rtw8852b_pwr_{on,off}_func() for USB 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 Signed-off-by: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
1 parent 2f4596c commit 273acf3

File tree

1 file changed

+17
-4
lines changed

1 file changed

+17
-4
lines changed

drivers/net/wireless/realtek/rtw89/rtw8852b.c

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,8 @@ static int rtw8852b_pwr_on_func(struct rtw89_dev *rtwdev)
299299
rtw89_write8_clr(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
300300

301301
rtw89_write8_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
302-
rtw89_write32_clr(rtwdev, R_AX_SYS_SDIO_CTRL, B_AX_PCIE_CALIB_EN_V1);
302+
if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE)
303+
rtw89_write32_clr(rtwdev, R_AX_SYS_SDIO_CTRL, B_AX_PCIE_CALIB_EN_V1);
303304

304305
rtw89_write32_set(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_PTA_1P3);
305306

@@ -361,7 +362,7 @@ static int rtw8852b_pwr_on_func(struct rtw89_dev *rtwdev)
361362
rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_VOL_L1_MASK, 0x9);
362363
rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_VREFPFM_L_MASK, 0xA);
363364

364-
if (rtwdev->hal.cv == CHIP_CBV) {
365+
if (rtwdev->hal.cv == CHIP_CBV && rtwdev->hci.type == RTW89_HCI_TYPE_PCIE) {
365366
rtw89_write32_set(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK);
366367
rtw89_write16_mask(rtwdev, R_AX_HCI_LDO_CTRL, B_AX_R_AX_VADJ_MASK, 0xA);
367368
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)
443444
if (ret)
444445
return ret;
445446

446-
rtw89_write32(rtwdev, R_AX_WLLPS_CTRL, SW_LPS_OPTION);
447+
if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE)
448+
rtw89_write32(rtwdev, R_AX_WLLPS_CTRL, SW_LPS_OPTION);
449+
else if (rtwdev->hci.type == RTW89_HCI_TYPE_USB)
450+
rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_SOP_EDSWR);
451+
447452
rtw89_write32_set(rtwdev, R_AX_SYS_SWR_CTRL1, B_AX_SYM_CTRL_SPS_PWMFREQ);
448453
rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_REG_ZCDC_H_MASK, 0x3);
449-
rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
454+
455+
if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE) {
456+
rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
457+
} else if (rtwdev->hci.type == RTW89_HCI_TYPE_USB) {
458+
val32 = rtw89_read32(rtwdev, R_AX_SYS_PW_CTRL);
459+
val32 &= ~B_AX_AFSM_PCIE_SUS_EN;
460+
val32 |= B_AX_AFSM_WLSUS_EN;
461+
rtw89_write32(rtwdev, R_AX_SYS_PW_CTRL, val32);
462+
}
450463

451464
return 0;
452465
}

0 commit comments

Comments
 (0)