summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManikandan Mohan <manikand@codeaurora.org>2017-02-12 16:30:55 -0800
committerqcabuildsw <qcabuildsw@localhost>2017-02-14 13:52:35 -0800
commitc7cc61ff47ea78f65f307e243b5de696a5897726 (patch)
tree79fd07f83acb047685b2479cc8c2d09874cbff02
parent94d771f34be98f5a589ba715393e0fa34a83d7f0 (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.c74
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);