From 47e709a62b9cf8c8282ebb256bf3c05be945787a Mon Sep 17 00:00:00 2001 From: Abhishek Ambure Date: Fri, 9 Aug 2019 17:54:43 +0530 Subject: [PATCH] qcacmn: Move vdev resp timer to scheduler context for MCL For MCL, vdev manager resp timer callback should be called in scheduler context. Hence vdev manager response timer callback code is refactored. To handle vdev response timer, MCL specific change is to post message to scheduler thread and handle timer callback in scheduler thread. This MCL specific change is protected using "SERIALIZE_VDEV_RESP_TIMER" macro. Change-Id: I4c5a24cd4c8afba92e407fc229a9d2c295cecb57 CRs-Fixed: 2507577 --- .../vdev_mgr/src/target_if_vdev_mgr_rx_ops.c | 48 ++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c b/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c index 7c64a96c97..96a9b6e733 100644 --- a/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c +++ b/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c @@ -32,7 +32,7 @@ #include #include -void target_if_vdev_mgr_rsp_timer_mgmt_cb(void *arg) +static void target_if_vdev_mgr_rsp_timer_cb(void *arg) { struct wlan_objmgr_vdev *vdev = arg; struct wlan_objmgr_psoc *psoc; @@ -153,6 +153,52 @@ void target_if_vdev_mgr_rsp_timer_mgmt_cb(void *arg) } } +#ifdef SERIALIZE_VDEV_RESP_TIMER +static QDF_STATUS target_if_vdev_mgr_rsp_flush_cb(struct scheduler_msg *msg) +{ + struct wlan_objmgr_vdev *vdev = msg->bodyptr; + + if (vdev) + wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); + + return QDF_STATUS_SUCCESS; +} + +static void +target_if_vdev_mgr_rsp_cb_mc_ctx(void *arg) +{ + struct scheduler_msg msg = {0}; + struct wlan_objmgr_vdev *vdev = arg; + + msg.type = SYS_MSG_ID_MC_TIMER; + msg.reserved = SYS_MSG_COOKIE; + msg.callback = target_if_vdev_mgr_rsp_timer_cb; + msg.bodyptr = arg; + msg.bodyval = 0; + msg.flush_callback = target_if_vdev_mgr_rsp_flush_cb; + + if (scheduler_post_message(QDF_MODULE_ID_TARGET_IF, + QDF_MODULE_ID_TARGET_IF, + QDF_MODULE_ID_SYS, &msg) == + QDF_STATUS_SUCCESS) + return; + + mlme_err("Could not enqueue timer to timer queue"); + if (vdev) + wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); +} + +void target_if_vdev_mgr_rsp_timer_mgmt_cb(void *arg) +{ + target_if_vdev_mgr_rsp_cb_mc_ctx(arg); +} +#else +void target_if_vdev_mgr_rsp_timer_mgmt_cb(void *arg) +{ + target_if_vdev_mgr_rsp_timer_cb(arg); +} +#endif + static int target_if_vdev_mgr_start_response_handler( ol_scn_t scn, uint8_t *data,