]> git.ipfire.org Git - thirdparty/kernel/stable.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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 21 Feb 2025 13:01:46 +0000 (14:01 +0100)
commit 9c1df813e08832c3836c254bc8a2f83ff22dbc06 upstream.

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
Signed-off-by: Zenm Chen <zenmchen@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/wireless/realtek/rtw89/pci.c
drivers/net/wireless/realtek/rtw89/pci.h
drivers/net/wireless/realtek/rtw89/pci_be.c

index 5aef7fa378788c5d219c3ed19259aff3f4c67ddf..0ac84f968994b4e55d060d0d4365fd8438f009dc 100644 (file)
@@ -2492,7 +2492,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);
@@ -2799,6 +2799,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);
@@ -2841,7 +2843,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);
@@ -2886,6 +2888,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;
@@ -4264,7 +4273,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,
@@ -4280,6 +4289,8 @@ const struct rtw89_pci_gen_def rtw89_pci_gen_ax = {
        .aspm_set = rtw89_pci_aspm_set_ax,
        .clkreq_set = rtw89_pci_clkreq_set_ax,
        .l1ss_set = rtw89_pci_l1ss_set_ax,
+
+       .power_wake = rtw89_pci_power_wake_ax,
 };
 EXPORT_SYMBOL(rtw89_pci_gen_ax);
 
index 48c3ab735db2a707490718610d69ad130370eec9..0ea4dcb84dd862ba74851b1ac1381e73c9d04621 100644 (file)
@@ -1276,6 +1276,8 @@ struct rtw89_pci_gen_def {
        void (*aspm_set)(struct rtw89_dev *rtwdev, bool enable);
        void (*clkreq_set)(struct rtw89_dev *rtwdev, bool enable);
        void (*l1ss_set)(struct rtw89_dev *rtwdev, bool enable);
+
+       void (*power_wake)(struct rtw89_dev *rtwdev, bool pwr_up);
 };
 
 struct rtw89_pci_info {
@@ -1766,4 +1768,13 @@ static inline int rtw89_pci_poll_txdma_ch_idle(struct rtw89_dev *rtwdev)
 
        return gen_def->poll_txdma_ch_idle(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 7cc32822296528387af769b8d9cbba564502a6ce..2f0d9ff25ba520ba7f801e3e7d048cc962da1643 100644 (file)
@@ -614,5 +614,7 @@ const struct rtw89_pci_gen_def rtw89_pci_gen_be = {
        .aspm_set = rtw89_pci_aspm_set_be,
        .clkreq_set = rtw89_pci_clkreq_set_be,
        .l1ss_set = rtw89_pci_l1ss_set_be,
+
+       .power_wake = _patch_pcie_power_wake_be,
 };
 EXPORT_SYMBOL(rtw89_pci_gen_be);