|
@@ -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);
|