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
This commit is contained in:
Kiran Kumar Lokere
2022-08-08 22:19:25 -07:00
committed by Madan Koyyalamudi
szülő 0deb4831e8
commit 31bc110c0d

Fájl megtekintése

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