qcacld-3.0: Add vendor cmd for ldpc/tx_stbc/rx_stbc

Add vendor cmd for ldpc/tx_stbc/rx_stbc.

Change-Id: Id932bc68f9282adc1f542ecc6212288b4ae59d38
CRs-Fixed: 2689414
Bu işleme şunda yer alıyor:
Jingxiang Ge
2020-05-19 12:29:08 +08:00
işlemeyi yapan: nshrivas
ebeveyn f1e669fdc6
işleme 3c19aa6dbb
5 değiştirilmiş dosya ile 361 ekleme ve 235 silme

Dosyayı Görüntüle

@@ -329,4 +329,58 @@ bool hdd_dfs_indicate_radar(struct hdd_context *hdd_ctx);
* Return: None
*/
void hdd_override_all_ps(struct hdd_context *hdd_ctx);
#endif
/**
* hdd_get_ldpc() - Get adapter LDPC
* @adapter: adapter being queried
* @value: where to store the value
*
* Return: 0 on success, negative errno on failure
*/
int hdd_get_ldpc(struct hdd_adapter *adapter, int *value);
/**
* hdd_set_ldpc() - Set adapter LDPC
* @adapter: adapter being modified
* @value: new LDPC value
*
* Return: 0 on success, negative errno on failure
*/
int hdd_set_ldpc(struct hdd_adapter *adapter, int value);
/**
* hdd_get_tx_stbc() - Get adapter TX STBC
* @adapter: adapter being queried
* @value: where to store the value
*
* Return: 0 on success, negative errno on failure
*/
int hdd_get_tx_stbc(struct hdd_adapter *adapter, int *value);
/**
* hdd_set_tx_stbc() - Set adapter TX STBC
* @adapter: adapter being modified
* @value: new TX STBC value
*
* Return: 0 on success, negative errno on failure
*/
int hdd_set_tx_stbc(struct hdd_adapter *adapter, int value);
/**
* hdd_get_rx_stbc() - Get adapter RX STBC
* @adapter: adapter being queried
* @value: where to store the value
*
* Return: 0 on success, negative errno on failure
*/
int hdd_get_rx_stbc(struct hdd_adapter *adapter, int *value);
/**
* hdd_set_rx_stbc() - Set adapter RX STBC
* @adapter: adapter being modified
* @value: new RX STBC value
*
* Return: 0 on success, negative errno on failure
*/
int hdd_set_rx_stbc(struct hdd_adapter *adapter, int value);
#endif /* end #if !defined(HDD_CONFIG_H__) */

Dosyayı Görüntüle

