]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: pci: disable PCIE wake bit when PCIE deinit
authorPing-Ke Shih <pkshih@realtek.com>
Mon, 11 Nov 2024 06:38:35 +0000 (14:38 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Mon, 18 Nov 2024 02:05:59 +0000 (10:05 +0800)
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 <pkshih@realtek.com>
Link: https://patch.msgid.link/20241111063835.15454-1-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/pci.c
drivers/net/wireless/realtek/rtw89/pci.h
drivers/net/wireless/realtek/rtw89/pci_be.c

index f923bec03d410f391b1a7fa0e8a3a00bfc9f6141..c3a027735d0f977d55ba4d2a668f126aad3abe92 100644 (file)
@@ -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);
 
index b68e2d82eea90d05c1d12c02d0ee8aade791fa72..d52db4ca1b9979ec49550dd6274f8ec0f672d80c 100644 (file)
@@ -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
index 34154506f5d467f70e674a7ce622fbe7044dde61..cd39eebe818615d0a943849cbc1eddb0711fddce 100644 (file)
@@ -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);