Răsfoiți Sursa

qcacmn: Add support to restrict scan to preconfigured chans

Some times we need to scan only some pre configured
channels irrespective of channels requested in scan
start command.
Add support for pre specified list of scan channels
and scan only these channels if configured.

Change-Id: I7fa9ef9d626fd25d7855a7eb458818d8e2314fa5
CRs-Fixed: 2218494
Om Prakash Tripathi 7 ani în urmă
părinte
comite
8a4564f221

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

@@ -207,10 +207,12 @@ struct scan_requester_info {
  * struct pdev_scan_info - defines per pdev scan info
  * @wide_band_scan: wide band scan capability
  * @last_scan_time: time of last scan start on this pdev
+ * @custom_chan_list: scan only these channels
  */
 struct pdev_scan_info {
 	bool wide_band_scan;
 	qdf_time_t last_scan_time;
+	struct chan_list custom_chan_list;
 };
 
 /**

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

@@ -242,6 +242,17 @@ QDF_STATUS ucfg_scan_set_wide_band_scan(
  */
 bool ucfg_scan_get_wide_band_scan(struct wlan_objmgr_pdev *pdev);
 
+/**
+ * ucfg_scan_set_custom_scan_chan_list() - Public API to restrict scan
+ * to few pre configured channels
+ * @pdev: psoc on which scans need to be disabled
+ * @chan_list: list of channels to scan if set
+ *
+ * Return: QDF_STATUS.
+ */
+QDF_STATUS ucfg_scan_set_custom_scan_chan_list(
+		struct wlan_objmgr_pdev *pdev, struct chan_list *chan_list);
+
 /**
  * ucfg_scan_cancel() - Public API to stop a scan
  * @req: stop scan request params

+ 51 - 15
umac/scan/dispatcher/src/wlan_scan_ucfg_api.c

@@ -739,6 +739,26 @@ ucfg_scan_update_dbs_scan_ctrl_ext_flag(
 	struct scan_start_request *req) {}
 #endif
 
+QDF_STATUS
+ucfg_scan_set_custom_scan_chan_list(struct wlan_objmgr_pdev *pdev,
+		struct chan_list *chan_list)
+{
+	uint8_t pdev_id;
+	struct wlan_scan_obj *scan_obj;
+
+	if (!pdev || !chan_list) {
+		scm_warn("pdev: 0x%pK, chan_list: 0x%pK", pdev, chan_list);
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+	pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
+	scan_obj = wlan_pdev_get_scan_obj(pdev);
+
+	qdf_mem_copy(&scan_obj->pdev_info[pdev_id].custom_chan_list,
+			chan_list, sizeof(*chan_list));
+
+	return QDF_STATUS_SUCCESS;
+}
+
 /**
  * ucfg_scan_req_update_params() - update scan req params depending on modes
  * and scan type.
@@ -752,6 +772,9 @@ static void
 ucfg_scan_req_update_params(struct wlan_objmgr_vdev *vdev,
 	struct scan_start_request *req, struct wlan_scan_obj *scan_obj)
 {
+	struct chan_list *custom_chan_list;
+	struct wlan_objmgr_pdev *pdev;
+	uint8_t pdev_id;
 
 	/* Ensure correct number of probes are sent on active channel */
 	if (!req->scan_req.repeat_probe_time)
@@ -831,11 +854,34 @@ ucfg_scan_req_update_params(struct wlan_objmgr_vdev *vdev,
 	      req->scan_req.chan_list.num_chan == 1))
 		ucfg_scan_req_update_concurrency_params(vdev, req, scan_obj);
 
-	scm_debug("dwell time: active %d ;passive %d, repeat_probe_time %d n_probes %d flags_ext %x",
-		  req->scan_req.dwell_time_active,
-		  req->scan_req.dwell_time_passive,
-		  req->scan_req.repeat_probe_time, req->scan_req.n_probes,
-		  req->scan_req.scan_ctrl_flags_ext);
+	/* Set wide band flag if enabled. This will cause
+	 * phymode TLV being sent to FW.
+	 */
+	pdev = wlan_vdev_get_pdev(vdev);
+	pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
+	if (ucfg_scan_get_wide_band_scan(pdev))
+		req->scan_req.scan_f_wide_band = true;
+	else
+		req->scan_req.scan_f_wide_band = false;
+
+	/* Overwrite scan channles with custom scan channel
+	 * list if configured.
+	 */
+	custom_chan_list = &scan_obj->pdev_info[pdev_id].custom_chan_list;
+	if (custom_chan_list->num_chan)
+		qdf_mem_copy(&req->scan_req.chan_list, custom_chan_list,
+				sizeof(struct chan_list));
+	else if (req->scan_req.scan_f_wide_band &&
+			!req->scan_req.chan_list.num_chan)
+		ucfg_scan_init_chanlist_params(req, 0, NULL, NULL);
+
+	scm_debug("dwell time: active %d, passive %d, repeat_probe_time %d "
+			"n_probes %d flags_ext %x, wide_bw_scan: %d",
+			req->scan_req.dwell_time_active,
+			req->scan_req.dwell_time_passive,
+			req->scan_req.repeat_probe_time, req->scan_req.n_probes,
+			req->scan_req.scan_ctrl_flags_ext,
+			req->scan_req.scan_f_wide_band);
 }
 
 QDF_STATUS
@@ -880,16 +926,6 @@ ucfg_scan_start(struct scan_start_request *req)
 
 	ucfg_scan_req_update_params(req->vdev, req, scan_obj);
 
-	/* Overwrite scan parameters as required */
-	if (!ucfg_scan_get_wide_band_scan(pdev)) {
-		req->scan_req.scan_f_wide_band = false;
-	} else {
-		req->scan_req.scan_f_wide_band = true;
-		if (req->scan_req.chan_list.num_chan == 0)
-			ucfg_scan_init_chanlist_params(req, 0, NULL, NULL);
-	}
-	scm_debug("scan_f_wide_band: %d", req->scan_req.scan_f_wide_band);
-
 	/* Try to get vdev reference. Return if reference could
 	 * not be taken. Reference will be released once scan
 	 * request handling completes along with free of @req.