From cd68afdcc7ef6c5a9ffc84cdbaedafd9c72380d6 Mon Sep 17 00:00:00 2001 From: Yue Ma Date: Tue, 31 Mar 2020 16:28:46 -0700 Subject: [PATCH] cnss2: Skip link down recovery if link has been recovered by retry There is no need to proceed link down recovery if link has been recovered by retries during power on sequence. Change-Id: I876f2e239b519d4230b5c115cdc05ff7650f5cd1 Signed-off-by: Yue Ma --- drivers/net/wireless/cnss2/bus.c | 15 +++++++++++++++ drivers/net/wireless/cnss2/bus.h | 1 + drivers/net/wireless/cnss2/main.c | 4 ++++ drivers/net/wireless/cnss2/pci.c | 2 +- drivers/net/wireless/cnss2/pci.h | 1 + 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/cnss2/bus.c b/drivers/net/wireless/cnss2/bus.c index c590f53af8f2..94e0a4d4fed3 100644 --- a/drivers/net/wireless/cnss2/bus.c +++ b/drivers/net/wireless/cnss2/bus.c @@ -418,6 +418,21 @@ int cnss_bus_is_device_down(struct cnss_plat_data *plat_priv) } } +int cnss_bus_check_link_status(struct cnss_plat_data *plat_priv) +{ + if (!plat_priv) + return -ENODEV; + + switch (plat_priv->bus_type) { + case CNSS_BUS_PCI: + return cnss_pci_check_link_status(plat_priv->bus_priv); + default: + cnss_pr_dbg("Unsupported bus type: %d\n", + plat_priv->bus_type); + return 0; + } +} + int cnss_bus_debug_reg_read(struct cnss_plat_data *plat_priv, u32 offset, u32 *val) { diff --git a/drivers/net/wireless/cnss2/bus.h b/drivers/net/wireless/cnss2/bus.h index 4b9e91f5e0e8..1e7cc0f3c1f2 100644 --- a/drivers/net/wireless/cnss2/bus.h +++ b/drivers/net/wireless/cnss2/bus.h @@ -48,6 +48,7 @@ int cnss_bus_call_driver_modem_status(struct cnss_plat_data *plat_priv, int cnss_bus_update_status(struct cnss_plat_data *plat_priv, enum cnss_driver_status status); int cnss_bus_is_device_down(struct cnss_plat_data *plat_priv); +int cnss_bus_check_link_status(struct cnss_plat_data *plat_priv); int cnss_bus_debug_reg_read(struct cnss_plat_data *plat_priv, u32 offset, u32 *val); int cnss_bus_debug_reg_write(struct cnss_plat_data *plat_priv, u32 offset, diff --git a/drivers/net/wireless/cnss2/main.c b/drivers/net/wireless/cnss2/main.c index b970f81d1d73..55de963da189 100644 --- a/drivers/net/wireless/cnss2/main.c +++ b/drivers/net/wireless/cnss2/main.c @@ -996,6 +996,10 @@ static int cnss_do_recovery(struct cnss_plat_data *plat_priv, switch (reason) { case CNSS_REASON_LINK_DOWN: + if (!cnss_bus_check_link_status(plat_priv)) { + cnss_pr_dbg("Skip link down recovery as link is already up\n"); + return 0; + } if (test_bit(LINK_DOWN_SELF_RECOVERY, &plat_priv->ctrl_params.quirks)) goto self_recovery; diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index 00193d50e849..75e182481d20 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -374,7 +374,7 @@ static struct cnss_bus_bw_cfg cnss_bus_bw_table[] = { #define PCIE_REG_SIZE ARRAY_SIZE(pcie_reg_access_seq) #define WLAON_REG_SIZE ARRAY_SIZE(wlaon_reg_access_seq) -static int cnss_pci_check_link_status(struct cnss_pci_data *pci_priv) +int cnss_pci_check_link_status(struct cnss_pci_data *pci_priv) { u16 device_id; diff --git a/drivers/net/wireless/cnss2/pci.h b/drivers/net/wireless/cnss2/pci.h index 3e872d17c19d..b04cb4ec6dc8 100644 --- a/drivers/net/wireless/cnss2/pci.h +++ b/drivers/net/wireless/cnss2/pci.h @@ -161,6 +161,7 @@ static inline int cnss_pci_get_drv_connected(void *bus_priv) return atomic_read(&pci_priv->drv_connected); } +int cnss_pci_check_link_status(struct cnss_pci_data *pci_priv); int cnss_suspend_pci_link(struct cnss_pci_data *pci_priv); int cnss_resume_pci_link(struct cnss_pci_data *pci_priv); int cnss_pci_init(struct cnss_plat_data *plat_priv);