qcacmn: Deinitialize the pdev scan private member

Added api to support the deinitialization of pdev scan
private member

Change-Id: Id887eab16f195fc5052f30900451625a586ed9fa
CRs-Fixed: 2033622
This commit is contained in:
Sandeep Puligilla 2017-04-13 18:07:06 -07:00
commit ea68a2c6f2
2 changed files with 84 additions and 0 deletions

View file

@ -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

View file

@ -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