@@ -223,17 +223,6 @@ int hdd_priv_get_data(struct iw_point *p_priv_data,
void *mem_alloc_copy_from_user_helper(const void *wrqu_data, size_t len);
int hdd_get_ldpc(struct hdd_adapter *adapter, int *value);
/**
* hdd_set_ldpc() - Set adapter LDPC
* @adapter: adapter being modified
* @value: new LDPC value
*
* Return: 0 on success, negative errno on failure
*/
int hdd_set_ldpc(struct hdd_adapter *adapter, int value);
/**
* hdd_we_set_short_gi() - Set adapter Short GI
* @adapter: adapter being modified
@@ -243,28 +232,6 @@ int hdd_set_ldpc(struct hdd_adapter *adapter, int value);
*/
int hdd_we_set_short_gi(struct hdd_adapter *adapter, int sgi);
int hdd_get_tx_stbc(struct hdd_adapter *adapter, int *value);
/**
* hdd_set_tx_stbc() - Set adapter TX STBC
* @adapter: adapter being modified
* @value: new TX STBC value
*
* Return: 0 on success, negative errno on failure
*/
int hdd_set_tx_stbc(struct hdd_adapter *adapter, int value);
int hdd_get_rx_stbc(struct hdd_adapter *adapter, int *value);
/**
* hdd_set_rx_stbc() - Set adapter RX STBC
* @adapter: adapter being modified
* @value: new RX STBC value
*
* Return: 0 on success, negative errno on failure
*/
int hdd_set_rx_stbc(struct hdd_adapter *adapter, int value);
/**
* hdd_assemble_rate_code() - assemble rate code to be sent to FW
* @preamble: rate preamble

Dosyayı Görüntüle

@@ -1223,3 +1223,183 @@ skip_ht_cap_update:
return (status == false) ? QDF_STATUS_E_FAILURE : QDF_STATUS_SUCCESS;
}
int hdd_get_ldpc(struct hdd_adapter *adapter, int *value)
{
mac_handle_t mac_handle = adapter->hdd_ctx->mac_handle;
int ret;
hdd_enter();
ret = sme_get_ht_config(mac_handle, adapter->vdev_id,
WNI_CFG_HT_CAP_INFO_ADVANCE_CODING);
if (ret < 0) {
hdd_err("Failed to get LDPC value");
} else {
*value = ret;
ret = 0;
}
return ret;
}
int hdd_set_ldpc(struct hdd_adapter *adapter, int value)
{
mac_handle_t mac_handle = adapter->hdd_ctx->mac_handle;
int ret;
QDF_STATUS status;
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
struct mlme_ht_capabilities_info ht_cap_info;
hdd_debug("%d", value);
if (!mac_handle) {
hdd_err("NULL Mac handle");
return -EINVAL;
}
status = ucfg_mlme_get_ht_cap_info(hdd_ctx->psoc, &ht_cap_info);
if (QDF_IS_STATUS_ERROR(status)) {
hdd_err("Failed to get HT capability info");
return -EIO;
}
ht_cap_info.adv_coding_cap = value;
status = ucfg_mlme_set_ht_cap_info(hdd_ctx->psoc, ht_cap_info);
if (QDF_IS_STATUS_ERROR(status)) {
hdd_err("Failed to set HT capability info");
return -EIO;
}
status = ucfg_mlme_cfg_set_vht_ldpc_coding_cap(hdd_ctx->psoc, value);
if (QDF_IS_STATUS_ERROR(status)) {
hdd_err("Failed to set VHT LDPC capability info");
return -EIO;
}
ret = sme_update_ht_config(mac_handle, adapter->vdev_id,
WNI_CFG_HT_CAP_INFO_ADVANCE_CODING,
value);
if (ret)
hdd_err("Failed to set LDPC value");
ret = sme_update_he_ldpc_supp(mac_handle, adapter->vdev_id, value);
if (ret)
hdd_err("Failed to set HE LDPC value");
ret = sme_set_auto_rate_ldpc(mac_handle, adapter->vdev_id,
(value ? 0 : 1));
return ret;
}
int hdd_get_tx_stbc(struct hdd_adapter *adapter, int *value)
{
mac_handle_t mac_handle = adapter->hdd_ctx->mac_handle;
int ret;
hdd_enter();
ret = sme_get_ht_config(mac_handle, adapter->vdev_id,
WNI_CFG_HT_CAP_INFO_TX_STBC);
if (ret < 0) {
hdd_err("Failed to get TX STBC value");
} else {
*value = ret;
ret = 0;
}
return ret;
}
int hdd_set_tx_stbc(struct hdd_adapter *adapter, int value)
{
mac_handle_t mac_handle = adapter->hdd_ctx->mac_handle;
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
int ret;
QDF_STATUS status;
struct mlme_ht_capabilities_info ht_cap_info;
hdd_debug("%d", value);
if (!mac_handle) {
hdd_err("NULL Mac handle");
return -EINVAL;
}
if (value) {
/* make sure HT capabilities allow this */
status = ucfg_mlme_get_ht_cap_info(hdd_ctx->psoc,
&ht_cap_info);
if (QDF_IS_STATUS_ERROR(status)) {
hdd_err("Failed to get HT capability info");
return -EIO;
}
if (!ht_cap_info.tx_stbc) {
hdd_err("TX STBC not supported");
return -EINVAL;
}
}
ret = sme_update_ht_config(mac_handle, adapter->vdev_id,
WNI_CFG_HT_CAP_INFO_TX_STBC,
value);
if (ret)
hdd_err("Failed to set TX STBC value");
ret = sme_update_he_tx_stbc_cap(mac_handle, adapter->vdev_id, value);
if (ret)
hdd_err("Failed to set HE TX STBC value");
return ret;
}
int hdd_get_rx_stbc(struct hdd_adapter *adapter, int *value)
{
mac_handle_t mac_handle = adapter->hdd_ctx->mac_handle;
int ret;
hdd_enter();
ret = sme_get_ht_config(mac_handle, adapter->vdev_id,
WNI_CFG_HT_CAP_INFO_RX_STBC);
if (ret < 0) {
hdd_err("Failed to get RX STBC value");
} else {
*value = ret;
ret = 0;
}
return ret;
}
int hdd_set_rx_stbc(struct hdd_adapter *adapter, int value)
{
mac_handle_t mac_handle = adapter->hdd_ctx->mac_handle;
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
int ret;
QDF_STATUS status;
struct mlme_ht_capabilities_info ht_cap_info;
hdd_debug("%d", value);
if (!mac_handle) {
hdd_err("NULL Mac handle");
return -EINVAL;
}
if (value) {
/* make sure HT capabilities allow this */
status = ucfg_mlme_get_ht_cap_info(hdd_ctx->psoc,
&ht_cap_info);
if (QDF_IS_STATUS_ERROR(status)) {
hdd_err("Failed to get HT capability info");
return -EIO;
}
if (!ht_cap_info.rx_stbc) {
hdd_warn("RX STBC not supported");
return -EINVAL;
}
}
ret = sme_update_ht_config(mac_handle, adapter->vdev_id,
WNI_CFG_HT_CAP_INFO_RX_STBC,
value);
if (ret)
hdd_err("Failed to set RX STBC value");
ret = sme_update_he_rx_stbc_cap(mac_handle, adapter->vdev_id, value);
if (ret)
hdd_err("Failed to set HE RX STBC value");
return ret;
}

