summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMukul Sharma <mukul@codeaurora.org>2016-10-02 23:37:07 +0530
committerqcabuildsw <qcabuildsw@localhost>2016-11-09 10:11:15 -0800
commitad784deb974ad5833ecc21129f2b8f2e135631f0 (patch)
treebb6e44143a56037795a33a9e59be7eee60a42f93
parent88058a2a1daaf45043d873c65068ad562f82b147 (diff)
qcacld-3.0: Add support for silent recovery in cds_trigger_recovery()
qcacld-2.0 to qcacld-3.0 propagation Currently, cds_trigger_recovery does not support silent recovery instead host send WMI_FORCE_FW_HANG_CMDID and wait for timeout. In cases where wmi cmd cannot be sent to firmware, host needs silent recovery. As a part of this fix, Parameterize the cds_trigger_recovery function for silent recovery. Change-Id: I9bb631f7346a267a10348037c49606af43c6be4f CRs-Fixed: 1053303
-rw-r--r--core/cds/inc/cds_api.h2
-rw-r--r--core/cds/src/cds_api.c43
-rw-r--r--core/sme/src/common/sme_api.c4
-rw-r--r--core/utils/logging/src/wlan_logging_sock_svc.c2
-rw-r--r--core/wma/src/wma_features.c10
5 files changed, 40 insertions, 21 deletions
diff --git a/core/cds/inc/cds_api.h b/core/cds/inc/cds_api.h
index f0061bf55ec4..807e4aa64779 100644
--- a/core/cds/inc/cds_api.h
+++ b/core/cds/inc/cds_api.h
@@ -239,7 +239,7 @@ bool cds_is_packet_log_enabled(void);
uint64_t cds_get_monotonic_boottime(void);
-void cds_trigger_recovery(void);
+void cds_trigger_recovery(bool);
void cds_set_wakelock_logging(bool value);
bool cds_is_wakelock_enabled(void);
diff --git a/core/cds/src/cds_api.c b/core/cds/src/cds_api.c
index 07f956662cb5..26c01c1a412f 100644
--- a/core/cds/src/cds_api.c
+++ b/core/cds/src/cds_api.c
@@ -1547,11 +1547,32 @@ bool cds_is_packet_log_enabled(void)
}
/**
+ * cds_config_recovery_work() - configure self recovery
+ * @qdf_ctx: pointer of qdf context
+ *
+ * Return: none
+ */
+
+void cds_config_recovery_work(qdf_device_t qdf_ctx)
+{
+ if (cds_is_driver_recovering()) {
+ QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
+ "Recovery is in progress, ignore!");
+ } else {
+ cds_set_recovery_in_progress(true);
+ QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
+ "schedule recovery work!");
+ pld_schedule_recovery_work(qdf_ctx->dev);
+ }
+}
+
+/**
* cds_trigger_recovery() - trigger self recovery
+ * @skip_crash_inject: Boolean value to skip to send crash inject cmd
*
* Return: none
*/
-void cds_trigger_recovery(void)
+void cds_trigger_recovery(bool skip_crash_inject)
{
tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
QDF_STATUS status = QDF_STATUS_SUCCESS;
@@ -1573,21 +1594,19 @@ void cds_trigger_recovery(void)
qdf_runtime_pm_prevent_suspend(recovery_lock);
- wma_crash_inject(wma_handle, RECOVERY_SIM_SELF_RECOVERY, 0);
+ if (!skip_crash_inject) {
- status = qdf_wait_single_event(&wma_handle->recovery_event,
- WMA_CRASH_INJECT_TIMEOUT);
+ wma_crash_inject(wma_handle, RECOVERY_SIM_SELF_RECOVERY, 0);
+ status = qdf_wait_single_event(&wma_handle->recovery_event,
+ WMA_CRASH_INJECT_TIMEOUT);
- if (QDF_STATUS_SUCCESS != status) {
- QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
- "CRASH_INJECT command is timed out!");
- if (cds_is_driver_recovering()) {
+ if (QDF_STATUS_SUCCESS != status) {
QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
- "Recovery is in progress, ignore!");
- } else {
- cds_set_recovery_in_progress(true);
- pld_schedule_recovery_work(qdf_ctx->dev);
+ "CRASH_INJECT command is timed out!");
+ cds_config_recovery_work(qdf_ctx);
}
+ } else {
+ cds_config_recovery_work(qdf_ctx);
}
qdf_runtime_pm_allow_suspend(recovery_lock);
diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c
index cebed727ddfc..56e5c81b328f 100644
--- a/core/sme/src/common/sme_api.c
+++ b/core/sme/src/common/sme_api.c
@@ -624,7 +624,7 @@ tSmeCmd *sme_get_command_buffer(tpAniSirGlobal pMac)
false,
pMac->sme.enableSelfRecovery ? true : false);
else if (pMac->sme.enableSelfRecovery)
- cds_trigger_recovery();
+ cds_trigger_recovery(false);
else
QDF_BUG(0);
}
@@ -11830,7 +11830,7 @@ void active_list_cmd_timeout_handle(void *userData)
if (mac_ctx->sme.enableSelfRecovery) {
sme_save_active_cmd_stats(hal);
- cds_trigger_recovery();
+ cds_trigger_recovery(false);
} else {
if (!mac_ctx->roam.configParam.enable_fatal_event &&
!(cds_is_load_or_unload_in_progress() ||
diff --git a/core/utils/logging/src/wlan_logging_sock_svc.c b/core/utils/logging/src/wlan_logging_sock_svc.c
index 25322afbf05e..5d038826fcd1 100644
--- a/core/utils/logging/src/wlan_logging_sock_svc.c
+++ b/core/utils/logging/src/wlan_logging_sock_svc.c
@@ -726,7 +726,7 @@ void send_flush_completion_to_user(void)
wlan_report_log_completion(is_fatal, indicator, reason_code);
if (recovery_needed)
- cds_trigger_recovery();
+ cds_trigger_recovery(false);
}
/**
diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c
index 4374b6dfae19..3aa3d69c5e24 100644
--- a/core/wma/src/wma_features.c
+++ b/core/wma/src/wma_features.c
@@ -3888,7 +3888,7 @@ QDF_STATUS wma_enable_wow_in_fw(WMA_HANDLE handle)
wmi_set_target_suspend(wma->wmi_handle, false);
if (!cds_is_driver_recovering()) {
if (pMac->sme.enableSelfRecovery) {
- cds_trigger_recovery();
+ cds_trigger_recovery(false);
} else {
QDF_BUG(0);
}
@@ -4613,7 +4613,7 @@ static QDF_STATUS wma_send_host_wakeup_ind_to_fw(tp_wma_handle wma)
wmi_get_host_credits(wma->wmi_handle));
if (!cds_is_driver_recovering()) {
if (pMac->sme.enableSelfRecovery) {
- cds_trigger_recovery();
+ cds_trigger_recovery(false);
} else {
QDF_BUG(0);
}
@@ -6552,7 +6552,7 @@ static inline void wma_suspend_target_timeout(bool is_self_recovery_enabled)
WMA_LOGE("%s: recovery is in progress, ignore!", __func__);
} else {
if (is_self_recovery_enabled) {
- cds_trigger_recovery();
+ cds_trigger_recovery(false);
} else {
QDF_BUG(0);
}
@@ -6566,7 +6566,7 @@ static inline void wma_suspend_target_timeout(bool is_self_recovery_enabled)
__func__);
} else {
if (is_self_recovery_enabled) {
- cds_trigger_recovery();
+ cds_trigger_recovery(false);
} else {
QDF_BUG(0);
}
@@ -6742,7 +6742,7 @@ QDF_STATUS wma_resume_target(WMA_HANDLE handle)
wmi_get_host_credits(wma->wmi_handle));
if (!cds_is_driver_recovering()) {
if (pMac->sme.enableSelfRecovery) {
- cds_trigger_recovery();
+ cds_trigger_recovery(false);
} else {
QDF_BUG(0);
}