Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 38fbb271 authored by Komal Seelam's avatar Komal Seelam Committed by Gerrit - the friendly Code Review server
Browse files

cnss: Reset QCA Card during WLAN SubSystem Recovery



During SSR, we observe cases where card enter bad state and is not
responding to any I/O commands. To Fix it, functional driver needs
to power off and power on the card to bring back into active state.

CRs-Fixed: 1046397
Change-Id: Ia3ab2781c93d1cfe7427e2b1c2644f6628f6465f
Signed-off-by: default avatarKomal Seelam <kseelam@codeaurora.org>
parent 2a2d5ee0
Loading
Loading
Loading
Loading
+29 −7
Original line number Original line Diff line number Diff line
@@ -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;
	if (!wdrv->shutdown)
		return 0;
		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) {

	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);
	ret = wdrv->reinit(cnss_info->func, cnss_info->id);
	if (ret)
	if (ret)
		pr_err("%s: wlan reinit error=%d\n", __func__, ret);
		pr_err("%s: wlan reinit error=%d\n", __func__, ret);
	}

	return ret;
	return ret;
}
}