diff options
| author | Mukul Sharma <mukul@codeaurora.org> | 2016-10-02 23:37:07 +0530 |
|---|---|---|
| committer | qcabuildsw <qcabuildsw@localhost> | 2016-11-09 10:11:15 -0800 |
| commit | ad784deb974ad5833ecc21129f2b8f2e135631f0 (patch) | |
| tree | bb6e44143a56037795a33a9e59be7eee60a42f93 | |
| parent | 88058a2a1daaf45043d873c65068ad562f82b147 (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.h | 2 | ||||
| -rw-r--r-- | core/cds/src/cds_api.c | 43 | ||||
| -rw-r--r-- | core/sme/src/common/sme_api.c | 4 | ||||
| -rw-r--r-- | core/utils/logging/src/wlan_logging_sock_svc.c | 2 | ||||
| -rw-r--r-- | core/wma/src/wma_features.c | 10 |
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); } |
