diff --git a/drivers/net/wireless/rockchip_wlan/rkwifi/Kconfig b/drivers/net/wireless/rockchip_wlan/rkwifi/Kconfig index f46c116b6c4f..3659e604e920 100644 --- a/drivers/net/wireless/rockchip_wlan/rkwifi/Kconfig +++ b/drivers/net/wireless/rockchip_wlan/rkwifi/Kconfig @@ -30,6 +30,12 @@ config BCMDHD_PCIE endchoice +config PCIEASPM_ROCKCHIP_WIFI_EXTENSION + bool "Extend ASPM function" + depends on BCMDHD_PCIE && PCIEASPM_EXT + help + This enables the extensions APIs for ASPM control. + config BCMDHD_FW_PATH depends on BCMDHD string "Firmware path" diff --git a/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c b/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c index b24def7768d3..bee40a506197 100755 --- a/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c +++ b/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c @@ -65,6 +65,7 @@ #include #include #include +#include #include #include @@ -12518,6 +12519,9 @@ dhd_bus_start(dhd_pub_t *dhdp) dhd_bus_l1ss_enable_rc_ep(dhdp->bus, TRUE); #endif /* BT_OVER_PCIE */ + if (IS_ENABLED(CONFIG_PCIEASPM_ROCKCHIP_WIFI_EXTENSION)) + rk_dhd_bus_l1ss_enable_rc_ep(dhdp->bus, TRUE); + #if defined(CONFIG_ARCH_EXYNOS) && defined(BCMPCIE) #if !defined(CONFIG_SOC_EXYNOS8890) && !defined(SUPPORT_EXYNOS7420) /* XXX: JIRA SWWLAN-139454: Added L1ss enable diff --git a/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie_linux.c b/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie_linux.c index 270cfeeed7e9..1d0442916575 100755 --- a/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie_linux.c +++ b/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie_linux.c @@ -47,6 +47,7 @@ #include #include #include +#include #ifdef OEM_ANDROID #ifdef CONFIG_ARCH_MSM #if defined(CONFIG_PCI_MSM) || defined(CONFIG_ARCH_MSM8996) @@ -617,6 +618,8 @@ dhd_bus_is_rc_ep_l1ss_capable(dhd_bus_t *bus) uint32 rc_l1ss_cap; uint32 ep_l1ss_cap; + if (IS_ENABLED(CONFIG_PCIEASPM_ROCKCHIP_WIFI_EXTENSION)) + return rk_dhd_bus_is_rc_ep_l1ss_capable(bus); /* RC Extendend Capacility */ rc_l1ss_cap = dhdpcie_access_cap(bus->rc_dev, PCIE_EXTCAP_ID_L1SS, PCIE_EXTCAP_L1SS_CONTROL_OFFSET, TRUE, FALSE, 0); diff --git a/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/rk_dhd_pcie_linux.h b/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/rk_dhd_pcie_linux.h new file mode 100644 index 000000000000..c6fedf9fb78b --- /dev/null +++ b/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/rk_dhd_pcie_linux.h @@ -0,0 +1,36 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Rockchip PCIe Apis For WIFI + * + * Copyright (c) 2022, Rockchip Electronics Co., Ltd. + */ + +#ifndef __RK_DHD_PCIE_LINUX_H__ +#define __RK_DHD_PCIE_LINUX_H__ + +#include +#include +#include +#include +#include + +static inline void +rk_dhd_bus_l1ss_enable_rc_ep(dhd_bus_t *bus, bool enable) +{ + if (!bus->rc_ep_aspm_cap || !bus->rc_ep_l1ss_cap) { + pr_err("%s: NOT L1SS CAPABLE rc_ep_aspm_cap: %d rc_ep_l1ss_cap: %d\n", + __func__, bus->rc_ep_aspm_cap, bus->rc_ep_l1ss_cap); + return; + } + + /* Disable ASPM of RC and EP */ + pcie_aspm_ext_l1ss_enable(bus->dev, bus->rc_dev, enable); +} + +static inline bool +rk_dhd_bus_is_rc_ep_l1ss_capable(dhd_bus_t *bus) +{ + return pcie_aspm_ext_is_rc_ep_l1ss_capable(bus->dev, bus->rc_dev); +} + +#endif /* __RK_DHD_PCIE_LINUX_H__ */