|
@@ -32,6 +32,7 @@
|
|
|
#include <linux/cpu.h>
|
|
|
#include <linux/etherdevice.h>
|
|
|
#include <linux/firmware.h>
|
|
|
+#include <linux/kernel.h>
|
|
|
#include <wlan_hdd_tx_rx.h>
|
|
|
#include <wni_api.h>
|
|
|
#include <wlan_hdd_cfg.h>
|
|
@@ -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);
|
|
|
}
|
|
|
|
|
|
/**
|