summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2019-05-07 16:55:14 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2019-05-07 16:55:13 -0700
commit589a44d37aba30b24344ff833ae8b23807f794ba (patch)
treec37a803e42c453f35f805f51f589f1af7145f93f
parent57cc803c86c0c29f7ed2a1302b76c43442cb11a1 (diff)
parentb08dd67c711f131cff76548f3f3f3db8f8a52a29 (diff)
Merge "icnss: Add a flag to indicate PDR"
-rw-r--r--drivers/soc/qcom/icnss.c23
-rw-r--r--include/soc/qcom/icnss.h1
2 files changed, 23 insertions, 1 deletions
diff --git a/drivers/soc/qcom/icnss.c b/drivers/soc/qcom/icnss.c
index c51006fda59e..384cbb22202b 100644
--- a/drivers/soc/qcom/icnss.c
+++ b/drivers/soc/qcom/icnss.c
@@ -302,6 +302,7 @@ enum icnss_driver_state {
ICNSS_DRIVER_UNLOADING,
ICNSS_REJUVENATE,
ICNSS_BLOCK_SHUTDOWN,
+ ICNSS_PDR,
};
struct ce_irq_list {
@@ -495,6 +496,7 @@ static struct icnss_priv {
u16 line_number;
char function_name[QMI_WLFW_FUNCTION_NAME_LEN_V01 + 1];
struct completion unblock_shutdown;
+ bool is_ssr;
} *penv;
#ifdef CONFIG_ICNSS_DEBUG
@@ -1217,6 +1219,15 @@ bool icnss_is_rejuvenate(void)
}
EXPORT_SYMBOL(icnss_is_rejuvenate);
+bool icnss_is_pdr(void)
+{
+ if (!penv)
+ return false;
+ else
+ return test_bit(ICNSS_PDR, &penv->state);
+}
+EXPORT_SYMBOL(icnss_is_pdr);
+
int icnss_power_off(struct device *dev)
{
struct icnss_priv *priv = dev_get_drvdata(dev);
@@ -2274,8 +2285,10 @@ static int icnss_pd_restart_complete(struct icnss_priv *priv)
icnss_call_driver_shutdown(priv);
- clear_bit(ICNSS_REJUVENATE, &penv->state);
+ clear_bit(ICNSS_PDR, &priv->state);
+ clear_bit(ICNSS_REJUVENATE, &priv->state);
clear_bit(ICNSS_PD_RESTART, &priv->state);
+ priv->is_ssr = false;
if (!priv->ops || !priv->ops->reinit)
goto out;
@@ -2609,6 +2622,8 @@ static int icnss_modem_notifier_nb(struct notifier_block *nb,
if (code != SUBSYS_BEFORE_SHUTDOWN)
return NOTIFY_OK;
+ priv->is_ssr = true;
+
if (code == SUBSYS_BEFORE_SHUTDOWN && !notif->crashed &&
test_bit(ICNSS_BLOCK_SHUTDOWN, &priv->state)) {
if (!wait_for_completion_timeout(&priv->unblock_shutdown,
@@ -2730,6 +2745,9 @@ static int icnss_service_notifier_notify(struct notifier_block *nb,
if (notification != SERVREG_NOTIF_SERVICE_STATE_DOWN_V01)
goto done;
+ if (!priv->is_ssr)
+ set_bit(ICNSS_PDR, &priv->state);
+
event_data = kzalloc(sizeof(*event_data), GFP_KERNEL);
if (event_data == NULL)
@@ -4015,6 +4033,9 @@ static int icnss_stats_show_state(struct seq_file *s, struct icnss_priv *priv)
continue;
case ICNSS_BLOCK_SHUTDOWN:
seq_puts(s, "BLOCK SHUTDOWN");
+ continue;
+ case ICNSS_PDR:
+ seq_puts(s, "PDR TRIGGERED");
}
seq_printf(s, "UNKNOWN-%d", i);
diff --git a/include/soc/qcom/icnss.h b/include/soc/qcom/icnss.h
index 010f29db8d48..4de4cd5e89dc 100644
--- a/include/soc/qcom/icnss.h
+++ b/include/soc/qcom/icnss.h
@@ -158,4 +158,5 @@ extern int icnss_set_wlan_mac_address(const u8 *in, const uint32_t len);
extern u8 *icnss_get_wlan_mac_address(struct device *dev, uint32_t *num);
extern int icnss_trigger_recovery(struct device *dev);
extern void icnss_block_shutdown(bool status);
+extern bool icnss_is_pdr(void);
#endif /* _ICNSS_WLAN_H_ */