diff --git a/os_if/linux/scan/inc/wlan_cfg80211_scan.h b/os_if/linux/scan/inc/wlan_cfg80211_scan.h index b517d83892e3..6dc8ab38e0ec 100644 --- a/os_if/linux/scan/inc/wlan_cfg80211_scan.h +++ b/os_if/linux/scan/inc/wlan_cfg80211_scan.h @@ -81,10 +81,12 @@ typedef struct { * struct osif_scan_pdev - OS scan private strcutre * scan_req_q: Scan request queue * req_id: Scan request Id -*/ + * runtime_pm_lock: Runtime suspend lock + */ struct osif_scan_pdev{ qdf_list_t scan_req_q; wlan_scan_requester req_id; + qdf_runtime_lock_t runtime_pm_lock; }; /* diff --git a/os_if/linux/scan/src/wlan_cfg80211_scan.c b/os_if/linux/scan/src/wlan_cfg80211_scan.c index 5d404d2349c5..4c22aa8f0d32 100644 --- a/os_if/linux/scan/src/wlan_cfg80211_scan.c +++ b/os_if/linux/scan/src/wlan_cfg80211_scan.c @@ -682,6 +682,7 @@ static void wlan_cfg80211_scan_done_callback( uint32_t scan_id = event->scan_id; uint8_t source = NL_SCAN; struct wlan_objmgr_pdev *pdev; + struct pdev_osif_priv *osif_priv; QDF_STATUS status; if ((event->type != SCAN_EVENT_TYPE_COMPLETED) && @@ -722,7 +723,7 @@ static void wlan_cfg80211_scan_done_callback( status = wlan_scan_request_dequeue(pdev, scan_id, &req, &source); if (QDF_IS_STATUS_ERROR(status)) { cfg80211_err("Dequeue of scan request failed ID: %d", scan_id); - return; + goto allow_suspend; } /* @@ -736,6 +737,13 @@ static void wlan_cfg80211_scan_done_callback( wlan_cfg80211_scan_done(req, aborted); else wlan_vendor_scan_callback(req, aborted); + +allow_suspend: + osif_priv = wlan_pdev_get_ospriv(pdev); + if (qdf_list_empty(&osif_priv->osif_scan->scan_req_q)) + qdf_runtime_pm_allow_suspend( + osif_priv->osif_scan->runtime_pm_lock); + } QDF_STATUS wlan_cfg80211_scan_priv_init(struct wlan_objmgr_pdev *pdev) @@ -762,6 +770,7 @@ QDF_STATUS wlan_cfg80211_scan_priv_init(struct wlan_objmgr_pdev *pdev) osif_priv->osif_scan = scan_priv; qdf_list_create(&scan_priv->scan_req_q, WLAN_MAX_SCAN_COUNT); scan_priv->req_id = req_id; + scan_priv->runtime_pm_lock = qdf_runtime_lock_init("scan"); return QDF_STATUS_SUCCESS; } @@ -781,6 +790,8 @@ QDF_STATUS wlan_cfg80211_scan_priv_deinit(struct wlan_objmgr_pdev *pdev) osif_priv->osif_scan = NULL; ucfg_scan_unregister_requester(psoc, scan_priv->req_id); qdf_list_destroy(&scan_priv->scan_req_q); + qdf_runtime_lock_deinit(scan_priv->runtime_pm_lock); + scan_priv->runtime_pm_lock = NULL; qdf_mem_free(scan_priv); return QDF_STATUS_SUCCESS; @@ -1044,6 +1055,9 @@ int wlan_cfg80211_scan(struct wlan_objmgr_pdev *pdev, /* Enqueue the scan request */ wlan_scan_request_enqueue(pdev, request, source, req->scan_req.scan_id); + qdf_runtime_pm_prevent_suspend( + osif_priv->osif_scan->runtime_pm_lock); + status = ucfg_scan_start(req); if (QDF_STATUS_SUCCESS != status) { cfg80211_err("ucfg_scan_start returned error %d", status); @@ -1053,6 +1067,10 @@ int wlan_cfg80211_scan(struct wlan_objmgr_pdev *pdev, } else { status = -EIO; } + wlan_scan_request_dequeue(pdev, scan_id, &request, &source); + if (qdf_list_empty(&osif_priv->osif_scan->scan_req_q)) + qdf_runtime_pm_allow_suspend( + osif_priv->osif_scan->runtime_pm_lock); } end: diff --git a/qdf/linux/src/qdf_lock.c b/qdf/linux/src/qdf_lock.c index ffddb53438dc..676beaa4e52e 100644 --- a/qdf/linux/src/qdf_lock.c +++ b/qdf/linux/src/qdf_lock.c @@ -551,6 +551,43 @@ void qdf_runtime_lock_deinit(qdf_runtime_lock_t lock) } EXPORT_SYMBOL(qdf_runtime_lock_deinit); +#else + +QDF_STATUS qdf_runtime_pm_get(void) +{ + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(qdf_runtime_pm_get); + +QDF_STATUS qdf_runtime_pm_put(void) +{ + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(qdf_runtime_pm_put); + +QDF_STATUS qdf_runtime_pm_prevent_suspend(qdf_runtime_lock_t lock) +{ + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(qdf_runtime_pm_prevent_suspend); + +QDF_STATUS qdf_runtime_pm_allow_suspend(qdf_runtime_lock_t lock) +{ + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(qdf_runtime_pm_allow_suspend); + +qdf_runtime_lock_t qdf_runtime_lock_init(const char *name) +{ + return NULL; +} +EXPORT_SYMBOL(qdf_runtime_lock_init); + +void qdf_runtime_lock_deinit(qdf_runtime_lock_t lock) +{ +} +EXPORT_SYMBOL(qdf_runtime_lock_deinit); + #endif /* CONFIG_MCL */ /**