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-14 00:35:03 -0700
commit2e5d7c73abb82b1ded954643f414d542877a4461 (patch)
tree182e34f02473965e1c91285fe984c486468b51fb
parentaca39cf6a80f90588c79d6eb07e944b5dbd3dc69 (diff)
icnss: reject idle restart if wlan driver unregisteredLA.UM.8.13.r1-10500-SAIPAN.0LA.UM.8.13.r1-10400-SAIPAN.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");