qcacmn: Add runtime suspend logic for scan
Add runtime suspend logic for scan, to block runtime suspend when scan is started and unblock when scan is completed. Change-Id: I61c9afaf996d1ac97bfb5ffb0cd8a3abc971051e CRs-Fixed: 2035675
This commit is contained in:
@@ -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;
|
||||
};
|
||||
|
||||
/*
|
||||
|
@@ -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:
|
||||
|
Reference in New Issue
Block a user