瀏覽代碼

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
Abhishek Singh 8 年之前
父節點
當前提交
ac80309005
共有 3 個文件被更改,包括 59 次插入2 次删除
  1. 3 1
      os_if/linux/scan/inc/wlan_cfg80211_scan.h
  2. 19 1
      os_if/linux/scan/src/wlan_cfg80211_scan.c
  3. 37 0
      qdf/linux/src/qdf_lock.c

+ 3 - 1
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;
 };
 
 /*

+ 19 - 1
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:

+ 37 - 0
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 */
 
 /**