|
@@ -8204,15 +8204,22 @@ const struct nla_policy wlan_hdd_wifi_config_policy[
|
|
|
.type = NLA_U8},
|
|
|
[QCA_WLAN_VENDOR_ATTR_CONFIG_EHT_MLO_MODE] = {
|
|
|
.type = NLA_U8},
|
|
|
+ [QCA_WLAN_VENDOR_ATTR_CONFIG_EHT_MLO_ACTIVE_LINKS] = {
|
|
|
+ .type = NLA_NESTED},
|
|
|
+ [QCA_WLAN_VENDOR_ATTR_CONFIG_EMLSR_MODE_SWITCH] = {
|
|
|
+ .type = NLA_U8},
|
|
|
};
|
|
|
|
|
|
static const struct nla_policy
|
|
|
-qca_wlan_vendor_attr_he_omi_tx_policy [QCA_WLAN_VENDOR_ATTR_HE_OMI_MAX + 1] = {
|
|
|
+qca_wlan_vendor_attr_omi_tx_policy [QCA_WLAN_VENDOR_ATTR_OMI_MAX + 1] = {
|
|
|
[QCA_WLAN_VENDOR_ATTR_HE_OMI_RX_NSS] = {.type = NLA_U8 },
|
|
|
[QCA_WLAN_VENDOR_ATTR_HE_OMI_CH_BW] = {.type = NLA_U8 },
|
|
|
[QCA_WLAN_VENDOR_ATTR_HE_OMI_ULMU_DISABLE] = {.type = NLA_U8 },
|
|
|
[QCA_WLAN_VENDOR_ATTR_HE_OMI_TX_NSTS] = {.type = NLA_U8 },
|
|
|
[QCA_WLAN_VENDOR_ATTR_HE_OMI_ULMU_DATA_DISABLE] = {.type = NLA_U8 },
|
|
|
+ [QCA_WLAN_VENDOR_ATTR_EHT_OMI_RX_NSS_EXTN] = {.type = NLA_U8 },
|
|
|
+ [QCA_WLAN_VENDOR_ATTR_EHT_OMI_CH_BW_EXTN] = {.type = NLA_U8 },
|
|
|
+ [QCA_WLAN_VENDOR_ATTR_EHT_OMI_TX_NSS_EXTN] = {.type = NLA_U8 },
|
|
|
};
|
|
|
|
|
|
static const struct nla_policy
|
|
@@ -8342,6 +8349,14 @@ wlan_hdd_wifi_test_config_policy[
|
|
|
.type = NLA_U8},
|
|
|
[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_EHT_TB_SOUNDING_FB_RL] = {
|
|
|
.type = NLA_U8},
|
|
|
+ [QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_EHT_OM_CTRL_SUPPORT] = {
|
|
|
+ .type = NLA_U8},
|
|
|
+ [QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_EMLSR_PADDING_DELAY] = {
|
|
|
+ .type = NLA_U8},
|
|
|
+ [QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_FORCE_MLO_POWER_SAVE_BCN_PERIOD] = {
|
|
|
+ .type = NLA_U8},
|
|
|
+ [QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_EHT_MLO_STR_TX] = {
|
|
|
+ .type = NLA_U8},
|
|
|
};
|
|
|
|
|
|
/**
|
|
@@ -10854,6 +10869,72 @@ static int hdd_set_wfc_state(struct hdd_adapter *adapter,
|
|
|
}
|
|
|
|
|
|
#ifdef WLAN_FEATURE_11BE_MLO
|
|
|
+static int hdd_test_config_emlsr_mode(struct hdd_context *hdd_ctx,
|
|
|
+ bool cfg_val)
|
|
|
+
|
|
|
+{
|
|
|
+ hdd_debug("11be op mode setting %d", cfg_val);
|
|
|
+ if (cfg_val && policy_mgr_is_hw_emlsr_capable(hdd_ctx->psoc)) {
|
|
|
+ hdd_debug("HW supports EMLSR mode, set caps");
|
|
|
+ ucfg_mlme_set_emlsr_mode_enabled(hdd_ctx->psoc, cfg_val);
|
|
|
+ } else {
|
|
|
+ hdd_debug("Default mode: MLMR, no action required");
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int
|
|
|
+hdd_test_config_emlsr_action_mode(struct hdd_adapter *adapter,
|
|
|
+ enum wlan_emlsr_action_mode emlsr_mode)
|
|
|
+{
|
|
|
+ struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
|
|
|
+ uint8_t i, num_links = 0;
|
|
|
+ uint16_t vdev_count = 0;
|
|
|
+ struct wlan_objmgr_vdev *wlan_vdev_list[WLAN_UMAC_MLO_MAX_VDEVS];
|
|
|
+ struct qdf_mac_addr active_link_addr[2];
|
|
|
+
|
|
|
+ mlo_sta_get_vdev_list(adapter->deflink->vdev, &vdev_count,
|
|
|
+ wlan_vdev_list);
|
|
|
+ for (i = 0; i < vdev_count; i++) {
|
|
|
+ if (!wlan_vdev_list[i])
|
|
|
+ continue;
|
|
|
+ qdf_mem_copy(&active_link_addr[i],
|
|
|
+ wlan_vdev_mlme_get_macaddr(wlan_vdev_list[i]),
|
|
|
+ QDF_MAC_ADDR_SIZE);
|
|
|
+ num_links++;
|
|
|
+ if (emlsr_mode == WLAN_EMLSR_MODE_EXIT)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (i = 0; i < vdev_count; i++)
|
|
|
+ mlo_release_vdev_ref(wlan_vdev_list[i]);
|
|
|
+
|
|
|
+ hdd_debug("number of links to force enable: %d", num_links);
|
|
|
+
|
|
|
+ if (num_links >= 1)
|
|
|
+ sme_activate_mlo_links(hdd_ctx->mac_handle,
|
|
|
+ adapter->deflink->vdev_id,
|
|
|
+ num_links, active_link_addr);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline int
|
|
|
+hdd_test_config_emlsr_mode(struct hdd_context *hdd_ctx, bool cfg_val)
|
|
|
+{
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static inline int
|
|
|
+hdd_test_config_emlsr_action_mode(struct hdd_adapter *adapter,
|
|
|
+ enum wlan_emlsr_action_mode emlsr_mode)
|
|
|
+{
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifdef WLAN_FEATURE_11BE
|
|
|
/**
|
|
|
* hdd_set_eht_max_simultaneous_links() - Set EHT maximum number of
|
|
|
* simultaneous links
|
|
@@ -10901,6 +10982,29 @@ static int hdd_set_eht_max_num_links(struct hdd_adapter *adapter,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * hdd_get_cfg_eht_mode() - Convert qca wlan EHT mode enum to cfg wlan EHT mode
|
|
|
+ * @qca_wlan_eht_mode: qca wlan eht mode
|
|
|
+ *
|
|
|
+ * Return: EHT mode on success, 0 on failure
|
|
|
+ */
|
|
|
+static enum wlan_eht_mode
|
|
|
+hdd_get_cfg_eht_mode(enum qca_wlan_eht_mlo_mode qca_wlan_eht_mode)
|
|
|
+{
|
|
|
+ switch (qca_wlan_eht_mode) {
|
|
|
+ case QCA_WLAN_EHT_MLSR:
|
|
|
+ return WLAN_EHT_MODE_MLSR;
|
|
|
+ case QCA_WLAN_EHT_EMLSR:
|
|
|
+ return WLAN_EHT_MODE_EMLSR;
|
|
|
+ case QCA_WLAN_EHT_NON_STR_MLMR:
|
|
|
+ case QCA_WLAN_EHT_STR_MLMR:
|
|
|
+ return WLAN_EHT_MODE_MLMR;
|
|
|
+ default:
|
|
|
+ hdd_debug("Invalid EHT mode");
|
|
|
+ return WLAN_EHT_MODE_DISABLED;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* hdd_set_eht_mlo_mode() - Set EHT MLO mode of operation
|
|
|
* @adapter: hdd adapter
|
|
@@ -10913,13 +11017,20 @@ static int hdd_set_eht_mlo_mode(struct hdd_adapter *adapter,
|
|
|
{
|
|
|
uint8_t cfg_val;
|
|
|
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
|
|
|
+ enum wlan_eht_mode eht_mode;
|
|
|
|
|
|
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);
|
|
|
+ eht_mode = hdd_get_cfg_eht_mode(cfg_val);
|
|
|
+
|
|
|
+ if (eht_mode == WLAN_EHT_MODE_EMLSR &&
|
|
|
+ adapter->device_mode == QDF_STA_MODE) {
|
|
|
+ hdd_test_config_emlsr_mode(hdd_ctx, true);
|
|
|
+ ucfg_mlme_set_bss_color_collision_det_sta(hdd_ctx->psoc, false);
|
|
|
+ }
|
|
|
+
|
|
|
+ ucfg_mlme_set_eht_mode(hdd_ctx->psoc, eht_mode);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -10945,6 +11056,96 @@ int hdd_set_eht_mlo_mode(struct hdd_adapter *adapter, const struct nlattr *attr)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+#ifdef WLAN_FEATURE_11BE_MLO
|
|
|
+static int hdd_set_link_force_active(struct hdd_adapter *adapter,
|
|
|
+ const struct nlattr *attr)
|
|
|
+{
|
|
|
+ struct hdd_context *hdd_ctx = NULL;
|
|
|
+ struct nlattr *curr_attr;
|
|
|
+ struct qdf_mac_addr active_link_addr[2];
|
|
|
+ struct qdf_mac_addr *mac_addr_ptr;
|
|
|
+ uint32_t num_links = 0;
|
|
|
+ int32_t len;
|
|
|
+
|
|
|
+ hdd_ctx = WLAN_HDD_GET_CTX(adapter);
|
|
|
+ if (!hdd_ctx)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (attr && adapter->device_mode == QDF_STA_MODE) {
|
|
|
+ nla_for_each_nested(curr_attr, &attr[0], len) {
|
|
|
+ mac_addr_ptr = &active_link_addr[num_links];
|
|
|
+ qdf_mem_copy(mac_addr_ptr, nla_data(curr_attr),
|
|
|
+ ETH_ALEN);
|
|
|
+ hdd_debug(QDF_MAC_ADDR_FMT " is link[%d] mac address",
|
|
|
+ QDF_MAC_ADDR_REF(mac_addr_ptr), num_links);
|
|
|
+ num_links++;
|
|
|
+ }
|
|
|
+ sme_activate_mlo_links(hdd_ctx->mac_handle,
|
|
|
+ adapter->deflink->vdev_id, num_links,
|
|
|
+ active_link_addr);
|
|
|
+ }
|
|
|
+ hdd_debug("number of links to force active: %d", num_links);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * hdd_get_cfg_emlsr_mode() - Convert qca wlan EMLSR mode enum to cfg wlan
|
|
|
+ * EMLSR action mode
|
|
|
+ * @qca_wlan_emlsr_mode: qca wlan EMLSR mode
|
|
|
+ *
|
|
|
+ * Return: EMLSR mode on success, 0 on failure
|
|
|
+ */
|
|
|
+static enum wlan_emlsr_action_mode
|
|
|
+hdd_get_cfg_emlsr_mode(enum qca_wlan_eht_mlo_mode qca_wlan_emlsr_mode)
|
|
|
+{
|
|
|
+ switch (qca_wlan_emlsr_mode) {
|
|
|
+ case QCA_WLAN_EMLSR_MODE_ENTER:
|
|
|
+ return WLAN_EMLSR_MODE_ENTER;
|
|
|
+ case QCA_WLAN_EMLSR_MODE_EXIT:
|
|
|
+ return WLAN_EMLSR_MODE_EXIT;
|
|
|
+ default:
|
|
|
+ hdd_debug("Invalid EMLSR action mode");
|
|
|
+ return WLAN_EMLSR_MODE_DISABLED;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static int hdd_set_emlsr_mode(struct hdd_adapter *adapter,
|
|
|
+ const struct nlattr *attr)
|
|
|
+{
|
|
|
+ uint8_t cfg_val;
|
|
|
+ enum wlan_emlsr_action_mode emlsr_action_mode;
|
|
|
+
|
|
|
+ if (!attr)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ cfg_val = nla_get_u8(attr);
|
|
|
+
|
|
|
+ emlsr_action_mode = hdd_get_cfg_emlsr_mode(cfg_val);
|
|
|
+
|
|
|
+ hdd_debug("EMLSR mode: %s", emlsr_action_mode == WLAN_EMLSR_MODE_ENTER ?
|
|
|
+ "Enter" : "Exit");
|
|
|
+
|
|
|
+ hdd_test_config_emlsr_action_mode(adapter, emlsr_action_mode);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline
|
|
|
+int hdd_set_link_force_active(struct hdd_adapter *adapter,
|
|
|
+ const struct nlattr *attr)
|
|
|
+{
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static inline
|
|
|
+int hdd_set_emlsr_mode(struct hdd_adapter *adapter,
|
|
|
+ const struct nlattr *attr)
|
|
|
+{
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
/**
|
|
|
* typedef independent_setter_fn - independent attribute handler
|
|
|
* @adapter: The adapter being configured
|
|
@@ -11080,6 +11281,10 @@ static const struct independent_setters independent_setters[] = {
|
|
|
hdd_set_eht_max_num_links},
|
|
|
{QCA_WLAN_VENDOR_ATTR_CONFIG_EHT_MLO_MODE,
|
|
|
hdd_set_eht_mlo_mode},
|
|
|
+ {QCA_WLAN_VENDOR_ATTR_CONFIG_EHT_MLO_ACTIVE_LINKS,
|
|
|
+ hdd_set_link_force_active},
|
|
|
+ {QCA_WLAN_VENDOR_ATTR_CONFIG_EMLSR_MODE_SWITCH,
|
|
|
+ hdd_set_emlsr_mode},
|
|
|
};
|
|
|
|
|
|
#ifdef WLAN_FEATURE_ELNA
|
|
@@ -12072,32 +12277,6 @@ static int hdd_test_config_6ghz_security_test_mode(struct hdd_context *hdd_ctx,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-#ifdef WLAN_FEATURE_11BE_MLO
|
|
|
-static int hdd_test_config_emlsr_mode(struct hdd_context *hdd_ctx,
|
|
|
- struct nlattr *attr)
|
|
|
-
|
|
|
-{
|
|
|
- uint8_t cfg_val;
|
|
|
-
|
|
|
- cfg_val = nla_get_u8(attr);
|
|
|
- hdd_info("11be op mode setting %d", cfg_val);
|
|
|
- if (cfg_val && policy_mgr_is_hw_emlsr_capable(hdd_ctx->psoc)) {
|
|
|
- hdd_debug("HW supports eMLSR mode, set caps");
|
|
|
- ucfg_mlme_set_emlsr_mode_enabled(hdd_ctx->psoc, cfg_val);
|
|
|
- } else {
|
|
|
- hdd_debug("Default mode: MLMR, no action required");
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-#else
|
|
|
-static inline int
|
|
|
-hdd_test_config_emlsr_mode(struct hdd_context *hdd_ctx, struct nlattr *attr)
|
|
|
-{
|
|
|
- return 0;
|
|
|
-}
|
|
|
-#endif
|
|
|
-
|
|
|
/**
|
|
|
* __wlan_hdd_cfg80211_set_wifi_test_config() - Wifi test configuration
|
|
|
* vendor command
|
|
@@ -12555,17 +12734,19 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy,
|
|
|
hdd_err("unable to set unicat probe ra cfg");
|
|
|
}
|
|
|
|
|
|
- cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_OMI_TX;
|
|
|
+ cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_OMI_TX;
|
|
|
if (tb[cmd_id]) {
|
|
|
- struct nlattr *tb2[QCA_WLAN_VENDOR_ATTR_HE_OMI_MAX + 1];
|
|
|
+ struct nlattr *tb2[QCA_WLAN_VENDOR_ATTR_OMI_MAX + 1];
|
|
|
struct nlattr *curr_attr;
|
|
|
int tmp, rc;
|
|
|
+ struct omi_ctrl_tx omi_data = {0};
|
|
|
+
|
|
|
nla_for_each_nested(curr_attr, tb[cmd_id], tmp) {
|
|
|
rc = wlan_cfg80211_nla_parse(
|
|
|
- tb2, QCA_WLAN_VENDOR_ATTR_HE_OMI_MAX,
|
|
|
+ tb2, QCA_WLAN_VENDOR_ATTR_OMI_MAX,
|
|
|
nla_data(curr_attr),
|
|
|
nla_len(curr_attr),
|
|
|
- qca_wlan_vendor_attr_he_omi_tx_policy);
|
|
|
+ qca_wlan_vendor_attr_omi_tx_policy);
|
|
|
if (rc) {
|
|
|
hdd_err("Invalid ATTR");
|
|
|
goto send_err;
|
|
@@ -12614,13 +12795,35 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy,
|
|
|
cmd_id, cfg_val);
|
|
|
}
|
|
|
|
|
|
+ cmd_id = QCA_WLAN_VENDOR_ATTR_EHT_OMI_RX_NSS_EXTN;
|
|
|
+ if (tb2[cmd_id]) {
|
|
|
+ cfg_val = nla_get_u8(tb2[cmd_id]);
|
|
|
+ hdd_debug("EHT OM ctrl Rx Nss %d", cfg_val);
|
|
|
+ omi_data.eht_rx_nss_ext = cfg_val;
|
|
|
+ }
|
|
|
+
|
|
|
+ cmd_id = QCA_WLAN_VENDOR_ATTR_EHT_OMI_CH_BW_EXTN;
|
|
|
+ if (tb2[cmd_id]) {
|
|
|
+ cfg_val = nla_get_u8(tb2[cmd_id]);
|
|
|
+ hdd_debug("Set EHT OM ctrl BW to %d", cfg_val);
|
|
|
+ omi_data.eht_ch_bw_ext = cfg_val;
|
|
|
+ }
|
|
|
+
|
|
|
+ cmd_id = QCA_WLAN_VENDOR_ATTR_EHT_OMI_TX_NSS_EXTN;
|
|
|
+ if (tb2[cmd_id]) {
|
|
|
+ cfg_val = nla_get_u8(tb2[cmd_id]);
|
|
|
+ hdd_debug("EHT OM ctrl Tx Nss %d", cfg_val);
|
|
|
+ omi_data.eht_tx_nss_ext = cfg_val;
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
if (ret_val) {
|
|
|
sme_reset_he_om_ctrl(hdd_ctx->mac_handle);
|
|
|
goto send_err;
|
|
|
}
|
|
|
ret_val = sme_send_he_om_ctrl_update(hdd_ctx->mac_handle,
|
|
|
- adapter->deflink->vdev_id);
|
|
|
+ adapter->deflink->vdev_id,
|
|
|
+ &omi_data);
|
|
|
}
|
|
|
|
|
|
if (tb[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_CLEAR_HE_OM_CTRL_CONFIG])
|
|
@@ -13018,10 +13221,9 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy,
|
|
|
|
|
|
cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_11BE_EMLSR_MODE;
|
|
|
if (tb[cmd_id] && adapter->device_mode == QDF_STA_MODE) {
|
|
|
- wfa_param.vdev_id = adapter->deflink->vdev_id;
|
|
|
- wfa_param.value = nla_get_u8(tb[cmd_id]);
|
|
|
+ cfg_val = nla_get_u8(tb[cmd_id]);
|
|
|
|
|
|
- ret_val = hdd_test_config_emlsr_mode(hdd_ctx, tb[cmd_id]);
|
|
|
+ ret_val = hdd_test_config_emlsr_mode(hdd_ctx, cfg_val);
|
|
|
}
|
|
|
|
|
|
cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_BEAMFORMER_PERIODIC_SOUNDING;
|
|
@@ -13136,6 +13338,71 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy,
|
|
|
if (ret_val)
|
|
|
sme_err("Failed to update EHT Tx BFEE cap");
|
|
|
}
|
|
|
+
|
|
|
+ cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_EHT_OM_CTRL_SUPPORT;
|
|
|
+ if (tb[cmd_id]) {
|
|
|
+ cfg_val = nla_get_u8(tb[cmd_id]);
|
|
|
+ hdd_debug("EHT OM control support: %d", cfg_val);
|
|
|
+
|
|
|
+ ret_val = sme_update_he_htc_he_supp(hdd_ctx->mac_handle,
|
|
|
+ adapter->deflink->vdev_id,
|
|
|
+ true);
|
|
|
+ if (ret_val)
|
|
|
+ hdd_err("Could not set htc_he");
|
|
|
+
|
|
|
+ ret_val = sme_update_eht_om_ctrl_supp(hdd_ctx->mac_handle,
|
|
|
+ adapter->deflink->vdev_id,
|
|
|
+ cfg_val);
|
|
|
+ if (ret_val)
|
|
|
+ hdd_err("Could not update EHT OM control fields");
|
|
|
+ }
|
|
|
+
|
|
|
+ cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_EMLSR_PADDING_DELAY;
|
|
|
+ if (tb[cmd_id] && adapter->device_mode == QDF_STA_MODE) {
|
|
|
+ cfg_val = nla_get_u8(tb[cmd_id]);
|
|
|
+ hdd_debug("Configure EMLSR padding delay subfield to %d",
|
|
|
+ cfg_val);
|
|
|
+ if (cfg_val)
|
|
|
+ wlan_mlme_cfg_set_emlsr_pad_delay(hdd_ctx->psoc,
|
|
|
+ cfg_val);
|
|
|
+ }
|
|
|
+
|
|
|
+ cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_FORCE_MLO_POWER_SAVE_BCN_PERIOD;
|
|
|
+ if (tb[cmd_id] && adapter->device_mode == QDF_STA_MODE) {
|
|
|
+ uint32_t bitmap = 0;
|
|
|
+ uint32_t vdev_id, idx;
|
|
|
+
|
|
|
+ cfg_val = nla_get_u8(tb[cmd_id]);
|
|
|
+ hdd_debug("Send vdev pause on ML sta vdev for %d beacon periods",
|
|
|
+ cfg_val);
|
|
|
+ bitmap = policy_mgr_get_active_vdev_bitmap(hdd_ctx->psoc);
|
|
|
+ for (idx = 0; idx < 32; idx++) {
|
|
|
+ if (bitmap & (1 << idx)) {
|
|
|
+ vdev_id = idx;
|
|
|
+ ret_val = sme_send_vdev_pause_for_bcn_period(
|
|
|
+ mac_handle,
|
|
|
+ vdev_id, cfg_val);
|
|
|
+ if (ret_val)
|
|
|
+ sme_err("Failed to send vdev pause");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_EHT_MLO_STR_TX;
|
|
|
+ if (tb[cmd_id]) {
|
|
|
+ uint32_t arg[2];
|
|
|
+
|
|
|
+ hdd_debug("Send EHT MLO STR TX indication to FW");
|
|
|
+ arg[0] = 676;
|
|
|
+ arg[1] = 1;
|
|
|
+
|
|
|
+ ret_val = sme_send_unit_test_cmd(adapter->deflink->vdev_id,
|
|
|
+ 0x48, 2, arg);
|
|
|
+
|
|
|
+ if (ret_val)
|
|
|
+ sme_err("Failed to send STR TX indication");
|
|
|
+ }
|
|
|
+
|
|
|
if (update_sme_cfg)
|
|
|
sme_update_config(mac_handle, sme_config);
|
|
|
|