diff --git a/components/mlme/dispatcher/inc/cfg_mlme_vht_caps.h b/components/mlme/dispatcher/inc/cfg_mlme_vht_caps.h index 19b07238e3..3c20e6acaa 100644 --- a/components/mlme/dispatcher/inc/cfg_mlme_vht_caps.h +++ b/components/mlme/dispatcher/inc/cfg_mlme_vht_caps.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -113,16 +113,16 @@ #define CFG_VHT_RX_SUPP_DATA_RATE CFG_UINT( \ "rx_supp_data_rate", \ 0, \ - 780, \ - 780, \ + 866, \ + 866, \ CFG_VALUE_OR_DEFAULT, \ "VHT RX SUPP DATA RATE") #define CFG_VHT_TX_SUPP_DATA_RATE CFG_UINT( \ "tx_supp_data_rate", \ 0, \ - 780, \ - 780, \ + 866, \ + 866, \ CFG_VALUE_OR_DEFAULT, \ "VHT TX SUPP DATA RATE") diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 05c298b662..d552bd5103 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -15447,6 +15447,7 @@ static void wlan_hdd_update_ht_cap(struct hdd_context *hdd_ctx) uint32_t channel_bonding_mode; struct ieee80211_supported_band *band_2g; struct ieee80211_supported_band *band_5g; + uint8_t i; status = ucfg_mlme_get_ht_cap_info(hdd_ctx->psoc, &ht_cap_info); if (QDF_STATUS_SUCCESS != status) @@ -15466,6 +15467,16 @@ static void wlan_hdd_update_ht_cap(struct hdd_context *hdd_ctx) if (!ht_cap_info.short_gi_20_mhz) band_2g->ht_cap.cap &= ~IEEE80211_HT_CAP_SGI_20; + + for (i = 0; i < hdd_ctx->num_rf_chains; i++) + band_2g->ht_cap.mcs.rx_mask[i] = 0xff; + + /* + * According to mcs_nss HT MCS parameters highest data rate for + * Nss = 1 is 150 Mbps + */ + band_2g->ht_cap.mcs.rx_highest = + cpu_to_le16(150 * hdd_ctx->num_rf_chains); } if (band_5g) { @@ -15488,6 +15499,15 @@ static void wlan_hdd_update_ht_cap(struct hdd_context *hdd_ctx) if (!channel_bonding_mode) band_5g->ht_cap.cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40; + + for (i = 0; i < hdd_ctx->num_rf_chains; i++) + band_5g->ht_cap.mcs.rx_mask[i] = 0xff; + /* + * According to mcs_nss HT MCS parameters highest data rate for + * Nss = 1 is 150 Mbps + */ + band_5g->ht_cap.mcs.rx_highest = + cpu_to_le16(150 * hdd_ctx->num_rf_chains); } } diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index b9b425a7ae..f950cfc2d6 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -1680,6 +1681,7 @@ static void hdd_update_wiphy_vhtcap(struct hdd_context *hdd_ctx) hdd_ctx->wiphy->bands[NL80211_BAND_5GHZ]; QDF_STATUS status; uint8_t value = 0, value1 = 0; + uint32_t value2; if (!band_5g) { hdd_debug("5GHz band disabled, skipping capability population"); @@ -1700,6 +1702,13 @@ static void hdd_update_wiphy_vhtcap(struct hdd_context *hdd_ctx) hdd_debug("Updated wiphy vhtcap:0x%x, CSNAntSupp:%d, NumSoundDim:%d", band_5g->vht_cap.cap, value, value1); + + ucfg_mlme_cfg_get_vht_rx_mcs_map(hdd_ctx->psoc, &value2); + band_5g->vht_cap.vht_mcs.rx_mcs_map = value2; + + ucfg_mlme_cfg_get_vht_tx_mcs_map(hdd_ctx->psoc, &value2); + band_5g->vht_cap.vht_mcs.tx_mcs_map = value2; + } static void hdd_update_tgt_ht_cap(struct hdd_context *hdd_ctx, @@ -1766,23 +1775,9 @@ static void hdd_update_tgt_ht_cap(struct hdd_context *hdd_ctx, if (!QDF_IS_STATUS_SUCCESS(status)) hdd_err("unable to set vht_enable2x2"); - if (!b_enable1x1) { + if (!b_enable1x1) ht_cap_info.tx_stbc = 0; - /* 1x1 */ - /* Update Rx Highest Long GI data Rate */ - status = ucfg_mlme_cfg_set_vht_rx_supp_data_rate( - hdd_ctx->psoc, - VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_1_1); - if (!QDF_IS_STATUS_SUCCESS(status)) - hdd_err("Failed to set rx_supp_data_rate"); - /* Update Tx Highest Long GI data Rate */ - status = ucfg_mlme_cfg_set_vht_tx_supp_data_rate( - hdd_ctx->psoc, - VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_1_1); - if (!QDF_IS_STATUS_SUCCESS(status)) - hdd_err("Failed to set tx_supp_data_rate"); - } if (!(cfg->ht_tx_stbc && b_enable1x1)) ht_cap_info.tx_stbc = 0; @@ -1823,6 +1818,9 @@ static void hdd_update_tgt_vht_cap(struct hdd_context *hdd_ctx, wiphy->bands[HDD_NL80211_BAND_5GHZ]; uint32_t ch_width; struct wma_caps_per_phy caps_per_phy = {0}; + bool vht_enable_2x2; + uint32_t tx_highest_data_rate; + uint32_t rx_highest_data_rate; if (!band_5g) { hdd_debug("5GHz band disabled, skipping capability population"); @@ -1833,6 +1831,48 @@ static void hdd_update_tgt_vht_cap(struct hdd_context *hdd_ctx, if (QDF_IS_STATUS_ERROR(status)) hdd_err("could not update vht capabilities"); + status = ucfg_mlme_get_vht_enable2x2(hdd_ctx->psoc, &vht_enable_2x2); + if (!QDF_IS_STATUS_SUCCESS(status)) + hdd_err("unable to get vht_enable2x2"); + + if (vht_enable_2x2) { + if (cfg->vht_short_gi_80 & WMI_VHT_CAP_SGI_80MHZ) { + /* Update 2x2 Highest Short GI data rate */ + tx_highest_data_rate = + VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_2_2_SGI80; + rx_highest_data_rate = + VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_2_2_SGI80; + } else { + /* Update 2x2 Rx Highest Long GI data Rate */ + tx_highest_data_rate = + VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_2_2; + rx_highest_data_rate = + VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_2_2; + } + } else if (cfg->vht_short_gi_80 & WMI_VHT_CAP_SGI_80MHZ) { + /* Update 1x1 Highest Short GI data rate */ + tx_highest_data_rate = + VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_1_1_SGI80; + rx_highest_data_rate = + VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_1_1_SGI80; + } else { + /* Update 1x1 Highest Long GI data rate */ + tx_highest_data_rate = VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_1_1; + rx_highest_data_rate = VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_1_1; + } + + status = ucfg_mlme_cfg_set_vht_rx_supp_data_rate( + hdd_ctx->psoc, + rx_highest_data_rate); + if (!QDF_IS_STATUS_SUCCESS(status)) + hdd_err("Failed to set rx_supp_data_rate"); + + status = ucfg_mlme_cfg_set_vht_tx_supp_data_rate( + hdd_ctx->psoc, + tx_highest_data_rate); + if (!QDF_IS_STATUS_SUCCESS(status)) + hdd_err("Failed to set tx_supp_data_rate"); + if (WMI_VHT_CAP_MAX_MPDU_LEN_11454 == cfg->vht_max_mpdu) band_5g->vht_cap.cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454; else if (WMI_VHT_CAP_MAX_MPDU_LEN_7935 == cfg->vht_max_mpdu) @@ -1907,6 +1947,8 @@ static void hdd_update_tgt_vht_cap(struct hdd_context *hdd_ctx, if (cfg->vht_txop_ps & WMI_VHT_CAP_TXOP_PS) band_5g->vht_cap.cap |= IEEE80211_VHT_CAP_VHT_TXOP_PS; + band_5g->vht_cap.vht_mcs.rx_highest = cpu_to_le16(rx_highest_data_rate); + band_5g->vht_cap.vht_mcs.tx_highest = cpu_to_le16(tx_highest_data_rate); } /** diff --git a/core/mac/inc/sir_mac_prot_def.h b/core/mac/inc/sir_mac_prot_def.h index 3770a251e1..d2569ed4fc 100644 --- a/core/mac/inc/sir_mac_prot_def.h +++ b/core/mac/inc/sir_mac_prot_def.h @@ -168,6 +168,11 @@ #define VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_2_2 780 #define VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_2_2 780 +#define VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_1_1_SGI80 433 +#define VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_1_1_SGI80 433 +#define VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_2_2_SGI80 866 +#define VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_2_2_SGI80 866 + #define VHT_CAP_NO_160M_SUPP 0 #define VHT_CAP_160_SUPP 1 #define VHT_CAP_160_AND_80P80_SUPP 2