diff --git a/target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_rx_ops.h b/target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_rx_ops.h index 3f7c96fdd2..e60b4b2816 100644 --- a/target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_rx_ops.h +++ b/target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_rx_ops.h @@ -51,6 +51,34 @@ static inline bool target_if_vdev_mgr_is_panic_allowed(void) } #endif +/** + * target_if_timer_flush_handler() - API to handle target_if timer flush + * request + * @pdev: pointer to pdev object + * @object: pointer to vdev object + * @arg: pointer to arguments passed + * + * This is a target_if timer flush handler used to flush target_if response + * timer. This API used while wlan driver shut down. + * + * Return: none + */ +void target_if_timer_flush_handler(struct wlan_objmgr_pdev *pdev, + void *object, + void *arg); + +/** + * target_if_flush_vdev_timers() - API to flush target_if response timers + * for vdev + * @pdev: pointer to pdev object + * + * This API is used to flush target_if response timer. This API used while + * wlan driver shut down. + * + * Return: none + */ +void target_if_flush_vdev_timers(struct wlan_objmgr_pdev *pdev); + /** * target_if_vdev_mgr_delete_response_handler() - API to handle vdev delete * response 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 17b10407b2..81eb6642e3 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 @@ -150,6 +150,39 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg) } } +void target_if_timer_flush_handler(struct wlan_objmgr_pdev *pdev, + void *object, + void *arg) +{ + struct vdev_response_timer *vdev_rsp; + struct wlan_lmac_if_mlme_rx_ops *rx_ops; + struct wlan_objmgr_psoc *psoc; + struct wlan_objmgr_vdev *vdev = object; + + psoc = wlan_pdev_get_psoc(pdev); + if (!psoc) { + mlme_err("PSOC is NULL"); + return; + } + + rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); + if (!rx_ops || !rx_ops->vdev_mgr_get_response_timer_info) { + mlme_err("No Rx Ops"); + return; + } + + vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev); + if (qdf_timer_sync_cancel(&vdev_rsp->rsp_timer)) + target_if_vdev_mgr_rsp_timer_cb(vdev); +} + +void target_if_flush_vdev_timers(struct wlan_objmgr_pdev *pdev) +{ + wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_VDEV_OP, + target_if_timer_flush_handler, + NULL, true, WLAN_VDEV_TARGET_IF_ID); +} + #ifdef SERIALIZE_VDEV_RESP_TIMER static QDF_STATUS target_if_vdev_mgr_rsp_flush_cb(struct scheduler_msg *msg) {