Переглянути джерело

qcacld-3.0: Vendor command support for MLO and EHT config

Add vendor command support to configure MLO and EHT
capability support.

Change-Id: I10f4fffb1fc7382bad7feb4cd82d2f4f3c366e1b
CRs-Fixed: 3271417
Kiran Kumar Lokere 2 роки тому
батько
коміт
31bc110c0d
1 змінених файлів з 221 додано та 1 видалено
  1. 221 1
      core/hdd/src/wlan_hdd_cfg80211.c

+ 221 - 1
core/hdd/src/wlan_hdd_cfg80211.c

@@ -8024,6 +8024,14 @@ const struct nla_policy wlan_hdd_wifi_config_policy[
 		.type = NLA_U8 },
 	[QCA_WLAN_VENDOR_ATTR_CONFIG_WFC_STATE] = {
 		.type = NLA_U8 },
+	[QCA_WLAN_VENDOR_ATTR_CONFIG_EHT_EML_CAPABILITY] = {
+		.type = NLA_U8},
+	[QCA_WLAN_VENDOR_ATTR_CONFIG_EHT_MLO_MAX_SIMULTANEOUS_LINKS] = {
+		.type = NLA_U8},
+	[QCA_WLAN_VENDOR_ATTR_CONFIG_EHT_MLO_MAX_NUM_LINKS] = {
+		.type = NLA_U8},
+	[QCA_WLAN_VENDOR_ATTR_CONFIG_EHT_MLO_MODE] = {
+		.type = NLA_U8},
 };
 
 static const struct nla_policy
@@ -8148,6 +8156,20 @@ wlan_hdd_wifi_test_config_policy[
 			.type = NLA_U8},
 		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_BEAMFORMER_PERIODIC_SOUNDING] = {
 			.type = NLA_U8},
