OSDN Git Service

icnss: Add a flag to indicare FW rejuvenate
authorAnurag Chouhan <achouhan@codeaurora.org>
Thu, 30 Aug 2018 08:59:14 +0000 (14:29 +0530)
committerGerrit - the friendly Code Review server <code-review@localhost>
Thu, 30 Aug 2018 09:21:41 +0000 (02:21 -0700)
Add a flag to maintain fw rejuvenate state,
set if fw rejuvenate happens and reset at fw ready.
export an API to the wlan host driver to distinguish the
case of ssr or pdr with the FW rejuventae.

Change-Id: I7a01cc4996f68f78aa13eacf36648331a701882a
Signed-off-by: Anurag Chouhan <achouhan@codeaurora.org>
drivers/soc/qcom/icnss.c
include/soc/qcom/icnss.h

index 1fc891b..d56fb48 100644 (file)
@@ -298,6 +298,7 @@ enum icnss_driver_state {
        ICNSS_HOST_TRIGGERED_PDR,
        ICNSS_FW_DOWN,
        ICNSS_DRIVER_UNLOADING,
+       ICNSS_REJUVENATE,
 };
 
 struct ce_irq_list {
@@ -1187,6 +1188,14 @@ bool icnss_is_fw_down(void)
 }
 EXPORT_SYMBOL(icnss_is_fw_down);
 
+bool icnss_is_rejuvenate(void)
+{
+       if (!penv)
+               return false;
+       else
+               return test_bit(ICNSS_REJUVENATE, &penv->state);
+}
+EXPORT_SYMBOL(icnss_is_rejuvenate);
 
 int icnss_power_off(struct device *dev)
 {
@@ -2007,6 +2016,7 @@ static void icnss_qmi_wlfw_clnt_ind(struct qmi_handle *handle,
                event_data->crashed = true;
                event_data->fw_rejuvenate = true;
                fw_down_data.crashed = true;
+               set_bit(ICNSS_REJUVENATE, &penv->state);
                icnss_call_driver_uevent(penv, ICNSS_UEVENT_FW_DOWN,
                                         &fw_down_data);
                icnss_driver_event_post(ICNSS_DRIVER_EVENT_PD_SERVICE_DOWN,
@@ -2191,6 +2201,7 @@ static int icnss_pd_restart_complete(struct icnss_priv *priv)
 
        icnss_call_driver_shutdown(priv);
 
+       clear_bit(ICNSS_REJUVENATE, &penv->state);
        clear_bit(ICNSS_PD_RESTART, &priv->state);
 
        if (!priv->ops || !priv->ops->reinit)
@@ -3903,6 +3914,9 @@ static int icnss_stats_show_state(struct seq_file *s, struct icnss_priv *priv)
                case ICNSS_FW_DOWN:
                        seq_puts(s, "FW DOWN");
                        continue;
+               case ICNSS_REJUVENATE:
+                       seq_puts(s, "FW REJUVENATE");
+                       continue;
                case ICNSS_DRIVER_UNLOADING:
                        seq_puts(s, "DRIVER UNLOADING");
                }
index ae8834d..85ec8be 100644 (file)
@@ -153,6 +153,7 @@ extern int icnss_wlan_get_dfs_nol(void *info, u16 info_len);
 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_rejuvenate(void);
 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);