On a platform, RTL8852BE gets lost from suspending, and kernel throws Unable to change power state from D3cold to D0, device inaccessible then driver throws 0000:39:00.0: failed to write DBI register, addr=0xB48 0000:39:00.0: failed to write DBI register, addr=0xB48 0000:39:00.0: failed to read PCI cap, ret=134 0000:39:00.0: xtal si not ready(W): offset=90 val=10 mask=10 0000:39:00.0: mac init fail, ret:-110 An solution is to disable d3cold via sysfs to write 1 to /sys/bus/pci/devices/0000:39:00.0/d3cold_allowed Since it's hard to measure hardware signals to find cause, add a quirk to disable d3cold for the platform. Reported-by: Marcin Wojcik Closes: https://lore.kernel.org/linux-wireless/CAE3x6Qi8Nku26B4aWE+jtJmHb=hO8C743_myNrrBzUAGyuUw9A@mail.gmail.com/ Closes: https://github.com/morrownr/rtw89/issues/18 Signed-off-by: Ping-Ke Shih --- drivers/net/wireless/realtek/rtw89/core.h | 1 + drivers/net/wireless/realtek/rtw89/pci.c | 3 +++ drivers/net/wireless/realtek/rtw89/rtw8852be.c | 14 +++++++++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h index 43e10278e14d..39085c9589da 100644 --- a/drivers/net/wireless/realtek/rtw89/core.h +++ b/drivers/net/wireless/realtek/rtw89/core.h @@ -5028,6 +5028,7 @@ enum rtw89_flags { enum rtw89_quirks { RTW89_QUIRK_PCI_BER, + RTW89_QUIRK_PCI_NO_D3COLD, RTW89_QUIRK_THERMAL_PROT_120C, RTW89_QUIRK_THERMAL_PROT_110C, diff --git a/drivers/net/wireless/realtek/rtw89/pci.c b/drivers/net/wireless/realtek/rtw89/pci.c index a669f2f843aa..c9b93191805d 100644 --- a/drivers/net/wireless/realtek/rtw89/pci.c +++ b/drivers/net/wireless/realtek/rtw89/pci.c @@ -3060,6 +3060,9 @@ static int rtw89_pci_claim_device(struct rtw89_dev *rtwdev, pci_set_master(pdev); pci_set_drvdata(pdev, rtwdev->hw); + if (test_bit(RTW89_QUIRK_PCI_NO_D3COLD, rtwdev->quirks)) + pci_d3cold_disable(pdev); + rtwpci->pdev = pdev; return 0; diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852be.c b/drivers/net/wireless/realtek/rtw89/rtw8852be.c index b0726f590ca2..ea6c129a3422 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8852be.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8852be.c @@ -65,10 +65,22 @@ static const struct rtw89_pci_info rtw8852b_pci_info = { .ssid_quirks = NULL, }; +static const struct dmi_system_id rtw8852b_pci_quirks[] = { + { + .ident = "ASUS TUF Gaming F16 FX607VUR_FX607VU", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), + DMI_MATCH(DMI_PRODUCT_NAME, "ASUS TUF Gaming F16 FX607VUR_FX607VU"), + }, + .driver_data = (void *)RTW89_QUIRK_PCI_NO_D3COLD, + }, + {}, +}; + static const struct rtw89_driver_info rtw89_8852be_info = { .chip = &rtw8852b_chip_info, .variant = NULL, - .quirks = NULL, + .quirks = rtw8852b_pci_quirks, .bus = { .pci = &rtw8852b_pci_info, }, -- 2.25.1