More and more laptops become frozen, due to the equipped RTL8821CE. This patch follows the idea mentioned in commits 956c6d4f20c5 ("rtw88: add quirks to disable pci capabilities") and 1d4dcaf3db9bd ("rtw88: add quirk to disable pci caps on HP Pavilion 14-ce0xxx"), but disables its PCI ASPM capability of RTL8821CE directly, instead of checking DMI. Buglink:https://bugzilla.kernel.org/show_bug.cgi?id=215239 Fixes: 1d4dcaf3db9bd ("rtw88: add quirk to disable pci caps on HP Pavilion 14-ce0xxx") Signed-off-by: Jian-Hong Pan <jhp@xxxxxxxxxxxxx> --- drivers/net/wireless/realtek/rtw88/main.h | 3 ++ drivers/net/wireless/realtek/rtw88/pci.c | 33 ++----------------- drivers/net/wireless/realtek/rtw88/pci.h | 5 +++ drivers/net/wireless/realtek/rtw88/rtw8821c.c | 3 ++ 4 files changed, 14 insertions(+), 30 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h index bbdd535b64e7..31cd427a0949 100644 --- a/drivers/net/wireless/realtek/rtw88/main.h +++ b/drivers/net/wireless/realtek/rtw88/main.h @@ -1259,6 +1259,9 @@ struct rtw_chip_info { const struct rtw_hw_reg *btg_reg; const struct rtw_reg_domain *coex_info_hw_regs; u32 wl_fw_desired_ver; + + /* quirk flags */ + u32 pci_quirk_data; }; enum rtw_coex_bt_state_cnt { diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c index a7a6ebfaa203..0a858db2d515 100644 --- a/drivers/net/wireless/realtek/rtw88/pci.c +++ b/drivers/net/wireless/realtek/rtw88/pci.c @@ -1702,14 +1702,9 @@ static void rtw_pci_napi_deinit(struct rtw_dev *rtwdev) netif_napi_del(&rtwpci->napi); } -enum rtw88_quirk_dis_pci_caps { - QUIRK_DIS_PCI_CAP_MSI, - QUIRK_DIS_PCI_CAP_ASPM, -}; - -static int disable_pci_caps(const struct dmi_system_id *dmi) +static int disable_pci_caps_by_chip(const struct rtw_chip_info *chip) { - uintptr_t dis_caps = (uintptr_t)dmi->driver_data; + u32 dis_caps = chip->pci_quirk_data; if (dis_caps & BIT(QUIRK_DIS_PCI_CAP_MSI)) rtw_disable_msi = true; @@ -1719,28 +1714,6 @@ static int disable_pci_caps(const struct dmi_system_id *dmi) return 1; } -static const struct dmi_system_id rtw88_pci_quirks[] = { - { - .callback = disable_pci_caps, - .ident = "Protempo Ltd L116HTN6SPW", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Protempo Ltd"), - DMI_MATCH(DMI_PRODUCT_NAME, "L116HTN6SPW"), - }, - .driver_data = (void *)BIT(QUIRK_DIS_PCI_CAP_ASPM), - }, - { - .callback = disable_pci_caps, - .ident = "HP HP Pavilion Laptop 14-ce0xxx", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "HP"), - DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Laptop 14-ce0xxx"), - }, - .driver_data = (void *)BIT(QUIRK_DIS_PCI_CAP_ASPM), - }, - {} -}; - int rtw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { @@ -1791,7 +1764,7 @@ int rtw_pci_probe(struct pci_dev *pdev, goto err_destroy_pci; } - dmi_check_system(rtw88_pci_quirks); + disable_pci_caps_by_chip(rtwdev->chip); rtw_pci_phy_cfg(rtwdev); ret = rtw_register_hw(rtwdev, hw); diff --git a/drivers/net/wireless/realtek/rtw88/pci.h b/drivers/net/wireless/realtek/rtw88/pci.h index 66f78eb7757c..f470387fbb9a 100644 --- a/drivers/net/wireless/realtek/rtw88/pci.h +++ b/drivers/net/wireless/realtek/rtw88/pci.h @@ -274,4 +274,9 @@ struct rtw_pci_tx_buffer_desc *get_tx_buffer_desc(struct rtw_pci_tx_ring *ring, return (struct rtw_pci_tx_buffer_desc *)buf_desc; } +enum rtw88_quirk_dis_pci_caps { + QUIRK_DIS_PCI_CAP_MSI, + QUIRK_DIS_PCI_CAP_ASPM, +}; + #endif diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c index 80a6f4da6acd..4d684534fa1e 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c +++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c @@ -15,6 +15,7 @@ #include "debug.h" #include "bf.h" #include "regd.h" +#include "pci.h" static const s8 lna_gain_table_0[8] = {22, 8, -6, -22, -31, -40, -46, -52}; static const s8 lna_gain_table_1[16] = {10, 6, 2, -2, -6, -10, -14, -17, @@ -1947,6 +1948,8 @@ struct rtw_chip_info rtw8821c_hw_spec = { .coex_info_hw_regs_num = ARRAY_SIZE(coex_info_hw_regs_8821c), .coex_info_hw_regs = coex_info_hw_regs_8821c, + + .pci_quirk_data = BIT(QUIRK_DIS_PCI_CAP_ASPM), }; EXPORT_SYMBOL(rtw8821c_hw_spec); -- 2.34.1