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>
This commit is contained in:
Komal Seelam 2016-07-26 16:58:01 +05:30 committed by Anand Kumar
parent 9bb7d6728f
commit fcf844fbdd

View file

@ -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_info *cnss_info;
struct cnss_sdio_wlan_driver *wdrv; struct cnss_sdio_wlan_driver *wdrv;
int ret = 0;
if (!cnss_pdata) if (!cnss_pdata)
return -ENODEV; return -ENODEV;
cnss_info = &cnss_pdata->cnss_sdio_info; cnss_info = &cnss_pdata->cnss_sdio_info;
wdrv = cnss_info->wdrv; wdrv = cnss_info->wdrv;
if (wdrv && wdrv->shutdown) if (!wdrv)
wdrv->shutdown(cnss_info->func); return 0;
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) 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; cnss_info = &cnss_pdata->cnss_sdio_info;
wdrv = cnss_info->wdrv; wdrv = cnss_info->wdrv;
if (wdrv && wdrv->reinit) {
ret = wdrv->reinit(cnss_info->func, cnss_info->id); if (!wdrv)
if (ret) return 0;
pr_err("%s: wlan reinit error=%d\n", __func__, ret);
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; return ret;
} }