+		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_EHT_BEAMFORMEE_SS_80MHZ] = {
+			.type = NLA_U8},
+		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_EHT_BEAMFORMEE_SS_160MHZ] = {
+			.type = NLA_U8},
+		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_EHT_BEAMFORMEE_SS_320MHZ] = {
+			.type = NLA_U8},
+		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_EXCLUDE_STA_PROF_IN_PROBE_REQ] = {
+			.type = NLA_U8},
+		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_SET_EHT_TESTBED_DEFAULTS] = {
+			.type = NLA_U8},
+		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_EHT_MCS] = {
+			.type = NLA_U8},
+		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_EHT_TB_SOUNDING_FB_RL] = {
+			.type = NLA_U8},
 };
 
 /**
@@ -10646,6 +10668,97 @@ static int hdd_set_wfc_state(struct hdd_adapter *adapter,
 
 }
 
+#ifdef WLAN_FEATURE_11BE
+/**
+ * hdd_set_eht_max_simultaneous_links() - Set EHT maximum number of
+ * simultaneous links
+ * @adapter: hdd adapter
+ * @attr: pointer to nla attr
+ *
+ * Return: 0 on success, negative on failure
+ */
+static int hdd_set_eht_max_simultaneous_links(struct hdd_adapter *adapter,
+					      const struct nlattr *attr)
+{
+	uint8_t cfg_val;
+	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
+
+	cfg_val = nla_get_u8(attr);
+	if (cfg_val < 0 || cfg_val > MAX_SIMULTANEOUS_STA_ML_LINKS)
+		return -EINVAL;
+
+	sme_set_mlo_max_simultaneous_links(hdd_ctx->mac_handle,
+					   adapter->vdev_id, cfg_val);
+
+	return 0;
+}
+
+/**
+ * hdd_set_eht_max_num_links() - Set EHT maximum number of links
+ * @adapter: hdd adapter
+ * @attr: pointer to nla attr
+ *
+ * Return: 0 on success, negative on failure
+ */
+static int hdd_set_eht_max_num_links(struct hdd_adapter *adapter,
+				     const struct nlattr *attr)
+{
+	uint8_t cfg_val;
+	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
+
+	cfg_val = nla_get_u8(attr);
+	if (cfg_val < 0 || cfg_val > MAX_NUM_STA_ML_lINKS)
+		return -EINVAL;
+
+	sme_set_mlo_max_links(hdd_ctx->mac_handle, adapter->vdev_id, cfg_val);
+
+	return 0;
+}
+
+/**
+ * hdd_set_eht_mlo_mode() - Set EHT MLO mode of operation
+ * @adapter: hdd adapter
+ * @attr: pointer to nla attr
+ *
+ * Return: 0 on success, negative on failure
+ */
+static int hdd_set_eht_mlo_mode(struct hdd_adapter *adapter,
+				const struct nlattr *attr)
+{
+	uint8_t cfg_val;
+	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
+
+	cfg_val = nla_get_u8(attr);
+	hdd_debug("Configure EHT mode of operation: %d", cfg_val);
+	if (cfg_val < WLAN_EHT_MODE_SLO || cfg_val > WLAN_EHT_MODE_MLMR)
+		return -EINVAL;
+
+	ucfg_mlme_set_eht_mode(hdd_ctx->psoc, cfg_val);
+
+	return 0;
+}
+#else
+static inline
+int hdd_set_eht_max_simultaneous_links(struct hdd_adapter *adapter,
+				       const struct nlattr *attr)
+{
+	return 0;
+}
+
+static inline
+int hdd_set_eht_max_num_links(struct hdd_adapter *adapter,
+			      const struct nlattr *attr)
+{
+	return 0;
+}
+
+static inline
+int hdd_set_eht_mlo_mode(struct hdd_adapter *adapter, const struct nlattr *attr)
+{
+	return 0;
+}
+#endif
+
 /**
  * typedef independent_setter_fn - independent attribute handler
  * @adapter: The adapter being configured
@@ -10775,6 +10888,12 @@ static const struct independent_setters independent_setters[] = {
 
 	{QCA_WLAN_VENDOR_ATTR_CONFIG_WFC_STATE,
 	 hdd_set_wfc_state},
+	{QCA_WLAN_VENDOR_ATTR_CONFIG_EHT_MLO_MAX_SIMULTANEOUS_LINKS,
+	 hdd_set_eht_max_simultaneous_links},
+	{QCA_WLAN_VENDOR_ATTR_CONFIG_EHT_MLO_MAX_NUM_LINKS,
+	 hdd_set_eht_max_num_links},
+	{QCA_WLAN_VENDOR_ATTR_CONFIG_EHT_MLO_MODE,
+	 hdd_set_eht_mlo_mode},
 };
 
 #ifdef WLAN_FEATURE_ELNA
@@ -12054,13 +12173,20 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy,
 			goto send_err;
 	}
 
-	if (tb[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ENABLE_TX_BEAMFORMEE]) {
+	cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ENABLE_TX_BEAMFORMEE;
+	if (tb[cmd_id]) {
 		cfg_val = nla_get_u8(tb[
 			QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ENABLE_TX_BEAMFORMEE]);
 		hdd_debug("Set Tx beamformee to %d", cfg_val);
 		ret_val = sme_update_tx_bfee_supp(mac_handle,
 						  adapter->vdev_id,
 						  cfg_val);
+		if (ret_val)
+			sme_err("Failed to update Tx beamformee support");
+
+		ret_val = sme_update_eht_caps(mac_handle, adapter->vdev_id,
+					      cfg_val, EHT_TX_BFEE_ENABLE,
+					      adapter->device_mode);
 		if (ret_val)
 			sme_err("Failed to set Tx beamformee cap");
 
@@ -12647,6 +12773,100 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy,
 					set_val, PDEV_CMD);
 	}
 
+	cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_EHT_BEAMFORMEE_SS_80MHZ;
+	if (tb[cmd_id]) {
+		cfg_val = nla_get_u8(tb[cmd_id]);
+		hdd_debug("Configure Tx BF < 80 MHz: %d", cfg_val);
+
+		ret_val = sme_update_eht_caps(mac_handle, adapter->vdev_id,
+					      cfg_val, EHT_TX_BFEE_SS_80MHZ,
+					      adapter->device_mode);
+		if (ret_val)
+			sme_err("Failed to update EHT Tx BFEE cap");
+	}
+
+	cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_EHT_BEAMFORMEE_SS_160MHZ;
+	if (tb[cmd_id]) {
+		cfg_val = nla_get_u8(tb[cmd_id]);
+		hdd_debug("Configure Tx BF for 160 MHz: %d", cfg_val);
+
+		ret_val = sme_update_eht_caps(mac_handle, adapter->vdev_id,
+					      cfg_val, EHT_TX_BFEE_SS_160MHZ,
+					      adapter->device_mode);
+		if (ret_val)
+			sme_err("Failed to update EHT Tx BFEE cap");
+	}
+
+	cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_EHT_BEAMFORMEE_SS_320MHZ;
+	if (tb[cmd_id]) {
+		cfg_val = nla_get_u8(tb[cmd_id]);
+		hdd_debug("Configure Tx BF for 320 MHz: %d", cfg_val);
+
+		ret_val = sme_update_eht_caps(mac_handle, adapter->vdev_id,
+					      cfg_val, EHT_TX_BFEE_SS_320MHZ,
+					      adapter->device_mode);
+		if (ret_val)
+			sme_err("Failed to update EHT Tx BFEE cap");
+	}
+
+	cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_EXCLUDE_STA_PROF_IN_PROBE_REQ;
+	if (tb[cmd_id] && adapter->device_mode == QDF_STA_MODE) {
+		cfg_val = nla_get_u8(tb[cmd_id]);
+
+		if (cfg_val) {
+			wlan_vdev_obj_lock(adapter->vdev);
+			wlan_vdev_mlme_cap_set(
+					adapter->vdev,
+					WLAN_VDEV_C_EXCL_STA_PROF_PRB_REQ);
+			wlan_vdev_obj_unlock(adapter->vdev);
+		} else {
+			wlan_vdev_obj_lock(adapter->vdev);
+			wlan_vdev_mlme_cap_clear(
+					adapter->vdev,
+					WLAN_VDEV_C_EXCL_STA_PROF_PRB_REQ);
+			wlan_vdev_obj_unlock(adapter->vdev);
+		}
+		hdd_debug("Sta profile in Probe req frame: %d", cfg_val);
+	}
+
+	cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_SET_EHT_TESTBED_DEFAULTS;
+	if (tb[cmd_id]) {
+		cfg_val = nla_get_u8(tb[cmd_id]);
+		hdd_debug("Configure EHT testbed defaults %d", cfg_val);
+		if (!cfg_val)
+			sme_reset_eht_caps(hdd_ctx->mac_handle,
+					   adapter->vdev_id);
+		else
+			sme_set_eht_testbed_def(hdd_ctx->mac_handle,
+						adapter->vdev_id);
+
+		sme_set_vdev_ies_per_band(hdd_ctx->mac_handle, adapter->vdev_id,
+					  adapter->device_mode);
+	}
+
+	cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_EHT_MCS;
+	if (tb[cmd_id]) {
+		cfg_val = nla_get_u8(tb[cmd_id]);
+		sme_update_eht_cap_mcs(hdd_ctx->mac_handle, adapter->vdev_id,
+				       cfg_val);
+		sme_set_vdev_ies_per_band(hdd_ctx->mac_handle, adapter->vdev_id,
+					  adapter->device_mode);
+	}
+
+	cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_EHT_TB_SOUNDING_FB_RL;
+	if (tb[cmd_id]) {
+		cfg_val = nla_get_u8(tb[cmd_id]);
+		hdd_debug("Configure TB sounding feedback rate limit: %d",
+			  cfg_val);
+
+		ret_val = sme_update_eht_caps(
+					mac_handle, adapter->vdev_id,
+					cfg_val,
+					EHT_TX_BFEE_SOUNDING_FEEDBACK_RATELIMIT,
+					adapter->device_mode);
+		if (ret_val)
+			sme_err("Failed to update EHT Tx BFEE cap");
+	}
 	if (update_sme_cfg)
 		sme_update_config(mac_handle, sme_config);