summaryrefslogtreecommitdiff
path: root/drivers/soc/qcom
diff options
context:
space:
mode:
authorAnurag Chouhan <achouhan@codeaurora.org>2019-02-08 15:46:53 +0530
committerSandeep Singh <sandsing@codeaurora.org>2019-03-26 14:41:37 +0530
commit8846ee70c326edb5995b443bfcdc84a145c587be (patch)
treed2b188e4c1a040bb9d8f6b08980a72c2b0fa089d /drivers/soc/qcom
parent1174076aa273369f86d2d46ad679dc0862c80db8 (diff)
icnss: Add Api to Block/Unblock modem shutdown
Add API to Block/Unblock modem graceful shutdown. Change-Id: I69b061fc7d25762b2c36d9590802addfc170f91f Signed-off-by: Sandeep Singh <sandsing@codeaurora.org>
Diffstat (limited to 'drivers/soc/qcom')
-rw-r--r--drivers/soc/qcom/icnss.c49
1 files changed, 29 insertions, 20 deletions
diff --git a/drivers/soc/qcom/icnss.c b/drivers/soc/qcom/icnss.c
index fcfb649aedee..830f49eb5ac3 100644
--- a/drivers/soc/qcom/icnss.c
+++ b/drivers/soc/qcom/icnss.c
@@ -301,7 +301,7 @@ enum icnss_driver_state {
ICNSS_FW_DOWN,
ICNSS_DRIVER_UNLOADING,
ICNSS_REJUVENATE,
- ICNSS_DRIVER_LOADING,
+ ICNSS_BLOCK_SHUTDOWN,
};
struct ce_irq_list {
@@ -494,7 +494,7 @@ static struct icnss_priv {
u8 requesting_sub_system;
u16 line_number;
char function_name[QMI_WLFW_FUNCTION_NAME_LEN_V01 + 1];
- struct completion driver_probed;
+ struct completion unblock_shutdown;
} *penv;
#ifdef CONFIG_ICNSS_DEBUG
@@ -1182,6 +1182,21 @@ bool icnss_is_fw_ready(void)
}
EXPORT_SYMBOL(icnss_is_fw_ready);
+void icnss_block_shutdown(bool status)
+{
+ if (!penv)
+ return;
+
+ if (status) {
+ set_bit(ICNSS_BLOCK_SHUTDOWN, &penv->state);
+ reinit_completion(&penv->unblock_shutdown);
+ } else {
+ clear_bit(ICNSS_BLOCK_SHUTDOWN, &penv->state);
+ complete(&penv->unblock_shutdown);
+ }
+}
+EXPORT_SYMBOL(icnss_block_shutdown);
+
bool icnss_is_fw_down(void)
{
if (!penv)
@@ -2207,8 +2222,7 @@ static int icnss_call_driver_probe(struct icnss_priv *priv)
icnss_hw_power_on(priv);
- set_bit(ICNSS_DRIVER_LOADING, &priv->state);
- reinit_completion(&penv->driver_probed);
+ icnss_block_shutdown(true);
while (probe_cnt < ICNSS_MAX_PROBE_CNT) {
ret = priv->ops->probe(&priv->pdev->dev);
probe_cnt++;
@@ -2218,13 +2232,11 @@ static int icnss_call_driver_probe(struct icnss_priv *priv)
if (ret < 0) {
icnss_pr_err("Driver probe failed: %d, state: 0x%lx, probe_cnt: %d\n",
ret, priv->state, probe_cnt);
- complete(&penv->driver_probed);
- clear_bit(ICNSS_DRIVER_LOADING, &penv->state);
+ icnss_block_shutdown(false);
goto out;
}
- complete(&penv->driver_probed);
- clear_bit(ICNSS_DRIVER_LOADING, &penv->state);
+ icnss_block_shutdown(false);
set_bit(ICNSS_DRIVER_PROBED, &priv->state);
return 0;
@@ -2360,8 +2372,7 @@ static int icnss_driver_event_register_driver(void *data)
if (ret)
goto out;
- set_bit(ICNSS_DRIVER_LOADING, &penv->state);
- reinit_completion(&penv->driver_probed);
+ icnss_block_shutdown(true);
while (probe_cnt < ICNSS_MAX_PROBE_CNT) {
ret = penv->ops->probe(&penv->pdev->dev);
probe_cnt++;
@@ -2371,13 +2382,11 @@ static int icnss_driver_event_register_driver(void *data)
if (ret) {
icnss_pr_err("Driver probe failed: %d, state: 0x%lx, probe_cnt: %d\n",
ret, penv->state, probe_cnt);
- clear_bit(ICNSS_DRIVER_LOADING, &penv->state);
- complete(&penv->driver_probed);
+ icnss_block_shutdown(false);
goto power_off;
}
- complete(&penv->driver_probed);
- clear_bit(ICNSS_DRIVER_LOADING, &penv->state);
+ icnss_block_shutdown(false);
set_bit(ICNSS_DRIVER_PROBED, &penv->state);
return 0;
@@ -2601,8 +2610,8 @@ static int icnss_modem_notifier_nb(struct notifier_block *nb,
return NOTIFY_OK;
if (code == SUBSYS_BEFORE_SHUTDOWN && !notif->crashed &&
- test_bit(ICNSS_DRIVER_LOADING, &priv->state)) {
- if (!wait_for_completion_timeout(&priv->driver_probed,
+ test_bit(ICNSS_BLOCK_SHUTDOWN, &priv->state)) {
+ if (!wait_for_completion_timeout(&priv->unblock_shutdown,
PROBE_TIMEOUT))
icnss_pr_err("wlan driver probe timeout\n");
}
@@ -4005,8 +4014,8 @@ static int icnss_stats_show_state(struct seq_file *s, struct icnss_priv *priv)
case ICNSS_DRIVER_UNLOADING:
seq_puts(s, "DRIVER UNLOADING");
continue;
- case ICNSS_DRIVER_LOADING:
- seq_puts(s, "WLAN DRIVER LOADING");
+ case ICNSS_BLOCK_SHUTDOWN:
+ seq_puts(s, "BLOCK SHUTDOWN");
}
seq_printf(s, "UNKNOWN-%d", i);
@@ -4678,7 +4687,7 @@ static int icnss_probe(struct platform_device *pdev)
penv = priv;
- init_completion(&priv->driver_probed);
+ init_completion(&priv->unblock_shutdown);
icnss_pr_info("Platform driver probed successfully\n");
@@ -4702,7 +4711,7 @@ static int icnss_remove(struct platform_device *pdev)
icnss_debugfs_destroy(penv);
- complete_all(&penv->driver_probed);
+ complete_all(&penv->unblock_shutdown);
icnss_modem_ssr_unregister_notifier(penv);