Bladeren bron

qcacld-3.0: Add logic to control WIFI standard per vdev

With these APIs, vdev connection is effected by the
WIFI standard version. For example, if wifi_std is
wifi6, then the connection will not use 11be feature.

Change-Id: I8f762f9cf16d876d5cf2847561b61c11a23e97b5
CRs-Fixed: 3554305
Paul Zhang 1 jaar geleden
bovenliggende
commit
39dcbc8810

+ 6 - 2
components/cmn_services/interface_mgr/src/wlan_if_mgr_roam.c

@@ -786,6 +786,7 @@ if_mgr_get_conc_ext_flags(struct wlan_objmgr_vdev *vdev,
 }
 
 static void if_mgr_update_candidate(struct wlan_objmgr_psoc *psoc,
+				    struct wlan_objmgr_vdev *vdev,
 				    struct validate_bss_data *candidate_info)
 {
 	struct scan_cache_entry *scan_entry = candidate_info->scan_entry;
@@ -796,8 +797,10 @@ static void if_mgr_update_candidate(struct wlan_objmgr_psoc *psoc,
 
 	if (mlme_get_bss_11be_allowed(psoc, &candidate_info->peer_addr,
 				      util_scan_entry_ie_data(scan_entry),
-				      util_scan_entry_ie_len(scan_entry)))
+				      util_scan_entry_ie_len(scan_entry)) &&
+	    (!wlan_vdev_mlme_get_user_dis_eht_flag(vdev)))
 		return;
+
 	scan_entry->ie_list.multi_link_bv = NULL;
 	scan_entry->ie_list.ehtcap = NULL;
 	scan_entry->ie_list.ehtop = NULL;
@@ -813,6 +816,7 @@ if_mgr_get_conc_ext_flags(struct wlan_objmgr_vdev *vdev,
 }
 
 static void if_mgr_update_candidate(struct wlan_objmgr_psoc *psoc,
+				    struct wlan_objmgr_vdev *vdev,
 				    struct validate_bss_data *candidate_info)
 {
 }
@@ -841,7 +845,7 @@ QDF_STATUS if_mgr_validate_candidate(struct wlan_objmgr_vdev *vdev,
 	if (!psoc)
 		return QDF_STATUS_E_FAILURE;
 
-	if_mgr_update_candidate(psoc, candidate_info);
+	if_mgr_update_candidate(psoc, vdev, candidate_info);
 	/*
 	 * Do not allow STA to connect on 6Ghz or indoor channel for non dbs
 	 * hardware if SAP and skip_6g_and_indoor_freq_scan ini are present

+ 4 - 0
components/mlme/core/inc/wlan_mlme_main.h

@@ -765,6 +765,8 @@ struct enhance_roam_info {
  * @ba_2k_jump_iot_ap: This is set to true if connected to the ba 2k jump IOT AP
  * @is_usr_ps_enabled: Is Power save enabled
  * @notify_co_located_ap_upt_rnr: Notify co located AP to update RNR or not
+ * @is_user_std_set: true if user set the @wifi_std
+ * @wifi_std: wifi standard version
  * @max_mcs_index: Max supported mcs index of vdev
  * @vdev_traffic_type: to set if vdev is LOW_LATENCY or HIGH_TPUT
  * @country_ie_for_all_band: take all band channel info in country ie
@@ -833,6 +835,8 @@ struct mlme_legacy_priv {
 	bool ba_2k_jump_iot_ap;
 	bool is_usr_ps_enabled;
 	bool notify_co_located_ap_upt_rnr;
+	bool is_user_std_set;
+	WMI_HOST_WIFI_STANDARD wifi_std;
 #ifdef WLAN_FEATURE_SON
 	uint8_t max_mcs_index;
 #endif

+ 8 - 0
components/mlme/core/inc/wlan_mlme_vdev_mgr_interface.h

@@ -440,6 +440,14 @@ void mlme_set_notify_co_located_ap_update_rnr(struct wlan_objmgr_vdev *vdev,
  */
 bool wlan_is_vdev_traffic_ll_ht(struct wlan_objmgr_vdev *vdev);
 
+/**
+ * mlme_get_vdev_wifi_std() - get the wifi std version for the vdev
+ * @vdev: vdev pointer
+ *
+ * Return: WMI_HOST_WIFI_STANDARD
+ */
+WMI_HOST_WIFI_STANDARD mlme_get_vdev_wifi_std(struct wlan_objmgr_vdev *vdev);
+
 /**
  * mlme_get_assoc_type() - get associate type
  * @vdev: vdev pointer

+ 16 - 0
components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c

@@ -1233,6 +1233,22 @@ bool wlan_is_vdev_traffic_ll_ht(struct wlan_objmgr_vdev *vdev)
 	return false;
 }
 
+WMI_HOST_WIFI_STANDARD mlme_get_vdev_wifi_std(struct wlan_objmgr_vdev *vdev)
+{
+	struct mlme_legacy_priv *mlme_priv;
+
+	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
+	if (!mlme_priv) {
+		mlme_legacy_err("vdev legacy private object is NULL");
+		return WMI_HOST_WIFI_STANDARD_7;
+	}
+
+	if (!mlme_priv->is_user_std_set)
+		return WMI_HOST_WIFI_STANDARD_7;
+
+	return mlme_priv->wifi_std;
+}
+
 enum vdev_assoc_type  mlme_get_assoc_type(struct wlan_objmgr_vdev *vdev)
 {
 	struct mlme_legacy_priv *mlme_priv;

+ 12 - 0
components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h

@@ -4678,6 +4678,18 @@ ucfg_mlme_set_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc,
 
 #endif
 
+/**
+ * ucfg_mlme_set_vdev_wifi_std()  - Set vdev wifi standard support
+ * @psoc: pointer to psoc object
+ * @vdev_id: Vdev id
+ * @wifi_std: wifi standard version
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+ucfg_mlme_set_vdev_wifi_std(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
+			    WMI_HOST_WIFI_STANDARD wifi_std);
+
 /**
  * ucfg_mlme_set_vdev_traffic_low_latency()  - Set/clear vdev low latency
  * config

+ 35 - 0
components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c

@@ -415,6 +415,41 @@ release:
 	return status;
 }
 
+QDF_STATUS
+ucfg_mlme_set_vdev_wifi_std(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
+			    WMI_HOST_WIFI_STANDARD wifi_std)
+{
+	struct wlan_objmgr_vdev *vdev;
+	struct mlme_legacy_priv *mlme_priv;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+						    WLAN_MLME_OBJMGR_ID);
+	if (!vdev) {
+		mlme_legacy_err("vdev %d: vdev not found",
+				vdev_id);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
+	if (!mlme_priv) {
+		mlme_legacy_err("vdev %d: vmlme_priv is null", vdev_id);
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	mlme_priv->wifi_std = wifi_std;
+	mlme_priv->is_user_std_set = true;
+
+	if (wifi_std < WMI_HOST_WIFI_STANDARD_7)
+		wlan_vdev_mlme_set_user_dis_eht_flag(vdev, true);
+	else
+		wlan_vdev_mlme_set_user_dis_eht_flag(vdev, false);
+
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
+
+	return QDF_STATUS_SUCCESS;
+}
+
 QDF_STATUS
 ucfg_mlme_set_vdev_traffic_low_latency(struct wlan_objmgr_psoc *psoc,
 				       uint8_t vdev_id, bool set)