qcacld-3.0: Check FW capabilities for VHT160 support

Check the FW capabilities to enable VHT160MHz support.
Disable 160MHz by default in the configuration.

Change-Id: Ia6985d9f7c55a070dbb47faf95cd409201037e0c
CRs-Fixed: 2004245
This commit is contained in:
Kiran Kumar Lokere 2017-02-07 00:06:43 -08:00 committed by qcabuildsw
parent 1e8e4f0eb7
commit 4bbbd0d8c2
4 changed files with 53 additions and 17 deletions

View File

@ -3698,7 +3698,7 @@ typedef enum {
#define CFG_VHT_CHANNEL_WIDTH "gVhtChannelWidth"
#define CFG_VHT_CHANNEL_WIDTH_MIN (0)
#define CFG_VHT_CHANNEL_WIDTH_MAX (4)
#define CFG_VHT_CHANNEL_WIDTH_DEFAULT (3)
#define CFG_VHT_CHANNEL_WIDTH_DEFAULT (2)
/*
* <ini>

View File

@ -483,6 +483,8 @@ static int curr_con_mode;
*/
enum phy_ch_width hdd_map_nl_chan_width(enum nl80211_chan_width ch_width)
{
uint8_t fw_ch_bw;
fw_ch_bw = wma_get_vht_ch_width();
switch (ch_width) {
case NL80211_CHAN_WIDTH_20_NOHT:
case NL80211_CHAN_WIDTH_20:
@ -493,9 +495,17 @@ enum phy_ch_width hdd_map_nl_chan_width(enum nl80211_chan_width ch_width)
case NL80211_CHAN_WIDTH_80:
return CH_WIDTH_80MHZ;
case NL80211_CHAN_WIDTH_80P80:
return CH_WIDTH_80P80MHZ;
if (fw_ch_bw == WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ)
return CH_WIDTH_80P80MHZ;
else if (fw_ch_bw == WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ)
return CH_WIDTH_160MHZ;
else
return CH_WIDTH_80MHZ;
case NL80211_CHAN_WIDTH_160:
return CH_WIDTH_160MHZ;
if (fw_ch_bw >= WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ)
return CH_WIDTH_160MHZ;
else
return CH_WIDTH_80MHZ;
case NL80211_CHAN_WIDTH_5:
return CH_WIDTH_5MHZ;
case NL80211_CHAN_WIDTH_10:
@ -945,6 +955,7 @@ static void hdd_update_tgt_vht_cap(hdd_context_t *hdd_ctx,
struct ieee80211_supported_band *band_5g =
wiphy->bands[NL80211_BAND_5GHZ];
uint32_t temp = 0;
uint32_t ch_width = eHT_CHANNEL_WIDTH_80MHZ;
if (!band_5g) {
hdd_info("5GHz band disabled, skipping capability population");
@ -976,16 +987,6 @@ static void hdd_update_tgt_vht_cap(hdd_context_t *hdd_ctx,
}
}
/* Get the current supported chan width */
status = sme_cfg_get_int(hdd_ctx->hHal,
WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET,
&value);
if (status != QDF_STATUS_SUCCESS) {
hdd_err("could not get MPDU LENGTH");
value = 0;
}
sme_cfg_get_int(hdd_ctx->hHal, WNI_CFG_VHT_BASIC_MCS_SET, &temp);
temp = (temp & VHT_MCS_1x1) | pconfig->vhtRxMCS;
@ -1230,12 +1231,44 @@ static void hdd_update_tgt_vht_cap(hdd_context_t *hdd_ctx,
band_5g->vht_cap.cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895;
if (cfg->supp_chan_width & (1 << eHT_CHANNEL_WIDTH_80P80MHZ))
if (cfg->supp_chan_width & (1 << eHT_CHANNEL_WIDTH_80P80MHZ)) {
status = sme_cfg_set_int(hdd_ctx->hHal,
WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET,
VHT_CAP_160_AND_80P80_SUPP);
if (status == QDF_STATUS_E_FAILURE)
hdd_alert("could not set the VHT CAP 160");
band_5g->vht_cap.cap |=
IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ;
else if (cfg->supp_chan_width & (1 << eHT_CHANNEL_WIDTH_160MHZ))
ch_width = eHT_CHANNEL_WIDTH_80P80MHZ;
} else if (cfg->supp_chan_width & (1 << eHT_CHANNEL_WIDTH_160MHZ)) {
status = sme_cfg_set_int(hdd_ctx->hHal,
WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET,
VHT_CAP_160_SUPP);
if (status == QDF_STATUS_E_FAILURE)
hdd_alert("could not set the VHT CAP 160");
band_5g->vht_cap.cap |=
IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ;
ch_width = eHT_CHANNEL_WIDTH_160MHZ;
}
pconfig->vhtChannelWidth = QDF_MIN(pconfig->vhtChannelWidth,
ch_width);
/* Get the current supported chan width */
status = sme_cfg_get_int(hdd_ctx->hHal,
WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET,
&value);
if (status != QDF_STATUS_SUCCESS) {
hdd_err("could not get CH BW");
value = 0;
}
/* set the Guard interval 80MHz */
if (value) {
status = sme_cfg_set_int(hdd_ctx->hHal,
WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ,
cfg->vht_short_gi_160);
if (status == QDF_STATUS_E_FAILURE)
hdd_alert("failed to set SHORT GI 80MHZ");
}
if (cfg->vht_rx_ldpc & WMI_VHT_CAP_RX_LDPC)
band_5g->vht_cap.cap |= IEEE80211_VHT_CAP_RXLDPC;

View File

@ -410,6 +410,9 @@
#define VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_2_2 780
#define VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_2_2 780
#define VHT_CAP_160_SUPP 1
#define VHT_CAP_160_AND_80P80_SUPP 2
#define VHT_MCS_1x1 0xFFFC
#define VHT_MCS_2x2 0xFFF3

View File

@ -845,7 +845,7 @@ enum {
#define WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET_STAMIN 0
#define WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET_STAMAX 2
#define WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET_STADEF 2
#define WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET_STADEF 0
#define WNI_CFG_VHT_LDPC_CODING_CAP_STAMIN 0
#define WNI_CFG_VHT_LDPC_CODING_CAP_STAMAX 1
@ -857,7 +857,7 @@ enum {
#define WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ_STAMIN 0
#define WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ_STAMAX 1
#define WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ_STADEF 1
#define WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ_STADEF 0
#define WNI_CFG_VHT_TXSTBC_STAMIN 0
#define WNI_CFG_VHT_TXSTBC_STAMAX 1