summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorAnurag Chouhan <achouhan@codeaurora.org>2017-04-10 17:26:47 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2017-04-28 00:01:54 -0700
commitd65bd33775807fb23a23b49b2bafd936b8e5ad6e (patch)
treea1fa6216bce1a8763c3ecf5d6312c7bac35c59c1 /drivers
parent0abd412d833e1f914d366a89d533bcb5cd6be7c7 (diff)
icnss: Add support to handle SSR within SSR
Add state bit to defer recursive shutdown. This state bit adds support for synchronization between reinit and shutdown method during SSR within SSR. Change-Id: Ifb857ecdb6545709706380631c423f0e24269e11 Signed-off-by: Anurag Chouhan <achouhan@codeaurora.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/soc/qcom/icnss.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/soc/qcom/icnss.c b/drivers/soc/qcom/icnss.c
index ab46eb70651c..51a6e3bf0e64 100644
--- a/drivers/soc/qcom/icnss.c
+++ b/drivers/soc/qcom/icnss.c
@@ -202,6 +202,7 @@ enum icnss_driver_state {
ICNSS_MSA0_ASSIGNED,
ICNSS_WLFW_EXISTS,
ICNSS_WDOG_BITE,
+ ICNSS_SHUTDOWN_DONE,
};
struct ce_irq_list {
@@ -1990,9 +1991,13 @@ static int icnss_call_driver_shutdown(struct icnss_priv *priv)
if (!priv->ops || !priv->ops->shutdown)
goto out;
+ if (test_bit(ICNSS_SHUTDOWN_DONE, &penv->state))
+ goto out;
+
icnss_pr_dbg("Calling driver shutdown state: 0x%lx\n", priv->state);
priv->ops->shutdown(&priv->pdev->dev);
+ set_bit(ICNSS_SHUTDOWN_DONE, &penv->state);
out:
return 0;
@@ -2030,6 +2035,7 @@ static int icnss_pd_restart_complete(struct icnss_priv *priv)
}
out:
+ clear_bit(ICNSS_SHUTDOWN_DONE, &penv->state);
return 0;
call_probe:
@@ -3667,6 +3673,9 @@ static int icnss_stats_show_state(struct seq_file *s, struct icnss_priv *priv)
case ICNSS_WDOG_BITE:
seq_puts(s, "MODEM WDOG BITE");
continue;
+ case ICNSS_SHUTDOWN_DONE:
+ seq_puts(s, "SHUTDOWN DONE");
+ continue;
}
seq_printf(s, "UNKNOWN-%d", i);