Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

rtw88: pci: disable aspm for platform inter-op with module parameter

Some platforms cannot read the DBI register successfully for the
ASPM settings. After the read failed, the bus could be unstable,
and the device just became unavailable [1]. For those platforms,
the ASPM should be disabled. But as the ASPM can help the driver
to save the power consumption in power save mode, the ASPM is still
needed. So, add a module parameter for them to disable it, then
the device can still work, while others can benefit from the less
power consumption that brings by ASPM enabled.

[1] https://bugzilla.kernel.org/show_bug.cgi?id=206411
[2] Note that my lenovo T430 is the same.

Fixes: 3dff7c6e3749 ("rtw88: allows to enable/disable HCI link PS mechanism")
Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20200605074703.32726-1-yhchuang@realtek.com

authored by

Yan-Hsuan Chuang and committed by
Kalle Valo
68aa716b f745eb9c

+9
+9
drivers/net/wireless/realtek/rtw88/pci.c
··· 14 14 #include "debug.h" 15 15 16 16 static bool rtw_disable_msi; 17 + static bool rtw_pci_disable_aspm; 17 18 module_param_named(disable_msi, rtw_disable_msi, bool, 0644); 19 + module_param_named(disable_aspm, rtw_pci_disable_aspm, bool, 0644); 18 20 MODULE_PARM_DESC(disable_msi, "Set Y to disable MSI interrupt support"); 21 + MODULE_PARM_DESC(disable_aspm, "Set Y to disable PCI ASPM support"); 19 22 20 23 static u32 rtw_pci_tx_queue_idx_addr[] = { 21 24 [RTW_TX_QUEUE_BK] = RTK_PCI_TXBD_IDX_BKQ, ··· 1203 1200 u8 value; 1204 1201 int ret; 1205 1202 1203 + if (rtw_pci_disable_aspm) 1204 + return; 1205 + 1206 1206 ret = rtw_dbi_read8(rtwdev, RTK_PCIE_LINK_CFG, &value); 1207 1207 if (ret) { 1208 1208 rtw_err(rtwdev, "failed to read CLKREQ_L1, ret=%d", ret); ··· 1224 1218 { 1225 1219 u8 value; 1226 1220 int ret; 1221 + 1222 + if (rtw_pci_disable_aspm) 1223 + return; 1227 1224 1228 1225 ret = rtw_dbi_read8(rtwdev, RTK_PCIE_LINK_CFG, &value); 1229 1226 if (ret) {