From a7958f33a34c52b50b5bf63f0482c4e1117ed68f Mon Sep 17 00:00:00 2001 From: Yue Ma Date: Mon, 9 Nov 2020 16:23:35 -0800 Subject: [PATCH] cnss2: Avoid suspending PCIe after QMI send get is called Introduce usage count for QMI send get/put APIs. Make sure PCIe link will not be suspended from runtime PM path if the usage count is not 0. That means PCIe link should be always up when host driver starts to proceed stats query from upper layer. Change-Id: I0ff62874d62c4db2292236d8b4b5c2e09e439a5b Signed-off-by: Yue Ma --- drivers/net/wireless/cnss2/pci.c | 44 +++++++++++++++++--------------- drivers/net/wireless/cnss2/pci.h | 1 + 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index fbd1584cc233..45a052456998 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -2098,6 +2098,9 @@ static int cnss_qca6290_powerup(struct cnss_pci_data *pci_priv) cnss_pci_deinit_mhi(pci_priv); } + /* Clear QMI send usage count during every power up */ + pci_priv->qmi_send_usage_count = 0; + retry: ret = cnss_power_on_device(plat_priv); if (ret) { @@ -3194,10 +3197,12 @@ int cnss_auto_suspend(struct device *dev) return -ENODEV; mutex_lock(&pci_priv->bus_lock); - ret = cnss_pci_suspend_bus(pci_priv); - if (ret) { - mutex_unlock(&pci_priv->bus_lock); - return ret; + if (!pci_priv->qmi_send_usage_count) { + ret = cnss_pci_suspend_bus(pci_priv); + if (ret) { + mutex_unlock(&pci_priv->bus_lock); + return ret; + } } cnss_pci_set_auto_suspended(pci_priv, 1); @@ -3371,15 +3376,14 @@ int cnss_pci_qmi_send_get(struct cnss_pci_data *pci_priv) return -ENODEV; mutex_lock(&pci_priv->bus_lock); - if (!cnss_pci_get_auto_suspended(pci_priv)) - goto out; - - cnss_pr_vdbg("Starting to handle get info prepare\n"); - - ret = cnss_pci_resume_bus(pci_priv); - -out: + if (cnss_pci_get_auto_suspended(pci_priv) && + !pci_priv->qmi_send_usage_count) + ret = cnss_pci_resume_bus(pci_priv); + pci_priv->qmi_send_usage_count++; + cnss_pr_vdbg("Increased QMI send usage count to %d\n", + pci_priv->qmi_send_usage_count); mutex_unlock(&pci_priv->bus_lock); + return ret; } @@ -3391,15 +3395,15 @@ int cnss_pci_qmi_send_put(struct cnss_pci_data *pci_priv) return -ENODEV; mutex_lock(&pci_priv->bus_lock); - if (!cnss_pci_get_auto_suspended(pci_priv)) - goto out; - - cnss_pr_vdbg("Starting to handle get info done\n"); - - ret = cnss_pci_suspend_bus(pci_priv); - -out: + if (pci_priv->qmi_send_usage_count) + pci_priv->qmi_send_usage_count--; + cnss_pr_vdbg("Decreased QMI send usage count to %d\n", + pci_priv->qmi_send_usage_count); + if (cnss_pci_get_auto_suspended(pci_priv) && + !pci_priv->qmi_send_usage_count) + ret = cnss_pci_suspend_bus(pci_priv); mutex_unlock(&pci_priv->bus_lock); + return ret; } diff --git a/drivers/net/wireless/cnss2/pci.h b/drivers/net/wireless/cnss2/pci.h index d417a81e6152..1b5195a9655b 100644 --- a/drivers/net/wireless/cnss2/pci.h +++ b/drivers/net/wireless/cnss2/pci.h @@ -90,6 +90,7 @@ struct cnss_pci_data { atomic_t auto_suspended; atomic_t drv_connected; u8 drv_connected_last; + u32 qmi_send_usage_count; u16 def_link_speed; u16 def_link_width; struct completion wake_event;