diff options
| author | Manikandan Mohan <manikand@codeaurora.org> | 2017-02-12 16:30:55 -0800 |
|---|---|---|
| committer | qcabuildsw <qcabuildsw@localhost> | 2017-02-14 13:52:35 -0800 |
| commit | c7cc61ff47ea78f65f307e243b5de696a5897726 (patch) | |
| tree | 79fd07f83acb047685b2479cc8c2d09874cbff02 | |
| parent | 94d771f34be98f5a589ba715393e0fa34a83d7f0 (diff) | |
qcacld-3.0: Cleanup Vdev response timer on SSR
During SSR firmware is reloaded and FW responses for previous
vdev sessions are not received. Thus cleanup FW response timers
on SSR.
CRs-fixed: 2005625
Change-Id: I95e2d85b29da240d372039deeece9db6add74edb
| -rw-r--r-- | core/wma/src/wma_main.c | 74 |
1 files changed, 38 insertions, 36 deletions
diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index 4f85f29c0981..4524a95c81f5 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -1726,6 +1726,42 @@ static void wma_init_max_no_of_peers(tp_wma_handle wma_handle, } /** + * wma_cleanup_vdev_resp_queue() - cleanup vdev response queue + * @wma: wma handle + * + * Return: none + */ +static void wma_cleanup_vdev_resp_queue(tp_wma_handle wma) +{ + struct wma_target_req *req_msg = NULL; + qdf_list_node_t *node1 = NULL; + QDF_STATUS status; + + qdf_spin_lock_bh(&wma->vdev_respq_lock); + if (!qdf_list_size(&wma->vdev_resp_queue)) { + qdf_spin_unlock_bh(&wma->vdev_respq_lock); + WMA_LOGI(FL("request queue maybe empty")); + return; + } + + while (qdf_list_peek_front(&wma->vdev_resp_queue, &node1) != + QDF_STATUS_SUCCESS) { + req_msg = qdf_container_of(node1, struct wma_target_req, node); + status = qdf_list_remove_node(&wma->vdev_resp_queue, node1); + qdf_spin_unlock_bh(&wma->vdev_respq_lock); + if (status != QDF_STATUS_SUCCESS) { + WMA_LOGE(FL("Failed to remove req vdev_id %d type %d"), + req_msg->vdev_id, req_msg->type); + return; + } + qdf_mc_timer_destroy(&req_msg->event_timeout); + qdf_mem_free(req_msg); + qdf_spin_lock_bh(&wma->vdev_respq_lock); + } + qdf_spin_unlock_bh(&wma->vdev_respq_lock); +} + +/** * wma_shutdown_notifier_cb - Shutdown notifer call back * @priv : WMA handle * @@ -1742,6 +1778,7 @@ static void wma_shutdown_notifier_cb(void *priv) tp_wma_handle wma_handle = priv; qdf_event_set(&wma_handle->wma_resume_event); + wma_cleanup_vdev_resp_queue(wma_handle); } struct wma_version_info g_wmi_version_info; @@ -3296,41 +3333,6 @@ static void wma_cleanup_hold_req(tp_wma_handle wma) } /** - * wma_cleanup_vdev_resp() - cleanup vdev response queue - * @wma: wma handle - * - * Return: none - */ -static void wma_cleanup_vdev_resp(tp_wma_handle wma) -{ - struct wma_target_req *req_msg = NULL; - qdf_list_node_t *node1 = NULL; - QDF_STATUS status; - - qdf_spin_lock_bh(&wma->vdev_respq_lock); - if (!qdf_list_size(&wma->vdev_resp_queue)) { - qdf_spin_unlock_bh(&wma->vdev_respq_lock); - WMA_LOGI(FL("request queue maybe empty")); - return; - } - - while (QDF_STATUS_SUCCESS != qdf_list_peek_front(&wma->vdev_resp_queue, - &node1)) { - req_msg = qdf_container_of(node1, struct wma_target_req, node); - status = qdf_list_remove_node(&wma->vdev_resp_queue, node1); - if (QDF_STATUS_SUCCESS != status) { - qdf_spin_unlock_bh(&wma->vdev_respq_lock); - WMA_LOGE(FL("Failed to remove request for vdev_id %d type %d"), - req_msg->vdev_id, req_msg->type); - return; - } - qdf_mc_timer_destroy(&req_msg->event_timeout); - qdf_mem_free(req_msg); - } - qdf_spin_unlock_bh(&wma->vdev_respq_lock); -} - -/** * wma_wmi_service_close() - close wma wmi service interface. * @cds_ctx: cds context * @@ -3549,7 +3551,7 @@ QDF_STATUS wma_close(void *cds_ctx) qdf_event_destroy(&wma_handle->recovery_event); qdf_event_destroy(&wma_handle->tx_frm_download_comp_event); qdf_event_destroy(&wma_handle->tx_queue_empty_event); - wma_cleanup_vdev_resp(wma_handle); + wma_cleanup_vdev_resp_queue(wma_handle); wma_cleanup_hold_req(wma_handle); qdf_wake_lock_destroy(&wma_handle->wmi_cmd_rsp_wake_lock); qdf_runtime_lock_deinit(&wma_handle->wmi_cmd_rsp_runtime_lock); |
