qcacld-3.0: Add VHT extended Nss BW support for 160MHz

Add VHT extended Nss BW support for 160MHz connection.

Change-Id: I8e2833a48ca5de0301634a88eb1a66002b4c9c20
CRs-Fixed: 2531279
This commit is contained in:
Kiran Kumar Lokere
2019-07-24 18:30:47 -07:00
committed by nshrivas
parent 2df1001a50
commit c220a51edb
25 changed files with 429 additions and 230 deletions

View File

@@ -125,7 +125,7 @@
* gStaPrefer80MHzOver160MHz - set sta preference to connect in 80HZ/160HZ * gStaPrefer80MHzOver160MHz - set sta preference to connect in 80HZ/160HZ
* @Min: 0 * @Min: 0
* @Max: 1 * @Max: 1
* @Default: 1 * @Default: 0
* *
* This ini is used to set sta preference to connect in 80HZ/160HZ * This ini is used to set sta preference to connect in 80HZ/160HZ
* *
@@ -142,7 +142,7 @@
*/ */
#define CFG_STA_PREFER_80MHZ_OVER_160MHZ CFG_INI_BOOL( \ #define CFG_STA_PREFER_80MHZ_OVER_160MHZ CFG_INI_BOOL( \
"gStaPrefer80MHzOver160MHz", \ "gStaPrefer80MHzOver160MHz", \
1, \ 0, \
"Sta preference to connect in 80HZ/160HZ") "Sta preference to connect in 80HZ/160HZ")
/* /*

View File

@@ -841,6 +841,9 @@ struct mlme_vht_capabilities_info {
uint8_t as_cap; uint8_t as_cap;
bool disable_ldpc_with_txbf_ap; bool disable_ldpc_with_txbf_ap;
bool vht_mcs_10_11_supp; bool vht_mcs_10_11_supp;
uint8_t extended_nss_bw_supp;
uint8_t vht_extended_nss_bw_cap;
uint8_t max_nsts_total;
}; };
/** /**

View File

@@ -2640,6 +2640,11 @@ wlan_mlme_cfg_set_vht_chan_width(struct wlan_objmgr_psoc *psoc, uint8_t value)
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
mlme_obj->cfg.vht_caps.vht_cap_info.supp_chan_width = value; mlme_obj->cfg.vht_caps.vht_cap_info.supp_chan_width = value;
if (value == VHT_CAP_160_AND_80P80_SUPP ||
value == VHT_CAP_160_SUPP) {
mlme_obj->cfg.vht_caps.vht_cap_info.vht_extended_nss_bw_cap = 1;
mlme_obj->cfg.vht_caps.vht_cap_info.extended_nss_bw_supp = 0;
}
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }

View File

@@ -855,15 +855,15 @@ static void hdd_copy_ht_operation(struct hdd_station_ctx *hdd_sta_ctx,
static void hdd_copy_vht_center_freq(struct ieee80211_vht_operation *ieee_ops, static void hdd_copy_vht_center_freq(struct ieee80211_vht_operation *ieee_ops,
tDot11fIEVHTOperation *roam_ops) tDot11fIEVHTOperation *roam_ops)
{ {
ieee_ops->center_freq_seg0_idx = roam_ops->chanCenterFreqSeg1; ieee_ops->center_freq_seg0_idx = roam_ops->chan_center_freq_seg0;
ieee_ops->center_freq_seg1_idx = roam_ops->chanCenterFreqSeg2; ieee_ops->center_freq_seg1_idx = roam_ops->chan_center_freq_seg1;
} }
#else #else
static void hdd_copy_vht_center_freq(struct ieee80211_vht_operation *ieee_ops, static void hdd_copy_vht_center_freq(struct ieee80211_vht_operation *ieee_ops,
tDot11fIEVHTOperation *roam_ops) tDot11fIEVHTOperation *roam_ops)
{ {
ieee_ops->center_freq_seg1_idx = roam_ops->chanCenterFreqSeg1; ieee_ops->center_freq_seg1_idx = roam_ops->chan_center_freq_seg0;
ieee_ops->center_freq_seg2_idx = roam_ops->chanCenterFreqSeg2; ieee_ops->center_freq_seg2_idx = roam_ops->chan_center_freq_seg1;
} }
#endif /* KERNEL_VERSION(4, 12, 0) */ #endif /* KERNEL_VERSION(4, 12, 0) */

View File

