summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaman Padhiar <quic_npadhiar@quicinc.com>2023-03-01 15:28:21 +0530
committerMadan Koyyalamudi <quic_mkoyyala@quicinc.com>2023-03-03 15:24:27 -0800
commit97d02063a9e4176d8dd6ce9787c40e0e57407d8f (patch)
tree1a6618e98f9bbd6454ce0b9b24054402d1732c41
parentf6f770735190989320df27745caaa7b0852cf566 (diff)
downloadwlan-platform-97d02063a9e4176d8dd6ce9787c40e0e57407d8f.tar.gz
cnss2: Avoid IDLE Shutdown during recovery
There can be scenario where CNSS driver receives IDLE shutdown request from WLAN Host driver when SSR/Recovery is in progress. In such case return -EBUSY to Host driver and avoid doing IDLE Shutdown. Change-Id: I68bea49d23e741f405acc1f2c9133cb7452d7952 CRs-Fixed: 3418977
-rw-r--r--cnss2/main.c19
1 files changed, 4 insertions, 15 deletions
diff --git a/cnss2/main.c b/cnss2/main.c
index 8fa4b18..2ad0904 100644
--- a/cnss2/main.c
+++ b/cnss2/main.c
@@ -1371,8 +1371,6 @@ EXPORT_SYMBOL(cnss_idle_restart);
int cnss_idle_shutdown(struct device *dev)
{
struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);
- unsigned int timeout;
- int ret;
if (!plat_priv) {
cnss_pr_err("plat_priv is NULL\n");
@@ -1386,21 +1384,12 @@ int cnss_idle_shutdown(struct device *dev)
cnss_pr_dbg("Doing idle shutdown\n");
- if (!test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state) &&
- !test_bit(CNSS_DEV_ERR_NOTIFY, &plat_priv->driver_state))
- goto skip_wait;
-
- reinit_completion(&plat_priv->recovery_complete);
- timeout = cnss_get_timeout(plat_priv, CNSS_TIMEOUT_RECOVERY);
- ret = wait_for_completion_timeout(&plat_priv->recovery_complete,
- msecs_to_jiffies(timeout));
- if (!ret) {
- cnss_pr_err("Timeout (%ums) waiting for recovery to complete\n",
- timeout);
- CNSS_ASSERT(0);
+ if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state) ||
+ test_bit(CNSS_DEV_ERR_NOTIFY, &plat_priv->driver_state)) {
+ cnss_pr_dbg("Recovery in progress. Ignore IDLE Shutdown\n");
+ return -EBUSY;
}
-skip_wait:
return cnss_driver_event_post(plat_priv,
CNSS_DRIVER_EVENT_IDLE_SHUTDOWN,
CNSS_EVENT_SYNC_UNINTERRUPTIBLE, NULL);