|
@@ -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);
|
|
|
|