diff --git a/mlme/core/src/wlan_mlme_main.c b/mlme/core/src/wlan_mlme_main.c index d0f49e6e9c..b2a0421bc2 100644 --- a/mlme/core/src/wlan_mlme_main.c +++ b/mlme/core/src/wlan_mlme_main.c @@ -25,6 +25,8 @@ #include "wlan_scan_public_structs.h" #include "cfg_mlme_threshold.h" +#define NUM_OF_SOUNDING_DIMENSIONS 1 /*Nss - 1, (Nss = 2 for 2x2)*/ + struct wlan_mlme_psoc_obj *mlme_get_psoc_obj(struct wlan_objmgr_psoc *psoc) { struct wlan_mlme_psoc_obj *mlme_obj; @@ -462,8 +464,6 @@ static void mlme_init_vht_cap_cfg(struct wlan_objmgr_psoc *psoc, { vht_cap_info->supp_chan_width = cfg_default(CFG_VHT_SUPP_CHAN_WIDTH); - vht_cap_info->tx_bfee_ant_supp = - cfg_default(CFG_VHT_BEAMFORMEE_ANT_SUPP); vht_cap_info->num_soundingdim = cfg_default(CFG_VHT_NUM_SOUNDING_DIMENSIONS); vht_cap_info->htc_vhtc = @@ -478,39 +478,47 @@ static void mlme_init_vht_cap_cfg(struct wlan_objmgr_psoc *psoc, cfg_default(CFG_VHT_RX_SUPP_DATA_RATE); vht_cap_info->tx_supp_data_rate = cfg_default(CFG_VHT_TX_SUPP_DATA_RATE); - vht_cap_info->enable_txbf_20mhz = - cfg_default(CFG_VHT_ENABLE_TXBF_20MHZ); + vht_cap_info->txop_ps = + cfg_default(CFG_VHT_TXOP_PS); + vht_cap_info->rx_mcs_map = + WNI_CFG_VHT_RX_MCS_MAP_STADEF; + vht_cap_info->tx_mcs_map = + WNI_CFG_VHT_TX_MCS_MAP_STADEF; + vht_cap_info->basic_mcs_set = + CFG_VHT_BASIC_MCS_SET_STADEF; + vht_cap_info->su_bformer = + cfg_default(CFG_VHT_SU_BEAMFORMER_CAP); + vht_cap_info->tx_bfee_ant_supp = + cfg_get(psoc, CFG_VHT_BEAMFORMEE_ANT_SUPP); + + vht_cap_info->enable_txbf_20mhz = + cfg_get(psoc, CFG_VHT_ENABLE_TXBF_20MHZ); vht_cap_info->ampdu_len = cfg_get(psoc, CFG_VHT_MPDU_LEN); + vht_cap_info->ldpc_coding_cap = - cfg_get(psoc, CFG_VHT_LDPC_CODING_CAP); + cfg_get(psoc, CFG_RX_LDPC_ENABLE); vht_cap_info->short_gi_80mhz = - cfg_get(psoc, CFG_VHT_SHORT_GI_80MHZ); + cfg_get(psoc, CFG_SHORT_GI_40MHZ); vht_cap_info->short_gi_160mhz = - cfg_get(psoc, CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ); + cfg_get(psoc, CFG_SHORT_GI_40MHZ); vht_cap_info->tx_stbc = - cfg_get(psoc, CFG_VHT_TXSTBC); + cfg_get(psoc, CFG_TX_STBC_ENABLE); vht_cap_info->rx_stbc = - cfg_get(psoc, CFG_VHT_RXSTBC); - vht_cap_info->su_bformer = - cfg_get(psoc, CFG_VHT_SU_BEAMFORMER_CAP); - vht_cap_info->su_bformee = - cfg_get(psoc, CFG_VHT_SU_BEAMFORMEE_CAP); + cfg_get(psoc, CFG_RX_STBC_ENABLE); + + if (vht_cap_info->enable_txbf_20mhz) + vht_cap_info->su_bformee = + cfg_default(CFG_VHT_SU_BEAMFORMEE_CAP); + vht_cap_info->mu_bformer = - cfg_get(psoc, CFG_VHT_MU_BEAMFORMER_CAP); + cfg_default(CFG_VHT_MU_BEAMFORMER_CAP); + vht_cap_info->enable_mu_bformee = cfg_get(psoc, CFG_VHT_ENABLE_MU_BFORMEE_CAP_FEATURE); - vht_cap_info->txop_ps = - cfg_get(psoc, CFG_VHT_TXOP_PS); vht_cap_info->ampdu_len_exponent = cfg_get(psoc, CFG_VHT_AMPDU_LEN_EXPONENT); - vht_cap_info->rx_mcs_map = - cfg_get(psoc, CFG_VHT_RX_MCS_MAP); - vht_cap_info->tx_mcs_map = - cfg_get(psoc, CFG_VHT_TX_MCS_MAP); - vht_cap_info->basic_mcs_set = - cfg_get(psoc, CFG_VHT_BASIC_MCS_SET); vht_cap_info->channel_width = cfg_get(psoc, CFG_VHT_CHANNEL_WIDTH); vht_cap_info->rx_mcs = @@ -533,6 +541,17 @@ static void mlme_init_vht_cap_cfg(struct wlan_objmgr_psoc *psoc, cfg_get(psoc, CFG_ENABLE_VHT_FOR_24GHZ); vht_cap_info->vendor_24ghz_band = cfg_get(psoc, CFG_ENABLE_VENDOR_VHT_FOR_24GHZ); + vht_cap_info->tx_bfee_sap = + cfg_get(psoc, CFG_VHT_ENABLE_TXBF_SAP_MODE); + vht_cap_info->vendor_vhtie = + cfg_get(psoc, CFG_ENABLE_SUBFEE_IN_VENDOR_VHTIE); + + if (vht_cap_info->enable2x2) + vht_cap_info->enable_tx_su = + cfg_get(psoc, CFG_VHT_ENABLE_TX_SU_BEAM_FORMER); + + if (vht_cap_info->enable2x2 && vht_cap_info->enable_tx_su) + vht_cap_info->num_soundingdim = NUM_OF_SOUNDING_DIMENSIONS; } static void mlme_init_rates_in_cfg(struct wlan_objmgr_psoc *psoc, diff --git a/mlme/dispatcher/inc/cfg_mlme_vht_caps.h b/mlme/dispatcher/inc/cfg_mlme_vht_caps.h index bb953ca9eb..52f55546bc 100644 --- a/mlme/dispatcher/inc/cfg_mlme_vht_caps.h +++ b/mlme/dispatcher/inc/cfg_mlme_vht_caps.h @@ -31,14 +31,39 @@ CFG_VALUE_OR_DEFAULT, \ "VHT SUPPORTED CHAN WIDTH SET") -#define CFG_VHT_BEAMFORMEE_ANT_SUPP CFG_UINT( \ - "tx_bfee_ant_supp", \ +/* + * + * gTxBFCsnValue - ini to set VHT/HE STS Caps field + * @Min: 0 + * @Max: 7 + * @Default: 7 + * + * This ini is used to configure the STS capability shown in AC/AX mode + * MGMT frame IE, the final STS field shown in VHT/HE IE will be calculated + * by MIN of (INI set, target report value). Only if gTxBFEnable is enabled + * and SU/MU BEAMFORMEE Caps is shown, then STS Caps make sense. + * + * Related: gTxBFEnable. + * + * Supported Feature: STA/SAP + * + * Usage: Internal + * + * + */ +#define CFG_VHT_BEAMFORMEE_ANT_SUPP CFG_INI_UINT( \ + "txBFCsnValue", \ 0, \ - 8, \ - 8, \ + 7, \ + 7, \ CFG_VALUE_OR_DEFAULT, \ "VHT BEAMFORMEE ANTENNA SUPPORTED CAP") +#define CFG_VHT_ENABLE_TX_SU_BEAM_FORMER CFG_INI_BOOL( \ + "gEnableTxSUBeamformer", \ + 0, \ + "vht tx su beam former") + #define CFG_VHT_NUM_SOUNDING_DIMENSIONS CFG_UINT( \ "num_soundingdim", \ 0, \ @@ -86,80 +111,31 @@ CFG_VALUE_OR_DEFAULT, \ "VHT TX SUPP DATA RATE") -#define CFG_VHT_ENABLE_TXBF_20MHZ CFG_BOOL( \ - "enable_txbf_20mhz", \ +#define CFG_VHT_ENABLE_TXBF_20MHZ CFG_INI_BOOL( \ + "gTxBFEnable", \ 0, \ "VHT ENABLE TXBF 20MHZ") -#define CFG_VHT_LDPC_CODING_CAP CFG_INI_BOOL( \ - "ldpc_coding_cap", \ - 0, \ - "VHT LDPC CODING CAP") - -#define CFG_VHT_SHORT_GI_80MHZ CFG_INI_BOOL( \ - "short_gi_80mhz", \ - 1, \ - "VHT SHORT GI 80MHZ") - -#define CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ CFG_INI_BOOL( \ - "short_gi_160mhz", \ - 0, \ - "VHT SHORT GI 160 AND 80 PLUS 80MHZ") - -#define CFG_VHT_TXSTBC CFG_INI_BOOL( \ - "tx_stbc", \ - 0, \ - "VHT Tx STBC") - -#define CFG_VHT_RXSTBC CFG_INI_BOOL( \ - "rx_stbc", \ - 1, \ - "VHT Rx STBC") - -#define CFG_VHT_SU_BEAMFORMER_CAP CFG_INI_BOOL( \ +#define CFG_VHT_SU_BEAMFORMER_CAP CFG_BOOL( \ "su_bformer", \ 0, \ "VHT SU BEAMFORMER CAP") -#define CFG_VHT_SU_BEAMFORMEE_CAP CFG_INI_BOOL( \ +#define CFG_VHT_SU_BEAMFORMEE_CAP CFG_BOOL( \ "su_bformee", \ 1, \ "VHT SU BEAMFORMEE CAP") -#define CFG_VHT_MU_BEAMFORMER_CAP CFG_INI_BOOL( \ +#define CFG_VHT_MU_BEAMFORMER_CAP CFG_BOOL( \ "mu_bformer", \ 0, \ "VHT MU BEAMFORMER CAP") -#define CFG_VHT_TXOP_PS CFG_INI_BOOL( \ +#define CFG_VHT_TXOP_PS CFG_BOOL( \ "txop_ps", \ 0, \ "VHT TXOP PS") -#define CFG_VHT_RX_MCS_MAP CFG_INI_UINT( \ - "rx_mcs_map", \ - 0, \ - 65535, \ - 65534, \ - CFG_VALUE_OR_DEFAULT, \ - "VHT RX MCS MAP") - -#define CFG_VHT_TX_MCS_MAP CFG_INI_UINT( \ - "tx_mcs_map", \ - 0, \ - 65535, \ - 65534, \ - CFG_VALUE_OR_DEFAULT, \ - "VHT TX MCS MAP") - -#define CFG_VHT_BASIC_MCS_SET CFG_INI_UINT( \ - "basic_mcs_set", \ - 0, \ - 65535, \ - 65534, \ - CFG_VALUE_OR_DEFAULT, \ - "VHT BASIC MCS SET") - /* * * gVhtChannelWidth - Channel width capability for 11ac @@ -427,16 +403,44 @@ CFG_VALUE_OR_DEFAULT, \ "VHT MPDU Length") +/* + * Enable / Disable Tx beamformee in SAP mode + * Default: Disable + */ +#define CFG_VHT_ENABLE_TXBF_SAP_MODE CFG_INI_BOOL( \ + "gEnableTxBFeeSAP", \ + 0, \ + "Enable tx bf sap mode") + +/* + * + * enable_subfee_vendor_vhtie - ini to enable/disable SU Bformee in vendor VHTIE + * @Min: 0 + * @Max: 1 + * @Default: 1 + * + * This ini is used to enable/disable SU Bformee in vendor vht ie if gTxBFEnable + * is enabled. if gTxBFEnable is 0 this will not have any effect. + * + * Related: gTxBFEnable. + * + * Supported Feature: STA + * + * Usage: External + * + * + */ +#define CFG_ENABLE_SUBFEE_IN_VENDOR_VHTIE CFG_INI_BOOL( \ + "enable_subfee_vendor_vhtie", \ + 0, \ + "Enable subfee in vendor vht ie") + #define CFG_VHT_CAPS_ALL \ CFG(CFG_VHT_SUPP_CHAN_WIDTH) \ - CFG(CFG_VHT_LDPC_CODING_CAP) \ - CFG(CFG_VHT_SHORT_GI_80MHZ) \ - CFG(CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ) \ - CFG(CFG_VHT_TXSTBC) \ - CFG(CFG_VHT_RXSTBC) \ CFG(CFG_VHT_SU_BEAMFORMER_CAP) \ CFG(CFG_VHT_SU_BEAMFORMEE_CAP) \ CFG(CFG_VHT_BEAMFORMEE_ANT_SUPP) \ + CFG(CFG_VHT_ENABLE_TX_SU_BEAM_FORMER) \ CFG(CFG_VHT_NUM_SOUNDING_DIMENSIONS) \ CFG(CFG_VHT_MU_BEAMFORMER_CAP) \ CFG(CFG_VHT_TXOP_PS) \ @@ -444,11 +448,8 @@ CFG(CFG_VHT_LINK_ADAPTATION_CAP) \ CFG(CFG_VHT_RX_ANT_PATTERN) \ CFG(CFG_VHT_TX_ANT_PATTERN) \ - CFG(CFG_VHT_RX_MCS_MAP) \ - CFG(CFG_VHT_TX_MCS_MAP) \ CFG(CFG_VHT_RX_SUPP_DATA_RATE) \ CFG(CFG_VHT_TX_SUPP_DATA_RATE) \ - CFG(CFG_VHT_BASIC_MCS_SET) \ CFG(CFG_VHT_ENABLE_TXBF_20MHZ) \ CFG(CFG_VHT_CHANNEL_WIDTH) \ CFG(CFG_VHT_ENABLE_RX_MCS_8_9) \ @@ -463,6 +464,8 @@ CFG(CFG_ENABLE_VHT_FOR_24GHZ) \ CFG(CFG_ENABLE_VENDOR_VHT_FOR_24GHZ) \ CFG(CFG_VHT_AMPDU_LEN_EXPONENT) \ - CFG(CFG_VHT_MPDU_LEN) + CFG(CFG_VHT_MPDU_LEN) \ + CFG(CFG_VHT_ENABLE_TXBF_SAP_MODE) \ + CFG(CFG_ENABLE_SUBFEE_IN_VENDOR_VHTIE) #endif /* __CFG_MLME_VHT_CAPS_H */ diff --git a/mlme/dispatcher/inc/wlan_mlme_api.h b/mlme/dispatcher/inc/wlan_mlme_api.h index efd939e488..56a31bb519 100644 --- a/mlme/dispatcher/inc/wlan_mlme_api.h +++ b/mlme/dispatcher/inc/wlan_mlme_api.h @@ -726,7 +726,18 @@ QDF_STATUS wlan_mlme_cfg_get_vht_chan_width(struct wlan_objmgr_psoc *psoc, * Return: QDF_STATUS */ QDF_STATUS wlan_mlme_cfg_set_vht_chan_width(struct wlan_objmgr_psoc *psoc, - uint8_t value); + uint8_t value); + +/** + * wlan_mlme_cfg_get_vht_chan_width() - sets vht supported channel width into + * cfg item + * @psoc: psoc context + * @value: data to be set + * + * Return: QDF_STATUS + */ +QDF_STATUS wlan_mlme_cfg_get_vht_chan_width(struct wlan_objmgr_psoc *psoc, + uint8_t *value); /** * wlan_mlme_cfg_get_vht_ldpc_coding_cap() - gets vht ldpc coding cap from @@ -737,7 +748,7 @@ QDF_STATUS wlan_mlme_cfg_set_vht_chan_width(struct wlan_objmgr_psoc *psoc, * Return: QDF_STATUS */ QDF_STATUS wlan_mlme_cfg_get_vht_ldpc_coding_cap(struct wlan_objmgr_psoc *psoc, - bool *value); + bool *value); /** * wlan_mlme_cfg_set_vht_ldpc_coding_cap() - sets vht ldpc coding cap into @@ -773,26 +784,26 @@ QDF_STATUS wlan_mlme_cfg_set_vht_short_gi_80mhz(struct wlan_objmgr_psoc *psoc, bool value); /** - * wlan_mlme_cfg_get_vht_short_gi_160mhz() - gets vht short gi 160MHz from + * wlan_mlme_cfg_get_short_gi_160_mhz() - gets vht short gi 160MHz from * cfg item * @psoc: psoc context * @value: pointer to get required data * * Return: QDF_STATUS */ -QDF_STATUS wlan_mlme_cfg_get_vht_short_gi_160mhz(struct wlan_objmgr_psoc *psoc, - bool *value); +QDF_STATUS wlan_mlme_cfg_get_short_gi_160_mhz(struct wlan_objmgr_psoc *psoc, + bool *value); /** - * wlan_mlme_cfg_set_vht_short_gi_160mhz() - sets vht short gi 160MHz into + * wlan_mlme_cfg_set_short_gi_160_mhz() - sets vht short gi 160MHz into * cfg item * @psoc: psoc context * @value: data to be set * * Return: QDF_STATUS */ -QDF_STATUS wlan_mlme_cfg_set_vht_short_gi_160mhz(struct wlan_objmgr_psoc *psoc, - bool value); +QDF_STATUS wlan_mlme_cfg_set_short_gi_160_mhz(struct wlan_objmgr_psoc *psoc, + bool value); /** * wlan_mlme_cfg_get_vht_tx_stbc() - gets vht tx stbc from @@ -805,6 +816,17 @@ QDF_STATUS wlan_mlme_cfg_set_vht_short_gi_160mhz(struct wlan_objmgr_psoc *psoc, QDF_STATUS wlan_mlme_cfg_get_vht_tx_stbc(struct wlan_objmgr_psoc *psoc, bool *value); +/** + * wlan_mlme_cfg_get_vht_rx_stbc() - gets vht rx stbc from + * cfg item + * @psoc: psoc context + * @value: pointer to get required data + * + * Return: QDF_STATUS + */ +QDF_STATUS wlan_mlme_cfg_get_vht_rx_stbc(struct wlan_objmgr_psoc *psoc, + bool *value); + /** * wlan_mlme_cfg_set_vht_tx_stbc() - sets vht tx stbc into * cfg item @@ -872,7 +894,8 @@ QDF_STATUS wlan_mlme_cfg_set_vht_su_bformee(struct wlan_objmgr_psoc *psoc, bool value); /** - * wlan_mlme_cfg_set_vht_tx_bfee_ant_supp() - sets vht Beamformee antenna support cap + * wlan_mlme_cfg_set_vht_tx_bfee_ant_supp() - sets vht Beamformee antenna + * support cap * into cfg item * @psoc: psoc context * @value: data to be set @@ -882,6 +905,18 @@ QDF_STATUS wlan_mlme_cfg_set_vht_su_bformee(struct wlan_objmgr_psoc *psoc, QDF_STATUS wlan_mlme_cfg_set_vht_tx_bfee_ant_supp(struct wlan_objmgr_psoc *psoc, uint8_t value); +/** + * wlan_mlme_cfg_get_vht_tx_bfee_ant_supp() - sets vht Beamformee antenna + * support cap + * into cfg item + * @psoc: psoc context + * @value: data to be set + * + * Return: QDF_STATUS + */ +QDF_STATUS wlan_mlme_cfg_get_vht_tx_bfee_ant_supp(struct wlan_objmgr_psoc *psoc, + uint8_t *value); + /** * wlan_mlme_cfg_set_vht_num_sounding_dim() - sets vht no of sounding dimensions * into cfg item @@ -1071,6 +1106,26 @@ QDF_STATUS wlan_mlme_cfg_get_vht_basic_mcs_set(struct wlan_objmgr_psoc *psoc, QDF_STATUS wlan_mlme_cfg_set_vht_basic_mcs_set(struct wlan_objmgr_psoc *psoc, uint32_t value); +/** + * wlan_mlme_get_vht_enable_tx_bf() - VHT Rx MCS capability for 1x1 mode + * @psoc: psoc context + * @value: data to be set + * + * Return: QDF_STATUS + */ +QDF_STATUS wlan_mlme_get_vht_enable_tx_bf(struct wlan_objmgr_psoc *psoc, + bool *value); + +/** + * wlan_mlme_get_vht_enable_tx_su_beam() - VHT enable tx su beam + * @psoc: psoc context + * @value: data to be set + * + * Return: QDF_STATUS + */ +QDF_STATUS wlan_mlme_get_vht_enable_tx_su_beam(struct wlan_objmgr_psoc *psoc, + bool *value); + /** * wlan_mlme_get_vht_channel_width() - gets Channel width capability * for 11ac @@ -1192,4 +1247,23 @@ QDF_STATUS wlan_mlme_get_vht_for_24ghz(struct wlan_objmgr_psoc *psoc, QDF_STATUS wlan_mlme_get_vendor_vht_for_24ghz(struct wlan_objmgr_psoc *psoc, bool *value); +/** + * mlme_update_vht_cap() - update vht capabilities + * @psoc: psoc context + * @cfg: data to be set + * + * Return: QDF_STATUS + */ +QDF_STATUS mlme_update_vht_cap(struct wlan_objmgr_psoc *psoc, + struct wma_tgt_vht_cap *cfg); + +/** + * mlme_update_nss_vht_cap() - Update the number of spatial + * streams supported for vht + * @psoc: psoc context + * + * Return: QDF_STATUS + */ +QDF_STATUS mlme_update_nss_vht_cap(struct wlan_objmgr_psoc *psoc); + #endif /* _WLAN_MLME_API_H_ */ diff --git a/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/mlme/dispatcher/inc/wlan_mlme_public_struct.h index 04ac0d2833..ad3dacd7c4 100644 --- a/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -29,6 +29,16 @@ #define CFG_PMKID_MODES_OKC (0x1) #define CFG_PMKID_MODES_PMKSA_CACHING (0x2) +#define CFG_VHT_BASIC_MCS_SET_STADEF 0xFFFE + +#define CFG_VHT_RX_MCS_MAP_STAMIN 0 +#define CFG_VHT_RX_MCS_MAP_STAMAX 65535 +#define CFG_VHT_RX_MCS_MAP_STADEF 65534 + +#define CFG_VHT_TX_MCS_MAP_STAMIN 0 +#define CFG_VHT_TX_MCS_MAP_STAMAX 65535 +#define CFG_VHT_TX_MCS_MAP_STADEF 65534 + #define CFG_STR_DATA_LEN 17 #define CFG_EDCA_DATA_LEN 17 @@ -312,6 +322,7 @@ struct wlan_mlme_mbo { * @tx_supp_data_rate: Tx highest supported data rate * @basic_mcs_set: Basic MCS set * @enable_txbf_20mhz: enable tx bf for 20mhz + * @enable_tx_su: enable VHT tx su beam former * @channel_width: Channel width capability for 11ac * @rx_mcs: VHT Rx MCS capability for 1x1 mode * @tx_mcs: VHT Tx MCS capability for 1x1 mode @@ -328,6 +339,8 @@ struct wlan_mlme_mbo { * ie in 2.4 GHz band * @ampdu_len_exponent: To handle maximum receive AMPDU ampdu len exponent * @ampdu_len: To handle maximum receive AMPDU ampdu len + * @tx_bfee_sap: enable tx bfee SAp + * @subfee_vendor_vhtie: enable subfee vendor vht ie */ struct mlme_vht_capabilities_info { uint8_t supp_chan_width; @@ -352,9 +365,10 @@ struct mlme_vht_capabilities_info { uint32_t tx_supp_data_rate; uint32_t basic_mcs_set; bool enable_txbf_20mhz; + bool enable_tx_su; uint8_t channel_width; - uint8_t rx_mcs; - uint8_t tx_mcs; + uint32_t rx_mcs; + uint32_t tx_mcs; uint8_t rx_mcs2x2; uint8_t tx_mcs2x2; bool enable_vht20_mcs9; @@ -366,6 +380,8 @@ struct mlme_vht_capabilities_info { bool vendor_24ghz_band; uint8_t ampdu_len_exponent; uint8_t ampdu_len; + bool tx_bfee_sap; + bool vendor_vhtie; }; /** diff --git a/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h b/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h index 633bf26cbb..137301b3fb 100644 --- a/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h +++ b/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h @@ -1045,6 +1045,23 @@ QDF_STATUS ucfg_mlme_cfg_set_vht_chan_width(struct wlan_objmgr_psoc *psoc, return wlan_mlme_cfg_set_vht_chan_width(psoc, value); } +/** + * ucfg_mlme_cfg_get_vht_chan_width() - gets vht supported channel width into + * cfg item + * @psoc: psoc context + * @value: data to be set + * + * Inline UCFG API to be used by HDD/OSIF callers + * + * Return: QDF_STATUS_SUCCESS or QDF_STATUS_FAILURE + */ +static inline +QDF_STATUS ucfg_mlme_cfg_get_vht_chan_width(struct wlan_objmgr_psoc *psoc, + uint8_t *value) +{ + return wlan_mlme_cfg_get_vht_chan_width(psoc, value); +} + /** * ucfg_mlme_cfg_set_vht_ldpc_coding_cap() - sets vht ldpc coding cap into * cfg item @@ -1062,6 +1079,42 @@ ucfg_mlme_cfg_set_vht_ldpc_coding_cap(struct wlan_objmgr_psoc *psoc, return wlan_mlme_cfg_set_vht_ldpc_coding_cap(psoc, value); } +/** + * ucfg_mlme_cfg_get_short_gi_160_mhz() - gets basic set SHORT GI 160MHZ from + * cfg item + * @psoc: psoc context + * @value: data to be set + * + * Inline UCFG API to be used by HDD/OSIF callers to get the + * ignore_peer_ht_opmode flag value + * + * Return: QDF_STATUS_SUCCESS or QDF_STATUS_FAILURE + */ +static inline QDF_STATUS +ucfg_mlme_cfg_get_short_gi_160_mhz(struct wlan_objmgr_psoc *psoc, + bool *value) +{ + return wlan_mlme_cfg_get_short_gi_160_mhz(psoc, value); +} + +/** + * ucfg_mlme_cfg_set_short_gi_160_mhz() - sets basic set SHORT GI 160MHZ into + * cfg item + * @psoc: psoc context + * @value: data to be set + * + * Inline UCFG API to be used by HDD/OSIF callers to get the + * ignore_peer_ht_opmode flag value + * + * Return: QDF_STATUS_SUCCESS or QDF_STATUS_FAILURE + */ +static inline QDF_STATUS +ucfg_mlme_cfg_set_short_gi_160_mhz(struct wlan_objmgr_psoc *psoc, + bool value) +{ + return wlan_mlme_cfg_set_short_gi_160_mhz(psoc, value); +} + /** * ucfg_mlme_cfg_get_vht_tx_stbc() - gets vht tx stbc from * cfg item @@ -1080,6 +1133,24 @@ ucfg_mlme_cfg_get_vht_tx_stbc(struct wlan_objmgr_psoc *psoc, return wlan_mlme_cfg_get_vht_tx_stbc(psoc, value); } +/** + * ucfg_mlme_cfg_get_vht_rx_stbc() - gets vht tx stbc from + * cfg item + * @psoc: psoc context + * @value: pointer to get required data + * + * Inline UCFG API to be used by HDD/OSIF callers to get the + * ignore_peer_ht_opmode flag value + * + * Return: QDF_STATUS_SUCCESS or QDF_STATUS_FAILURE + */ +static inline QDF_STATUS +ucfg_mlme_cfg_get_vht_rx_stbc(struct wlan_objmgr_psoc *psoc, + bool *value) +{ + return wlan_mlme_cfg_get_vht_rx_stbc(psoc, value); +} + /** * ucfg_mlme_cfg_set_vht_tx_bfee_ant_supp() - sets vht Beamformee antenna * support cap into cfg item @@ -1097,6 +1168,23 @@ ucfg_mlme_cfg_set_vht_tx_bfee_ant_supp(struct wlan_objmgr_psoc *psoc, return wlan_mlme_cfg_set_vht_tx_bfee_ant_supp(psoc, value); } +/** + * ucfg_mlme_cfg_get_vht_tx_bfee_ant_supp() - gets vht Beamformee antenna + * support cap into cfg item + * @psoc: psoc context + * @value: data to be set + * + * Inline UCFG API to be used by HDD/OSIF callers + * + * Return: QDF_STATUS_SUCCESS or QDF_STATUS_FAILURE + */ +static inline QDF_STATUS +ucfg_mlme_cfg_get_vht_tx_bfee_ant_supp(struct wlan_objmgr_psoc *psoc, + uint8_t *value) +{ + return wlan_mlme_cfg_get_vht_tx_bfee_ant_supp(psoc, value); +} + /** * ucfg_mlme_cfg_get_vht_rx_mcs_map() - gets vht rx mcs map from * cfg item @@ -1237,6 +1325,40 @@ ucfg_mlme_cfg_set_vht_basic_mcs_set(struct wlan_objmgr_psoc *psoc, return wlan_mlme_cfg_set_vht_basic_mcs_set(psoc, value); } +/** + * ucfg_mlme_get_vht_enable_tx_bf() - gets enable TXBF for 20MHZ + * for 11ac + * @psoc: psoc context + * @value: data to be set + * + * Inline UCFG API to be used by HDD/OSIF callers to get the + * ignore_peer_ht_opmode flag value + * + * Return: QDF_STATUS_SUCCESS or QDF_STATUS_FAILURE + */ +static inline QDF_STATUS +ucfg_mlme_get_vht_enable_tx_bf(struct wlan_objmgr_psoc *psoc, bool *value) +{ + return wlan_mlme_get_vht_enable_tx_bf(psoc, value); +} + +/** + * ucfg_mlme_get_vht_enable_tx_su_beam() - gets enable enable_tx_su_beam + * for 11ac + * @psoc: psoc context + * @value: data to be set + * + * Inline UCFG API to be used by HDD/OSIF callers to get the + * ignore_peer_ht_opmode flag value + * + * Return: QDF_STATUS_SUCCESS or QDF_STATUS_FAILURE + */ +static inline QDF_STATUS +ucfg_mlme_get_vht_enable_tx_su_beam(struct wlan_objmgr_psoc *psoc, bool *value) +{ + return wlan_mlme_get_vht_enable_tx_su_beam(psoc, value); +} + /** * ucfg_mlme_get_vht_channel_width() - gets Channel width capability * for 11ac @@ -1433,4 +1555,39 @@ ucfg_mlme_get_vendor_vht_for_24ghz(struct wlan_objmgr_psoc *psoc, bool *value) { return wlan_mlme_get_vendor_vht_for_24ghz(psoc, value); } + +/** + * ucfg_mlme_update_vht_cap() - Update vht capabilities + * @psoc: psoc context + * @value: data to be set + * + * Inline UCFG API to be used by HDD/OSIF callers to get the + * ignore_peer_ht_opmode flag value + * + * Return: QDF_STATUS_SUCCESS or QDF_STATUS_FAILURE + */ +static inline QDF_STATUS +ucfg_mlme_update_vht_cap(struct wlan_objmgr_psoc *psoc, + struct wma_tgt_vht_cap *cfg) +{ + return mlme_update_vht_cap(psoc, cfg); +} + +/** + * ucfg_mlme_update_nss_vht_cap() -Update the number of spatial + * streams supported for vht + * @psoc: psoc context + * @value: data to be set + * + * Inline UCFG API to be used by HDD/OSIF callers to get the + * ignore_peer_ht_opmode flag value + * + * Return: QDF_STATUS_SUCCESS or QDF_STATUS_FAILURE + */ +static inline QDF_STATUS +ucfg_mlme_update_nss_vht_cap(struct wlan_objmgr_psoc *psoc) +{ + return mlme_update_nss_vht_cap(psoc); +} + #endif /* _WLAN_MLME_UCFG_API_H_ */ diff --git a/mlme/dispatcher/src/wlan_mlme_api.c b/mlme/dispatcher/src/wlan_mlme_api.c index 46f5af691b..11620d3d54 100644 --- a/mlme/dispatcher/src/wlan_mlme_api.c +++ b/mlme/dispatcher/src/wlan_mlme_api.c @@ -1230,6 +1230,21 @@ wlan_mlme_cfg_set_vht_chan_width(struct wlan_objmgr_psoc *psoc, uint8_t value) return QDF_STATUS_SUCCESS; } +QDF_STATUS +wlan_mlme_cfg_get_vht_chan_width(struct wlan_objmgr_psoc *psoc, uint8_t *value) +{ + struct wlan_mlme_psoc_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_obj(psoc); + if (!mlme_obj) { + mlme_err("Failed to get MLME Obj"); + return QDF_STATUS_E_FAILURE; + } + + *value = mlme_obj->cfg.vht_caps.vht_cap_info.supp_chan_width; + + return QDF_STATUS_SUCCESS; +} QDF_STATUS wlan_mlme_cfg_set_vht_ldpc_coding_cap(struct wlan_objmgr_psoc *psoc, @@ -1248,6 +1263,39 @@ wlan_mlme_cfg_set_vht_ldpc_coding_cap(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_SUCCESS; } +QDF_STATUS +wlan_mlme_cfg_set_short_gi_160_mhz(struct wlan_objmgr_psoc *psoc, + bool value) +{ + struct wlan_mlme_psoc_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_obj(psoc); + if (!mlme_obj) { + mlme_err("Failed to get MLME Obj"); + return QDF_STATUS_E_FAILURE; + } + + mlme_obj->cfg.vht_caps.vht_cap_info.short_gi_160mhz = value; + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS +wlan_mlme_cfg_get_short_gi_160_mhz(struct wlan_objmgr_psoc *psoc, bool *value) +{ + struct wlan_mlme_psoc_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_obj(psoc); + if (!mlme_obj) { + mlme_err("Failed to get MLME Obj"); + return QDF_STATUS_E_FAILURE; + } + + *value = mlme_obj->cfg.vht_caps.vht_cap_info.short_gi_160mhz; + + return QDF_STATUS_SUCCESS; +} + QDF_STATUS wlan_mlme_cfg_get_vht_tx_stbc(struct wlan_objmgr_psoc *psoc, bool *value) { @@ -1264,6 +1312,21 @@ wlan_mlme_cfg_get_vht_tx_stbc(struct wlan_objmgr_psoc *psoc, bool *value) return QDF_STATUS_SUCCESS; } +QDF_STATUS +wlan_mlme_cfg_get_vht_rx_stbc(struct wlan_objmgr_psoc *psoc, bool *value) +{ + struct wlan_mlme_psoc_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_obj(psoc); + if (!mlme_obj) { + mlme_err("Failed to get MLME Obj"); + return QDF_STATUS_E_FAILURE; + } + + *value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_stbc; + + return QDF_STATUS_SUCCESS; +} QDF_STATUS wlan_mlme_cfg_set_vht_tx_bfee_ant_supp(struct wlan_objmgr_psoc *psoc, @@ -1282,6 +1345,23 @@ wlan_mlme_cfg_set_vht_tx_bfee_ant_supp(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_SUCCESS; } +QDF_STATUS +wlan_mlme_cfg_get_vht_tx_bfee_ant_supp(struct wlan_objmgr_psoc *psoc, + uint8_t *value) +{ + struct wlan_mlme_psoc_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_obj(psoc); + if (!mlme_obj) { + mlme_err("Failed to get MLME Obj"); + return QDF_STATUS_E_FAILURE; + } + + *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_bfee_ant_supp; + + return QDF_STATUS_SUCCESS; +} + QDF_STATUS wlan_mlme_cfg_get_vht_rx_mcs_map(struct wlan_objmgr_psoc *psoc, uint32_t *value) @@ -1418,6 +1498,38 @@ wlan_mlme_cfg_set_vht_basic_mcs_set(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_SUCCESS; } +QDF_STATUS +wlan_mlme_get_vht_enable_tx_bf(struct wlan_objmgr_psoc *psoc, bool *value) +{ + struct wlan_mlme_psoc_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_obj(psoc); + if (!mlme_obj) { + mlme_err("Failed to get MLME Obj"); + return QDF_STATUS_E_FAILURE; + } + + *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_txbf_20mhz; + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS +wlan_mlme_get_vht_enable_tx_su_beam(struct wlan_objmgr_psoc *psoc, bool *value) +{ + struct wlan_mlme_psoc_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_obj(psoc); + if (!mlme_obj) { + mlme_err("Failed to get MLME Obj"); + return QDF_STATUS_E_FAILURE; + } + + *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_tx_su; + + return QDF_STATUS_SUCCESS; +} + QDF_STATUS wlan_mlme_get_vht_channel_width(struct wlan_objmgr_psoc *psoc, uint8_t *value) { @@ -1610,3 +1722,142 @@ wlan_mlme_get_vendor_vht_for_24ghz(struct wlan_objmgr_psoc *psoc, bool *value) return QDF_STATUS_SUCCESS; } + +QDF_STATUS mlme_update_vht_cap(struct wlan_objmgr_psoc *psoc, + struct wma_tgt_vht_cap *cfg) +{ + struct wlan_mlme_psoc_obj *mlme_obj; + struct mlme_vht_capabilities_info vht_cap_info; + uint32_t value = 0; + bool hw_rx_ldpc_enabled; + + mlme_obj = mlme_get_psoc_obj(psoc); + if (!mlme_obj) { + mlme_err("Failed to get MLME Obj"); + return QDF_STATUS_E_FAILURE; + } + + vht_cap_info = mlme_obj->cfg.vht_caps.vht_cap_info; + + /* + * VHT max MPDU length: + * override if user configured value is too high + * that the target cannot support + */ + if (vht_cap_info.ampdu_len > cfg->vht_max_mpdu) + vht_cap_info.ampdu_len = cfg->vht_max_mpdu; + + value = (CFG_VHT_BASIC_MCS_SET_STADEF & VHT_MCS_1x1) | + vht_cap_info.basic_mcs_set; + if (vht_cap_info.enable2x2) + value = (value & VHT_MCS_2x2) | (vht_cap_info.rx_mcs2x2 << 2); + vht_cap_info.basic_mcs_set = value; + + value = (CFG_VHT_RX_MCS_MAP_STADEF & VHT_MCS_1x1) | vht_cap_info.rx_mcs; + if (vht_cap_info.enable2x2) + value = (value & VHT_MCS_2x2) | (vht_cap_info.rx_mcs2x2 << 2); + vht_cap_info.rx_mcs_map = value; + + value = (CFG_VHT_TX_MCS_MAP_STADEF & VHT_MCS_1x1) | vht_cap_info.tx_mcs; + if (vht_cap_info.enable2x2) + value = (value & VHT_MCS_2x2) | (vht_cap_info.tx_mcs2x2 << 2); + vht_cap_info.tx_mcs_map = value; + + /* Set HW RX LDPC capability */ + hw_rx_ldpc_enabled = !!cfg->vht_rx_ldpc; + if (hw_rx_ldpc_enabled != vht_cap_info.ldpc_coding_cap) + vht_cap_info.ldpc_coding_cap = hw_rx_ldpc_enabled; + + /* set the Guard interval 80MHz */ + if (vht_cap_info.short_gi_80mhz && !cfg->vht_short_gi_80) + vht_cap_info.short_gi_80mhz = cfg->vht_short_gi_80; + + /* Set VHT TX STBC cap */ + if (vht_cap_info.tx_stbc && !cfg->vht_tx_stbc) + vht_cap_info.tx_stbc = cfg->vht_tx_stbc; + + /* Set VHT RX STBC cap */ + if (vht_cap_info.rx_stbc && !cfg->vht_rx_stbc) + vht_cap_info.rx_stbc = cfg->vht_rx_stbc; + + /* Set VHT SU Beamformer cap */ + if (vht_cap_info.su_bformer && !cfg->vht_su_bformer) + vht_cap_info.su_bformer = cfg->vht_su_bformer; + + /* check and update SU BEAMFORMEE capabality */ + if (vht_cap_info.enable_txbf_20mhz && !cfg->vht_su_bformee) + vht_cap_info.su_bformee = cfg->vht_su_bformee; + + /* Set VHT MU Beamformer cap */ + if (vht_cap_info.mu_bformer && !cfg->vht_mu_bformer) + vht_cap_info.mu_bformer = cfg->vht_mu_bformer; + + /* Set VHT MU Beamformee cap */ + if (vht_cap_info.enable_mu_bformee && !cfg->vht_mu_bformee) + vht_cap_info.enable_mu_bformee = cfg->vht_mu_bformee; + + /* + * VHT max AMPDU len exp: + * override if user configured value is too high + * that the target cannot support. + * Even though Rome publish ampdu_len=7, it can + * only support 4 because of some h/w bug. + */ + if (vht_cap_info.ampdu_len_exponent > cfg->vht_max_ampdu_len_exp) + vht_cap_info.ampdu_len_exponent = cfg->vht_max_ampdu_len_exp; + + /* Set VHT TXOP PS CAP */ + if (vht_cap_info.txop_ps && !cfg->vht_txop_ps) + vht_cap_info.txop_ps = cfg->vht_txop_ps; + + /* set the Guard interval 160MHz */ + if (vht_cap_info.short_gi_160mhz && !cfg->vht_short_gi_160) + vht_cap_info.short_gi_160mhz = cfg->vht_short_gi_160; + + return QDF_STATUS_SUCCESS; + +} + +QDF_STATUS mlme_update_nss_vht_cap(struct wlan_objmgr_psoc *psoc) +{ + struct wlan_mlme_psoc_obj *mlme_obj; + struct mlme_vht_capabilities_info vht_cap_info; + uint32_t temp = 0; + + mlme_obj = mlme_get_psoc_obj(psoc); + if (!mlme_obj) { + mlme_err("Failed to get MLME Obj"); + return QDF_STATUS_E_FAILURE; + } + + vht_cap_info = mlme_obj->cfg.vht_caps.vht_cap_info; + + temp = vht_cap_info.basic_mcs_set; + temp = (temp & 0xFFFC) | vht_cap_info.rx_mcs; + if (vht_cap_info.enable2x2) + temp = (temp & 0xFFF3) | (vht_cap_info.rx_mcs2x2 << 2); + else + temp |= 0x000C; + + vht_cap_info.basic_mcs_set = temp; + + temp = vht_cap_info.rx_mcs_map; + temp = (temp & 0xFFFC) | vht_cap_info.rx_mcs; + if (vht_cap_info.enable2x2) + temp = (temp & 0xFFF3) | (vht_cap_info.rx_mcs2x2 << 2); + else + temp |= 0x000C; + + vht_cap_info.rx_mcs_map = temp; + + temp = vht_cap_info.tx_mcs_map; + temp = (temp & 0xFFFC) | vht_cap_info.tx_mcs; + if (vht_cap_info.enable2x2) + temp = (temp & 0xFFF3) | (vht_cap_info.tx_mcs2x2 << 2); + else + temp |= 0x000C; + + vht_cap_info.tx_mcs_map = temp; + + return QDF_STATUS_SUCCESS; +}