فهرست منبع

qcacmn: Don't Scan same mac frequencies, if low latency SAP present

Currently, Scan list is trimmed based on low latency sap frequency.
But even after removal of 6 GHz frequencies from scan list,
host receives scan events for 6 GHz frequencies because rnr info
is updated and hint bssids and hint ssids are added due to which
FW scans 6 GHz frequencies also.

Fix is to update hint_bssid and hint_s_ssid to those frequencies
only which are allowed to be scanned in case low latency sap is up.

Change-Id: I7f9bc6b6262a235d5aa02c9155555b4827227acf
CRs-Fixed: 3379401
Sheenam Monga 2 سال پیش
والد
کامیت
a1a81cce96
1فایلهای تغییر یافته به همراه96 افزوده شده و 0 حذف شده
  1. 96 0
      umac/scan/dispatcher/src/wlan_scan_api.c

+ 96 - 0
umac/scan/dispatcher/src/wlan_scan_api.c

@@ -719,6 +719,100 @@ void wlan_scan_get_feature_info(struct wlan_objmgr_psoc *psoc,
 #endif
 
 #ifdef WLAN_POLICY_MGR_ENABLE
+/**
+ * wlan_scan_update_hint_bssid() - Update rnr hint bssid info
+ * @psoc: objmgr psoc
+ * @req: Scan request
+ * @ll_sap_freq: ll sap freq
+ *
+ * Use to update hint_bssid if low latency Sap is UP
+ *
+ * Return: void
+ */
+static void
+wlan_scan_update_hint_bssid(struct wlan_objmgr_psoc *psoc,
+			    struct scan_start_request *req,
+			    qdf_freq_t ll_sap_freq)
+{
+	struct hint_bssid hint_bssid[WLAN_SCAN_MAX_HINT_BSSID] = {0};
+	uint32_t i;
+	uint32_t count = 0;
+	qdf_freq_t freq;
+
+	if (!req->scan_req.num_hint_bssid)
+		return;
+
+	for (i = 0; i < req->scan_req.num_hint_bssid; i++) {
+		freq = req->scan_req.hint_bssid[i].freq_flags >> 16;
+		if (!freq)
+			continue;
+		if (!policy_mgr_2_freq_always_on_same_mac(psoc,
+							  ll_sap_freq,
+							  freq)) {
+			qdf_mem_copy(
+				&hint_bssid[count].bssid,
+				&req->scan_req.hint_bssid[i].bssid,
+				sizeof(hint_bssid[i].bssid));
+			hint_bssid[count].freq_flags =
+				req->scan_req.hint_bssid[i].freq_flags;
+			count++;
+		}
+	}
+	qdf_mem_zero(req->scan_req.hint_bssid,
+		     sizeof(req->scan_req.hint_bssid));
+	if (count)
+		qdf_mem_copy(req->scan_req.hint_bssid, hint_bssid,
+			     sizeof(hint_bssid));
+	req->scan_req.num_hint_bssid = count;
+}
+
+/**
+ * wlan_scan_update_hint_s_ssid() - Update rnr hint short ssid info
+ * @psoc: objmgr psoc
+ * @req: Scan request
+ * @ll_sap_freq: ll sap freq
+ *
+ * Use to update hint_s_ssid if low latency Sap is UP
+ *
+ * Return: void
+ */
+static
+void wlan_scan_update_hint_s_ssid(struct wlan_objmgr_psoc *psoc,
+				  struct scan_start_request *req,
+				  qdf_freq_t ll_sap_freq)
+{
+	struct hint_short_ssid hint_s_ssid[WLAN_SCAN_MAX_HINT_BSSID] = {0};
+	uint32_t i;
+	uint32_t count = 0;
+	qdf_freq_t freq;
+
+	if (!req->scan_req.num_hint_s_ssid)
+		return;
+
+	for (i = 0; i < req->scan_req.num_hint_s_ssid; i++) {
+		freq = req->scan_req.hint_s_ssid[i].freq_flags >> 16;
+		if (!freq)
+			continue;
+		if (!policy_mgr_2_freq_always_on_same_mac(psoc,
+							  ll_sap_freq,
+							  freq)) {
+			qdf_mem_copy(
+				&hint_s_ssid[count].short_ssid,
+				&req->scan_req.hint_s_ssid[i].short_ssid,
+				sizeof(hint_s_ssid[i].short_ssid));
+			hint_s_ssid[count].freq_flags =
+				req->scan_req.hint_s_ssid[i].freq_flags;
+			count++;
+		}
+	}
+	qdf_mem_zero(req->scan_req.hint_s_ssid,
+		     sizeof(req->scan_req.hint_s_ssid));
+	if (count)
+		qdf_mem_copy(req->scan_req.hint_s_ssid, hint_s_ssid,
+			     sizeof(hint_s_ssid));
+	req->scan_req.num_hint_s_ssid = count;
+}
+
 void wlan_scan_update_low_latency_profile_chnlist(
 				struct wlan_objmgr_vdev *vdev,
 				struct scan_start_request *req)
@@ -737,6 +831,8 @@ void wlan_scan_update_low_latency_profile_chnlist(
 	if (!ll_sap_freq)
 		return;
 
+	wlan_scan_update_hint_bssid(psoc, req, ll_sap_freq);
+	wlan_scan_update_hint_s_ssid(psoc, req, ll_sap_freq);
 	/*
 	 * Scenario: LL SAP is present and scan is requested.
 	 * Allow scan on freq on mutually exclusive mac.