From ea68a2c6f228ca34794c794fdf682c632762cd3e Mon Sep 17 00:00:00 2001 From: Sandeep Puligilla Date: Thu, 13 Apr 2017 18:07:06 -0700 Subject: [PATCH] qcacmn: Deinitialize the pdev scan private member Added api to support the deinitialization of pdev scan private member Change-Id: Id887eab16f195fc5052f30900451625a586ed9fa CRs-Fixed: 2033622 --- os_if/linux/scan/inc/wlan_cfg80211_scan.h | 22 ++++++++ os_if/linux/scan/src/wlan_cfg80211_scan.c | 62 +++++++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/os_if/linux/scan/inc/wlan_cfg80211_scan.h b/os_if/linux/scan/inc/wlan_cfg80211_scan.h index 91b5687479b8..b8c7c6177f49 100644 --- a/os_if/linux/scan/inc/wlan_cfg80211_scan.h +++ b/os_if/linux/scan/inc/wlan_cfg80211_scan.h @@ -149,6 +149,17 @@ int wlan_cfg80211_sched_scan_stop(struct wlan_objmgr_pdev *pdev, */ QDF_STATUS wlan_cfg80211_scan_priv_init(struct wlan_objmgr_pdev *pdev); +/** + * wlan_cfg80211_scan_priv_deinit() - API to deinitialize cfg80211 scan + * @pdev: Pointer to net device + * + * API to deinitialize cfg80211 scan module. + * + * Return: QDF_STATUS + */ +QDF_STATUS wlan_cfg80211_scan_priv_deinit( + struct wlan_objmgr_pdev *pdev); + /** * wlan_cfg80211_scan() - API to process cfg80211 scan request * @pdev: Pointer to pdev @@ -217,4 +228,15 @@ QDF_STATUS wlan_abort_scan(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id, wlan_scan_id scan_id); +/** + * wlan_cfg80211_cleanup_scan_queue() - remove entries in scan queue + * @pdev: pdev pointer + * + * Removes entries in scan queue and sends scan complete event to NL + * + * Return: None + */ +void wlan_cfg80211_cleanup_scan_queue(struct wlan_objmgr_pdev *pdev); + + #endif diff --git a/os_if/linux/scan/src/wlan_cfg80211_scan.c b/os_if/linux/scan/src/wlan_cfg80211_scan.c index e40e1274b2e0..cdea702d2d13 100644 --- a/os_if/linux/scan/src/wlan_cfg80211_scan.c +++ b/os_if/linux/scan/src/wlan_cfg80211_scan.c @@ -721,6 +721,68 @@ QDF_STATUS wlan_cfg80211_scan_priv_init(struct wlan_objmgr_pdev *pdev) return QDF_STATUS_SUCCESS; } +QDF_STATUS wlan_cfg80211_scan_priv_deinit(struct wlan_objmgr_pdev *pdev) +{ + struct pdev_osif_priv *osif_priv; + struct osif_scan_pdev *scan_priv; + struct wlan_objmgr_psoc *psoc; + + wlan_pdev_obj_lock(pdev); + psoc = wlan_pdev_get_psoc(pdev); + osif_priv = wlan_pdev_get_ospriv(pdev); + wlan_pdev_obj_unlock(pdev); + + scan_priv = osif_priv->osif_scan; + osif_priv->osif_scan = NULL; + ucfg_scan_unregister_requester(psoc, scan_priv->req_id); + qdf_list_destroy(&scan_priv->scan_req_q); + qdf_mem_free(scan_priv); + + return QDF_STATUS_SUCCESS; +} + +void wlan_cfg80211_cleanup_scan_queue(struct wlan_objmgr_pdev *pdev) +{ + struct scan_req *scan_req; + qdf_list_node_t *node = NULL; + struct cfg80211_scan_request *req; + uint8_t source; + bool aborted = true; + struct pdev_osif_priv *osif_priv; + struct osif_scan_pdev *scan_priv; + + if (!pdev) { + cfg80211_err("pdev is Null"); + return; + } + + wlan_pdev_obj_lock(pdev); + osif_priv = wlan_pdev_get_ospriv(pdev); + wlan_pdev_obj_unlock(pdev); + + scan_priv = osif_priv->osif_scan; + + while (!qdf_list_empty(&scan_priv->scan_req_q)) { + if (QDF_STATUS_SUCCESS != + qdf_list_remove_front(&scan_priv->scan_req_q, + &node)) { + cfg80211_err("Failed to remove scan request"); + return; + } + + scan_req = container_of(node, struct scan_req, node); + req = scan_req->scan_request; + source = scan_req->source; + if (NL_SCAN == source) + wlan_cfg80211_scan_done(req, aborted); + else + wlan_vendor_scan_callback(req, aborted); + qdf_mem_free(scan_req); + } + + return; +} + /** * wlan_cfg80211_scan() - Process scan request * @pdev: pdev object pointer