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
This commit is contained in:
Manikandan Mohan
2017-02-12 16:30:55 -08:00
committed by qcabuildsw
부모 b089ed654d
커밋 b0932ab0bf

파일 보기

@@ -1647,6 +1647,42 @@ static void wma_init_max_no_of_peers(tp_wma_handle wma_handle,
cfg->max_no_of_peers = max_peers;
}
/**
* 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
@@ -1664,6 +1700,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;
@@ -3293,41 +3330,6 @@ static void wma_cleanup_hold_req(tp_wma_handle wma)
qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
}
/**
* 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
@@ -3547,7 +3549,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);