@@ -1780,9 +1780,8 @@ static void hdd_update_tgt_vht_cap(struct hdd_context *hdd_ctx,
struct wiphy *wiphy = hdd_ctx->wiphy; struct wiphy *wiphy = hdd_ctx->wiphy;
struct ieee80211_supported_band *band_5g = struct ieee80211_supported_band *band_5g =
wiphy->bands[HDD_NL80211_BAND_5GHZ]; wiphy->bands[HDD_NL80211_BAND_5GHZ];
uint32_t ch_width = eHT_CHANNEL_WIDTH_80MHZ; uint32_t ch_width;
struct wma_caps_per_phy caps_per_phy; struct wma_caps_per_phy caps_per_phy;
uint8_t val = 0;
if (!band_5g) { if (!band_5g) {
hdd_debug("5GHz band disabled, skipping capability population"); hdd_debug("5GHz band disabled, skipping capability population");
@@ -1802,32 +1801,22 @@ static void hdd_update_tgt_vht_cap(struct hdd_context *hdd_ctx,
if (cfg->supp_chan_width & (1 << eHT_CHANNEL_WIDTH_80P80MHZ)) { if (cfg->supp_chan_width & (1 << eHT_CHANNEL_WIDTH_80P80MHZ)) {
status = ucfg_mlme_set_vht_ch_width(hdd_ctx->psoc,
VHT_CAP_160_AND_80P80_SUPP);
if (QDF_IS_STATUS_ERROR(status))
hdd_err("could not set the VHT CAP 160");
band_5g->vht_cap.cap |= band_5g->vht_cap.cap |=
IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ; IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ;
ch_width = eHT_CHANNEL_WIDTH_80P80MHZ; ch_width = VHT_CAP_160_AND_80P80_SUPP;
} else if (cfg->supp_chan_width & (1 << eHT_CHANNEL_WIDTH_160MHZ)) { } else if (cfg->supp_chan_width & (1 << eHT_CHANNEL_WIDTH_160MHZ)) {
status = ucfg_mlme_set_vht_ch_width(hdd_ctx->psoc,
VHT_CAP_160_SUPP);
if (QDF_IS_STATUS_ERROR(status))
hdd_err("could not set the VHT CAP 160");
band_5g->vht_cap.cap |= band_5g->vht_cap.cap |=
IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ; IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ;
ch_width = eHT_CHANNEL_WIDTH_160MHZ; ch_width = VHT_CAP_160_SUPP;
} else {
ch_width = VHT_CAP_NO_160M_SUPP;
} }
status = status = ucfg_mlme_set_vht_ch_width(hdd_ctx->psoc, ch_width);
ucfg_mlme_cfg_get_vht_chan_width(hdd_ctx->psoc, &val);
if (QDF_IS_STATUS_ERROR(status))
hdd_err("could not get channel_width");
val = QDF_MIN(val, ch_width);
status = ucfg_mlme_set_vht_ch_width(hdd_ctx->psoc, val);
if (QDF_IS_STATUS_ERROR(status)) if (QDF_IS_STATUS_ERROR(status))
hdd_err("could not set the channel width"); hdd_err("could not set the channel width");
else
hdd_debug("supported channel width %d", ch_width);
if (cfg->vht_rx_ldpc & WMI_VHT_CAP_RX_LDPC) { if (cfg->vht_rx_ldpc & WMI_VHT_CAP_RX_LDPC) {
band_5g->vht_cap.cap |= IEEE80211_VHT_CAP_RXLDPC; band_5g->vht_cap.cap |= IEEE80211_VHT_CAP_RXLDPC;

View File

@@ -539,7 +539,9 @@ struct sir_vht_config {
uint32_t vht_link_adapt:2; uint32_t vht_link_adapt:2;
uint32_t rx_antpattern:1; uint32_t rx_antpattern:1;
uint32_t tx_antpattern:1; uint32_t tx_antpattern:1;
uint32_t unused:2; uint32_t extended_nss_bw_supp:2;
uint8_t max_nsts_total:2;
uint8_t vht_extended_nss_bw_cap:1;
}; };

View File

@@ -168,9 +168,21 @@
#define VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_2_2 780 #define VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_2_2 780
#define VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_2_2 780 #define VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_2_2 780
#define VHT_CAP_NO_160M_SUPP 0
#define VHT_CAP_160_SUPP 1 #define VHT_CAP_160_SUPP 1
#define VHT_CAP_160_AND_80P80_SUPP 2 #define VHT_CAP_160_AND_80P80_SUPP 2
#define VHT_NO_EXTD_NSS_BW_SUPP 0
#define VHT_EXTD_NSS_80_HALF_NSS_160 1
#define VHT_EXTD_NSS_80_HALF_NSS_80P80 2
#define VHT_EXTD_NSS_80_3QUART_NSS_80P80 3
#define VHT_EXTD_NSS_160_HALF_NSS_80P80 1
#define VHT_EXTD_NSS_160_3QUART_NSS_80P80 2
#define VHT_EXTD_NSS_2X_NSS_160_1X_NSS_80P80 3
#define VHT_EXTD_NSS_2X_NSS_80_1X_NSS_80P80 3
#define VHT_MAX_NSS 8
#define VHT_MCS_1x1 0xFFFC #define VHT_MCS_1x1 0xFFFC
#define VHT_MCS_2x2 0xFFF3 #define VHT_MCS_2x2 0xFFF3
@@ -1022,7 +1034,7 @@ typedef struct sSirMacMeasReqIE {
/* VHT Capabilities Info */ /* VHT Capabilities Info */
typedef struct sSirMacVHTCapabilityInfo { typedef struct sSirMacVHTCapabilityInfo {
#ifndef ANI_LITTLE_BIT_ENDIAN #ifndef ANI_LITTLE_BIT_ENDIAN
uint32_t reserved1:2; uint32_t extended_nss_bw_supp:2;
uint32_t txAntPattern:1; uint32_t txAntPattern:1;
uint32_t rxAntPattern:1; uint32_t rxAntPattern:1;
uint32_t vhtLinkAdaptCap:2; uint32_t vhtLinkAdaptCap:2;
@@ -1062,27 +1074,29 @@ typedef struct sSirMacVHTCapabilityInfo {
uint32_t vhtLinkAdaptCap:2; uint32_t vhtLinkAdaptCap:2;
uint32_t rxAntPattern:1; uint32_t rxAntPattern:1;
uint32_t txAntPattern:1; uint32_t txAntPattern:1;
uint32_t reserved1:2; uint32_t extended_nss_bw_supp:2;
#endif #endif
} qdf_packed tSirMacVHTCapabilityInfo; } qdf_packed tSirMacVHTCapabilityInfo;
typedef struct sSirMacVHTTxSupDataRateInfo { typedef struct sSirMacVHTTxSupDataRateInfo {
#ifndef ANI_LITTLE_BIT_ENDIAN #ifndef ANI_LITTLE_BIT_ENDIAN
uint16_t reserved:3; uint16_t reserved:2;
uint16_t vht_extended_nss_bw_cap:1;
uint16_t txSupDataRate:13; uint16_t txSupDataRate:13;
#else #else
uint16_t txSupDataRate:13; uint16_t txSupDataRate:13;
uint16_t reserved:3; uint16_t vht_extended_nss_bw_cap:1;
uint16_t reserved:2;
#endif #endif
} qdf_packed tSirMacVHTTxSupDataRateInfo; } qdf_packed tSirMacVHTTxSupDataRateInfo;
typedef struct sSirMacVHTRxSupDataRateInfo { typedef struct sSirMacVHTRxSupDataRateInfo {
#ifndef ANI_LITTLE_BIT_ENDIAN #ifndef ANI_LITTLE_BIT_ENDIAN
uint16_t reserved:3; uint16_t max_nsts_total:3;
uint16_t rxSupDataRate:13; uint16_t rxSupDataRate:13;
#else #else
uint16_t rxSupDataRate:13; uint16_t rxSupDataRate:13;
uint16_t reserved:3; uint16_t max_nsts_total:3;
#endif #endif
} qdf_packed tSirMacVHTRxSupDataRateInfo; } qdf_packed tSirMacVHTRxSupDataRateInfo;
@@ -1947,7 +1961,7 @@ struct he_capability_info {
#define SIR_MAC_VHT_CAP_LINK_ADAPT_CAP 26 #define SIR_MAC_VHT_CAP_LINK_ADAPT_CAP 26
#define SIR_MAC_VHT_CAP_RX_ANTENNA_PATTERN 28 #define SIR_MAC_VHT_CAP_RX_ANTENNA_PATTERN 28
#define SIR_MAC_VHT_CAP_TX_ANTENNA_PATTERN 29 #define SIR_MAC_VHT_CAP_TX_ANTENNA_PATTERN 29
#define SIR_MAC_VHT_CAP_RESERVED2 30 #define SIR_MAC_VHT_CAP_EXTD_NSS_BW 30
#define SIR_MAC_HT_CAP_ADVCODING_S 0 #define SIR_MAC_HT_CAP_ADVCODING_S 0
#define SIR_MAC_HT_CAP_CHWIDTH40_S 1 #define SIR_MAC_HT_CAP_CHWIDTH40_S 1

View File

@@ -2398,25 +2398,26 @@ IE VHTCaps (EID_VHT_CAPABILITIES)
vhtLinkAdaptCap: 2; vhtLinkAdaptCap: 2;
rxAntPattern: 1; rxAntPattern: 1;
txAntPattern: 1; txAntPattern: 1;
reserved1: 2; extended_nss_bw_supp: 2;
} }
rxMCSMap, 2; rxMCSMap, 2;
{ {
rxHighSupDataRate: 13; rxHighSupDataRate: 13;
reserved2: 3; max_nsts_total: 3;
} }
txMCSMap, 2; txMCSMap, 2;
{ {
txSupDataRate: 13; txSupDataRate: 13;
reserved3: 3; vht_extended_nss_bw_cap: 1;
reserved: 2;
} }
} }
IE VHTOperation (EID_VHT_OPERATION_ELEMENT) IE VHTOperation (EID_VHT_OPERATION_ELEMENT)
{ {
chanWidth, 1; chanWidth, 1;
chanCenterFreqSeg1, 1; chan_center_freq_seg0, 1;
chanCenterFreqSeg2, 1; chan_center_freq_seg1, 1;
basicMCSSet, 2; basicMCSSet, 2;
} }
@@ -2550,7 +2551,8 @@ IE HTInfo (EID_HT_INFO)
nonGFDevicesPresent: 1; nonGFDevicesPresent: 1;
transmitBurstLimit: 1; transmitBurstLimit: 1;
obssNonHTStaPresent:1; obssNonHTStaPresent:1;
reserved: 11; chan_center_freq_seg2:8;
reserved: 3;
} }
@@ -2578,7 +2580,8 @@ IE OperatingMode (EID_OPERATING_MODE)
{ {
{ //Operating Mode field { //Operating Mode field
chanWidth: 2; chanWidth: 2;
reserved: 2; vht_160_80p80_supp: 1;
no_ldpc: 1;
rxNSS: 3; rxNSS: 3;
rxNSSType: 1; rxNSSType: 1;
} }

View File

@@ -26,7 +26,7 @@
* *
* *
* This file was automatically generated by 'framesc' * This file was automatically generated by 'framesc'
* Fri Sep 13 10:34:49 2019 from the following file(s): * Thu Sep 19 14:00:22 2019 from the following file(s):
* *
* dot11f.frms * dot11f.frms
* *
@@ -3643,13 +3643,14 @@ typedef struct sDot11fIEVHTCaps {
uint32_t vhtLinkAdaptCap:2; uint32_t vhtLinkAdaptCap:2;
uint32_t rxAntPattern:1; uint32_t rxAntPattern:1;
uint32_t txAntPattern:1; uint32_t txAntPattern:1;
uint32_t reserved1:2; uint32_t extended_nss_bw_supp:2;
uint16_t rxMCSMap; uint16_t rxMCSMap;
uint16_t rxHighSupDataRate:13; uint16_t rxHighSupDataRate:13;
uint16_t reserved2:3; uint16_t max_nsts_total:3;
uint16_t txMCSMap; uint16_t txMCSMap;
uint16_t txSupDataRate:13; uint16_t txSupDataRate:13;
uint16_t reserved3:3; uint16_t vht_extended_nss_bw_cap:1;
uint16_t reserved:2;
} tDot11fIEVHTCaps; } tDot11fIEVHTCaps;
#define DOT11F_EID_VHTCAPS (191) #define DOT11F_EID_VHTCAPS (191)
@@ -3689,8 +3690,8 @@ uint32_t dot11f_get_packed_ie_VHTCaps(
typedef struct sDot11fIEVHTOperation { typedef struct sDot11fIEVHTOperation {
uint8_t present; uint8_t present;
uint8_t chanWidth; uint8_t chanWidth;
uint8_t chanCenterFreqSeg1; uint8_t chan_center_freq_seg0;
uint8_t chanCenterFreqSeg2; uint8_t chan_center_freq_seg1;
uint16_t basicMCSSet; uint16_t basicMCSSet;
} tDot11fIEVHTOperation; } tDot11fIEVHTOperation;
@@ -5355,7 +5356,8 @@ typedef struct sDot11fIEHTInfo {
uint16_t nonGFDevicesPresent:1; uint16_t nonGFDevicesPresent:1;
uint16_t transmitBurstLimit:1; uint16_t transmitBurstLimit:1;
uint16_t obssNonHTStaPresent:1; uint16_t obssNonHTStaPresent:1;
uint16_t reserved:11; uint16_t chan_center_freq_seg2:8;
uint16_t reserved:3;
uint16_t basicSTBCMCS:7; uint16_t basicSTBCMCS:7;
uint16_t dualCTSProtection:1; uint16_t dualCTSProtection:1;
uint16_t secondaryBeacon:1; uint16_t secondaryBeacon:1;
@@ -5863,7 +5865,8 @@ uint32_t dot11f_get_packed_ie_OBSSScanParameters(
typedef struct sDot11fIEOperatingMode { typedef struct sDot11fIEOperatingMode {
uint8_t present; uint8_t present;
uint8_t chanWidth:2; uint8_t chanWidth:2;
uint8_t reserved:2; uint8_t vht_160_80p80_supp:1;
uint8_t no_ldpc:1;
uint8_t rxNSS:3; uint8_t rxNSS:3;
uint8_t rxNSSType:1; uint8_t rxNSSType:1;
} tDot11fIEOperatingMode; } tDot11fIEOperatingMode;

View File

@@ -148,10 +148,14 @@ typedef struct sDphHashNode {
uint8_t staType; uint8_t staType;
uint8_t vhtSupportedChannelWidthSet; uint8_t vhtSupportedChannelWidthSet;
enum phy_ch_width ch_width;
uint8_t vhtSupportedRxNss; uint8_t vhtSupportedRxNss;
uint8_t vhtBeamFormerCapable; uint8_t vhtBeamFormerCapable;
uint8_t vht_su_bfee_capable; uint8_t vht_su_bfee_capable;
uint8_t vht_mcs_10_11_supp; uint8_t vht_mcs_10_11_supp;
uint8_t vht_160mhz_nss;
uint8_t vht_80p80mhz_nss;
uint8_t vht_extended_nss_bw_cap;
#ifdef WLAN_FEATURE_11W #ifdef WLAN_FEATURE_11W
TX_TIMER pmfSaQueryTimer; TX_TIMER pmfSaQueryTimer;
uint16_t pmfSaQueryCurrentTransId; uint16_t pmfSaQueryCurrentTransId;

View File

@@ -1359,11 +1359,124 @@ lim_decide_short_slot(struct mac_context *mac_ctx, tpDphHashNode sta_ds,
} }
} }
static uint8_t lim_get_nss_from_vht_mcs_map(uint16_t mcs_map)
{
uint8_t nss = 0;
uint16_t mcs_mask = 0x3;
for (nss = 0; nss < VHT_MAX_NSS; nss++) {
if ((mcs_map & mcs_mask) == mcs_mask)
return nss;
mcs_mask = (mcs_mask << 2);
}
return nss;
}
static void lim_get_vht_gt80_nss(struct mac_context *mac_ctx,
struct sDphHashNode *sta_ds,
tDot11fIEVHTCaps *vht_caps,
struct pe_session *session)
{
uint8_t nss;
if (!vht_caps->vht_extended_nss_bw_cap) {
sta_ds->vht_160mhz_nss = 0;
sta_ds->vht_80p80mhz_nss = 0;
pe_debug("peer does not support vht extnd nss bw");
return;
}
nss = lim_get_nss_from_vht_mcs_map(vht_caps->rxMCSMap);
if (!nss) {
pe_debug("Invalid peer VHT MCS map %0X", vht_caps->rxMCSMap);
nss = 1;
}
switch (vht_caps->supportedChannelWidthSet) {
case VHT_CAP_NO_160M_SUPP:
if (vht_caps->extended_nss_bw_supp ==
VHT_EXTD_NSS_80_HALF_NSS_160) {
sta_ds->vht_160mhz_nss = nss / 2;
sta_ds->vht_80p80mhz_nss = 0;
} else if (vht_caps->extended_nss_bw_supp ==
VHT_EXTD_NSS_80_HALF_NSS_80P80) {
sta_ds->vht_160mhz_nss = nss / 2;
sta_ds->vht_80p80mhz_nss = nss / 2;
} else if (vht_caps->extended_nss_bw_supp ==
VHT_EXTD_NSS_80_3QUART_NSS_80P80) {
sta_ds->vht_160mhz_nss = (nss * 3) / 4;
sta_ds->vht_80p80mhz_nss = (nss * 3) / 4;
} else {
sta_ds->vht_160mhz_nss = 0;
sta_ds->vht_80p80mhz_nss = 0;
}
break;
case VHT_CAP_160_SUPP:
sta_ds->vht_160mhz_nss = nss;
if (vht_caps->extended_nss_bw_supp ==
VHT_EXTD_NSS_160_HALF_NSS_80P80) {
sta_ds->vht_80p80mhz_nss = nss / 2;
} else if (vht_caps->extended_nss_bw_supp ==
VHT_EXTD_NSS_160_3QUART_NSS_80P80) {
sta_ds->vht_80p80mhz_nss = (nss * 3) / 4;
} else if (vht_caps->extended_nss_bw_supp ==
VHT_EXTD_NSS_2X_NSS_160_1X_NSS_80P80) {
if (nss > (VHT_MAX_NSS / 2)) {
pe_debug("Invalid extnd nss bw support val");
sta_ds->vht_80p80mhz_nss = nss / 2;
break;
}
sta_ds->vht_160mhz_nss = nss * 2;
if (session->nss == MAX_VDEV_NSS)
break;
if (!mac_ctx->mlme_cfg->vht_caps.vht_cap_info.enable2x2)
break;
session->nss *= 2;
} else {
sta_ds->vht_80p80mhz_nss = 0;
}
break;
case VHT_CAP_160_AND_80P80_SUPP:
if (vht_caps->extended_nss_bw_supp ==
VHT_EXTD_NSS_2X_NSS_80_1X_NSS_80P80) {
if (nss > (VHT_MAX_NSS / 2)) {
pe_debug("Invalid extnd nss bw support val");
break;
}
if (session->nss == MAX_VDEV_NSS)
break;
if (!mac_ctx->mlme_cfg->vht_caps.vht_cap_info.enable2x2)
break;
session->nss *= 2;
} else {
sta_ds->vht_160mhz_nss = nss;
sta_ds->vht_80p80mhz_nss = nss;
}
break;
default:
sta_ds->vht_160mhz_nss = 0;
sta_ds->vht_80p80mhz_nss = 0;
}
pe_debug("AP Nss config: 160MHz: %d, 80P80MHz %d",
sta_ds->vht_160mhz_nss, sta_ds->vht_80p80mhz_nss);
sta_ds->vht_160mhz_nss = QDF_MIN(sta_ds->vht_160mhz_nss, session->nss);
sta_ds->vht_80p80mhz_nss = QDF_MIN(sta_ds->vht_80p80mhz_nss,
session->nss);
pe_debug("Session Nss config: 160MHz: %d, 80P80MHz %d, session Nss %d",
sta_ds->vht_160mhz_nss, sta_ds->vht_80p80mhz_nss,
session->nss);
}
QDF_STATUS lim_populate_vht_mcs_set(struct mac_context *mac_ctx, QDF_STATUS lim_populate_vht_mcs_set(struct mac_context *mac_ctx,
struct supported_rates *rates, struct supported_rates *rates,
tDot11fIEVHTCaps *peer_vht_caps, tDot11fIEVHTCaps *peer_vht_caps,
struct pe_session *session_entry, struct pe_session *session_entry,
uint8_t nss) uint8_t nss,
struct sDphHashNode *sta_ds)
{ {
uint32_t self_sta_dot11mode = 0; uint32_t self_sta_dot11mode = 0;
uint16_t mcs_map_mask = MCSMAPMASK1x1; uint16_t mcs_map_mask = MCSMAPMASK1x1;
@@ -1375,6 +1488,9 @@ QDF_STATUS lim_populate_vht_mcs_set(struct mac_context *mac_ctx,
if (!IS_DOT11_MODE_VHT(self_sta_dot11mode)) if (!IS_DOT11_MODE_VHT(self_sta_dot11mode))
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
if (!peer_vht_caps || !peer_vht_caps->present)
return QDF_STATUS_SUCCESS;
vht_cap_info = &mac_ctx->mlme_cfg->vht_caps.vht_cap_info; vht_cap_info = &mac_ctx->mlme_cfg->vht_caps.vht_cap_info;
rates->vhtRxMCSMap = (uint16_t)vht_cap_info->rx_mcs_map; rates->vhtRxMCSMap = (uint16_t)vht_cap_info->rx_mcs_map;
@@ -1412,9 +1528,6 @@ QDF_STATUS lim_populate_vht_mcs_set(struct mac_context *mac_ctx,
} }
} }
if ((!peer_vht_caps) || (!peer_vht_caps->present))
return QDF_STATUS_SUCCESS;
rates->vhtTxHighestDataRate = rates->vhtTxHighestDataRate =
QDF_MIN(rates->vhtTxHighestDataRate, QDF_MIN(rates->vhtTxHighestDataRate,
peer_vht_caps->txSupDataRate); peer_vht_caps->txSupDataRate);
@@ -1428,24 +1541,19 @@ QDF_STATUS lim_populate_vht_mcs_set(struct mac_context *mac_ctx,
if ((peer_vht_caps->txMCSMap & mcs_map_mask) < if ((peer_vht_caps->txMCSMap & mcs_map_mask) <
(rates->vhtRxMCSMap & mcs_map_mask)) { (rates->vhtRxMCSMap & mcs_map_mask)) {
rates->vhtRxMCSMap &= ~(mcs_map_mask); rates->vhtRxMCSMap &= ~(mcs_map_mask);
rates->vhtRxMCSMap |= rates->vhtRxMCSMap |= (peer_vht_caps->txMCSMap & mcs_map_mask);
(peer_vht_caps->txMCSMap & mcs_map_mask);
} }
if ((peer_vht_caps->rxMCSMap & mcs_map_mask) < if ((peer_vht_caps->rxMCSMap & mcs_map_mask) <
(rates->vhtTxMCSMap & mcs_map_mask)) { (rates->vhtTxMCSMap & mcs_map_mask)) {
rates->vhtTxMCSMap &= ~(mcs_map_mask); rates->vhtTxMCSMap &= ~(mcs_map_mask);
rates->vhtTxMCSMap |= rates->vhtTxMCSMap |= (peer_vht_caps->rxMCSMap & mcs_map_mask);
(peer_vht_caps->rxMCSMap & mcs_map_mask);
} }
if (mcs_map_mask2x2) { if (mcs_map_mask2x2) {
uint16_t peer_mcs_map, self_mcs_map; uint16_t peer_mcs_map, self_mcs_map;
peer_mcs_map = peer_mcs_map = peer_vht_caps->txMCSMap & mcs_map_mask2x2;
peer_vht_caps->txMCSMap & mcs_map_mask2x2; self_mcs_map = rates->vhtRxMCSMap & mcs_map_mask2x2;
self_mcs_map =
rates->vhtRxMCSMap & mcs_map_mask2x2;
if ((self_mcs_map != mcs_map_mask2x2) && if ((self_mcs_map != mcs_map_mask2x2) &&
((peer_mcs_map == mcs_map_mask2x2) || ((peer_mcs_map == mcs_map_mask2x2) ||
@@ -1454,10 +1562,8 @@ QDF_STATUS lim_populate_vht_mcs_set(struct mac_context *mac_ctx,
rates->vhtRxMCSMap |= peer_mcs_map; rates->vhtRxMCSMap |= peer_mcs_map;
} }
peer_mcs_map = peer_mcs_map = (peer_vht_caps->rxMCSMap & mcs_map_mask2x2);
(peer_vht_caps->rxMCSMap & mcs_map_mask2x2); self_mcs_map = (rates->vhtTxMCSMap & mcs_map_mask2x2);
self_mcs_map =
(rates->vhtTxMCSMap & mcs_map_mask2x2);
if ((self_mcs_map != mcs_map_mask2x2) && if ((self_mcs_map != mcs_map_mask2x2) &&
((peer_mcs_map == mcs_map_mask2x2) || ((peer_mcs_map == mcs_map_mask2x2) ||
@@ -1466,18 +1572,24 @@ QDF_STATUS lim_populate_vht_mcs_set(struct mac_context *mac_ctx,
rates->vhtTxMCSMap |= peer_mcs_map; rates->vhtTxMCSMap |= peer_mcs_map;
} }
} }
pe_debug("enable2x2 - %d nss %d vhtRxMCSMap - %x vhtTxMCSMap - %x", pe_debug("enable2x2 - %d nss %d vhtRxMCSMap - %x vhtTxMCSMap - %x",
vht_cap_info->enable2x2, nss, vht_cap_info->enable2x2, nss,
rates->vhtRxMCSMap, rates->vhtTxMCSMap); rates->vhtRxMCSMap, rates->vhtTxMCSMap);
if (session_entry) { if (!session_entry)
return QDF_STATUS_SUCCESS;
session_entry->supported_nss_1x1 = session_entry->supported_nss_1x1 =
((rates->vhtTxMCSMap & VHT_MCS_1x1) == ((rates->vhtTxMCSMap & VHT_MCS_1x1) == VHT_MCS_1x1) ?
VHT_MCS_1x1) ? true : false; true : false;
pe_debug("VHT supported nss 1x1: %d", pe_debug("VHT supported nss 1x1: %d", session_entry->supported_nss_1x1);
session_entry->supported_nss_1x1);
} if (!sta_ds || CH_WIDTH_80MHZ >= session_entry->ch_width)
return QDF_STATUS_SUCCESS;
sta_ds->vht_extended_nss_bw_cap =
peer_vht_caps->vht_extended_nss_bw_cap;
lim_get_vht_gt80_nss(mac_ctx, sta_ds, peer_vht_caps, session_entry);
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
@@ -1605,8 +1717,8 @@ QDF_STATUS lim_populate_own_rate_set(struct mac_context *mac_ctx,
for (i = 0; i < SIR_MAC_MAX_SUPPORTED_MCS_SET; i++) for (i = 0; i < SIR_MAC_MAX_SUPPORTED_MCS_SET; i++)
pe_debug("%x ", rates->supportedMCSSet[i]); pe_debug("%x ", rates->supportedMCSSet[i]);
} }
lim_populate_vht_mcs_set(mac_ctx, rates, vht_caps, lim_populate_vht_mcs_set(mac_ctx, rates, vht_caps, session_entry,
session_entry, session_entry->nss); session_entry->nss, NULL);
lim_populate_he_mcs_set(mac_ctx, rates, he_caps, lim_populate_he_mcs_set(mac_ctx, rates, he_caps,
session_entry, session_entry->nss); session_entry, session_entry->nss);
@@ -1641,7 +1753,8 @@ QDF_STATUS lim_populate_peer_rate_set(struct mac_context *mac,
uint8_t basicOnly, uint8_t basicOnly,
struct pe_session *pe_session, struct pe_session *pe_session,
tDot11fIEVHTCaps *pVHTCaps, tDot11fIEVHTCaps *pVHTCaps,
tDot11fIEhe_cap *he_caps) tDot11fIEhe_cap *he_caps,
struct sDphHashNode *sta_ds)
{ {
tSirMacRateSet tempRateSet; tSirMacRateSet tempRateSet;
tSirMacRateSet tempRateSet2; tSirMacRateSet tempRateSet2;
@@ -1772,8 +1885,8 @@ QDF_STATUS lim_populate_peer_rate_set(struct mac_context *mac,
pe_debug("HT supported nss 1x1: %d", pe_debug("HT supported nss 1x1: %d",
pe_session->supported_nss_1x1); pe_session->supported_nss_1x1);
} }
lim_populate_vht_mcs_set(mac, pRates, pVHTCaps, lim_populate_vht_mcs_set(mac, pRates, pVHTCaps, pe_session,
pe_session, pe_session->nss); pe_session->nss, sta_ds);
lim_populate_he_mcs_set(mac, pRates, he_caps, lim_populate_he_mcs_set(mac, pRates, he_caps,
pe_session, pe_session->nss); pe_session, pe_session->nss);
@@ -2012,7 +2125,7 @@ QDF_STATUS lim_populate_matching_rate_set(struct mac_context *mac_ctx,
} }
} }
lim_populate_vht_mcs_set(mac_ctx, &sta_ds->supportedRates, vht_caps, lim_populate_vht_mcs_set(mac_ctx, &sta_ds->supportedRates, vht_caps,
session_entry, session_entry->nss); session_entry, session_entry->nss, sta_ds);
lim_populate_he_mcs_set(mac_ctx, &sta_ds->supportedRates, he_caps, lim_populate_he_mcs_set(mac_ctx, &sta_ds->supportedRates, he_caps,
session_entry, session_entry->nss); session_entry, session_entry->nss);
/* /*
@@ -2074,8 +2187,8 @@ static uint32_t lim_populate_vht_caps(tDot11fIEVHTCaps input_caps)
SIR_MAC_VHT_CAP_RX_ANTENNA_PATTERN) | SIR_MAC_VHT_CAP_RX_ANTENNA_PATTERN) |
(input_caps.txAntPattern << (input_caps.txAntPattern <<
SIR_MAC_VHT_CAP_TX_ANTENNA_PATTERN) | SIR_MAC_VHT_CAP_TX_ANTENNA_PATTERN) |
(input_caps.reserved1 << (input_caps.extended_nss_bw_supp <<
SIR_MAC_VHT_CAP_RESERVED2)); SIR_MAC_VHT_CAP_EXTD_NSS_BW));
return vht_caps; return vht_caps;
} }
@@ -2259,7 +2372,7 @@ lim_add_sta(struct mac_context *mac_ctx,
add_sta_params->maxAmpduSize = sta_ds->htMaxRxAMpduFactor; add_sta_params->maxAmpduSize = sta_ds->htMaxRxAMpduFactor;
add_sta_params->fShortGI20Mhz = sta_ds->htShortGI20Mhz; add_sta_params->fShortGI20Mhz = sta_ds->htShortGI20Mhz;
add_sta_params->fShortGI40Mhz = sta_ds->htShortGI40Mhz; add_sta_params->fShortGI40Mhz = sta_ds->htShortGI40Mhz;
add_sta_params->ch_width = sta_ds->htSupportedChannelWidthSet; add_sta_params->ch_width = sta_ds->ch_width;
add_sta_params->mimoPS = sta_ds->htMIMOPSState; add_sta_params->mimoPS = sta_ds->htMIMOPSState;
pe_debug("maxAmpduDensity: %d maxAmpduDensity: %d", pe_debug("maxAmpduDensity: %d maxAmpduDensity: %d",
@@ -3414,8 +3527,8 @@ static void lim_update_vhtcaps_assoc_resp(struct mac_context *mac_ctx,
SIR_MAC_VHT_CAP_RX_ANTENNA_PATTERN) | SIR_MAC_VHT_CAP_RX_ANTENNA_PATTERN) |
(vht_caps->txAntPattern << (vht_caps->txAntPattern <<
SIR_MAC_VHT_CAP_TX_ANTENNA_PATTERN) | SIR_MAC_VHT_CAP_TX_ANTENNA_PATTERN) |
(vht_caps->reserved1 << (vht_caps->extended_nss_bw_supp <<
SIR_MAC_VHT_CAP_RESERVED2)); SIR_MAC_VHT_CAP_EXTD_NSS_BW));
pAddBssParams->staContext.maxAmpduSize = pAddBssParams->staContext.maxAmpduSize =
SIR_MAC_GET_VHT_MAX_AMPDU_EXPO( SIR_MAC_GET_VHT_MAX_AMPDU_EXPO(
@@ -3665,6 +3778,19 @@ QDF_STATUS lim_sta_send_add_bss(struct mac_context *mac, tpSirAssocRsp pAssocRsp
if (vht_caps && pAddBssParams->staContext.stbc_capable) if (vht_caps && pAddBssParams->staContext.stbc_capable)
pAddBssParams->staContext.stbc_capable = pAddBssParams->staContext.stbc_capable =
vht_caps->rxSTBC; vht_caps->rxSTBC;
if (pe_session->ch_width == CH_WIDTH_160MHZ ||
pe_session->ch_width == CH_WIDTH_80P80MHZ) {
sta_context->vht_160mhz_nss =
sta->vht_160mhz_nss;
sta_context->vht_80p80mhz_nss =
sta->vht_80p80mhz_nss;
sta_context->vht_extended_nss_bw_cap =
sta->vht_extended_nss_bw_cap;
} else {
sta_context->vht_160mhz_nss = 0;
sta_context->vht_80p80mhz_nss = 0;
sta_context->vht_extended_nss_bw_cap = 0;
}
} }
if (lim_is_session_he_capable(pe_session) && if (lim_is_session_he_capable(pe_session) &&
pAssocRsp->he_cap.present) { pAssocRsp->he_cap.present) {
@@ -4166,7 +4292,7 @@ QDF_STATUS lim_sta_send_add_bss_pre_assoc(struct mac_context *mac,
pBeaconStruct->HTCaps.supportedMCSSet, pBeaconStruct->HTCaps.supportedMCSSet,
false, pe_session, false, pe_session,
&pBeaconStruct->VHTCaps, &pBeaconStruct->VHTCaps,
&pBeaconStruct->he_cap); &pBeaconStruct->he_cap, NULL);
pAddBssParams->staContext.encryptType = pe_session->encryptType; pAddBssParams->staContext.encryptType = pe_session->encryptType;

View File

@@ -62,7 +62,8 @@ QDF_STATUS lim_populate_peer_rate_set(struct mac_context *mac,
uint8_t basicOnly, uint8_t basicOnly,
struct pe_session *pe_session, struct pe_session *pe_session,
tDot11fIEVHTCaps *pVHTCaps, tDot11fIEVHTCaps *pVHTCaps,
tDot11fIEhe_cap *he_caps); tDot11fIEhe_cap *he_caps,
struct sDphHashNode *sta_ds);
/** /**
* lim_populate_own_rate_set() - comprises the basic and extended rates read * lim_populate_own_rate_set() - comprises the basic and extended rates read
@@ -311,6 +312,7 @@ void lim_send_sme_tsm_ie_ind(struct mac_context *mac,
* @peer_vht_caps: pointer to peer vht capabilities * @peer_vht_caps: pointer to peer vht capabilities
* @session_entry: pe session entry * @session_entry: pe session entry
* @nss: number of spatial streams * @nss: number of spatial streams
* @sta_ds: pointer to peer sta data structure
* *
* Populates vht mcs rate set based on peer and self capabilities * Populates vht mcs rate set based on peer and self capabilities
* *
@@ -320,7 +322,8 @@ QDF_STATUS lim_populate_vht_mcs_set(struct mac_context *mac_ctx,
struct supported_rates *rates, struct supported_rates *rates,
tDot11fIEVHTCaps *peer_vht_caps, tDot11fIEVHTCaps *peer_vht_caps,
struct pe_session *session_entry, struct pe_session *session_entry,
uint8_t nss); uint8_t nss,
struct sDphHashNode *sta_ds);
/** /**
* lim_extract_ies_from_deauth_disassoc() - Extract IEs from deauth/disassoc * lim_extract_ies_from_deauth_disassoc() - Extract IEs from deauth/disassoc

View File

@@ -233,8 +233,8 @@ void lim_ft_prepare_add_bss_req(struct mac_context *mac,
SIR_MAC_VHT_CAP_RX_ANTENNA_PATTERN) | SIR_MAC_VHT_CAP_RX_ANTENNA_PATTERN) |
(pBeaconStruct->VHTCaps.txAntPattern << (pBeaconStruct->VHTCaps.txAntPattern <<
SIR_MAC_VHT_CAP_TX_ANTENNA_PATTERN) | SIR_MAC_VHT_CAP_TX_ANTENNA_PATTERN) |
(pBeaconStruct->VHTCaps.reserved1 << (pBeaconStruct->VHTCaps.extended_nss_bw_supp <<
SIR_MAC_VHT_CAP_RESERVED2)); SIR_MAC_VHT_CAP_EXTD_NSS_BW));
} else { } else {
pAddBssParams->vhtCapable = 0; pAddBssParams->vhtCapable = 0;
} }
@@ -343,7 +343,7 @@ void lim_ft_prepare_add_bss_req(struct mac_context *mac,
pBeaconStruct->HTCaps.supportedMCSSet, pBeaconStruct->HTCaps.supportedMCSSet,
false, ft_session, false, ft_session,
&pBeaconStruct->VHTCaps, &pBeaconStruct->VHTCaps,
&pBeaconStruct->he_cap); &pBeaconStruct->he_cap, NULL);
} }
pAddBssParams->maxTxPower = ft_session->maxTxPower; pAddBssParams->maxTxPower = ft_session->maxTxPower;
@@ -561,9 +561,9 @@ void lim_fill_ft_session(struct mac_context *mac,
ft_session->ch_width = ft_session->ch_width =
pBeaconStruct->VHTOperation.chanWidth + 1; pBeaconStruct->VHTOperation.chanWidth + 1;
ft_session->ch_center_freq_seg0 = ft_session->ch_center_freq_seg0 =
pBeaconStruct->VHTOperation.chanCenterFreqSeg1; pBeaconStruct->VHTOperation.chan_center_freq_seg0;
ft_session->ch_center_freq_seg1 = ft_session->ch_center_freq_seg1 =
pBeaconStruct->VHTOperation.chanCenterFreqSeg2; pBeaconStruct->VHTOperation.chan_center_freq_seg1;
} else { } else {
if (pBeaconStruct->HTInfo.secondaryChannelOffset == if (pBeaconStruct->HTInfo.secondaryChannelOffset ==
PHY_DOUBLE_CHANNEL_LOW_PRIMARY) PHY_DOUBLE_CHANNEL_LOW_PRIMARY)

View File

@@ -1488,11 +1488,17 @@ static bool lim_update_sta_ds(struct mac_context *mac_ctx, tpSirMacMgmtHdr hdr,
*assoc_req_copied = true; *assoc_req_copied = true;
} }
if (!assoc_req->wmeInfoPresent) {
sta_ds->mlmStaContext.htCapability = 0;
sta_ds->mlmStaContext.vhtCapability = 0;
} else {
sta_ds->mlmStaContext.htCapability = assoc_req->HTCaps.present; sta_ds->mlmStaContext.htCapability = assoc_req->HTCaps.present;
if ((vht_caps) && vht_caps->present) if ((vht_caps) && vht_caps->present)
sta_ds->mlmStaContext.vhtCapability = vht_caps->present; sta_ds->mlmStaContext.vhtCapability = vht_caps->present;
else else
sta_ds->mlmStaContext.vhtCapability = false; sta_ds->mlmStaContext.vhtCapability = false;
}
lim_update_stads_he_capable(sta_ds, assoc_req); lim_update_stads_he_capable(sta_ds, assoc_req);
sta_ds->qos.addtsPresent = sta_ds->qos.addtsPresent =
(assoc_req->addtsPresent == 0) ? false : true; (assoc_req->addtsPresent == 0) ? false : true;
@@ -1523,7 +1529,7 @@ static bool lim_update_sta_ds(struct mac_context *mac_ctx, tpSirMacMgmtHdr hdr,
sta_ds->mlmStaContext.capabilityInfo = assoc_req->capabilityInfo; sta_ds->mlmStaContext.capabilityInfo = assoc_req->capabilityInfo;
if (IS_DOT11_MODE_HT(session->dot11mode) && if (IS_DOT11_MODE_HT(session->dot11mode) &&
assoc_req->HTCaps.present && assoc_req->wmeInfoPresent) { sta_ds->mlmStaContext.htCapability) {
sta_ds->htGreenfield = (uint8_t) assoc_req->HTCaps.greenField; sta_ds->htGreenfield = (uint8_t) assoc_req->HTCaps.greenField;
sta_ds->htAMpduDensity = assoc_req->HTCaps.mpduDensity; sta_ds->htAMpduDensity = assoc_req->HTCaps.mpduDensity;
sta_ds->htDsssCckRate40MHzSupport = sta_ds->htDsssCckRate40MHzSupport =
@@ -1558,66 +1564,63 @@ static bool lim_update_sta_ds(struct mac_context *mac_ctx, tpSirMacMgmtHdr hdr,
sta_ds->htSupportedChannelWidthSet = sta_ds->htSupportedChannelWidthSet =
(uint8_t) assoc_req->HTCaps.supportedChannelWidthSet; (uint8_t) assoc_req->HTCaps.supportedChannelWidthSet;
if (session->ch_width > CH_WIDTH_20MHZ &&
session->ch_width <= CH_WIDTH_80P80MHZ &&
sta_ds->htSupportedChannelWidthSet) {
/* /*
* peer just follows AP; so when we are softAP/GO, * peer just follows AP; so when we are softAP/GO,
* we just store our session entry's secondary channel offset * we just store our session entry's secondary channel
* here in peer INFRA STA. However, if peer's 40MHz channel * offset here in peer INFRA STA. However, if peer's
* width support is disabled then secondary channel will be zero * 40MHz channel width support is disabled then
* secondary channel will be zero
*/ */
sta_ds->htSecondaryChannelOffset = sta_ds->htSecondaryChannelOffset =
(sta_ds->htSupportedChannelWidthSet) ? session->htSecondaryChannelOffset;
session->htSecondaryChannelOffset : 0; sta_ds->ch_width = CH_WIDTH_40MHZ;
if (sta_ds->mlmStaContext.vhtCapability) {
if (assoc_req->operMode.present) { if (assoc_req->operMode.present) {
enum phy_ch_width ch_width; sta_ds->ch_width =
assoc_req->operMode.chanWidth;
ch_width = assoc_req->operMode.chanWidth; } else if (vht_caps->supportedChannelWidthSet ==
if (session->ch_width < ch_width) VHT_CAP_160_AND_80P80_SUPP) {
ch_width = session->ch_width; sta_ds->ch_width = CH_WIDTH_80P80MHZ;
} else if (vht_caps->supportedChannelWidthSet ==
sta_ds->vhtSupportedChannelWidthSet = VHT_CAP_160_SUPP) {
(uint8_t) ((ch_width == CH_WIDTH_80MHZ) ? if (vht_caps->vht_extended_nss_bw_cap &&
WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ : vht_caps->extended_nss_bw_supp)
WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ); sta_ds->ch_width =
sta_ds->htSupportedChannelWidthSet = CH_WIDTH_80P80MHZ;
(uint8_t) (ch_width ? else
eHT_CHANNEL_WIDTH_40MHZ : sta_ds->ch_width =
eHT_CHANNEL_WIDTH_20MHZ); CH_WIDTH_160MHZ;
} else if ((vht_caps) && vht_caps->present) { } else if (vht_caps->vht_extended_nss_bw_cap) {
/* if (vht_caps->extended_nss_bw_supp ==
* Check if STA has enabled it's channel bonding mode. VHT_EXTD_NSS_80_HALF_NSS_160)
* If channel bonding mode is enabled, we decide based sta_ds->ch_width =
* on SAP's current configuration. else, we set it to CH_WIDTH_160MHZ;
* VHT20. else if (vht_caps->extended_nss_bw_supp >
*/ VHT_EXTD_NSS_80_HALF_NSS_160)
sta_ds->vhtSupportedChannelWidthSet = sta_ds->ch_width =
(uint8_t) ((sta_ds->htSupportedChannelWidthSet CH_WIDTH_80P80MHZ;
== eHT_CHANNEL_WIDTH_20MHZ) ? else
WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ : sta_ds->ch_width =
session->ch_width - 1); CH_WIDTH_80MHZ;
sta_ds->htMaxRxAMpduFactor = } else {
vht_caps->maxAMPDULenExp; sta_ds->ch_width = CH_WIDTH_80MHZ;
} }
/* Lesser among the AP and STA bandwidth of operation. */
sta_ds->htSupportedChannelWidthSet =
(sta_ds->htSupportedChannelWidthSet <
session->htSupportedChannelWidthSet) ?
sta_ds->htSupportedChannelWidthSet :
session->htSupportedChannelWidthSet;
if (!sta_ds->htSupportedChannelWidthSet)
sta_ds->vhtSupportedChannelWidthSet =
WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ;
sta_ds->ch_width = QDF_MIN(sta_ds->ch_width,
session->ch_width);
}
} else {
sta_ds->htSupportedChannelWidthSet = 0;
sta_ds->htSecondaryChannelOffset = 0;
sta_ds->ch_width = CH_WIDTH_20MHZ;
}
sta_ds->htLdpcCapable = sta_ds->htLdpcCapable =
(uint8_t) assoc_req->HTCaps.advCodingCap; (uint8_t) assoc_req->HTCaps.advCodingCap;
} }
if ((vht_caps) && vht_caps->present &&
assoc_req->wmeInfoPresent) {
sta_ds->vhtLdpcCapable =
(uint8_t) vht_caps->ldpcCodingCap;
}
if (assoc_req->ExtCap.present) if (assoc_req->ExtCap.present)
sta_ds->non_ecsa_capable = sta_ds->non_ecsa_capable =
!((struct s_ext_cap *)assoc_req->ExtCap.bytes)-> !((struct s_ext_cap *)assoc_req->ExtCap.bytes)->
@@ -1625,12 +1628,10 @@ static bool lim_update_sta_ds(struct mac_context *mac_ctx, tpSirMacMgmtHdr hdr,
else else
sta_ds->non_ecsa_capable = 1; sta_ds->non_ecsa_capable = 1;
if (!assoc_req->wmeInfoPresent) { if (sta_ds->mlmStaContext.vhtCapability &&
sta_ds->mlmStaContext.htCapability = 0; IS_DOT11_MODE_VHT(session->dot11mode)) {
sta_ds->mlmStaContext.vhtCapability = 0; sta_ds->vhtLdpcCapable =
} (uint8_t)vht_caps->ldpcCodingCap;
if (sta_ds->mlmStaContext.vhtCapability && vht_caps) {
if (session->vht_config.su_beam_formee && if (session->vht_config.su_beam_formee &&
vht_caps->suBeamFormerCap) vht_caps->suBeamFormerCap)
sta_ds->vhtBeamFormerCapable = 1; sta_ds->vhtBeamFormerCapable = 1;

View File

@@ -193,7 +193,8 @@ void lim_update_assoc_sta_datas(struct mac_context *mac_ctx,
if (lim_populate_peer_rate_set(mac_ctx, &sta_ds->supportedRates, if (lim_populate_peer_rate_set(mac_ctx, &sta_ds->supportedRates,
assoc_rsp->HTCaps.supportedMCSSet, assoc_rsp->HTCaps.supportedMCSSet,
false, session_entry, false, session_entry,
vht_caps, he_cap) != QDF_STATUS_SUCCESS) { vht_caps, he_cap, sta_ds) !=
QDF_STATUS_SUCCESS) {
pe_err("could not get rateset and extended rate set"); pe_err("could not get rateset and extended rate set");
return; return;
} }

View File

@@ -485,7 +485,7 @@ void lim_process_sta_mlm_add_bss_rsp_ft(struct mac_context *mac,
pAddStaParams->updateSta = false; pAddStaParams->updateSta = false;
lim_populate_peer_rate_set(mac, &pAddStaParams->supportedRates, NULL, lim_populate_peer_rate_set(mac, &pAddStaParams->supportedRates, NULL,
false, pe_session, NULL, NULL); false, pe_session, NULL, NULL, NULL);
if (pe_session->htCapability) { if (pe_session->htCapability) {
pAddStaParams->htCapable = pe_session->htCapability; pAddStaParams->htCapable = pe_session->htCapability;

View File

@@ -2185,7 +2185,8 @@ lim_tdls_populate_dot11f_vht_caps(struct mac_context *mac,
uVHTCapabilityInfo.vhtCapInfo.vhtLinkAdaptCap; uVHTCapabilityInfo.vhtCapInfo.vhtLinkAdaptCap;
pDot11f->rxAntPattern = uVHTCapabilityInfo.vhtCapInfo.rxAntPattern; pDot11f->rxAntPattern = uVHTCapabilityInfo.vhtCapInfo.rxAntPattern;
pDot11f->txAntPattern = uVHTCapabilityInfo.vhtCapInfo.txAntPattern; pDot11f->txAntPattern = uVHTCapabilityInfo.vhtCapInfo.txAntPattern;
pDot11f->reserved1 = uVHTCapabilityInfo.vhtCapInfo.reserved1; pDot11f->extended_nss_bw_supp =
uVHTCapabilityInfo.vhtCapInfo.extended_nss_bw_supp;
pDot11f->rxMCSMap = add_sta_req->vht_cap.supp_mcs.rx_mcs_map; pDot11f->rxMCSMap = add_sta_req->vht_cap.supp_mcs.rx_mcs_map;
@@ -2193,6 +2194,8 @@ lim_tdls_populate_dot11f_vht_caps(struct mac_context *mac,
uVHTSupDataRateInfo.nCfgValue16 = nCfgValue & 0xffff; uVHTSupDataRateInfo.nCfgValue16 = nCfgValue & 0xffff;
pDot11f->rxHighSupDataRate = pDot11f->rxHighSupDataRate =
uVHTSupDataRateInfo.vhtRxsupDataRateInfo.rxSupDataRate; uVHTSupDataRateInfo.vhtRxsupDataRateInfo.rxSupDataRate;
pDot11f->max_nsts_total =
uVHTSupDataRateInfo.vhtRxsupDataRateInfo.max_nsts_total;
pDot11f->txMCSMap = add_sta_req->vht_cap.supp_mcs.tx_mcs_map; pDot11f->txMCSMap = add_sta_req->vht_cap.supp_mcs.tx_mcs_map;
@@ -2201,7 +2204,8 @@ lim_tdls_populate_dot11f_vht_caps(struct mac_context *mac,
pDot11f->txSupDataRate = pDot11f->txSupDataRate =
uVHTSupDataRateInfo.vhtTxSupDataRateInfo.txSupDataRate; uVHTSupDataRateInfo.vhtTxSupDataRateInfo.txSupDataRate;
pDot11f->reserved3 = uVHTSupDataRateInfo.vhtTxSupDataRateInfo.reserved; pDot11f->vht_extended_nss_bw_cap =
uVHTSupDataRateInfo.vhtTxSupDataRateInfo.vht_extended_nss_bw_cap;
lim_log_vht_cap(mac, pDot11f); lim_log_vht_cap(mac, pDot11f);
@@ -2396,7 +2400,7 @@ lim_tdls_populate_matching_rate_set(struct mac_context *mac_ctx,
} }
} }
lim_populate_vht_mcs_set(mac_ctx, &stads->supportedRates, vht_caps, lim_populate_vht_mcs_set(mac_ctx, &stads->supportedRates, vht_caps,
session_entry, nss); session_entry, nss, NULL);
/** /**
* Set the erpEnabled bit if the phy is in G mode and at least * Set the erpEnabled bit if the phy is in G mode and at least
* one A rate is supported * one A rate is supported

View File

@@ -214,10 +214,10 @@ static inline bool lim_extract_adaptive_11r_cap(uint8_t *ie, uint16_t ie_len)
} }
#endif #endif
void void lim_extract_ap_capability(struct mac_context *mac_ctx, uint8_t *p_ie,
lim_extract_ap_capability(struct mac_context *mac_ctx, uint8_t *p_ie, uint16_t ie_len, uint8_t *qos_cap,
uint16_t ie_len, uint8_t *qos_cap, uint8_t *uapsd, uint8_t *uapsd, int8_t *local_constraint,
int8_t *local_constraint, struct pe_session *session) struct pe_session *session)
{ {
tSirProbeRespBeacon *beacon_struct; tSirProbeRespBeacon *beacon_struct;
uint8_t ap_bcon_ch_width; uint8_t ap_bcon_ch_width;
@@ -227,6 +227,8 @@ lim_extract_ap_capability(struct mac_context *mac_ctx, uint8_t *p_ie,
uint8_t vht_ch_wd; uint8_t vht_ch_wd;
uint8_t center_freq_diff; uint8_t center_freq_diff;
struct s_ext_cap *ext_cap; struct s_ext_cap *ext_cap;
uint8_t chan_center_freq_seg1;
tDot11fIEVHTCaps *vht_caps;
beacon_struct = qdf_mem_malloc(sizeof(tSirProbeRespBeacon)); beacon_struct = qdf_mem_malloc(sizeof(tSirProbeRespBeacon));
if (!beacon_struct) if (!beacon_struct)
@@ -262,6 +264,7 @@ lim_extract_ap_capability(struct mac_context *mac_ctx, uint8_t *p_ie,
IS_BSS_VHT_CAPABLE(beacon_struct->VHTCaps)); IS_BSS_VHT_CAPABLE(beacon_struct->VHTCaps));
vht_op = &beacon_struct->VHTOperation; vht_op = &beacon_struct->VHTOperation;
vht_caps = &beacon_struct->VHTCaps;
if (IS_BSS_VHT_CAPABLE(beacon_struct->VHTCaps) && if (IS_BSS_VHT_CAPABLE(beacon_struct->VHTCaps) &&
vht_op->present && vht_op->present &&
session->vhtCapability) { session->vhtCapability) {
@@ -286,16 +289,26 @@ lim_extract_ap_capability(struct mac_context *mac_ctx, uint8_t *p_ie,
vht_op->chanWidth) { vht_op->chanWidth) {
/* If VHT is supported min 80 MHz support is must */ /* If VHT is supported min 80 MHz support is must */
ap_bcon_ch_width = vht_op->chanWidth; ap_bcon_ch_width = vht_op->chanWidth;
if ((ap_bcon_ch_width == WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ) && if (vht_caps->vht_extended_nss_bw_cap) {
vht_op->chanCenterFreqSeg2) { if (!vht_caps->extended_nss_bw_supp)
new_ch_width_dfn = true; chan_center_freq_seg1 =
if (vht_op->chanCenterFreqSeg2 > vht_op->chan_center_freq_seg1;
vht_op->chanCenterFreqSeg1)
center_freq_diff = vht_op->chanCenterFreqSeg2 -
vht_op->chanCenterFreqSeg1;
else else
center_freq_diff = vht_op->chanCenterFreqSeg1 - chan_center_freq_seg1 =
vht_op->chanCenterFreqSeg2; beacon_struct->HTInfo.chan_center_freq_seg2;
} else {
chan_center_freq_seg1 = vht_op->chan_center_freq_seg1;
}
if (chan_center_freq_seg1 &&
(ap_bcon_ch_width == WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ)) {
new_ch_width_dfn = true;
if (chan_center_freq_seg1 >
vht_op->chan_center_freq_seg0)
center_freq_diff = chan_center_freq_seg1 -
vht_op->chan_center_freq_seg0;
else
center_freq_diff = vht_op->chan_center_freq_seg0 -
chan_center_freq_seg1;
if (center_freq_diff == 8) if (center_freq_diff == 8)
ap_bcon_ch_width = ap_bcon_ch_width =
WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ; WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ;
@@ -320,22 +333,22 @@ lim_extract_ap_capability(struct mac_context *mac_ctx, uint8_t *p_ie,
} }
/* /*
* VHT OP IE old definition: * VHT OP IE old definition:
* vht_op->chanCenterFreqSeg1: center freq of 80MHz/160MHz/ * vht_op->chan_center_freq_seg0: center freq of 80MHz/160MHz/
* primary 80 in 80+80MHz. * primary 80 in 80+80MHz.
* *
* vht_op->chanCenterFreqSeg2: center freq of secondary 80 * vht_op->chan_center_freq_seg1: center freq of secondary 80
* in 80+80MHz. * in 80+80MHz.
* *
* VHT OP IE NEW definition: * VHT OP IE NEW definition:
* vht_op->chanCenterFreqSeg1: center freq of 80MHz/primary * vht_op->chan_center_freq_seg0: center freq of 80MHz/primary
* 80 in 80+80MHz/center freq of the 80 MHz channel segment * 80 in 80+80MHz/center freq of the 80 MHz channel segment
* that contains the primary channel in 160MHz mode. * that contains the primary channel in 160MHz mode.
* *
* vht_op->chanCenterFreqSeg2: center freq of secondary 80 * vht_op->chan_center_freq_seg1: center freq of secondary 80
* in 80+80MHz/center freq of 160MHz. * in 80+80MHz/center freq of 160MHz.
*/ */
session->ch_center_freq_seg0 = vht_op->chanCenterFreqSeg1; session->ch_center_freq_seg0 = vht_op->chan_center_freq_seg0;
session->ch_center_freq_seg1 = vht_op->chanCenterFreqSeg2; session->ch_center_freq_seg1 = chan_center_freq_seg1;
if (vht_ch_wd == WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ) { if (vht_ch_wd == WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ) {
/* DUT or AP supports only 160MHz */ /* DUT or AP supports only 160MHz */
if (ap_bcon_ch_width == if (ap_bcon_ch_width ==
@@ -343,7 +356,7 @@ lim_extract_ap_capability(struct mac_context *mac_ctx, uint8_t *p_ie,
/* AP is in 160MHz mode */ /* AP is in 160MHz mode */
if (!new_ch_width_dfn) { if (!new_ch_width_dfn) {
session->ch_center_freq_seg1 = session->ch_center_freq_seg1 =
vht_op->chanCenterFreqSeg1; vht_op->chan_center_freq_seg0;
session->ch_center_freq_seg0 = session->ch_center_freq_seg0 =
lim_get_80Mhz_center_channel( lim_get_80Mhz_center_channel(
beacon_struct->channelNumber); beacon_struct->channelNumber);
@@ -372,10 +385,6 @@ lim_extract_ap_capability(struct mac_context *mac_ctx, uint8_t *p_ie,
session->ch_center_freq_seg0, session->ch_center_freq_seg0,
session->ch_center_freq_seg1, session->ch_center_freq_seg1,
session->ch_width); session->ch_width);
if (CH_WIDTH_80MHZ < session->ch_width) {
session->vht_config.su_beam_former = 0;
session->nss = 1;
}
} }
if (session->vhtCapability && if (session->vhtCapability &&

View File

@@ -5435,21 +5435,22 @@ void lim_set_vht_caps(struct mac_context *p_mac, struct pe_session *p_session_en
vht_cap->vhtLinkAdaptCap = dot11_vht_cap.vhtLinkAdaptCap; vht_cap->vhtLinkAdaptCap = dot11_vht_cap.vhtLinkAdaptCap;
vht_cap->rxAntPattern = dot11_vht_cap.rxAntPattern; vht_cap->rxAntPattern = dot11_vht_cap.rxAntPattern;
vht_cap->txAntPattern = dot11_vht_cap.txAntPattern; vht_cap->txAntPattern = dot11_vht_cap.txAntPattern;
vht_cap->reserved1 = dot11_vht_cap.reserved1; vht_cap->extended_nss_bw_supp =
dot11_vht_cap.extended_nss_bw_supp;
/* Populate VHT MCS Information */ /* Populate VHT MCS Information */
vht_mcs->rxMcsMap = dot11_vht_cap.rxMCSMap; vht_mcs->rxMcsMap = dot11_vht_cap.rxMCSMap;
u_vht_data_rate_info.vht_rx_supp_rate.rxSupDataRate = u_vht_data_rate_info.vht_rx_supp_rate.rxSupDataRate =
dot11_vht_cap.rxHighSupDataRate; dot11_vht_cap.rxHighSupDataRate;
u_vht_data_rate_info.vht_rx_supp_rate.reserved = u_vht_data_rate_info.vht_rx_supp_rate.max_nsts_total =
dot11_vht_cap.reserved2; dot11_vht_cap.max_nsts_total;
vht_mcs->rxHighest = u_vht_data_rate_info.u_value; vht_mcs->rxHighest = u_vht_data_rate_info.u_value;
vht_mcs->txMcsMap = dot11_vht_cap.txMCSMap; vht_mcs->txMcsMap = dot11_vht_cap.txMCSMap;
u_vht_data_rate_info.vht_tx_supp_rate.txSupDataRate = u_vht_data_rate_info.vht_tx_supp_rate.txSupDataRate =
dot11_vht_cap.txSupDataRate; dot11_vht_cap.txSupDataRate;
u_vht_data_rate_info.vht_tx_supp_rate.reserved = u_vht_data_rate_info.vht_tx_supp_rate.vht_extended_nss_bw_cap =
dot11_vht_cap.reserved3; dot11_vht_cap.vht_extended_nss_bw_cap;
vht_mcs->txHighest = u_vht_data_rate_info.u_value; vht_mcs->txHighest = u_vht_data_rate_info.u_value;
} }
} }

View File

@@ -24,7 +24,7 @@
* *
* *
* This file was automatically generated by 'framesc' * This file was automatically generated by 'framesc'
* Fri Sep 13 10:34:49 2019 from the following file(s): * Thu Sep 19 14:00:22 2019 from the following file(s):
* *
* dot11f.frms * dot11f.frms
* *
@@ -2823,7 +2823,7 @@ uint32_t dot11f_unpack_ie_vht_caps(tpAniSirGlobal pCtx,
pDst->vhtLinkAdaptCap = tmp22__ >> 26 & 0x3; pDst->vhtLinkAdaptCap = tmp22__ >> 26 & 0x3;
pDst->rxAntPattern = tmp22__ >> 28 & 0x1; pDst->rxAntPattern = tmp22__ >> 28 & 0x1;
pDst->txAntPattern = tmp22__ >> 29 & 0x1; pDst->txAntPattern = tmp22__ >> 29 & 0x1;
pDst->reserved1 = tmp22__ >> 30 & 0x3; pDst->extended_nss_bw_supp = tmp22__ >> 30 & 0x3;
if (unlikely(ielen < 2)) { if (unlikely(ielen < 2)) {
pDst->present = 0; pDst->present = 0;
return DOT11F_INCOMPLETE_IE; return DOT11F_INCOMPLETE_IE;
@@ -2841,7 +2841,7 @@ uint32_t dot11f_unpack_ie_vht_caps(tpAniSirGlobal pCtx,
pBuf += 2; pBuf += 2;
ielen -= 2; ielen -= 2;
pDst->rxHighSupDataRate = tmp23__ >> 0 & 0x1fff; pDst->rxHighSupDataRate = tmp23__ >> 0 & 0x1fff;
pDst->reserved2 = tmp23__ >> 13 & 0x7; pDst->max_nsts_total = tmp23__ >> 13 & 0x7;
if (unlikely(ielen < 2)) { if (unlikely(ielen < 2)) {
pDst->present = 0; pDst->present = 0;
return DOT11F_INCOMPLETE_IE; return DOT11F_INCOMPLETE_IE;
@@ -2857,7 +2857,8 @@ uint32_t dot11f_unpack_ie_vht_caps(tpAniSirGlobal pCtx,
framesntohs(pCtx, &tmp24__, pBuf, 0); framesntohs(pCtx, &tmp24__, pBuf, 0);
pDst->txSupDataRate = tmp24__ >> 0 & 0x1fff; pDst->txSupDataRate = tmp24__ >> 0 & 0x1fff;
pDst->reserved3 = tmp24__ >> 13 & 0x7; pDst->vht_extended_nss_bw_cap = tmp24__ >> 13 & 0x1;
pDst->reserved = tmp24__ >> 14 & 0x3;
(void)pCtx; (void)pCtx;
return status; return status;
} /* End dot11f_unpack_ie_vht_caps. */ } /* End dot11f_unpack_ie_vht_caps. */
@@ -2889,7 +2890,7 @@ uint32_t dot11f_unpack_ie_vht_operation(tpAniSirGlobal pCtx,
return DOT11F_INCOMPLETE_IE; return DOT11F_INCOMPLETE_IE;
} }
pDst->chanCenterFreqSeg1 = *pBuf; pDst->chan_center_freq_seg0 = *pBuf;
pBuf += 1; pBuf += 1;
ielen -= (uint8_t)1; ielen -= (uint8_t)1;
if (unlikely(ielen < 1)) { if (unlikely(ielen < 1)) {
@@ -2897,7 +2898,7 @@ uint32_t dot11f_unpack_ie_vht_operation(tpAniSirGlobal pCtx,
return DOT11F_INCOMPLETE_IE; return DOT11F_INCOMPLETE_IE;
} }
pDst->chanCenterFreqSeg2 = *pBuf; pDst->chan_center_freq_seg1 = *pBuf;
pBuf += 1; pBuf += 1;
ielen -= (uint8_t)1; ielen -= (uint8_t)1;
if (unlikely(ielen < 2)) { if (unlikely(ielen < 2)) {
@@ -4825,7 +4826,8 @@ uint32_t dot11f_unpack_ie_ht_info(tpAniSirGlobal pCtx,
pDst->nonGFDevicesPresent = tmp49__ >> 2 & 0x1; pDst->nonGFDevicesPresent = tmp49__ >> 2 & 0x1;
pDst->transmitBurstLimit = tmp49__ >> 3 & 0x1; pDst->transmitBurstLimit = tmp49__ >> 3 & 0x1;
pDst->obssNonHTStaPresent = tmp49__ >> 4 & 0x1; pDst->obssNonHTStaPresent = tmp49__ >> 4 & 0x1;
pDst->reserved = tmp49__ >> 5 & 0x7ff; pDst->chan_center_freq_seg2 = tmp49__ >> 5 & 0xff;
pDst->reserved = tmp49__ >> 13 & 0x7;
if (unlikely(ielen < 2)) { if (unlikely(ielen < 2)) {
pDst->present = 0; pDst->present = 0;
return DOT11F_INCOMPLETE_IE; return DOT11F_INCOMPLETE_IE;
@@ -5878,7 +5880,8 @@ uint32_t dot11f_unpack_ie_operating_mode(tpAniSirGlobal pCtx,
tmp58__ = *pBuf; tmp58__ = *pBuf;
pDst->chanWidth = tmp58__ >> 0 & 0x3; pDst->chanWidth = tmp58__ >> 0 & 0x3;
pDst->reserved = tmp58__ >> 2 & 0x3; pDst->vht_160_80p80_supp = tmp58__ >> 2 & 0x1;
pDst->no_ldpc = tmp58__ >> 3 & 0x1;
pDst->rxNSS = tmp58__ >> 4 & 0x7; pDst->rxNSS = tmp58__ >> 4 & 0x7;
pDst->rxNSSType = tmp58__ >> 7 & 0x1; pDst->rxNSSType = tmp58__ >> 7 & 0x1;
(void)pCtx; (void)pCtx;
@@ -21091,7 +21094,7 @@ uint32_t dot11f_pack_ie_vht_caps(tpAniSirGlobal pCtx,
tmp119__ |= (pSrc->vhtLinkAdaptCap << 26); tmp119__ |= (pSrc->vhtLinkAdaptCap << 26);
tmp119__ |= (pSrc->rxAntPattern << 28); tmp119__ |= (pSrc->rxAntPattern << 28);
tmp119__ |= (pSrc->txAntPattern << 29); tmp119__ |= (pSrc->txAntPattern << 29);
tmp119__ |= (pSrc->reserved1 << 30); tmp119__ |= (pSrc->extended_nss_bw_supp << 30);
if (unlikely(nBuf < 4)) if (unlikely(nBuf < 4))
return DOT11F_INCOMPLETE_IE; return DOT11F_INCOMPLETE_IE;
@@ -21104,7 +21107,7 @@ uint32_t dot11f_pack_ie_vht_caps(tpAniSirGlobal pCtx,
pBuf += 2; pBuf += 2;
tmp120__ = 0U; tmp120__ = 0U;
tmp120__ |= (pSrc->rxHighSupDataRate << 0); tmp120__ |= (pSrc->rxHighSupDataRate << 0);
tmp120__ |= (pSrc->reserved2 << 13); tmp120__ |= (pSrc->max_nsts_total << 13);
if (unlikely(nBuf < 2)) if (unlikely(nBuf < 2))
return DOT11F_INCOMPLETE_IE; return DOT11F_INCOMPLETE_IE;
@@ -21117,7 +21120,8 @@ uint32_t dot11f_pack_ie_vht_caps(tpAniSirGlobal pCtx,
pBuf += 2; pBuf += 2;
tmp121__ = 0U; tmp121__ = 0U;
tmp121__ |= (pSrc->txSupDataRate << 0); tmp121__ |= (pSrc->txSupDataRate << 0);
tmp121__ |= (pSrc->reserved3 << 13); tmp121__ |= (pSrc->vht_extended_nss_bw_cap << 13);
tmp121__ |= (pSrc->reserved << 14);
if (unlikely(nBuf < 2)) if (unlikely(nBuf < 2))
return DOT11F_INCOMPLETE_IE; return DOT11F_INCOMPLETE_IE;
@@ -21154,10 +21158,10 @@ uint32_t dot11f_pack_ie_vht_operation(tpAniSirGlobal pCtx,
*pBuf = pSrc->chanWidth; *pBuf = pSrc->chanWidth;
*pnConsumed += 1; *pnConsumed += 1;
pBuf += 1; pBuf += 1;
*pBuf = pSrc->chanCenterFreqSeg1; *pBuf = pSrc->chan_center_freq_seg0;
*pnConsumed += 1; *pnConsumed += 1;
pBuf += 1; pBuf += 1;
*pBuf = pSrc->chanCenterFreqSeg2; *pBuf = pSrc->chan_center_freq_seg1;
*pnConsumed += 1; *pnConsumed += 1;
pBuf += 1; pBuf += 1;
frameshtons(pCtx, pBuf, pSrc->basicMCSSet, 0); frameshtons(pCtx, pBuf, pSrc->basicMCSSet, 0);
@@ -22931,7 +22935,8 @@ uint32_t dot11f_pack_ie_ht_info(tpAniSirGlobal pCtx,
tmp146__ |= (pSrc->nonGFDevicesPresent << 2); tmp146__ |= (pSrc->nonGFDevicesPresent << 2);
tmp146__ |= (pSrc->transmitBurstLimit << 3); tmp146__ |= (pSrc->transmitBurstLimit << 3);
tmp146__ |= (pSrc->obssNonHTStaPresent << 4); tmp146__ |= (pSrc->obssNonHTStaPresent << 4);
tmp146__ |= (pSrc->reserved << 5); tmp146__ |= (pSrc->chan_center_freq_seg2 << 5);
tmp146__ |= (pSrc->reserved << 13);
if (unlikely(nBuf < 2)) if (unlikely(nBuf < 2))
return DOT11F_INCOMPLETE_IE; return DOT11F_INCOMPLETE_IE;
@@ -23584,7 +23589,8 @@ uint32_t dot11f_pack_ie_operating_mode(tpAniSirGlobal pCtx,
++pBuf; ++(*pnConsumed); ++pBuf; ++(*pnConsumed);
tmp155__ = 0U; tmp155__ = 0U;
tmp155__ |= (pSrc->chanWidth << 0); tmp155__ |= (pSrc->chanWidth << 0);
tmp155__ |= (pSrc->reserved << 2); tmp155__ |= (pSrc->vht_160_80p80_supp << 2);
tmp155__ |= (pSrc->no_ldpc << 3);
tmp155__ |= (pSrc->rxNSS << 4); tmp155__ |= (pSrc->rxNSS << 4);
tmp155__ |= (pSrc->rxNSSType << 7); tmp155__ |= (pSrc->rxNSSType << 7);
if (unlikely(nBuf < 1)) if (unlikely(nBuf < 1))

View File

@@ -875,10 +875,10 @@ static void lim_log_vht_operation(struct mac_context *mac,
{ {
#ifdef DUMP_MGMT_CNTNTS #ifdef DUMP_MGMT_CNTNTS
pe_debug("chanWidth: %d", pDot11f->chanWidth); pe_debug("chanWidth: %d", pDot11f->chanWidth);
pe_debug("chanCenterFreqSeg1: %d", pe_debug("chan_center_freq_seg0: %d",
pDot11f->chanCenterFreqSeg1); pDot11f->chan_center_freq_seg0);
pe_debug("chanCenterFreqSeg2: %d", pe_debug("chan_center_freq_seg1: %d",
pDot11f->chanCenterFreqSeg2); pDot11f->chan_center_freq_seg1);
pe_debug("basicMCSSet: %d", pDot11f->basicMCSSet); pe_debug("basicMCSSet: %d", pDot11f->basicMCSSet);
#endif /* DUMP_MGMT_CNTNTS */ #endif /* DUMP_MGMT_CNTNTS */
} }
@@ -994,6 +994,8 @@ populate_dot11f_vht_caps(struct mac_context *mac,
pDot11f->rxAntPattern = pe_session->vht_config.rx_antpattern; pDot11f->rxAntPattern = pe_session->vht_config.rx_antpattern;
pDot11f->txAntPattern = pe_session->vht_config.tx_antpattern; pDot11f->txAntPattern = pe_session->vht_config.tx_antpattern;
pDot11f->extended_nss_bw_supp =
pe_session->vht_config.extended_nss_bw_supp;
pDot11f->maxAMPDULenExp = pDot11f->maxAMPDULenExp =
pe_session->vht_config.max_ampdu_lenexp; pe_session->vht_config.max_ampdu_lenexp;
@@ -1047,12 +1049,17 @@ populate_dot11f_vht_caps(struct mac_context *mac,
nCfgValue = vht_cap_info->link_adap_cap; nCfgValue = vht_cap_info->link_adap_cap;
pDot11f->vhtLinkAdaptCap = (nCfgValue & 0x0003); pDot11f->vhtLinkAdaptCap = (nCfgValue & 0x0003);
pDot11f->extended_nss_bw_supp =
vht_cap_info->extended_nss_bw_supp;
} }
pDot11f->max_nsts_total = vht_cap_info->max_nsts_total;
pDot11f->vht_extended_nss_bw_cap =
vht_cap_info->vht_extended_nss_bw_cap;
nCfgValue = vht_cap_info->mu_bformer; nCfgValue = vht_cap_info->mu_bformer;
pDot11f->muBeamformerCap = (nCfgValue & 0x0001); pDot11f->muBeamformerCap = (nCfgValue & 0x0001);
pDot11f->reserved1 = 0;
nCfgValue = vht_cap_info->rx_mcs_map; nCfgValue = vht_cap_info->rx_mcs_map;
pDot11f->rxMCSMap = (nCfgValue & 0x0000FFFF); pDot11f->rxMCSMap = (nCfgValue & 0x0000FFFF);
@@ -1060,15 +1067,12 @@ populate_dot11f_vht_caps(struct mac_context *mac,
nCfgValue = vht_cap_info->rx_supp_data_rate; nCfgValue = vht_cap_info->rx_supp_data_rate;
pDot11f->rxHighSupDataRate = (nCfgValue & 0x00001FFF); pDot11f->rxHighSupDataRate = (nCfgValue & 0x00001FFF);
pDot11f->reserved2 = 0;
nCfgValue = vht_cap_info->tx_mcs_map; nCfgValue = vht_cap_info->tx_mcs_map;
pDot11f->txMCSMap = (nCfgValue & 0x0000FFFF); pDot11f->txMCSMap = (nCfgValue & 0x0000FFFF);
nCfgValue = vht_cap_info->tx_supp_data_rate; nCfgValue = vht_cap_info->tx_supp_data_rate;
pDot11f->txSupDataRate = (nCfgValue & 0x00001FFF); pDot11f->txSupDataRate = (nCfgValue & 0x00001FFF);
pDot11f->reserved3 = 0;
if (pe_session) { if (pe_session) {
if (pe_session->nss == NSS_1x1_MODE) { if (pe_session->nss == NSS_1x1_MODE) {
pDot11f->txMCSMap |= DISABLE_NSS2_MCS; pDot11f->txMCSMap |= DISABLE_NSS2_MCS;
@@ -1114,18 +1118,18 @@ populate_dot11f_vht_operation(struct mac_context *mac,
if (pe_session->ch_width > CH_WIDTH_40MHZ) { if (pe_session->ch_width > CH_WIDTH_40MHZ) {
pDot11f->chanWidth = 1; pDot11f->chanWidth = 1;
pDot11f->chanCenterFreqSeg1 = pDot11f->chan_center_freq_seg0 =
pe_session->ch_center_freq_seg0; pe_session->ch_center_freq_seg0;
if (pe_session->ch_width == CH_WIDTH_80P80MHZ || if (pe_session->ch_width == CH_WIDTH_80P80MHZ ||
pe_session->ch_width == CH_WIDTH_160MHZ) pe_session->ch_width == CH_WIDTH_160MHZ)
pDot11f->chanCenterFreqSeg2 = pDot11f->chan_center_freq_seg1 =
pe_session->ch_center_freq_seg1; pe_session->ch_center_freq_seg1;
else else
pDot11f->chanCenterFreqSeg2 = 0; pDot11f->chan_center_freq_seg1 = 0;
} else { } else {
pDot11f->chanWidth = 0; pDot11f->chanWidth = 0;
pDot11f->chanCenterFreqSeg1 = 0; pDot11f->chan_center_freq_seg0 = 0;
pDot11f->chanCenterFreqSeg2 = 0; pDot11f->chan_center_freq_seg1 = 0;
} }
pDot11f->basicMCSSet = pDot11f->basicMCSSet =

View File

@@ -1170,9 +1170,9 @@ static void sap_upd_chan_spec_params(tSirProbeRespBeacon *pBeaconStruct,
*vhtSupport = pBeaconStruct->VHTOperation.present; *vhtSupport = pBeaconStruct->VHTOperation.present;
if (pBeaconStruct->VHTOperation.chanWidth) { if (pBeaconStruct->VHTOperation.chanWidth) {
*centerFreq = *centerFreq =
pBeaconStruct->VHTOperation.chanCenterFreqSeg1; pBeaconStruct->VHTOperation.chan_center_freq_seg0;
*centerFreq_2 = *centerFreq_2 =
pBeaconStruct->VHTOperation.chanCenterFreqSeg2; pBeaconStruct->VHTOperation.chan_center_freq_seg1;
/* /*
* LHS follows tSirMacHTChannelWidth, while RHS follows * LHS follows tSirMacHTChannelWidth, while RHS follows
* WNI_CFG_VHT_CHANNEL_WIDTH_X format hence following * WNI_CFG_VHT_CHANNEL_WIDTH_X format hence following

View File

@@ -3477,8 +3477,8 @@ static void csr_roam_populate_channels(tDot11fBeaconIEs *beacon_ies,
ePhyChanBondState phy_state; ePhyChanBondState phy_state;
if (beacon_ies->VHTOperation.present) { if (beacon_ies->VHTOperation.present) {
*chan1 = beacon_ies->VHTOperation.chanCenterFreqSeg1; *chan1 = beacon_ies->VHTOperation.chan_center_freq_seg0;
*chan2 = beacon_ies->VHTOperation.chanCenterFreqSeg2; *chan2 = beacon_ies->VHTOperation.chan_center_freq_seg1;
roam_info->chan_info.info = MODE_11AC_VHT80; roam_info->chan_info.info = MODE_11AC_VHT80;
} else if (beacon_ies->HTInfo.present) { } else if (beacon_ies->HTInfo.present) {
if (beacon_ies->HTInfo.recommendedTxWidthSet == if (beacon_ies->HTInfo.recommendedTxWidthSet ==

View File

@@ -187,7 +187,7 @@ typedef struct {
uint8_t uAPSD; uint8_t uAPSD;
uint8_t maxSPLen; uint8_t maxSPLen;
uint8_t htCapable; uint8_t htCapable;
uint8_t ch_width; enum phy_ch_width ch_width;
tSirMacHTMIMOPowerSaveState mimoPS; tSirMacHTMIMOPowerSaveState mimoPS;
uint8_t maxAmpduSize; uint8_t maxAmpduSize;
uint8_t maxAmpduDensity; uint8_t maxAmpduDensity;
@@ -218,6 +218,9 @@ typedef struct {
uint8_t csaOffloadEnable; uint8_t csaOffloadEnable;
uint8_t vhtCapable; uint8_t vhtCapable;
uint8_t vhtSupportedRxNss; uint8_t vhtSupportedRxNss;
uint8_t vht_160mhz_nss;
uint8_t vht_80p80mhz_nss;
uint8_t vht_extended_nss_bw_cap;
uint8_t vhtTxBFCapable; uint8_t vhtTxBFCapable;
uint8_t enable_su_tx_bformer; uint8_t enable_su_tx_bformer;
uint8_t vhtTxMUBformeeCapable; uint8_t vhtTxMUBformeeCapable;

View File

@@ -1650,6 +1650,21 @@ QDF_STATUS wma_send_peer_assoc(tp_wma_handle wma,
((1 << cmd->peer_nss) - 1)); ((1 << cmd->peer_nss) - 1));
WMI_VHT_MCS_NOTIFY_EXT_SS_SET(cmd->tx_mcs_set, 1); WMI_VHT_MCS_NOTIFY_EXT_SS_SET(cmd->tx_mcs_set, 1);
} }
if (params->vht_extended_nss_bw_cap) {
/*
* bit[2:0] : Represents value of Rx NSS for 160 MHz
* bit[5:3] : Represents value of Rx NSS for 80_80 MHz
* Extended NSS support
* bit[30:6]: Reserved
* bit[31] : MSB(0/1): 1 in case of valid data
*/
cmd->peer_bw_rxnss_override |= (1 << 31);
cmd->peer_bw_rxnss_override |= params->vht_160mhz_nss;
cmd->peer_bw_rxnss_override |=
(params->vht_80p80mhz_nss << 3);
WMA_LOGD(FL("peer_bw_rxnss_override %0X"),
cmd->peer_bw_rxnss_override);
}
} }
WMA_LOGD(FL("rx_max_rate: %d, rx_mcs: %x, tx_max_rate: %d, tx_mcs: %x"), WMA_LOGD(FL("rx_max_rate: %d, rx_mcs: %x, tx_max_rate: %d, tx_mcs: %x"),
@@ -1660,8 +1675,11 @@ QDF_STATUS wma_send_peer_assoc(tp_wma_handle wma,
* Limit nss to max number of rf chain supported by target * Limit nss to max number of rf chain supported by target
* Otherwise Fw will crash * Otherwise Fw will crash
*/ */
if (cmd->peer_nss > WMA_MAX_NSS) if (cmd->peer_nss > WMA_MAX_NSS) {
WMA_LOGE(FL("peer Nss %d is more than supported"),
cmd->peer_nss);
cmd->peer_nss = WMA_MAX_NSS; cmd->peer_nss = WMA_MAX_NSS;
}
wma_populate_peer_he_cap(cmd, params); wma_populate_peer_he_cap(cmd, params);