summaryrefslogtreecommitdiff
path: root/drivers/net
diff options
context:
space:
mode:
authorKomal Seelam <kseelam@codeaurora.org>2016-07-26 16:58:01 +0530
committerAnand Kumar <anandkumar@codeaurora.org>2016-08-30 14:49:30 +0530
commitfcf844fbdd18d5fd88ad4c4e7d40f1c15844f18b (patch)
tree5420338f1d7be71a49e8fe1ac04c81ff3a700deb /drivers/net
parent9bb7d6728fd1956bb3e3328d6f6dabfee0f57ae7 (diff)
cnss: Reset QCA Card during WLAN SubSystem Recovery
During SSR, we observe cases where card enter bad state and does not responding to any I/O commands. Fix it by powering off and on the card. Change-Id: Ia3ab2781c93d1cfe7427e2b1c2644f6628f6465f CRs-Fixed: 1058794 Signed-off-by: Komal Seelam <kseelam@codeaurora.org>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/cnss/cnss_sdio.c36
1 files changed, 29 insertions, 7 deletions
diff --git a/drivers/net/wireless/cnss/cnss_sdio.c b/drivers/net/wireless/cnss/cnss_sdio.c
index cd8b8538bc96..01b969ec627f 100644
--- a/drivers/net/wireless/cnss/cnss_sdio.c
+++ b/drivers/net/wireless/cnss/cnss_sdio.c
@@ -296,15 +296,25 @@ static int cnss_sdio_shutdown(const struct subsys_desc *subsys, bool force_stop)
{
struct cnss_sdio_info *cnss_info;
struct cnss_sdio_wlan_driver *wdrv;
+ int ret = 0;
if (!cnss_pdata)
return -ENODEV;
cnss_info = &cnss_pdata->cnss_sdio_info;
wdrv = cnss_info->wdrv;
- if (wdrv && wdrv->shutdown)
- wdrv->shutdown(cnss_info->func);
- return 0;
+ if (!wdrv)
+ return 0;
+ if (!wdrv->shutdown)
+ return 0;
+
+ wdrv->shutdown(cnss_info->func);
+ ret = cnss_put_hw_resources(cnss_info->dev);
+
+ if (ret)
+ pr_err("%s: Failed to put hw resources\n", __func__);
+
+ return ret;
}
static int cnss_sdio_powerup(const struct subsys_desc *subsys)
@@ -318,11 +328,23 @@ static int cnss_sdio_powerup(const struct subsys_desc *subsys)
cnss_info = &cnss_pdata->cnss_sdio_info;
wdrv = cnss_info->wdrv;
- if (wdrv && wdrv->reinit) {
- ret = wdrv->reinit(cnss_info->func, cnss_info->id);
- if (ret)
- pr_err("%s: wlan reinit error=%d\n", __func__, ret);
+
+ if (!wdrv)
+ return 0;
+
+ if (!wdrv->reinit)
+ return 0;
+
+ ret = cnss_get_hw_resources(cnss_info->dev);
+ if (ret) {
+ pr_err("%s: Failed to power up HW\n", __func__);
+ return ret;
}
+
+ ret = wdrv->reinit(cnss_info->func, cnss_info->id);
+ if (ret)
+ pr_err("%s: wlan reinit error=%d\n", __func__, ret);
+
return ret;
}