From fb9d5acfed189a36440dd01c320b905fcbbc752a Mon Sep 17 00:00:00 2001 From: Abhishek Singh Date: Tue, 6 Jun 2017 12:25:39 +0530 Subject: [PATCH] qcacmn: Add API to deint scan runtime suspend lock Add API to deint scan runtime suspend lock, which can be called before HIF is closed, to avoid crash while acessing HIF pointer. Change-Id: Ida9269cdaea33a387e2acd1e3d9670d152b6016f CRs-Fixed: 2065228 --- os_if/linux/scan/inc/wlan_cfg80211_scan.h | 12 ++++++++++++ os_if/linux/scan/src/wlan_cfg80211_scan.c | 16 ++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/os_if/linux/scan/inc/wlan_cfg80211_scan.h b/os_if/linux/scan/inc/wlan_cfg80211_scan.h index 99285eba42c6..9603f7134dbf 100644 --- a/os_if/linux/scan/inc/wlan_cfg80211_scan.h +++ b/os_if/linux/scan/inc/wlan_cfg80211_scan.h @@ -139,6 +139,18 @@ int wlan_cfg80211_sched_scan_stop(struct wlan_objmgr_pdev *pdev, struct net_device *dev); #endif +/** + * wlan_scan_runtime_pm_deinit() - API to deinitialize runtime pm + * for scan. + * @pdev: Pointer to pdev + * + * This will help to deinitialize scan runtime pm before deinitialize + * HIF + * + * Return: void + */ +void wlan_scan_runtime_pm_deinit(struct wlan_objmgr_pdev *pdev); + /** * wlan_cfg80211_scan_priv_init() - API to initialize cfg80211 scan * @pdev: Pointer to net device diff --git a/os_if/linux/scan/src/wlan_cfg80211_scan.c b/os_if/linux/scan/src/wlan_cfg80211_scan.c index 52ddd5ee9226..288d2873e2c9 100644 --- a/os_if/linux/scan/src/wlan_cfg80211_scan.c +++ b/os_if/linux/scan/src/wlan_cfg80211_scan.c @@ -773,6 +773,20 @@ allow_suspend: } +void wlan_scan_runtime_pm_deinit(struct wlan_objmgr_pdev *pdev) +{ + struct pdev_osif_priv *osif_priv; + struct osif_scan_pdev *scan_priv; + + wlan_pdev_obj_lock(pdev); + osif_priv = wlan_pdev_get_ospriv(pdev); + wlan_pdev_obj_unlock(pdev); + + scan_priv = osif_priv->osif_scan; + qdf_runtime_lock_deinit(scan_priv->runtime_pm_lock); + scan_priv->runtime_pm_lock = NULL; +} + QDF_STATUS wlan_cfg80211_scan_priv_init(struct wlan_objmgr_pdev *pdev) { struct pdev_osif_priv *osif_priv; @@ -819,8 +833,6 @@ QDF_STATUS wlan_cfg80211_scan_priv_deinit(struct wlan_objmgr_pdev *pdev) ucfg_scan_unregister_requester(psoc, scan_priv->req_id); qdf_list_destroy(&scan_priv->scan_req_q); qdf_mutex_destroy(&scan_priv->scan_req_q_lock); - qdf_runtime_lock_deinit(scan_priv->runtime_pm_lock); - scan_priv->runtime_pm_lock = NULL; qdf_mem_free(scan_priv); return QDF_STATUS_SUCCESS;