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:
@@ -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);
|
||||
|
Reference in New Issue
Block a user