From 04dfab5ac6713fbabb1d6d502e5ebe0f01886db6 Mon Sep 17 00:00:00 2001 From: Yue Ma Date: Tue, 3 Oct 2017 15:05:05 -0700 Subject: [PATCH] qcacmn: Add API to init scan runtime suspend lock Commit fb9d5acfed and 645749571d introduce an API to deinit scan runtime suspend lock in order to fix a memory leak issue. However, it breaks SSR because scan lock init and deinit are not matching during SSR which results double free happens in the rmmod after SSR. Add the API to init scan runtime suspend lock so that it can be added in the correct place during SSR. Change-Id: Ied85b16b199fdbf43fef4c966bed56c9f7bb0e86 CRs-fixed: 2120661 --- os_if/linux/scan/inc/wlan_cfg80211_scan.h | 10 ++++++++++ os_if/linux/scan/src/wlan_cfg80211_scan.c | 15 ++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/os_if/linux/scan/inc/wlan_cfg80211_scan.h b/os_if/linux/scan/inc/wlan_cfg80211_scan.h index 7c8a6a836275..976b3810162b 100644 --- a/os_if/linux/scan/inc/wlan_cfg80211_scan.h +++ b/os_if/linux/scan/inc/wlan_cfg80211_scan.h @@ -150,6 +150,16 @@ int wlan_cfg80211_sched_scan_stop(struct wlan_objmgr_pdev *pdev, struct net_device *dev); #endif +/** + * wlan_scan_runtime_pm_init() - API to initialize runtime pm context for scan + * @pdev: Pointer to pdev + * + * This will help to initialize scan runtime pm context separately. + * + * Return: QDF_STATUS + */ +QDF_STATUS wlan_scan_runtime_pm_init(struct wlan_objmgr_pdev *pdev); + /** * wlan_scan_runtime_pm_deinit() - API to deinitialize runtime pm * for scan. diff --git a/os_if/linux/scan/src/wlan_cfg80211_scan.c b/os_if/linux/scan/src/wlan_cfg80211_scan.c index abb52df7bf78..c40b15155c8a 100644 --- a/os_if/linux/scan/src/wlan_cfg80211_scan.c +++ b/os_if/linux/scan/src/wlan_cfg80211_scan.c @@ -977,6 +977,20 @@ allow_suspend: } +QDF_STATUS wlan_scan_runtime_pm_init(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; + + return qdf_runtime_lock_init(&scan_priv->runtime_pm_lock); +} + void wlan_scan_runtime_pm_deinit(struct wlan_objmgr_pdev *pdev) { struct pdev_osif_priv *osif_priv; @@ -1013,7 +1027,6 @@ QDF_STATUS wlan_cfg80211_scan_priv_init(struct wlan_objmgr_pdev *pdev) qdf_list_create(&scan_priv->scan_req_q, WLAN_MAX_SCAN_COUNT); qdf_mutex_create(&scan_priv->scan_req_q_lock); scan_priv->req_id = req_id; - qdf_runtime_lock_init(&scan_priv->runtime_pm_lock); return QDF_STATUS_SUCCESS; }