From 489e2ae31ea34725f8bdec88b0c5c27f695259a5 Mon Sep 17 00:00:00 2001 From: Ashish Kumar Dhanotiya Date: Fri, 28 Feb 2020 16:24:38 +0530 Subject: [PATCH] qcacld-3.0: Update correct MCS parameters in wiphy Currently MCS parameters are not getting correctly in wiphy which results in incorrect capabilities for iw list command output. To resolve above issue, update MCS parameters correctly in wiphy band capabilities. CRs-Fixed: 2633314 Change-Id: I830ad50aa4842bd2a79c97ed7b11b82c35148ff0 --- .../mlme/dispatcher/inc/cfg_mlme_vht_caps.h | 10 +-- core/hdd/src/wlan_hdd_cfg80211.c | 20 ++++++ core/hdd/src/wlan_hdd_main.c | 72 +++++++++++++++---- core/mac/inc/sir_mac_prot_def.h | 5 ++ 4 files changed, 87 insertions(+), 20 deletions(-) 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