diff options
author | Sandeep Singh <sandsing@codeaurora.org> | 2020-10-07 16:59:11 +0530 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2020-10-08 22:09:57 -0700 |
commit | 19d54cc029d1fd286f0614b6f36008cc9c725097 (patch) | |
tree | ff74e151face6b8c358b96cb4fc51b454c787892 | |
parent | 2437c8274dafcd997b7915e22dc7ff31ea5595fb (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.c | 12 |
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"); |