From 8ededa478abc216a34b5e5cc12b2c0a772d9adee Mon Sep 17 00:00:00 2001 From: Komal Seelam Date: Thu, 29 May 2014 15:13:26 +0530 Subject: qcacld: Defer WMI commands from Host during suspend. Defer WMI Commands from HOST until the response from FW is Processed by host for wow_enable command. Problem reported as host queued WMI command on recieving FW event in the window where wow_enable is sent to FW and ACK/NACK is received from FW. Results in Target Assert. Fix by Defering WMI commands until Host process HTC ACK/NACK from FW for WOW_ENABLE. Change-Id: Ie2dc28b54fb4aae0a1e047b0a276dba28f215345 CRs-Fixed: 672205 --- CORE/SERVICES/WMA/wma.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index b039f9f0048d..40e05180c8c4 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -13205,6 +13205,8 @@ int wma_enable_wow_in_fw(WMA_HANDLE handle) goto error; } + wmi_set_target_suspend(wma->wmi_handle, TRUE); + if (vos_wait_single_event(&wma->target_suspend, WMA_TGT_SUSPEND_COMPLETE_TIMEOUT) != VOS_STATUS_SUCCESS) { @@ -13213,11 +13215,13 @@ int wma_enable_wow_in_fw(WMA_HANDLE handle) wmi_get_host_credits(wma->wmi_handle), wmi_get_pending_cmds(wma->wmi_handle)); + wmi_set_target_suspend(wma->wmi_handle, FALSE); return VOS_STATUS_E_FAILURE; } if (wma->wow_nack) { WMA_LOGE("FW not ready to WOW"); + wmi_set_target_suspend(wma->wmi_handle, FALSE); return VOS_STATUS_E_AGAIN; } @@ -13242,6 +13246,7 @@ int wma_enable_wow_in_fw(WMA_HANDLE handle) if (scn == NULL) { WMA_LOGE("%s: Failed to get HIF context", __func__); + VOS_ASSERT(0); return VOS_STATUS_E_FAULT; } @@ -13249,7 +13254,6 @@ int wma_enable_wow_in_fw(WMA_HANDLE handle) wma->wow.wow_enable_cmd_sent = TRUE; - wmi_set_target_suspend(wma->wmi_handle, TRUE); return VOS_STATUS_SUCCESS; error: @@ -19558,10 +19562,15 @@ int wma_suspend_target(WMA_HANDLE handle, int disable_target_intr) adf_nbuf_free(wmibuf); return -1; } + + + wmi_set_target_suspend(wma_handle->wmi_handle, TRUE); + if (vos_wait_single_event(&wma_handle->target_suspend, WMA_TGT_SUSPEND_COMPLETE_TIMEOUT) != VOS_STATUS_SUCCESS) { WMA_LOGE("Failed to get ACK from firmware for pdev suspend"); + wmi_set_target_suspend(wma_handle->wmi_handle, FALSE); return -1; } @@ -19569,12 +19578,12 @@ int wma_suspend_target(WMA_HANDLE handle, int disable_target_intr) if (scn == NULL) { WMA_LOGE("%s: Failed to get HIF context", __func__); + VOS_ASSERT(0); return -1; } HTCCancelDeferredTargetSleep(scn); - wmi_set_target_suspend(wma_handle->wmi_handle, TRUE); return 0; } -- cgit v1.2.3