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_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;
}