瀏覽代碼

qcacmn: Add support to enable/disable scans

Adds support to enable/disable scans for the psoc.
Also adds API to set and get the scan enable/disable status.

Change-Id: I2ebb6f9c7fffabef90e9f8c461bdf735e95f0db3
CRs-Fixed: 2124783
Abhishek Singh 7 年之前
父節點
當前提交
65c4be7ef3

+ 2 - 0
umac/scan/core/src/wlan_scan_main.h

@@ -366,6 +366,7 @@ struct scan_cb {
 
 /**
  * struct wlan_scan_obj - scan object definition
+ * @enable_scan: if scan is enabled
  * @scan_db:    scan cache data base
  * @lock:       spin lock
  * @scan_def:   default scan parameters
@@ -378,6 +379,7 @@ struct scan_cb {
  * @ie_whitelist: default ie whitelist attrs
  */
 struct wlan_scan_obj {
+	bool enable_scan;
 	qdf_spinlock_t lock;
 	qdf_atomic_t scan_ids;
 	struct scan_dbs scan_db[WLAN_UMAC_MAX_PDEVS];

+ 17 - 0
umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h

@@ -172,6 +172,23 @@ ucfg_scan_get_pno_match(struct wlan_objmgr_vdev *vdev)
 QDF_STATUS
 ucfg_scan_start(struct scan_start_request *req);
 
+/**
+ * ucfg_scan_set_enable() - Public API to disable/enable scans
+ * @psoc: psoc on which scans need to be disabled
+ * @enable: enable scan if true disable is false
+ *
+ * Return: QDF_STATUS.
+ */
+QDF_STATUS ucfg_scan_set_enable(struct wlan_objmgr_psoc *psoc, bool enable);
+
+/**
+ * ucfg_scan_get_enable() - Public API to get if scan is enabled or disabled
+ * @psoc: psoc on which scans status need to be checked
+ *
+ * Return: true if enabled else false.
+ */
+bool ucfg_scan_get_enable(struct wlan_objmgr_psoc *psoc);
+
 /**
  * ucfg_scan_cancel() - Public API to stop a scan
  * @req: stop scan request params

+ 43 - 0
umac/scan/dispatcher/src/wlan_scan_ucfg_api.c

@@ -416,6 +416,7 @@ ucfg_scan_start(struct scan_start_request *req)
 {
 	struct scheduler_msg msg = {0};
 	QDF_STATUS status;
+	struct wlan_scan_obj *scan_obj;
 
 	if (!req || !req->vdev) {
 		scm_err("vdev: %pK, req: %pK", req->vdev, req);
@@ -423,6 +424,19 @@ ucfg_scan_start(struct scan_start_request *req)
 			scm_scan_free_scan_request_mem(req);
 		return QDF_STATUS_E_NULL_VALUE;
 	}
+
+	scan_obj = wlan_pdev_get_scan_obj(wlan_vdev_get_pdev(req->vdev));
+	if (!scan_obj) {
+		scm_err("Failed to get scan object");
+		scm_scan_free_scan_request_mem(req);
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	if (!scan_obj->enable_scan) {
+		scm_err("scan disabled, rejecting the scan req");
+		scm_scan_free_scan_request_mem(req);
+		return QDF_STATUS_E_AGAIN;
+	}
 	scm_info("reqid: %d, scanid: %d, vdevid: %d",
 		req->scan_req.scan_req_id, req->scan_req.scan_id,
 		req->scan_req.vdev_id);
@@ -454,6 +468,34 @@ ucfg_scan_start(struct scan_start_request *req)
 	return status;
 }
 
+QDF_STATUS ucfg_scan_set_enable(struct wlan_objmgr_psoc *psoc, bool enable)
+{
+	struct wlan_scan_obj *scan_obj;
+
+	scan_obj = wlan_psoc_get_scan_obj(psoc);
+	if (!scan_obj) {
+		scm_err("Failed to get scan object");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+	scan_obj->enable_scan = enable;
+	scm_debug("set enable_scan to %d", scan_obj->enable_scan);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+bool ucfg_scan_get_enable(struct wlan_objmgr_psoc *psoc)
+{
+	struct wlan_scan_obj *scan_obj;
+
+	scan_obj = wlan_psoc_get_scan_obj(psoc);
+	if (!scan_obj) {
+		scm_err("Failed to get scan object");
+		return false;
+	}
+	return scan_obj->enable_scan;
+}
+
+
 QDF_STATUS
 ucfg_scan_cancel(struct scan_cancel_request *req)
 {
@@ -739,6 +781,7 @@ ucfg_scan_register_event_handler(struct wlan_objmgr_pdev *pdev,
 static QDF_STATUS
 wlan_scan_global_init(struct wlan_scan_obj *scan_obj)
 {
+	scan_obj->enable_scan = true;
 	scan_obj->scan_def.active_dwell = SCAN_ACTIVE_DWELL_TIME;
 	scan_obj->scan_def.passive_dwell = SCAN_PASSIVE_DWELL_TIME;
 	scan_obj->scan_def.max_rest_time = SCAN_MAX_REST_TIME;