diff options
author | Naman Padhiar <quic_npadhiar@quicinc.com> | 2023-03-01 15:28:21 +0530 |
---|---|---|
committer | Madan Koyyalamudi <quic_mkoyyala@quicinc.com> | 2023-03-03 15:24:27 -0800 |
commit | 97d02063a9e4176d8dd6ce9787c40e0e57407d8f (patch) | |
tree | 1a6618e98f9bbd6454ce0b9b24054402d1732c41 | |
parent | f6f770735190989320df27745caaa7b0852cf566 (diff) | |
download | wlan-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.c | 19 |
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); |