From 62d0380257c97e358b72250ca990663787034fcc Mon Sep 17 00:00:00 2001 From: Om Prakash Tripathi Date: Tue, 6 Jun 2017 03:17:12 +0530 Subject: [PATCH] qcacmn: Add flush callback for scan module Components are required to provide flush callback to scheduler which gets invoked for all pending commands in scheduler queue when scheduler thread is going down. Added flush callback for scan so that command cleanup can be done. Change-Id: I990a5e14db1498e13a2eeeaa605b44593b8442f1 CRs-Fixed: 2056542 --- umac/scan/core/src/wlan_scan_manager.c | 72 +++++++++++++++++++ umac/scan/core/src/wlan_scan_manager.h | 40 +++++++++++ umac/scan/dispatcher/src/wlan_scan_tgt_api.c | 3 + umac/scan/dispatcher/src/wlan_scan_ucfg_api.c | 2 + 4 files changed, 117 insertions(+) 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)) {