qcacld-3.0: Set Wi-Fi configurations - NSS

Add attributes in SET_WIFI_CONFIGURATION to dynamically
configure capabilities - NSS.

Change-Id: Ib8174443d6737bc1f6c2737397bd915064715461
CRs-Fixed: 2709121
This commit is contained in:
Min Liu 2020-06-12 16:53:00 +08:00 committed by nshrivas
parent f710f5ef89
commit 0bf96737c8
4 changed files with 129 additions and 20 deletions

View File

@ -300,8 +300,33 @@ QDF_STATUS hdd_hex_string_to_u16_array(char *str, uint16_t *int_array,
void hdd_cfg_print_global_config(struct hdd_context *hdd_ctx);
/**
* hdd_update_nss() - Update the number of spatial streams supported.
*
* @adapter: the pointer to adapter
* @nss: the number of spatial streams to be updated
*
* This function is used to modify the number of spatial streams
* supported when not in connected state.
*
* Return: QDF_STATUS_SUCCESS if nss is correctly updated,
* otherwise QDF_STATUS_E_FAILURE would be returned
*/
QDF_STATUS hdd_update_nss(struct hdd_adapter *adapter, uint8_t nss);
/**
* hdd_get_nss() - Get the number of spatial streams supported by the adapter
*
* @adapter: the pointer to adapter
* @nss: the number of spatial streams supported by the adapter
*
* This function is used to get the number of spatial streams supported by
* the adapter.
*
* Return: QDF_STATUS
*/
QDF_STATUS hdd_get_nss(struct hdd_adapter *adapter, uint8_t *nss);
/**
* hdd_dfs_indicate_radar() - Block tx as radar found on the channel
* @hdd_ctxt: HDD context pointer

View File

@ -1022,19 +1022,6 @@ hdd_set_nss_params(struct hdd_adapter *adapter,
return QDF_STATUS_SUCCESS;
}
/**
* hdd_update_nss() - Update the number of spatial streams supported.
* Ensure that nss is either 1 or 2 before calling this.
*
* @adapter: the pointer to adapter
* @nss: the number of spatial streams to be updated
*
* This function is used to modify the number of spatial streams
* supported when not in connected state.
*
* Return: QDF_STATUS_SUCCESS if nss is correctly updated,
* otherwise QDF_STATUS_E_FAILURE would be returned
*/
QDF_STATUS hdd_update_nss(struct hdd_adapter *adapter, uint8_t nss)
{
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
@ -1225,6 +1212,26 @@ skip_ht_cap_update:
return (status == false) ? QDF_STATUS_E_FAILURE : QDF_STATUS_SUCCESS;
}
QDF_STATUS hdd_get_nss(struct hdd_adapter *adapter, uint8_t *nss)
{
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
bool bval;
QDF_STATUS status;
status = ucfg_mlme_get_vht_enable2x2(hdd_ctx->psoc, &bval);
if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_err("unable to get vht_enable2x2");
return status;
}
*nss = (bval) ? 2 : 1;
if (!policy_mgr_is_hw_dbs_2x2_capable(hdd_ctx->psoc) &&
policy_mgr_is_current_hwmode_dbs(hdd_ctx->psoc))
*nss = *nss - 1;
return status;
}
int hdd_get_ldpc(struct hdd_adapter *adapter, int *value)
{
mac_handle_t mac_handle = adapter->hdd_ctx->mac_handle;

View File

@ -6716,6 +6716,7 @@ const struct nla_policy wlan_hdd_wifi_config_policy[
[QCA_WLAN_VENDOR_ATTR_CONFIG_PHY_MODE] = {.type = NLA_U32 },
[QCA_WLAN_VENDOR_ATTR_CONFIG_CHANNEL_WIDTH] = {.type = NLA_U8 },
[QCA_WLAN_VENDOR_ATTR_CONFIG_DYNAMIC_BW] = {.type = NLA_U8 },
[QCA_WLAN_VENDOR_ATTR_CONFIG_NSS] = {.type = NLA_U8 },
};
@ -8354,6 +8355,33 @@ static int hdd_set_dynamic_bw(struct hdd_adapter *adapter,
enable, PDEV_CMD);
}
/**
* hdd_set_nss() - set the number of spatial streams supported by the adapter
*
* @adapter: hdd adapter
* @attr: pointer to nla attr
*
* Return: 0 on success, negative errno on failure
*/
static int hdd_set_nss(struct hdd_adapter *adapter,
const struct nlattr *attr)
{
uint8_t nss;
int ret;
QDF_STATUS status;
nss = nla_get_u8(attr);
status = hdd_update_nss(adapter, nss);
ret = qdf_status_to_os_return(status);
if (ret == 0 && adapter->device_mode == QDF_SAP_MODE)
ret = wma_cli_set_command(adapter->vdev_id, WMI_VDEV_PARAM_NSS,
nss, VDEV_CMD);
return ret;
}
/**
* typedef independent_setter_fn - independent attribute handler
* @adapter: The adapter being configured
@ -8458,6 +8486,8 @@ static const struct independent_setters independent_setters[] = {
hdd_set_channel_width},
{QCA_WLAN_VENDOR_ATTR_CONFIG_DYNAMIC_BW,
hdd_set_dynamic_bw},
{QCA_WLAN_VENDOR_ATTR_CONFIG_NSS,
hdd_set_nss},
};
#ifdef WLAN_FEATURE_ELNA
@ -8783,6 +8813,49 @@ static int hdd_get_dynamic_bw(struct hdd_adapter *adapter,
return 0;
}
/**
* hdd_get_nss_config() - Get the number of spatial streams supported by
* the adapter
* @adapter: Pointer to HDD adapter
* @skb: sk buffer to hold nl80211 attributes
* @attr: Pointer to struct nlattr
*
* Return: 0 on success; error number otherwise
*/
static int hdd_get_nss_config(struct hdd_adapter *adapter,
struct sk_buff *skb,
const struct nlattr *attr)
{
uint8_t nss;
if (adapter->device_mode == QDF_SAP_MODE) {
int value;
value = wma_cli_get_command(adapter->vdev_id,
WMI_VDEV_PARAM_NSS, VDEV_CMD);
if (value < 0) {
hdd_err("Failed to get nss");
return -EINVAL;
}
nss = (uint8_t)value;
} else {
QDF_STATUS status;
status = hdd_get_nss(adapter, &nss);
if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_err("Failed to get nss");
return -EINVAL;
}
}
if (nla_put_u8(skb, QCA_WLAN_VENDOR_ATTR_CONFIG_NSS, nss)) {
hdd_err("nla_put failure");
return -EINVAL;
}
return 0;
}
/**
* typedef config_getter_fn - get configuration handler
* @adapter: The adapter being configured
@ -8845,6 +8918,9 @@ static const struct config_getters config_getters[] = {
{QCA_WLAN_VENDOR_ATTR_CONFIG_DYNAMIC_BW,
sizeof(uint8_t),
hdd_get_dynamic_bw},
{QCA_WLAN_VENDOR_ATTR_CONFIG_NSS,
sizeof(uint8_t),
hdd_get_nss_config},
};
/**

View File

@ -5386,14 +5386,15 @@ static int __iw_setnone_getint(struct net_device *dev,
case WE_GET_NSS:
{
sme_get_config_param(mac_handle, sme_config);
status = ucfg_mlme_get_vht_enable2x2(hdd_ctx->psoc, &bval);
if (!QDF_IS_STATUS_SUCCESS(status))
uint8_t nss;
status = hdd_get_nss(adapter, &nss);
if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_err("unable to get vht_enable2x2");
*value = (bval == 0) ? 1 : 2;
if (!policy_mgr_is_hw_dbs_2x2_capable(hdd_ctx->psoc) &&
policy_mgr_is_current_hwmode_dbs(hdd_ctx->psoc))
*value = *value - 1;
ret = -EIO;
break;
}
*value = nss;
hdd_debug("GET_NSS: Current NSS:%d", *value);
break;