Dosyayı Görüntüle

@@ -6710,6 +6710,9 @@ const struct nla_policy wlan_hdd_wifi_config_policy[
[QCA_WLAN_VENDOR_ATTR_CONFIG_ROAM_REASON] = {.type = NLA_U8 },
[QCA_WLAN_VENDOR_ATTR_CONFIG_TX_MSDU_AGGREGATION] = {.type = NLA_U8 },
[QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MSDU_AGGREGATION] = {.type = NLA_U8 },
[QCA_WLAN_VENDOR_ATTR_CONFIG_LDPC] = {.type = NLA_U8 },
[QCA_WLAN_VENDOR_ATTR_CONFIG_TX_STBC] = {.type = NLA_U8 },
[QCA_WLAN_VENDOR_ATTR_CONFIG_RX_STBC] = {.type = NLA_U8 },
};
@@ -7097,6 +7100,45 @@ static int hdd_set_roam_reason_vsie_status(struct hdd_adapter *adapter,
}
#endif
static int hdd_config_ldpc(struct hdd_adapter *adapter,
const struct nlattr *attr)
{
uint8_t ldpc;
int ret;
ldpc = nla_get_u8(attr);
ret = hdd_set_ldpc(adapter, ldpc);
return ret;
}
static int hdd_config_tx_stbc(struct hdd_adapter *adapter,
const struct nlattr *attr)
{
uint8_t tx_stbc;
int ret;
tx_stbc = nla_get_u8(attr);
ret = hdd_set_tx_stbc(adapter, tx_stbc);
return ret;
}
static int hdd_config_rx_stbc(struct hdd_adapter *adapter,
const struct nlattr *attr)
{
uint8_t rx_stbc;
int ret;
rx_stbc = nla_get_u8(attr);
ret = hdd_set_rx_stbc(adapter, rx_stbc);
return ret;
}
static int hdd_config_access_policy(struct hdd_adapter *adapter,
struct nlattr *tb[])
{
@@ -8097,6 +8139,12 @@ static const struct independent_setters independent_setters[] = {
#endif
{QCA_WLAN_VENDOR_ATTR_CONFIG_ROAM_REASON,
hdd_set_roam_reason_vsie_status},
{QCA_WLAN_VENDOR_ATTR_CONFIG_LDPC,
hdd_config_ldpc},
{QCA_WLAN_VENDOR_ATTR_CONFIG_TX_STBC,
hdd_config_tx_stbc},
{QCA_WLAN_VENDOR_ATTR_CONFIG_RX_STBC,
hdd_config_rx_stbc},
};
#ifdef WLAN_FEATURE_ELNA
@@ -8171,6 +8219,75 @@ static int hdd_get_roam_reason_vsie_status(struct hdd_adapter *adapter,
}
#endif
static int hdd_vendor_attr_ldpc_get(struct hdd_adapter *adapter,
struct sk_buff *skb,
const struct nlattr *attr)
{
int ldpc;
int ret;
ret = hdd_get_ldpc(adapter, &ldpc);
if (ret) {
hdd_err("get ldpc failed");
return -EINVAL;
}
hdd_debug("ldpc %u", ldpc);
if (nla_put_u8(skb, QCA_WLAN_VENDOR_ATTR_CONFIG_LDPC,
(uint8_t)ldpc)) {
hdd_err("nla_put failure");
return -EINVAL;
}
return 0;
}
static int hdd_vendor_attr_tx_stbc_get(struct hdd_adapter *adapter,
struct sk_buff *skb,
const struct nlattr *attr)
{
int tx_stbc;
int ret;
ret = hdd_get_tx_stbc(adapter, &tx_stbc);
if (ret) {
hdd_err("get tx_stbc failed");
return -EINVAL;
}
hdd_debug("tx_stbc %u", tx_stbc);
if (nla_put_u8(skb, QCA_WLAN_VENDOR_ATTR_CONFIG_TX_STBC,
(uint8_t)tx_stbc)) {
hdd_err("nla_put failure");
return -EINVAL;
}
return 0;
}
static int hdd_vendor_attr_rx_stbc_get(struct hdd_adapter *adapter,
struct sk_buff *skb,
const struct nlattr *attr)
{
int rx_stbc;
int ret;
ret = hdd_get_rx_stbc(adapter, &rx_stbc);
if (ret) {
hdd_err("get rx_stbc failed");
return -EINVAL;
}
hdd_debug("rx_stbc %u", rx_stbc);
if (nla_put_u8(skb, QCA_WLAN_VENDOR_ATTR_CONFIG_RX_STBC,
(uint8_t)rx_stbc)) {
hdd_err("nla_put failure");
return -EINVAL;
}
return 0;
}
/**
* hdd_get_tx_ampdu() - Get TX AMPDU
* @adapter: Pointer to HDD adapter
@@ -8338,6 +8455,15 @@ static const struct config_getters config_getters[] = {
{QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MSDU_AGGREGATION,
sizeof(uint8_t),
hdd_get_rx_amsdu},
{QCA_WLAN_VENDOR_ATTR_CONFIG_LDPC,
sizeof(uint8_t),
hdd_vendor_attr_ldpc_get},
{QCA_WLAN_VENDOR_ATTR_CONFIG_TX_STBC,
sizeof(uint8_t),
hdd_vendor_attr_tx_stbc_get},
{QCA_WLAN_VENDOR_ATTR_CONFIG_RX_STBC,
sizeof(uint8_t),
hdd_vendor_attr_rx_stbc_get},
};
/**

Dosyayı Görüntüle

@@ -3182,207 +3182,6 @@ static int hdd_we_dump_stats(struct hdd_adapter *adapter, int value)
return hdd_wlan_dump_stats(adapter, value);
}
/**
* hdd_get_ldpc() - Get adapter LDPC
* @adapter: adapter being queried
* @value: where to store the value
*
* Return: 0 on success, negative errno on failure
*/
int hdd_get_ldpc(struct hdd_adapter *adapter, int *value)
{
mac_handle_t mac_handle = adapter->hdd_ctx->mac_handle;
int ret;
hdd_enter();
ret = sme_get_ht_config(mac_handle, adapter->vdev_id,
WNI_CFG_HT_CAP_INFO_ADVANCE_CODING);
if (ret < 0) {
hdd_err("Failed to get LDPC value");
} else {
*value = ret;
ret = 0;
}
return ret;
}
int hdd_set_ldpc(struct hdd_adapter *adapter, int value)
{
mac_handle_t mac_handle = adapter->hdd_ctx->mac_handle;
int ret;
QDF_STATUS status;
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
struct mlme_ht_capabilities_info ht_cap_info;
hdd_debug("%d", value);
if (!mac_handle) {
hdd_err("NULL Mac handle");
return -EINVAL;
}
status = ucfg_mlme_get_ht_cap_info(hdd_ctx->psoc, &ht_cap_info);
if (QDF_STATUS_SUCCESS != status) {
hdd_err("Failed to get HT capability info");
return -EIO;
}
ht_cap_info.adv_coding_cap = value;
status = ucfg_mlme_set_ht_cap_info(hdd_ctx->psoc, ht_cap_info);
if (QDF_STATUS_SUCCESS != status) {
hdd_err("Failed to set HT capability info");
return -EIO;
}
status = ucfg_mlme_cfg_set_vht_ldpc_coding_cap(hdd_ctx->psoc, value);
if (QDF_IS_STATUS_ERROR(status)) {
hdd_err("Failed to set VHT LDPC capability info");
return -EIO;
}
ret = sme_update_ht_config(mac_handle, adapter->vdev_id,
WNI_CFG_HT_CAP_INFO_ADVANCE_CODING,
value);
if (ret)
hdd_err("Failed to set LDPC value");
ret = sme_update_he_ldpc_supp(mac_handle, adapter->vdev_id, value);
if (ret)
hdd_err("Failed to set HE LDPC value");
ret = sme_set_auto_rate_ldpc(mac_handle, adapter->vdev_id,
(value ? 0 : 1));
return ret;
}
/**
* hdd_get_tx_stbc() - Get adapter TX STBC
* @adapter: adapter being queried
* @value: where to store the value
*
* Return: 0 on success, negative errno on failure
*/
int hdd_get_tx_stbc(struct hdd_adapter *adapter, int *value)
{
mac_handle_t mac_handle = adapter->hdd_ctx->mac_handle;
int ret;
hdd_enter();
ret = sme_get_ht_config(mac_handle, adapter->vdev_id,
WNI_CFG_HT_CAP_INFO_TX_STBC);
if (ret < 0) {
hdd_err("Failed to get TX STBC value");
} else {
*value = ret;
ret = 0;
}
return ret;
}
int hdd_set_tx_stbc(struct hdd_adapter *adapter, int value)
{
mac_handle_t mac_handle = adapter->hdd_ctx->mac_handle;
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
int ret;
QDF_STATUS status;
struct mlme_ht_capabilities_info ht_cap_info;
hdd_debug("%d", value);
if (!mac_handle) {
hdd_err("NULL Mac handle");
return -EINVAL;
}
if (value) {
/* make sure HT capabilities allow this */
status = ucfg_mlme_get_ht_cap_info(hdd_ctx->psoc,
&ht_cap_info);
if (QDF_STATUS_SUCCESS != status) {
hdd_err("Failed to get HT capability info");
return -EIO;
}
if (!ht_cap_info.tx_stbc) {
hdd_err("TX STBC not supported");
return -EINVAL;
}
}
ret = sme_update_ht_config(mac_handle, adapter->vdev_id,
WNI_CFG_HT_CAP_INFO_TX_STBC,
value);
if (ret)
hdd_err("Failed to set TX STBC value");
ret = sme_update_he_tx_stbc_cap(mac_handle, adapter->vdev_id, value);
if (ret)
hdd_err("Failed to set HE TX STBC value");
return ret;
}
/**
* hdd_get_rx_stbc() - Get adapter RX STBC
* @adapter: adapter being queried
* @value: where to store the value
*
* Return: 0 on success, negative errno on failure
*/
int hdd_get_rx_stbc(struct hdd_adapter *adapter, int *value)
{
mac_handle_t mac_handle = adapter->hdd_ctx->mac_handle;
int ret;
hdd_enter();
ret = sme_get_ht_config(mac_handle, adapter->vdev_id,
WNI_CFG_HT_CAP_INFO_RX_STBC);
if (ret < 0) {
hdd_err("Failed to get RX STBC value");
} else {
*value = ret;
ret = 0;
}
return ret;
}
int hdd_set_rx_stbc(struct hdd_adapter *adapter, int value)
{
mac_handle_t mac_handle = adapter->hdd_ctx->mac_handle;
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
int ret;
QDF_STATUS status;
struct mlme_ht_capabilities_info ht_cap_info;
hdd_debug("%d", value);
if (!mac_handle) {
hdd_err("NULL Mac handle");
return -EINVAL;
}
if (value) {
/* make sure HT capabilities allow this */
status = ucfg_mlme_get_ht_cap_info(hdd_ctx->psoc,
&ht_cap_info);
if (QDF_STATUS_SUCCESS != status) {
hdd_err("Failed to get HT capability info");
return -EIO;
}
if (!ht_cap_info.rx_stbc) {
hdd_warn("RX STBC not supported");
return -EINVAL;
}
}
ret = sme_update_ht_config(mac_handle, adapter->vdev_id,
WNI_CFG_HT_CAP_INFO_RX_STBC,
value);
if (ret)
hdd_err("Failed to set RX STBC value");
ret = sme_update_he_rx_stbc_cap(mac_handle, adapter->vdev_id, value);
if (ret)
hdd_err("Failed to set HE RX STBC value");
return ret;
}
/**
* iw_get_linkspeed() - Get current link speed ioctl
* @dev: device upon which the ioctl was received