wifi: rtw89: pci: disable PCIE wake bit when PCIE deinit
Subsystems (2)
PATCH 1/1 wifi: rtw89: pci: disable PCIE wake bit when PCIE deinit
From: Ping-Ke Shih <[email protected]>
[ Upstream commit 9c1df813e08832c3836c254bc8a2f83ff22dbc06 ]
The PCIE wake bit is to control PCIE wake signal to host. When PCIE is going down, clear this bit to prevent waking up host unexpectedly.
Signed-off-by Ping-Ke Shih <[email protected]>
Signed-off-by Zenm Chen <[email protected]>
---
Some users of RTL8852BE chip may encounter a shutdown issue [1] and this upstream patch fixes it, so backport it to kernel 6.13.
[1] https://github.com/lwfinger/rtw89/issues/372
--- drivers/net/wireless/realtek/rtw89/pci.c | 16 +++++++++++++--- drivers/net/wireless/realtek/rtw89/pci.h | 9 +++++++++ drivers/net/wireless/realtek/rtw89/pci_be.c | 1 + 3 files changed, 23 insertions(+), 3 deletions(-)
drivers/net/wireless/realtek/rtw89/pci.c +13 -3
@@ -2516,7 +2516,7 @@ static int rtw89_pci_dphy_delay(struct rtw89_dev *rtwdev) PCIE_DPHY_DLY_25US, PCIE_PHY_GEN1); } -static void rtw89_pci_power_wake (struct rtw89_dev *rtwdev,bool pwr_up) +static void rtw89_pci_power_wake_ax (struct rtw89_dev *rtwdev,bool pwr_up) {if (pwr_up)rtw89_write32_set (rtwdev,R_AX_HCI_OPT_CTRL ,BIT_WAKE_CTRL );
@@ -2825,6 +2825,8 @@ static int rtw89_pci_ops_deinit(struct rtw89_dev *rtwdev) {const struct rtw89_pci_info *info = rtwdev->pci_info; +rtw89_pci_power_wake (rtwdev, false); +if (rtwdev->chip->chip_id ==RTL8852A ) {/* ltr sw trigger */ rtw89_write32_set (rtwdev,R_AX_LTR_CTRL_0 ,B_AX_APP_LTR_IDLE );
@@ -2867,7 +2869,7 @@ static int rtw89_pci_ops_mac_pre_init_ax(struct rtw89_dev *rtwdev)return ret; } -rtw89_pci_power_wake (rtwdev, true); +rtw89_pci_power_wake_ax (rtwdev, true);rtw89_pci_autoload_hang (rtwdev);rtw89_pci_l12_vmain (rtwdev);rtw89_pci_gen2_force_ib (rtwdev);
@@ -2912,6 +2914,13 @@ static int rtw89_pci_ops_mac_pre_init_ax(struct rtw89_dev *rtwdev)return 0 ; } +static int rtw89_pci_ops_mac_pre_deinit_ax (struct rtw89_dev *rtwdev) +{ +rtw89_pci_power_wake_ax (rtwdev, false); + +return 0 ; +} +int rtw89_pci_ltr_set (struct rtw89_dev *rtwdev,bool en) {u32 val;
@@ -4325,7 +4334,7 @@ const struct rtw89_pci_gen_def rtw89_pci_gen_ax = { B_AX_RDU_INT}, .mac_pre_init = rtw89_pci_ops_mac_pre_init_ax, - .mac_pre_deinit = NULL, + .mac_pre_deinit = rtw89_pci_ops_mac_pre_deinit_ax, .mac_post_init = rtw89_pci_ops_mac_post_init_ax, .clr_idx_all = rtw89_pci_clr_idx_all_ax,
@@ -4343,6 +4352,7 @@ const struct rtw89_pci_gen_def rtw89_pci_gen_ax = { .l1ss_set = rtw89_pci_l1ss_set_ax, .disable_eq = rtw89_pci_disable_eq_ax, + .power_wake = rtw89_pci_power_wake_ax, };EXPORT_SYMBOL (rtw89_pci_gen_ax);
drivers/net/wireless/realtek/rtw89/pci.h +9 -0
@@ -1290,6 +1290,7 @@ struct rtw89_pci_gen_def {void (*l1ss_set)(struct rtw89_dev *rtwdev,bool enable);void (*disable_eq)(struct rtw89_dev *rtwdev); +void (*power_wake)(struct rtw89_dev *rtwdev,bool pwr_up); };#define RTW89_PCI_SSID (v, d, ssv, ssd, cust) \
@@ -1805,4 +1806,12 @@ static inline void rtw89_pci_disable_eq(struct rtw89_dev *rtwdev) gen_def->disable_eq(rtwdev); } +static inline void rtw89_pci_power_wake (struct rtw89_dev *rtwdev,bool pwr_up) +{ +const struct rtw89_pci_info *info = rtwdev->pci_info; +const struct rtw89_pci_gen_def *gen_def = info->gen_def; + + gen_def->power_wake (rtwdev, pwr_up); +} +#endif
drivers/net/wireless/realtek/rtw89/pci_be.c +1 -0
@@ -691,5 +691,6 @@ const struct rtw89_pci_gen_def rtw89_pci_gen_be = { .l1ss_set = rtw89_pci_l1ss_set_be, .disable_eq = rtw89_pci_disable_eq_be, + .power_wake = _patch_pcie_power_wake_be, };EXPORT_SYMBOL (rtw89_pci_gen_be);
Signature · 1 line
2.48.1