diff --git a/icnss2/debug.c b/icnss2/debug.c index c023272c05..44308f1a05 100644 --- a/icnss2/debug.c +++ b/icnss2/debug.c @@ -422,6 +422,9 @@ static int icnss_stats_show_state(struct seq_file *s, struct icnss_priv *priv) continue; case ICNSS_SLATE_UP: seq_puts(s, "ICNSS SLATE UP"); + continue; + case ICNSS_LOW_POWER: + seq_puts(s, "ICNSS LOW POWER"); } seq_printf(s, "UNKNOWN-%d", i); diff --git a/icnss2/main.c b/icnss2/main.c index 22aa75767b..a5ee81f0e2 100644 --- a/icnss2/main.c +++ b/icnss2/main.c @@ -519,6 +519,15 @@ static int icnss_send_smp2p(struct icnss_priv *priv, return ret; } +bool icnss_is_low_power(void) +{ + if (!penv) + return false; + else + return test_bit(ICNSS_LOW_POWER, &penv->state); +} +EXPORT_SYMBOL(icnss_is_low_power); + static irqreturn_t fw_error_fatal_handler(int irq, void *ctx) { struct icnss_priv *priv = ctx; @@ -1092,6 +1101,7 @@ static int icnss_pd_restart_complete(struct icnss_priv *priv) clear_bit(ICNSS_PDR, &priv->state); clear_bit(ICNSS_REJUVENATE, &priv->state); clear_bit(ICNSS_PD_RESTART, &priv->state); + clear_bit(ICNSS_LOW_POWER, &priv->state); priv->early_crash_ind = false; priv->is_ssr = false; @@ -2159,14 +2169,16 @@ static int icnss_modem_notifier_nb(struct notifier_block *nb, icnss_pr_vdbg("Modem-Notify: event %s(%lu)\n", icnss_qcom_ssr_notify_state_to_str(code), code); - if (code == QCOM_SSR_AFTER_SHUTDOWN) { + switch (code) { + case QCOM_SSR_BEFORE_SHUTDOWN: + break; + case QCOM_SSR_AFTER_SHUTDOWN: icnss_pr_info("Collecting msa0 segment dump\n"); icnss_msa0_ramdump(priv); goto out; - } - - if (code != QCOM_SSR_BEFORE_SHUTDOWN) + default: goto out; + } priv->is_ssr = true; diff --git a/icnss2/main.h b/icnss2/main.h index 1a09894946..bd36ac98dd 100644 --- a/icnss2/main.h +++ b/icnss2/main.h @@ -128,6 +128,7 @@ enum icnss_driver_state { ICNSS_QMI_DMS_CONNECTED, ICNSS_SLATE_SSR_REGISTERED, ICNSS_SLATE_UP, + ICNSS_LOW_POWER, }; struct ce_irq_list { diff --git a/inc/icnss2.h b/inc/icnss2.h index 4adbb13faa..51e4e39f22 100644 --- a/inc/icnss2.h +++ b/inc/icnss2.h @@ -177,6 +177,7 @@ extern unsigned int icnss_socinfo_get_serial_number(struct device *dev); extern bool icnss_is_qmi_disable(struct device *dev); extern bool icnss_is_fw_ready(void); extern bool icnss_is_fw_down(void); +extern bool icnss_is_low_power(void); extern bool icnss_is_rejuvenate(void); extern int icnss_trigger_recovery(struct device *dev); extern void icnss_block_shutdown(bool status);