diff --git a/umac/scan/core/src/wlan_scan_manager.c b/umac/scan/core/src/wlan_scan_manager.c index b1d935d96347..7d84c7e89ac5 100644 --- a/umac/scan/core/src/wlan_scan_manager.c +++ b/umac/scan/core/src/wlan_scan_manager.c @@ -600,3 +600,75 @@ exit: return QDF_STATUS_SUCCESS; } + +QDF_STATUS scm_scan_event_flush_callback(struct scheduler_msg *msg) +{ + struct wlan_objmgr_vdev *vdev; + struct scan_event_info *event_info; + + if (!msg || !msg->bodyptr) { + scm_err("msg: %p, bodyptr: %p", msg, msg->bodyptr); + return QDF_STATUS_E_NULL_VALUE; + } + event_info = msg->bodyptr; + vdev = event_info->vdev; + + /* free event info memory */ + qdf_mem_free(event_info); + wlan_objmgr_vdev_release_ref(vdev, WLAN_SCAN_ID); + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS scm_bcn_probe_flush_callback(struct scheduler_msg *msg) +{ + struct scan_bcn_probe_event *bcn; + + bcn = msg->bodyptr; + + if (!bcn) { + scm_err("bcn is NULL"); + return QDF_STATUS_E_NULL_VALUE; + } + if (bcn->psoc) + wlan_objmgr_psoc_release_ref(bcn->psoc, WLAN_SCAN_ID); + if (bcn->rx_data) + qdf_mem_free(bcn->rx_data); + if (bcn->buf) + qdf_nbuf_free(bcn->buf); + qdf_mem_free(bcn); + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS scm_scan_start_flush_callback(struct scheduler_msg *msg) +{ + struct scan_start_request *req; + + if (!msg || !msg->bodyptr) { + scm_err("msg: 0x%p, bodyptr: 0x%p", msg, msg->bodyptr); + return QDF_STATUS_E_NULL_VALUE; + } + req = msg->bodyptr; + wlan_objmgr_vdev_release_ref(req->vdev, WLAN_SCAN_ID); + scm_scan_free_scan_request_mem(req); + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS scm_scan_cancel_flush_callback(struct scheduler_msg *msg) +{ + struct scan_cancel_request *req; + + if (!msg || !msg->bodyptr) { + scm_err("msg: 0x%p, bodyptr: 0x%p", msg, msg->bodyptr); + return QDF_STATUS_E_NULL_VALUE; + } + + req = msg->bodyptr; + wlan_objmgr_vdev_release_ref(req->vdev, WLAN_SCAN_ID); + /* Free cancel request memory */ + qdf_mem_free(req); + + return QDF_STATUS_SUCCESS; +} diff --git a/umac/scan/core/src/wlan_scan_manager.h b/umac/scan/core/src/wlan_scan_manager.h index 82acf1e051b6..e879c4d6e0ff 100644 --- a/umac/scan/core/src/wlan_scan_manager.h +++ b/umac/scan/core/src/wlan_scan_manager.h @@ -85,4 +85,44 @@ QDF_STATUS scm_scan_event_handler(struct scheduler_msg *msg); */ QDF_STATUS scm_scan_free_scan_request_mem(struct scan_start_request *req); +/** + * scm_scan_event_flush_callback() - flush scan event + * @msg: scheduler message object containing scan event + * + * This function call is invoked when scheduler thread is going down + * + * Return: QDF_STATUS + */ +QDF_STATUS scm_scan_event_flush_callback(struct scheduler_msg *msg); + +/** + * scm_bcn_probe_flush_callback() - flush beacon/probe response + * @msg: scheduler message object containing scan event + * + * This function call is invoked when scheduler thread is going down + * + * Return: QDF_STATUS + */ +QDF_STATUS scm_bcn_probe_flush_callback(struct scheduler_msg *msg); + +/** + * scm_scan_start_flush_callback() - flush scan start request + * @msg: scheduler message object containing scan event + * + * This function call is invoked when scheduler thread is going down + * + * Return: QDF_STATUS + */ +QDF_STATUS scm_scan_start_flush_callback(struct scheduler_msg *msg); + +/** + * scm_scan_cancel_flush_callback() - flush scan cancel request + * @msg: scheduler message object containing scan event + * + * This function call is invoked when scheduler thread is going down + * + * Return: QDF_STATUS + */ +QDF_STATUS scm_scan_cancel_flush_callback(struct scheduler_msg *msg); + #endif diff --git a/umac/scan/dispatcher/src/wlan_scan_tgt_api.c b/umac/scan/dispatcher/src/wlan_scan_tgt_api.c index 8a53f76af20a..37931eb3551e 100644 --- a/umac/scan/dispatcher/src/wlan_scan_tgt_api.c +++ b/umac/scan/dispatcher/src/wlan_scan_tgt_api.c @@ -209,6 +209,7 @@ tgt_scan_event_handler(struct wlan_objmgr_psoc *psoc, } msg.bodyptr = event_info; msg.callback = scm_scan_event_handler; + msg.flush_callback = scm_scan_event_flush_callback; status = scheduler_post_msg(QDF_MODULE_ID_TARGET_IF, &msg); if (QDF_IS_STATUS_ERROR(status)) { @@ -269,6 +270,7 @@ QDF_STATUS tgt_scan_bcn_probe_rx_callback(struct wlan_objmgr_psoc *psoc, msg.bodyptr = bcn; msg.callback = scm_handle_bcn_probe; + msg.flush_callback = scm_bcn_probe_flush_callback; status = scheduler_post_msg(QDF_MODULE_ID_TARGET_IF, &msg); @@ -279,6 +281,7 @@ QDF_STATUS tgt_scan_bcn_probe_rx_callback(struct wlan_objmgr_psoc *psoc, qdf_mem_free(bcn); qdf_nbuf_free(buf); } + return status; } diff --git a/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c b/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c index d030502d2080..95a96f4988c8 100644 --- a/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c +++ b/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c @@ -358,6 +358,7 @@ ucfg_scan_start(struct scan_start_request *req) msg.bodyptr = req; msg.callback = scm_scan_start_req; + msg.flush_callback = scm_scan_start_flush_callback; status = scheduler_post_msg(QDF_MODULE_ID_OS_IF, &msg); if (QDF_IS_STATUS_ERROR(status)) { @@ -393,6 +394,7 @@ ucfg_scan_cancel(struct scan_cancel_request *req) msg.bodyptr = req; msg.callback = scm_scan_cancel_req; + msg.flush_callback = scm_scan_cancel_flush_callback; status = scheduler_post_msg(QDF_MODULE_ID_OS_IF, &msg); if (QDF_IS_STATUS_ERROR(status)) {