aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSandeep Singh <sandsing@codeaurora.org>2020-10-07 16:59:11 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2020-10-08 22:09:57 -0700
commit19d54cc029d1fd286f0614b6f36008cc9c725097 (patch)
treeff74e151face6b8c358b96cb4fc51b454c787892
parent2437c8274dafcd997b7915e22dc7ff31ea5595fb (diff)
icnss: reject idle restart if wlan driver unregisteredLA.UM.8.12.c3-17500-sm8250.0
This change is to reject idle restart if wlan driver unregistered or unregistration is in progress. Kernel holds rtnl lock before calling interface up and wlan driver needs same rtnl lock to complete driver unregister. In scenerio's where idle rstart and wlan driver remove gets called back to back, there is a possibility of deadlock. So, with this change reject idle restart if wlan driver is getting unregistered. Change-Id: If6733a039d896cbd682af6ebbdccacc11107c03d Signed-off-by: Sandeep Singh <sandsing@codeaurora.org>
-rw-r--r--drivers/soc/qcom/icnss.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/soc/qcom/icnss.c b/drivers/soc/qcom/icnss.c
index 23b7609503ae..a5387a1b7643 100644
--- a/drivers/soc/qcom/icnss.c
+++ b/drivers/soc/qcom/icnss.c
@@ -1312,6 +1312,12 @@ static int icnss_driver_event_idle_restart(void *data)
if (!penv->ops || !penv->ops->idle_restart)
return 0;
+ if (!test_bit(ICNSS_DRIVER_PROBED, &penv->state) ||
+ test_bit(ICNSS_DRIVER_UNLOADING, &penv->state)) {
+ icnss_pr_err("Driver unloaded or unloading is in progress, so reject idle restart");
+ return -EINVAL;
+ }
+
if (penv->is_ssr || test_bit(ICNSS_PDR, &penv->state) ||
test_bit(ICNSS_REJUVENATE, &penv->state)) {
icnss_pr_err("SSR/PDR is already in-progress during idle restart callback\n");
@@ -2335,6 +2341,12 @@ int icnss_idle_restart(struct device *dev)
return -EINVAL;
}
+ if (!test_bit(ICNSS_DRIVER_PROBED, &penv->state) ||
+ test_bit(ICNSS_DRIVER_UNLOADING, &penv->state)) {
+ icnss_pr_err("Driver unloaded or unloading is in progress, so reject idle restart");
+ return -EINVAL;
+ }
+
if (priv->is_ssr || test_bit(ICNSS_PDR, &priv->state) ||
test_bit(ICNSS_REJUVENATE, &penv->state)) {
icnss_pr_err("SSR/PDR is already in-progress during idle restart\n");