qcacmn: Deinitialize the pdev scan private member
Added api to support the deinitialization of pdev scan
private member
Change-Id: Id887eab16f195fc5052f30900451625a586ed9fa
CRs-Fixed: 2033622
diff --git a/os_if/linux/scan/inc/wlan_cfg80211_scan.h b/os_if/linux/scan/inc/wlan_cfg80211_scan.h
index 91b5687..b8c7c61 100644
--- a/os_if/linux/scan/inc/wlan_cfg80211_scan.h
+++ b/os_if/linux/scan/inc/wlan_cfg80211_scan.h
@@ -150,6 +150,17 @@
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
* @request: Pointer to scan request
@@ -217,4 +228,15 @@
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 e40e127..cdea702 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 @@
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