diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c index a9837c3516f5..2ea651c5628c 100644 --- a/components/mlme/core/src/wlan_mlme_main.c +++ b/components/mlme/core/src/wlan_mlme_main.c @@ -876,112 +876,168 @@ static void mlme_init_sap_protection_cfg(struct wlan_objmgr_psoc *psoc, cfg_get(psoc, CFG_IGNORE_PEER_HT_MODE); } +#ifdef WLAN_FEATURE_11AX static void mlme_init_he_cap_in_cfg(struct wlan_objmgr_psoc *psoc, - struct wlan_mlme_he_caps *he_caps) + struct wlan_mlme_cfg *mlme_cfg) { - he_caps->he_control = cfg_default(CFG_HE_CONTROL); - he_caps->he_twt_requestor = cfg_default(CFG_HE_TWT_REQUESTOR); - he_caps->he_twt_responder = cfg_default(CFG_HE_TWT_RESPONDER); - he_caps->he_twt_fragmentation = cfg_default(CFG_HE_TWT_FRAGMENTATION); - he_caps->he_max_frag_msdu = cfg_default(CFG_HE_MAX_FRAG_MSDU); - he_caps->he_min_frag_size = cfg_default(CFG_HE_MIN_FRAG_SIZE); - he_caps->he_trig_pad = cfg_default(CFG_HE_TRIG_PAD); - he_caps->he_mtid_aggr_rx = cfg_default(CFG_HE_MTID_AGGR_RX); - he_caps->he_link_adaptation = cfg_default(CFG_HE_LINK_ADAPTATION); - he_caps->he_all_ack = cfg_default(CFG_HE_ALL_ACK); - he_caps->he_trigd_rsp_scheduling = + uint32_t chan_width; + uint16_t value = 0; + struct wlan_mlme_he_caps *he_caps = &mlme_cfg->he_caps; + + he_caps->dot11_he_cap.htc_he = cfg_default(CFG_HE_CONTROL); + he_caps->dot11_he_cap.twt_request = cfg_default(CFG_HE_TWT_REQUESTOR); + he_caps->dot11_he_cap.twt_responder = cfg_default(CFG_HE_TWT_RESPONDER); + he_caps->dot11_he_cap.fragmentation = + cfg_default(CFG_HE_FRAGMENTATION); + he_caps->dot11_he_cap.max_num_frag_msdu_amsdu_exp = + cfg_default(CFG_HE_MAX_FRAG_MSDU); + he_caps->dot11_he_cap.min_frag_size = cfg_default(CFG_HE_MIN_FRAG_SIZE); + he_caps->dot11_he_cap.trigger_frm_mac_pad = + cfg_default(CFG_HE_TRIG_PAD); + he_caps->dot11_he_cap.multi_tid_aggr_rx_supp = + cfg_default(CFG_HE_MTID_AGGR_RX); + he_caps->dot11_he_cap.he_link_adaptation = + cfg_default(CFG_HE_LINK_ADAPTATION); + he_caps->dot11_he_cap.all_ack = cfg_default(CFG_HE_ALL_ACK); + he_caps->dot11_he_cap.trigd_rsp_sched = cfg_default(CFG_HE_TRIGD_RSP_SCHEDULING); - he_caps->he_buffer_status_rpt = cfg_default(CFG_HE_BUFFER_STATUS_RPT); - he_caps->he_bcast_twt = cfg_default(CFG_HE_BCAST_TWT); - he_caps->he_ba_32bit = cfg_default(CFG_HE_BA_32BIT); - he_caps->he_mu_cascading = cfg_default(CFG_HE_MU_CASCADING); - he_caps->he_multi_tid = cfg_default(CFG_HE_MULTI_TID); - he_caps->he_dl_mu_ba = cfg_default(CFG_HE_DL_MU_BA); - he_caps->he_omi = cfg_default(CFG_HE_OMI); - he_caps->he_ofdma_ra = cfg_default(CFG_HE_OFDMA_RA); - he_caps->he_max_ampdu_len = cfg_default(CFG_HE_MAX_AMPDU_LEN); - he_caps->he_amsdu_frag = cfg_default(CFG_HE_AMSDU_FRAG); - he_caps->he_flex_twt_sched = cfg_default(CFG_HE_FLEX_TWT_SCHED); - he_caps->he_rx_ctrl = cfg_default(CFG_HE_RX_CTRL); - he_caps->he_bsrp_ampdu_aggr = cfg_default(CFG_HE_BSRP_AMPDU_AGGR); - he_caps->he_qtp = cfg_default(CFG_HE_QTP); - he_caps->he_a_bqr = cfg_default(CFG_HE_A_BQR); - he_caps->he_sr_responder = cfg_default(CFG_HE_SR_RESPONDER); - he_caps->he_ndp_feedback_supp = cfg_default(CFG_HE_NDP_FEEDBACK_SUPP); - he_caps->he_ops_supp = cfg_default(CFG_HE_OPS_SUPP); - he_caps->he_amsdu_in_ampdu = cfg_default(CFG_HE_AMSDU_IN_AMPDU); - he_caps->he_chan_width = cfg_default(CFG_HE_CHAN_WIDTH); - he_caps->he_mtid_aggr_tx = cfg_default(CFG_HE_MTID_AGGR_TX); - he_caps->he_sub_ch_sel_tx = cfg_default(CFG_HE_SUB_CH_SEL_TX); - he_caps->he_ul_2x996_ru = cfg_default(CFG_HE_UL_2X996_RU); - he_caps->he_om_ctrl_ul_mu_dis_rx = - cfg_default(CFG_HE_OM_CTRL_UL_MU_DIS_RX); - he_caps->he_rx_pream_punc = cfg_default(CFG_HE_RX_PREAM_PUNC); - he_caps->he_class_of_device = cfg_default(CFG_HE_CLASS_OF_DEVICE); - he_caps->he_ldpc = cfg_default(CFG_HE_LDPC); - he_caps->he_ltf_ppdu = cfg_default(CFG_HE_LTF_PPDU); - he_caps->he_midamble_rx_nsts = cfg_default(CFG_HE_MIDAMBLE_RX_MAX_NSTS); - he_caps->he_ltf_ndp = cfg_default(CFG_HE_LTF_NDP); - he_caps->he_tx_stbc_lt80 = cfg_default(CFG_HE_TX_STBC_LT80); - he_caps->he_rx_stbc_lt80 = cfg_default(CFG_HE_RX_STBC_LT80); - he_caps->he_doppler = cfg_default(CFG_HE_DOPPLER); - he_caps->he_ul_mumimo = cfg_default(CFG_HE_UL_MUMIMO); - he_caps->he_dcm_tx = cfg_default(CFG_HE_DCM_TX); - he_caps->he_dcm_rx = cfg_default(CFG_HE_DCM_RX); - he_caps->he_mu_ppdu = cfg_default(CFG_HE_MU_PPDU); - he_caps->he_su_beamformer = cfg_default(CFG_HE_SU_BEAMFORMER); - he_caps->he_su_beamformee = cfg_default(CFG_HE_SU_BEAMFORMEE); - he_caps->he_mu_beamformer = cfg_default(CFG_HE_MU_BEAMFORMER); - he_caps->he_bfee_sts_lt80 = cfg_default(CFG_HE_BFEE_STS_LT80); - he_caps->he_bfee_sts_gt80 = cfg_default(CFG_HE_BFEE_STS_GT80); - he_caps->he_num_sound_lt80 = cfg_default(CFG_HE_NUM_SOUND_LT80); - he_caps->he_num_sound_gt80 = cfg_default(CFG_HE_NUM_SOUND_GT80); - he_caps->he_su_feed_tone16 = cfg_default(CFG_HE_SU_FEED_TONE16); - he_caps->he_mu_feed_tone16 = cfg_default(CFG_HE_MU_FEED_TONE16); - he_caps->he_codebook_su = cfg_default(CFG_HE_CODEBOOK_SU); - he_caps->he_codebook_mu = cfg_default(CFG_HE_CODEBOOK_MU); - he_caps->he_bfrm_feed = cfg_default(CFG_HE_BFRM_FEED); - he_caps->he_er_su_ppdu = cfg_default(CFG_HE_ER_SU_PPDU); - he_caps->he_dl_part_bw = cfg_default(CFG_HE_DL_PART_BW); - he_caps->he_ppet_present = cfg_default(CFG_HE_PPET_PRESENT); - he_caps->he_srp = cfg_default(CFG_HE_SRP); - he_caps->he_power_boost = cfg_default(CFG_HE_POWER_BOOST); - he_caps->he_4x_ltf_gi = cfg_default(CFG_HE_4x_LTF_GI); - he_caps->he_max_nc = cfg_default(CFG_HE_MAX_NC); - he_caps->he_tx_stbc_gt80 = cfg_default(CFG_HE_TX_STBC_GT80); - he_caps->he_rx_stbc_gt80 = cfg_default(CFG_HE_RX_STBC_GT80); - he_caps->he_er_4x_ltf_gi = cfg_default(CFG_HE_ER_4x_LTF_GI); - he_caps->he_ppdu_20_in_40mhz_2g = + he_caps->dot11_he_cap.a_bsr = cfg_default(CFG_HE_BUFFER_STATUS_RPT); + he_caps->dot11_he_cap.broadcast_twt = cfg_default(CFG_HE_BCAST_TWT); + he_caps->dot11_he_cap.ba_32bit_bitmap = cfg_default(CFG_HE_BA_32BIT); + he_caps->dot11_he_cap.mu_cascade = cfg_default(CFG_HE_MU_CASCADING); + he_caps->dot11_he_cap.ack_enabled_multitid = + cfg_default(CFG_HE_MULTI_TID); + he_caps->dot11_he_cap.omi_a_ctrl = cfg_default(CFG_HE_OMI); + he_caps->dot11_he_cap.ofdma_ra = cfg_default(CFG_HE_OFDMA_RA); + he_caps->dot11_he_cap.max_ampdu_len_exp_ext = + cfg_default(CFG_HE_MAX_AMPDU_LEN); + he_caps->dot11_he_cap.amsdu_frag = cfg_default(CFG_HE_AMSDU_FRAG); + he_caps->dot11_he_cap.flex_twt_sched = + cfg_default(CFG_HE_FLEX_TWT_SCHED); + he_caps->dot11_he_cap.rx_ctrl_frame = cfg_default(CFG_HE_RX_CTRL); + he_caps->dot11_he_cap.bsrp_ampdu_aggr = + cfg_default(CFG_HE_BSRP_AMPDU_AGGR); + he_caps->dot11_he_cap.qtp = cfg_default(CFG_HE_QTP); + he_caps->dot11_he_cap.a_bqr = cfg_default(CFG_HE_A_BQR); + he_caps->dot11_he_cap.spatial_reuse_param_rspder = + cfg_default(CFG_HE_SR_RESPONDER); + he_caps->dot11_he_cap.ndp_feedback_supp = + cfg_default(CFG_HE_NDP_FEEDBACK_SUPP); + he_caps->dot11_he_cap.ops_supp = cfg_default(CFG_HE_OPS_SUPP); + he_caps->dot11_he_cap.amsdu_in_ampdu = + cfg_default(CFG_HE_AMSDU_IN_AMPDU); + + chan_width = cfg_default(CFG_HE_CHAN_WIDTH); + he_caps->dot11_he_cap.chan_width_0 = HE_CH_WIDTH_GET_BIT(chan_width, 0); + he_caps->dot11_he_cap.chan_width_1 = HE_CH_WIDTH_GET_BIT(chan_width, 1); + he_caps->dot11_he_cap.chan_width_2 = HE_CH_WIDTH_GET_BIT(chan_width, 2); + he_caps->dot11_he_cap.chan_width_3 = HE_CH_WIDTH_GET_BIT(chan_width, 3); + he_caps->dot11_he_cap.chan_width_4 = HE_CH_WIDTH_GET_BIT(chan_width, 4); + he_caps->dot11_he_cap.chan_width_5 = HE_CH_WIDTH_GET_BIT(chan_width, 5); + he_caps->dot11_he_cap.chan_width_6 = HE_CH_WIDTH_GET_BIT(chan_width, 6); + + he_caps->dot11_he_cap.multi_tid_aggr_tx_supp = + cfg_default(CFG_HE_MTID_AGGR_TX); + he_caps->dot11_he_cap.he_sub_ch_sel_tx_supp = + cfg_default(CFG_HE_SUB_CH_SEL_TX); + he_caps->dot11_he_cap.ul_2x996_tone_ru_supp = + cfg_default(CFG_HE_UL_2X996_RU); + he_caps->dot11_he_cap.om_ctrl_ul_mu_data_dis_rx = + cfg_default(CFG_HE_OM_CTRL_UL_MU_DIS_RX); + he_caps->dot11_he_cap.rx_pream_puncturing = + cfg_default(CFG_HE_RX_PREAM_PUNC); + he_caps->dot11_he_cap.device_class = + cfg_default(CFG_HE_CLASS_OF_DEVICE); + he_caps->dot11_he_cap.ldpc_coding = cfg_default(CFG_HE_LDPC); + he_caps->dot11_he_cap.he_1x_ltf_800_gi_ppdu = + cfg_default(CFG_HE_LTF_PPDU); + he_caps->dot11_he_cap.midamble_tx_rx_max_nsts = + cfg_default(CFG_HE_MIDAMBLE_RX_MAX_NSTS); + he_caps->dot11_he_cap.he_4x_ltf_3200_gi_ndp = + cfg_default(CFG_HE_LTF_NDP); + he_caps->dot11_he_cap.tx_stbc_lt_80mhz = + cfg_default(CFG_HE_TX_STBC_LT80); + he_caps->dot11_he_cap.rx_stbc_lt_80mhz = + cfg_default(CFG_HE_RX_STBC_LT80); + he_caps->dot11_he_cap.doppler = cfg_default(CFG_HE_DOPPLER); + he_caps->dot11_he_cap.ul_mu = cfg_default(CFG_HE_UL_MUMIMO); + he_caps->dot11_he_cap.dcm_enc_tx = cfg_default(CFG_HE_DCM_TX); + he_caps->dot11_he_cap.dcm_enc_rx = cfg_default(CFG_HE_DCM_RX); + he_caps->dot11_he_cap.ul_he_mu = cfg_default(CFG_HE_MU_PPDU); + he_caps->dot11_he_cap.su_beamformer = cfg_default(CFG_HE_SU_BEAMFORMER); + he_caps->dot11_he_cap.su_beamformee = cfg_default(CFG_HE_SU_BEAMFORMEE); + he_caps->dot11_he_cap.mu_beamformer = cfg_default(CFG_HE_MU_BEAMFORMER); + he_caps->dot11_he_cap.bfee_sts_lt_80 = + cfg_default(CFG_HE_BFEE_STS_LT80); + he_caps->dot11_he_cap.bfee_sts_gt_80 = + cfg_default(CFG_HE_BFEE_STS_GT80); + he_caps->dot11_he_cap.num_sounding_lt_80 = + cfg_default(CFG_HE_NUM_SOUND_LT80); + he_caps->dot11_he_cap.num_sounding_gt_80 = + cfg_default(CFG_HE_NUM_SOUND_GT80); + he_caps->dot11_he_cap.su_feedback_tone16 = + cfg_default(CFG_HE_SU_FEED_TONE16); + he_caps->dot11_he_cap.mu_feedback_tone16 = + cfg_default(CFG_HE_MU_FEED_TONE16); + he_caps->dot11_he_cap.codebook_su = cfg_default(CFG_HE_CODEBOOK_SU); + he_caps->dot11_he_cap.codebook_mu = cfg_default(CFG_HE_CODEBOOK_MU); + he_caps->dot11_he_cap.beamforming_feedback = + cfg_default(CFG_HE_BFRM_FEED); + he_caps->dot11_he_cap.he_er_su_ppdu = cfg_default(CFG_HE_ER_SU_PPDU); + he_caps->dot11_he_cap.dl_mu_mimo_part_bw = + cfg_default(CFG_HE_DL_PART_BW); + he_caps->dot11_he_cap.ppet_present = cfg_default(CFG_HE_PPET_PRESENT); + he_caps->dot11_he_cap.srp = cfg_default(CFG_HE_SRP); + he_caps->dot11_he_cap.power_boost = cfg_default(CFG_HE_POWER_BOOST); + he_caps->dot11_he_cap.he_ltf_800_gi_4x = cfg_default(CFG_HE_4x_LTF_GI); + he_caps->dot11_he_cap.max_nc = cfg_default(CFG_HE_MAX_NC); + he_caps->dot11_he_cap.tx_stbc_gt_80mhz = + cfg_default(CFG_HE_TX_STBC_GT80); + he_caps->dot11_he_cap.rx_stbc_gt_80mhz = + cfg_default(CFG_HE_RX_STBC_GT80); + he_caps->dot11_he_cap.er_he_ltf_800_gi_4x = + cfg_default(CFG_HE_ER_4x_LTF_GI); + he_caps->dot11_he_cap.he_ppdu_20_in_40Mhz_2G = cfg_default(CFG_HE_PPDU_20_IN_40MHZ_2G); - he_caps->he_ppdu_20_in_160_80p80mhz = + he_caps->dot11_he_cap.he_ppdu_20_in_160_80p80Mhz = cfg_default(CFG_HE_PPDU_20_IN_160_80P80MHZ); - he_caps->he_ppdu_80_in_160_80p80mhz = + he_caps->dot11_he_cap.he_ppdu_80_in_160_80p80Mhz = cfg_default(CFG_HE_PPDU_80_IN_160_80P80MHZ); - he_caps->he_er_1x_he_ltf_gi = + he_caps->dot11_he_cap.er_1x_he_ltf_gi = cfg_default(CFG_HE_ER_1X_HE_LTF_GI); - he_caps->he_midamble_rx_1x_he_ltf = - cfg_default(CFG_HE_MIDAMBLE_RX_1X_HE_LTF); - he_caps->he_dcm_max_bw = cfg_default(CFG_HE_DCM_MAX_BW); - he_caps->he_longer_16_sigb_ofdm_sym = + he_caps->dot11_he_cap.midamble_tx_rx_1x_he_ltf = + cfg_default(CFG_HE_MIDAMBLE_TXRX_1X_HE_LTF); + he_caps->dot11_he_cap.dcm_max_bw = cfg_default(CFG_HE_DCM_MAX_BW); + he_caps->dot11_he_cap.longer_than_16_he_sigb_ofdm_sym = cfg_default(CFG_HE_LONGER_16_SIGB_OFDM_SYM); - he_caps->he_non_trig_cqi_feedback = + he_caps->dot11_he_cap.non_trig_cqi_feedback = cfg_default(CFG_HE_NON_TRIG_CQI_FEEDBACK); - he_caps->he_tx_1024_qam_lt_242_ru = + he_caps->dot11_he_cap.tx_1024_qam_lt_242_tone_ru = cfg_default(CFG_HE_TX_1024_QAM_LT_242_RU); - he_caps->he_rx_1024_qam_lt_242_ru = + he_caps->dot11_he_cap.rx_1024_qam_lt_242_tone_ru = cfg_default(CFG_HE_RX_1024_QAM_LT_242_RU); - he_caps->he_rx_full_bw_mu_cmpr_sigb = + he_caps->dot11_he_cap.rx_full_bw_su_he_mu_compress_sigb = cfg_default(CFG_HE_RX_FULL_BW_MU_CMPR_SIGB); - he_caps->he_rx_full_bw_mu_non_cmpr_sigb = + he_caps->dot11_he_cap.rx_full_bw_su_he_mu_non_cmpr_sigb = cfg_default(CFG_HE_RX_FULL_BW_MU_NON_CMPR_SIGB); - he_caps->he_rx_mcs_map_lt_80 = cfg_default(CFG_HE_RX_MCS_MAP_LT_80); - he_caps->he_tx_mcs_map_lt_80 = cfg_default(CFG_HE_TX_MCS_MAP_LT_80); - he_caps->he_rx_mcs_map_160 = cfg_default(CFG_HE_RX_MCS_MAP_160); - he_caps->he_tx_mcs_map_160 = cfg_default(CFG_HE_TX_MCS_MAP_160); - he_caps->he_rx_mcs_map_80_80 = cfg_default(CFG_HE_RX_MCS_MAP_80_80); - he_caps->he_tx_mcs_map_80_80 = cfg_default(CFG_HE_TX_MCS_MAP_80_80); + he_caps->dot11_he_cap.rx_he_mcs_map_lt_80 = + cfg_default(CFG_HE_RX_MCS_MAP_LT_80); + he_caps->dot11_he_cap.tx_he_mcs_map_lt_80 = + cfg_default(CFG_HE_TX_MCS_MAP_LT_80); + value = cfg_default(CFG_HE_RX_MCS_MAP_160); + qdf_mem_copy(he_caps->dot11_he_cap.rx_he_mcs_map_160, &value, + sizeof(uint16_t)); + value = cfg_default(CFG_HE_TX_MCS_MAP_160); + qdf_mem_copy(he_caps->dot11_he_cap.tx_he_mcs_map_160, &value, + sizeof(uint16_t)); + value = cfg_default(CFG_HE_RX_MCS_MAP_80_80); + qdf_mem_copy(he_caps->dot11_he_cap.rx_he_mcs_map_80_80, &value, + sizeof(uint16_t)); + value = cfg_default(CFG_HE_TX_MCS_MAP_80_80); + qdf_mem_copy(he_caps->dot11_he_cap.tx_he_mcs_map_80_80, &value, + sizeof(uint16_t)); he_caps->he_ops_basic_mcs_nss = cfg_default(CFG_HE_OPS_BASIC_MCS_NSS); - he_caps->he_twt_dynamic_fragmentation = + he_caps->he_dynamic_fragmentation = cfg_get(psoc, CFG_HE_DYNAMIC_FRAGMENTATION); he_caps->enable_ul_mimo = cfg_get(psoc, CFG_ENABLE_UL_MIMO); @@ -992,6 +1048,12 @@ static void mlme_init_he_cap_in_cfg(struct wlan_objmgr_psoc *psoc, qdf_mem_zero(he_caps->he_ppet_2g, MLME_HE_PPET_LEN); qdf_mem_zero(he_caps->he_ppet_5g, MLME_HE_PPET_LEN); } +#else +static void mlme_init_he_cap_in_cfg(struct wlan_objmgr_psoc *psoc, + struct wlan_mlme_cfg *mlme_cfg) +{ +} +#endif static void mlme_init_sap_cfg(struct wlan_objmgr_psoc *psoc, struct wlan_mlme_cfg_sap *sap_cfg) @@ -1597,8 +1659,8 @@ QDF_STATUS mlme_cfg_on_psoc_enable(struct wlan_objmgr_psoc *psoc) mlme_init_vht_cap_cfg(psoc, &mlme_cfg->vht_caps.vht_cap_info); mlme_init_chainmask_cfg(psoc, &mlme_cfg->chainmask_cfg); mlme_init_sap_cfg(psoc, &mlme_cfg->sap_cfg); - mlme_init_he_cap_in_cfg(psoc, &mlme_cfg->he_caps); mlme_init_nss_chains(psoc, &mlme_cfg->nss_chains_ini_cfg); + mlme_init_he_cap_in_cfg(psoc, mlme_cfg); mlme_init_obss_ht40_cfg(psoc, &mlme_cfg->obss_ht40); mlme_init_product_details_cfg(&mlme_cfg->product_details); mlme_init_sta_cfg(psoc, &mlme_cfg->sta); diff --git a/components/mlme/dispatcher/inc/cfg_mlme_he_caps.h b/components/mlme/dispatcher/inc/cfg_mlme_he_caps.h index 5ff03754f473..3e61f4b716b4 100644 --- a/components/mlme/dispatcher/inc/cfg_mlme_he_caps.h +++ b/components/mlme/dispatcher/inc/cfg_mlme_he_caps.h @@ -38,13 +38,13 @@ 0, \ "HE Twt Responder") -#define CFG_HE_TWT_FRAGMENTATION CFG_UINT( \ - "he_twt_fragmentation", \ +#define CFG_HE_FRAGMENTATION CFG_UINT( \ + "he_fragmentation", \ 0, \ 3, \ 0, \ CFG_VALUE_OR_DEFAULT, \ - "HE Twt Fragmentation") + "HE Fragmentation") #define CFG_HE_MAX_FRAG_MSDU CFG_UINT( \ "he_max_frag_msdu", \ @@ -121,11 +121,6 @@ 0, \ "HE Multi Tid") -#define CFG_HE_DL_MU_BA CFG_BOOL( \ - "he_dl_mu_ba", \ - 0, \ - "HE Dl_Mu_Ba") - #define CFG_HE_OMI CFG_BOOL( \ "he_omi", \ 0, \ @@ -462,10 +457,10 @@ 0, \ "He Er 1x He Ltf Gi") -#define CFG_HE_MIDAMBLE_RX_1X_HE_LTF CFG_BOOL( \ - "he_midamble_rx_1x_he_ltf", \ +#define CFG_HE_MIDAMBLE_TXRX_1X_HE_LTF CFG_BOOL( \ + "he_midamble_txrx_1x_he_ltf", \ 0, \ - "He Midamble Rx 1x He Ltf") + "He Midamble Tx Rx 1x He Ltf") #define CFG_HE_DCM_MAX_BW CFG_UINT( \ "he_dcm_max_bw", \ @@ -561,6 +556,7 @@ CFG_VALUE_OR_DEFAULT, \ "He Ops Basic Mcs NSS") +/* 11AX related INI configuration */ /* * * he_dynamic_frag_support - configure dynamic fragmentation @@ -584,7 +580,8 @@ 3, \ 0, \ CFG_VALUE_OR_DEFAULT, \ - "HE Dynamic Twt Fragmentation") + "HE Dynamic Fragmentation") + /* * @@ -666,7 +663,7 @@ CFG(CFG_HE_CONTROL) \ CFG(CFG_HE_TWT_REQUESTOR) \ CFG(CFG_HE_TWT_RESPONDER) \ - CFG(CFG_HE_TWT_FRAGMENTATION) \ + CFG(CFG_HE_FRAGMENTATION) \ CFG(CFG_HE_MAX_FRAG_MSDU) \ CFG(CFG_HE_MIN_FRAG_SIZE) \ CFG(CFG_HE_TRIG_PAD) \ @@ -679,7 +676,6 @@ CFG(CFG_HE_BA_32BIT) \ CFG(CFG_HE_MU_CASCADING) \ CFG(CFG_HE_MULTI_TID) \ - CFG(CFG_HE_DL_MU_BA) \ CFG(CFG_HE_OMI) \ CFG(CFG_HE_OFDMA_RA) \ CFG(CFG_HE_MAX_AMPDU_LEN) \ @@ -737,7 +733,7 @@ CFG(CFG_HE_PPDU_20_IN_160_80P80MHZ) \ CFG(CFG_HE_PPDU_80_IN_160_80P80MHZ) \ CFG(CFG_HE_ER_1X_HE_LTF_GI) \ - CFG(CFG_HE_MIDAMBLE_RX_1X_HE_LTF) \ + CFG(CFG_HE_MIDAMBLE_TXRX_1X_HE_LTF) \ CFG(CFG_HE_DCM_MAX_BW) \ CFG(CFG_HE_LONGER_16_SIGB_OFDM_SYM) \ CFG(CFG_HE_NON_TRIG_CQI_FEEDBACK) \ diff --git a/components/mlme/dispatcher/inc/wlan_mlme_api.h b/components/mlme/dispatcher/inc/wlan_mlme_api.h index eba46fecf659..bd37440e5e37 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_api.h @@ -659,6 +659,62 @@ QDF_STATUS wlan_mlme_get_oce_sta_enabled_info(struct wlan_objmgr_psoc *psoc, QDF_STATUS wlan_mlme_get_oce_sap_enabled_info(struct wlan_objmgr_psoc *psoc, bool *value); +#ifdef WLAN_FEATURE_11AX +/** + * wlan_mlme_cfg_get_he_ul_mumimo() - Get the HE Ul Mumio + * @psoc: pointer to psoc object + * @value: Value that needs to be set from the caller + * + * Return: QDF Status + */ +QDF_STATUS wlan_mlme_cfg_get_he_ul_mumimo(struct wlan_objmgr_psoc *psoc, + uint32_t *value); + +/** + * wlan_mlme_cfg_set_he_ul_mumimo() - Set the HE Ul Mumio + * @psoc: pointer to psoc object + * @value: Value that needs to be set from the caller + * + * Return: QDF Status + */ +QDF_STATUS wlan_mlme_cfg_set_he_ul_mumimo(struct wlan_objmgr_psoc *psoc, + uint32_t value); + +/** + * wlan_mlme_cfg_get_enable_ul_mimo() - Get the HE Ul mimo + * @psoc: pointer to psoc object + * @value: Value that needs to be set from the caller + * + * Return: QDF Status + */ +QDF_STATUS wlan_mlme_cfg_get_enable_ul_mimo(struct wlan_objmgr_psoc *psoc, + uint8_t *value); + +/** + * wlan_mlme_cfg_get_enable_ul_ofdm() - Get enable ul ofdm + * @psoc: pointer to psoc object + * @value: Value that needs to be set from the caller + * + * Return: QDF Status + */ +QDF_STATUS wlan_mlme_cfg_get_enable_ul_ofdm(struct wlan_objmgr_psoc *psoc, + uint8_t *value); + +/** + * mlme_update_tgt_he_caps_in_cfg() - Update tgt he cap in mlme component + * + * @psoc: pointer to psoc object + * @cfg: pointer to config params from target + * + * This api to be used by callers to update + * he caps in mlme. + * + * Return: QDF_STATUS_SUCCESS or QDF_STATUS_FAILURE + */ +QDF_STATUS mlme_update_tgt_he_caps_in_cfg(struct wlan_objmgr_psoc *psoc, + struct wma_tgt_cfg *cfg); +#endif + /** * wlan_mlme_get_rts_threshold() - Get the RTS threshold config * @psoc: pointer to psoc object diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index 100a0c9ec590..5f086836a0ec 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -26,6 +26,7 @@ #include #include #include +#include #define CFG_PMKID_MODES_OKC (0x1) #define CFG_PMKID_MODES_PMKSA_CACHING (0x2) @@ -696,107 +697,22 @@ struct wlan_mlme_qos { bool sap_max_inactivity_override; }; +#ifdef WLAN_FEATURE_11AX #define MLME_HE_PPET_LEN 25 /** * struct wlan_mlme_he_caps - HE Capabilities related config items */ struct wlan_mlme_he_caps { - uint8_t he_control; - uint8_t he_twt_requestor; - uint8_t he_twt_responder; - uint8_t he_twt_fragmentation; - uint8_t he_max_frag_msdu; - uint8_t he_min_frag_size; - uint8_t he_trig_pad; - uint8_t he_mtid_aggr_rx; - uint8_t he_link_adaptation; - uint8_t he_all_ack; - uint8_t he_trigd_rsp_scheduling; - uint8_t he_buffer_status_rpt; - uint8_t he_bcast_twt; - uint8_t he_ba_32bit; - uint8_t he_mu_cascading; - uint8_t he_multi_tid; - uint8_t he_dl_mu_ba; - uint8_t he_omi; - uint8_t he_ofdma_ra; - uint8_t he_max_ampdu_len; - uint8_t he_amsdu_frag; - uint8_t he_flex_twt_sched; - uint8_t he_rx_ctrl; - uint8_t he_bsrp_ampdu_aggr; - uint8_t he_qtp; - uint8_t he_a_bqr; - uint8_t he_sr_responder; - uint8_t he_ndp_feedback_supp; - uint8_t he_ops_supp; - uint8_t he_amsdu_in_ampdu; - uint8_t he_chan_width; - uint8_t he_mtid_aggr_tx; - uint8_t he_sub_ch_sel_tx; - uint8_t he_ul_2x996_ru; - uint8_t he_om_ctrl_ul_mu_dis_rx; - uint8_t he_rx_pream_punc; - uint8_t he_class_of_device; - uint8_t he_ldpc; - uint8_t he_ltf_ppdu; - uint8_t he_midamble_rx_nsts; - uint8_t he_ltf_ndp; - uint8_t he_tx_stbc_lt80; - uint8_t he_rx_stbc_lt80; - uint8_t he_doppler; - uint8_t he_ul_mumimo; - uint8_t he_dcm_tx; - uint8_t he_dcm_rx; - uint8_t he_mu_ppdu; - uint8_t he_su_beamformer; - uint8_t he_su_beamformee; - uint8_t he_mu_beamformer; - uint8_t he_bfee_sts_lt80; - uint8_t he_bfee_sts_gt80; - uint8_t he_num_sound_lt80; - uint8_t he_num_sound_gt80; - uint8_t he_su_feed_tone16; - uint8_t he_mu_feed_tone16; - uint8_t he_codebook_su; - uint8_t he_codebook_mu; - uint8_t he_bfrm_feed; - uint8_t he_er_su_ppdu; - uint8_t he_dl_part_bw; - uint8_t he_ppet_present; - uint8_t he_srp; - uint8_t he_power_boost; - uint8_t he_4x_ltf_gi; - uint8_t he_max_nc; - uint8_t he_rx_stbc_gt80; - uint8_t he_tx_stbc_gt80; - uint8_t he_er_4x_ltf_gi; - uint8_t he_ppdu_20_in_40mhz_2g; - uint8_t he_ppdu_20_in_160_80p80mhz; - uint8_t he_ppdu_80_in_160_80p80mhz; - uint8_t he_er_1x_he_ltf_gi; - uint8_t he_midamble_rx_1x_he_ltf; - uint8_t he_dcm_max_bw; - uint8_t he_longer_16_sigb_ofdm_sym; - uint8_t he_non_trig_cqi_feedback; - uint8_t he_tx_1024_qam_lt_242_ru; - uint8_t he_rx_1024_qam_lt_242_ru; - uint8_t he_rx_full_bw_mu_cmpr_sigb; - uint8_t he_rx_full_bw_mu_non_cmpr_sigb; - uint32_t he_rx_mcs_map_lt_80; - uint32_t he_tx_mcs_map_lt_80; - uint32_t he_rx_mcs_map_160; - uint32_t he_tx_mcs_map_160; - uint32_t he_rx_mcs_map_80_80; - uint32_t he_tx_mcs_map_80_80; + tDot11fIEhe_cap dot11_he_cap; uint8_t he_ppet_2g[MLME_HE_PPET_LEN]; uint8_t he_ppet_5g[MLME_HE_PPET_LEN]; uint32_t he_ops_basic_mcs_nss; - uint8_t he_twt_dynamic_fragmentation; + uint8_t he_dynamic_fragmentation; uint8_t enable_ul_mimo; uint8_t enable_ul_ofdm; uint32_t he_sta_obsspd; }; +#endif /** * struct wlan_mlme_rates - RATES related config items @@ -1549,7 +1465,9 @@ struct wlan_mlme_cfg { struct wlan_mlme_edca_params edca_params; struct wlan_mlme_generic gen; struct wlan_mlme_ht_caps ht_caps; +#ifdef WLAN_FEATURE_11AX struct wlan_mlme_he_caps he_caps; +#endif struct wlan_mlme_lfr_cfg lfr; struct wlan_mlme_obss_ht40 obss_ht40; struct wlan_mlme_mbo mbo_cfg; diff --git a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h index efd04a233a69..9d368a65f6ba 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h @@ -28,6 +28,7 @@ #include #include #include +#include "wma_tgt_cfg.h" /** * ucfg_mlme_init() - initialize mlme_ctx context. @@ -2213,6 +2214,82 @@ ucfg_mlme_get_wmm_mode(struct wlan_objmgr_psoc *psoc, uint8_t *value) return wlan_mlme_get_wmm_mode(psoc, value); } +#ifdef WLAN_FEATURE_11AX +/** + * ucfg_mlme_update_tgt_he_cap() - Update tgt he cap in mlme component + * + * @psoc: pointer to psoc object + * @cfg: pointer to config params from target + * + * Inline UCFG API to be used by HDD/OSIF callers to update + * he caps in mlme. + * + * Return: QDF_STATUS_SUCCESS or QDF_STATUS_FAILURE + */ +static inline +QDF_STATUS ucfg_mlme_update_tgt_he_cap(struct wlan_objmgr_psoc *psoc, + struct wma_tgt_cfg *cfg) +{ + return mlme_update_tgt_he_caps_in_cfg(psoc, cfg); +} + +/** + * ucfg_mlme_cfg_get_he_ul_mumimo() - Get the HE Ul Mumio + * @psoc: pointer to psoc object + * @value: Value that needs to be set from the caller + * + * Return: QDF Status + */ +static inline +QDF_STATUS ucfg_mlme_cfg_get_he_ul_mumimo(struct wlan_objmgr_psoc *psoc, + uint32_t *value) +{ + return wlan_mlme_cfg_get_he_ul_mumimo(psoc, value); +} + +/** + * ucfg_mlme_cfg_set_he_ul_mumimo() - Set the HE Ul Mumio + * @psoc: pointer to psoc object + * @value: Value that needs to be set from the caller + * + * Return: QDF Status + */ +static inline +QDF_STATUS ucfg_mlme_cfg_set_he_ul_mumimo(struct wlan_objmgr_psoc *psoc, + uint32_t value) +{ + return wlan_mlme_cfg_set_he_ul_mumimo(psoc, value); +} + +/** + * ucfg_mlme_cfg_get_enable_ul_mimo() - Get the HE Ul mimo + * @psoc: pointer to psoc object + * @value: Value that needs to be set from the caller + * + * Return: QDF Status + */ +static inline +QDF_STATUS ucfg_mlme_cfg_get_enable_ul_mimo(struct wlan_objmgr_psoc *psoc, + uint8_t *value) +{ + return wlan_mlme_cfg_get_enable_ul_mimo(psoc, value); +} + +/** + * ucfg_mlme_cfg_get_enable_ul_ofdm() - Get enable ul ofdm + * @psoc: pointer to psoc object + * @value: Value that needs to be set from the caller + * + * Return: QDF Status + */ +static inline +QDF_STATUS ucfg_mlme_cfg_get_enable_ul_ofdm(struct wlan_objmgr_psoc *psoc, + uint8_t *value) +{ + return wlan_mlme_cfg_get_enable_ul_ofdm(psoc, value); +} +#endif + /** * ucfg_mlme_get_80211e_is_enabled() - Enable 802.11e feature * @psoc: pointer to psoc object diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c index c7c97cc6516f..10e1eee3c3cf 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_api.c @@ -454,6 +454,354 @@ QDF_STATUS wlan_mlme_get_tx_chainmask_1ss(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_SUCCESS; } +#ifdef WLAN_FEATURE_11AX +QDF_STATUS wlan_mlme_cfg_get_he_ul_mumimo(struct wlan_objmgr_psoc *psoc, + uint32_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.he_caps.dot11_he_cap.ul_mu; + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS wlan_mlme_cfg_set_he_ul_mumimo(struct wlan_objmgr_psoc *psoc, + uint32_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; + } + + if (!cfg_in_range(CFG_HE_UL_MUMIMO, value)) { + mlme_debug("Failed to set CFG_HE_UL_MUMIMO with %d", value); + return QDF_STATUS_E_FAILURE; + } + + mlme_obj->cfg.he_caps.dot11_he_cap.ul_mu = value; + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS wlan_mlme_cfg_get_enable_ul_mimo(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.he_caps.enable_ul_mimo; + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS wlan_mlme_cfg_get_enable_ul_ofdm(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.he_caps.enable_ul_ofdm; + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS mlme_update_tgt_he_caps_in_cfg(struct wlan_objmgr_psoc *psoc, + struct wma_tgt_cfg *wma_cfg) +{ + uint8_t chan_width; + QDF_STATUS status = QDF_STATUS_SUCCESS; + tDot11fIEhe_cap *he_cap = &wma_cfg->he_cap; + struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc); + uint8_t value; + + if (!mlme_obj) { + mlme_err("Failed to get MLME Obj"); + return QDF_STATUS_E_FAILURE; + } + + mlme_obj->cfg.he_caps.dot11_he_cap.present = 1; + mlme_obj->cfg.he_caps.dot11_he_cap.htc_he = he_cap->htc_he; + + mlme_obj->cfg.he_caps.dot11_he_cap.twt_request = + he_cap->twt_request; + mlme_obj->cfg.he_caps.dot11_he_cap.twt_responder = + he_cap->twt_responder; + + value = QDF_MIN( + he_cap->fragmentation, + mlme_obj->cfg.he_caps.he_dynamic_fragmentation); + + if (cfg_in_range(CFG_HE_FRAGMENTATION, value)) + mlme_obj->cfg.he_caps.dot11_he_cap.fragmentation = value; + + if (cfg_in_range(CFG_HE_MAX_FRAG_MSDU, + he_cap->max_num_frag_msdu_amsdu_exp)) + mlme_obj->cfg.he_caps.dot11_he_cap.max_num_frag_msdu_amsdu_exp = + he_cap->max_num_frag_msdu_amsdu_exp; + if (cfg_in_range(CFG_HE_MIN_FRAG_SIZE, he_cap->min_frag_size)) + mlme_obj->cfg.he_caps.dot11_he_cap.min_frag_size = + he_cap->min_frag_size; + if (cfg_in_range(CFG_HE_TRIG_PAD, he_cap->trigger_frm_mac_pad)) + mlme_obj->cfg.he_caps.dot11_he_cap.trigger_frm_mac_pad = + he_cap->trigger_frm_mac_pad; + if (cfg_in_range(CFG_HE_MTID_AGGR_RX, he_cap->multi_tid_aggr_rx_supp)) + mlme_obj->cfg.he_caps.dot11_he_cap.multi_tid_aggr_rx_supp = + he_cap->multi_tid_aggr_rx_supp; + if (cfg_in_range(CFG_HE_MTID_AGGR_TX, he_cap->multi_tid_aggr_tx_supp)) + mlme_obj->cfg.he_caps.dot11_he_cap.multi_tid_aggr_tx_supp = + he_cap->multi_tid_aggr_tx_supp; + if (cfg_in_range(CFG_HE_LINK_ADAPTATION, he_cap->he_link_adaptation)) + mlme_obj->cfg.he_caps.dot11_he_cap.he_link_adaptation = + he_cap->he_link_adaptation; + mlme_obj->cfg.he_caps.dot11_he_cap.all_ack = he_cap->all_ack; + mlme_obj->cfg.he_caps.dot11_he_cap.trigd_rsp_sched = + he_cap->trigd_rsp_sched; + mlme_obj->cfg.he_caps.dot11_he_cap.a_bsr = he_cap->a_bsr; + mlme_obj->cfg.he_caps.dot11_he_cap.broadcast_twt = + he_cap->broadcast_twt; + mlme_obj->cfg.he_caps.dot11_he_cap.ba_32bit_bitmap = + he_cap->ba_32bit_bitmap; + mlme_obj->cfg.he_caps.dot11_he_cap.mu_cascade = he_cap->mu_cascade; + mlme_obj->cfg.he_caps.dot11_he_cap.ack_enabled_multitid = + he_cap->ack_enabled_multitid; + mlme_obj->cfg.he_caps.dot11_he_cap.omi_a_ctrl = he_cap->omi_a_ctrl; + mlme_obj->cfg.he_caps.dot11_he_cap.ofdma_ra = he_cap->ofdma_ra; + if (cfg_in_range(CFG_HE_MAX_AMPDU_LEN, he_cap->max_ampdu_len_exp_ext)) + mlme_obj->cfg.he_caps.dot11_he_cap.max_ampdu_len_exp_ext = + he_cap->max_ampdu_len_exp_ext; + mlme_obj->cfg.he_caps.dot11_he_cap.amsdu_frag = he_cap->amsdu_frag; + mlme_obj->cfg.he_caps.dot11_he_cap.flex_twt_sched = + he_cap->flex_twt_sched; + mlme_obj->cfg.he_caps.dot11_he_cap.rx_ctrl_frame = + he_cap->rx_ctrl_frame; + mlme_obj->cfg.he_caps.dot11_he_cap.bsrp_ampdu_aggr = + he_cap->bsrp_ampdu_aggr; + mlme_obj->cfg.he_caps.dot11_he_cap.qtp = he_cap->qtp; + mlme_obj->cfg.he_caps.dot11_he_cap.a_bqr = he_cap->a_bqr; + mlme_obj->cfg.he_caps.dot11_he_cap.spatial_reuse_param_rspder = + he_cap->spatial_reuse_param_rspder; + mlme_obj->cfg.he_caps.dot11_he_cap.ndp_feedback_supp = + he_cap->ndp_feedback_supp; + mlme_obj->cfg.he_caps.dot11_he_cap.ops_supp = he_cap->ops_supp; + mlme_obj->cfg.he_caps.dot11_he_cap.amsdu_in_ampdu = + he_cap->amsdu_in_ampdu; + mlme_obj->cfg.he_caps.dot11_he_cap.he_sub_ch_sel_tx_supp = + he_cap->he_sub_ch_sel_tx_supp; + mlme_obj->cfg.he_caps.dot11_he_cap.ul_2x996_tone_ru_supp = + he_cap->ul_2x996_tone_ru_supp; + mlme_obj->cfg.he_caps.dot11_he_cap.om_ctrl_ul_mu_data_dis_rx = + he_cap->om_ctrl_ul_mu_data_dis_rx; + + chan_width = HE_CH_WIDTH_COMBINE(he_cap->chan_width_0, + he_cap->chan_width_1, + he_cap->chan_width_2, + he_cap->chan_width_3, + he_cap->chan_width_4, + he_cap->chan_width_5, + he_cap->chan_width_6); + if (cfg_in_range(CFG_HE_CHAN_WIDTH, chan_width)) { + mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_0 = + he_cap->chan_width_0; + mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_1 = + he_cap->chan_width_1; + mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_2 = + he_cap->chan_width_2; + mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_3 = + he_cap->chan_width_3; + mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_4 = + he_cap->chan_width_4; + mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_5 = + he_cap->chan_width_5; + mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_6 = + he_cap->chan_width_6; + } + if (cfg_in_range(CFG_HE_RX_PREAM_PUNC, he_cap->rx_pream_puncturing)) + mlme_obj->cfg.he_caps.dot11_he_cap.rx_pream_puncturing = + he_cap->rx_pream_puncturing; + mlme_obj->cfg.he_caps.dot11_he_cap.device_class = he_cap->device_class; + mlme_obj->cfg.he_caps.dot11_he_cap.ldpc_coding = he_cap->ldpc_coding; + if (cfg_in_range(CFG_HE_LTF_PPDU, he_cap->he_1x_ltf_800_gi_ppdu)) + mlme_obj->cfg.he_caps.dot11_he_cap.he_1x_ltf_800_gi_ppdu = + he_cap->he_1x_ltf_800_gi_ppdu; + if (cfg_in_range(CFG_HE_MIDAMBLE_RX_MAX_NSTS, + he_cap->midamble_tx_rx_max_nsts)) + mlme_obj->cfg.he_caps.dot11_he_cap.midamble_tx_rx_max_nsts = + he_cap->midamble_tx_rx_max_nsts; + mlme_obj->cfg.he_caps.dot11_he_cap.he_4x_ltf_3200_gi_ndp = + he_cap->he_4x_ltf_3200_gi_ndp; + if (mlme_obj->cfg.vht_caps.vht_cap_info.rx_stbc) { + mlme_obj->cfg.he_caps.dot11_he_cap.rx_stbc_lt_80mhz = + he_cap->rx_stbc_lt_80mhz; + mlme_obj->cfg.he_caps.dot11_he_cap.rx_stbc_gt_80mhz = + he_cap->rx_stbc_gt_80mhz; + } else { + mlme_obj->cfg.he_caps.dot11_he_cap.rx_stbc_lt_80mhz = 0; + mlme_obj->cfg.he_caps.dot11_he_cap.rx_stbc_gt_80mhz = 0; + } + if (mlme_obj->cfg.vht_caps.vht_cap_info.tx_stbc) { + mlme_obj->cfg.he_caps.dot11_he_cap.tx_stbc_lt_80mhz = + he_cap->tx_stbc_lt_80mhz; + mlme_obj->cfg.he_caps.dot11_he_cap.tx_stbc_gt_80mhz = + he_cap->tx_stbc_gt_80mhz; + } else { + mlme_obj->cfg.he_caps.dot11_he_cap.tx_stbc_lt_80mhz = 0; + mlme_obj->cfg.he_caps.dot11_he_cap.tx_stbc_gt_80mhz = 0; + } + + if (cfg_in_range(CFG_HE_DOPPLER, he_cap->doppler)) + mlme_obj->cfg.he_caps.dot11_he_cap.doppler = he_cap->doppler; + if (cfg_in_range(CFG_HE_UL_MUMIMO, he_cap->ul_mu)) + mlme_obj->cfg.he_caps.dot11_he_cap.ul_mu = he_cap->ul_mu; + if (cfg_in_range(CFG_HE_DCM_TX, he_cap->dcm_enc_tx)) + mlme_obj->cfg.he_caps.dot11_he_cap.dcm_enc_tx = + he_cap->dcm_enc_tx; + if (cfg_in_range(CFG_HE_DCM_RX, he_cap->dcm_enc_rx)) + mlme_obj->cfg.he_caps.dot11_he_cap.dcm_enc_rx = + he_cap->dcm_enc_rx; + mlme_obj->cfg.he_caps.dot11_he_cap.ul_he_mu = he_cap->ul_he_mu; + if (mlme_obj->cfg.vht_caps.vht_cap_info.su_bformer) { + mlme_obj->cfg.he_caps.dot11_he_cap.su_beamformer = + he_cap->su_beamformer; + if (cfg_in_range(CFG_HE_NUM_SOUND_LT80, + he_cap->num_sounding_lt_80)) + mlme_obj->cfg.he_caps.dot11_he_cap.num_sounding_lt_80 = + he_cap->num_sounding_lt_80; + if (cfg_in_range(CFG_HE_NUM_SOUND_GT80, + he_cap->num_sounding_gt_80)) + mlme_obj->cfg.he_caps.dot11_he_cap.num_sounding_gt_80 = + he_cap->num_sounding_gt_80; + mlme_obj->cfg.he_caps.dot11_he_cap.mu_beamformer = + he_cap->mu_beamformer; + + } else { + mlme_obj->cfg.he_caps.dot11_he_cap.su_beamformer = 0; + mlme_obj->cfg.he_caps.dot11_he_cap.num_sounding_lt_80 = 0; + mlme_obj->cfg.he_caps.dot11_he_cap.num_sounding_gt_80 = 0; + mlme_obj->cfg.he_caps.dot11_he_cap.mu_beamformer = 0; + } + + if (mlme_obj->cfg.vht_caps.vht_cap_info.su_bformee) { + mlme_obj->cfg.he_caps.dot11_he_cap.su_beamformee = + he_cap->su_beamformee; + if (cfg_in_range(CFG_HE_BFEE_STS_LT80, he_cap->bfee_sts_lt_80)) + mlme_obj->cfg.he_caps.dot11_he_cap.bfee_sts_lt_80 = + he_cap->bfee_sts_lt_80; + if (cfg_in_range(CFG_HE_BFEE_STS_GT80, he_cap->bfee_sts_gt_80)) + mlme_obj->cfg.he_caps.dot11_he_cap.bfee_sts_gt_80 = + he_cap->bfee_sts_gt_80; + + } else { + mlme_obj->cfg.he_caps.dot11_he_cap.su_beamformee = 0; + mlme_obj->cfg.he_caps.dot11_he_cap.bfee_sts_lt_80 = 0; + mlme_obj->cfg.he_caps.dot11_he_cap.bfee_sts_gt_80 = 0; + } + mlme_obj->cfg.he_caps.dot11_he_cap.su_feedback_tone16 = + he_cap->su_feedback_tone16; + mlme_obj->cfg.he_caps.dot11_he_cap.mu_feedback_tone16 = + he_cap->mu_feedback_tone16; + mlme_obj->cfg.he_caps.dot11_he_cap.codebook_su = he_cap->codebook_su; + mlme_obj->cfg.he_caps.dot11_he_cap.codebook_mu = he_cap->codebook_mu; + if (cfg_in_range(CFG_HE_BFRM_FEED, he_cap->beamforming_feedback)) + mlme_obj->cfg.he_caps.dot11_he_cap.beamforming_feedback = + he_cap->beamforming_feedback; + mlme_obj->cfg.he_caps.dot11_he_cap.he_er_su_ppdu = + he_cap->he_er_su_ppdu; + mlme_obj->cfg.he_caps.dot11_he_cap.dl_mu_mimo_part_bw = + he_cap->dl_mu_mimo_part_bw; + mlme_obj->cfg.he_caps.dot11_he_cap.ppet_present = he_cap->ppet_present; + mlme_obj->cfg.he_caps.dot11_he_cap.srp = he_cap->srp; + mlme_obj->cfg.he_caps.dot11_he_cap.power_boost = he_cap->power_boost; + mlme_obj->cfg.he_caps.dot11_he_cap.he_ltf_800_gi_4x = + he_cap->he_ltf_800_gi_4x; + if (cfg_in_range(CFG_HE_MAX_NC, he_cap->max_nc)) + mlme_obj->cfg.he_caps.dot11_he_cap.max_nc = he_cap->max_nc; + mlme_obj->cfg.he_caps.dot11_he_cap.er_he_ltf_800_gi_4x = + he_cap->er_he_ltf_800_gi_4x; + mlme_obj->cfg.he_caps.dot11_he_cap.he_ppdu_20_in_40Mhz_2G = + he_cap->he_ppdu_20_in_40Mhz_2G; + mlme_obj->cfg.he_caps.dot11_he_cap.he_ppdu_20_in_160_80p80Mhz = + he_cap->he_ppdu_20_in_160_80p80Mhz; + mlme_obj->cfg.he_caps.dot11_he_cap.he_ppdu_80_in_160_80p80Mhz = + he_cap->he_ppdu_80_in_160_80p80Mhz; + mlme_obj->cfg.he_caps.dot11_he_cap.er_1x_he_ltf_gi = + he_cap->er_1x_he_ltf_gi; + mlme_obj->cfg.he_caps.dot11_he_cap.midamble_tx_rx_1x_he_ltf = + he_cap->midamble_tx_rx_1x_he_ltf; + if (cfg_in_range(CFG_HE_DCM_MAX_BW, he_cap->dcm_max_bw)) + mlme_obj->cfg.he_caps.dot11_he_cap.dcm_max_bw = + he_cap->dcm_max_bw; + mlme_obj->cfg.he_caps.dot11_he_cap.longer_than_16_he_sigb_ofdm_sym = + he_cap->longer_than_16_he_sigb_ofdm_sym; + mlme_obj->cfg.he_caps.dot11_he_cap.tx_1024_qam_lt_242_tone_ru = + he_cap->tx_1024_qam_lt_242_tone_ru; + mlme_obj->cfg.he_caps.dot11_he_cap.rx_1024_qam_lt_242_tone_ru = + he_cap->rx_1024_qam_lt_242_tone_ru; + mlme_obj->cfg.he_caps.dot11_he_cap.non_trig_cqi_feedback = + he_cap->non_trig_cqi_feedback; + mlme_obj->cfg.he_caps.dot11_he_cap.rx_full_bw_su_he_mu_compress_sigb = + he_cap->rx_full_bw_su_he_mu_compress_sigb; + mlme_obj->cfg.he_caps.dot11_he_cap.rx_full_bw_su_he_mu_non_cmpr_sigb = + he_cap->rx_full_bw_su_he_mu_non_cmpr_sigb; + + if (cfg_in_range(CFG_HE_RX_MCS_MAP_LT_80, he_cap->rx_he_mcs_map_lt_80)) + mlme_obj->cfg.he_caps.dot11_he_cap.rx_he_mcs_map_lt_80 = + he_cap->rx_he_mcs_map_lt_80; + if (cfg_in_range(CFG_HE_TX_MCS_MAP_LT_80, he_cap->tx_he_mcs_map_lt_80)) + mlme_obj->cfg.he_caps.dot11_he_cap.tx_he_mcs_map_lt_80 = + he_cap->tx_he_mcs_map_lt_80; + if (cfg_in_range(CFG_HE_RX_MCS_MAP_160, + *((uint16_t *)he_cap->rx_he_mcs_map_160))) + qdf_mem_copy(mlme_obj->cfg.he_caps.dot11_he_cap. + rx_he_mcs_map_160, + he_cap->rx_he_mcs_map_160, sizeof(uint16_t)); + + if (cfg_in_range(CFG_HE_TX_MCS_MAP_160, + *((uint16_t *)he_cap->tx_he_mcs_map_160))) + qdf_mem_copy(mlme_obj->cfg.he_caps.dot11_he_cap. + tx_he_mcs_map_160, + he_cap->tx_he_mcs_map_160, sizeof(uint16_t)); + + if (cfg_in_range(CFG_HE_RX_MCS_MAP_80_80, + *((uint16_t *)he_cap->rx_he_mcs_map_80_80))) + qdf_mem_copy(mlme_obj->cfg.he_caps.dot11_he_cap. + rx_he_mcs_map_80_80, + he_cap->rx_he_mcs_map_80_80, sizeof(uint16_t)); + + if (cfg_in_range(CFG_HE_TX_MCS_MAP_80_80, + *((uint16_t *)he_cap->tx_he_mcs_map_80_80))) + qdf_mem_copy(mlme_obj->cfg.he_caps.dot11_he_cap. + tx_he_mcs_map_80_80, + he_cap->tx_he_mcs_map_80_80, sizeof(uint16_t)); + + qdf_mem_copy(mlme_obj->cfg.he_caps.he_ppet_2g, wma_cfg->ppet_2g, + HE_MAX_PPET_SIZE); + + qdf_mem_copy(mlme_obj->cfg.he_caps.he_ppet_5g, wma_cfg->ppet_5g, + HE_MAX_PPET_SIZE); + + return status; +} +#endif + QDF_STATUS wlan_mlme_get_num_11b_tx_chains(struct wlan_objmgr_psoc *psoc, uint16_t *value) { diff --git a/core/hdd/src/wlan_hdd_he.c b/core/hdd/src/wlan_hdd_he.c index 67f01c1d500e..0b2464c492ae 100644 --- a/core/hdd/src/wlan_hdd_he.c +++ b/core/hdd/src/wlan_hdd_he.c @@ -27,6 +27,8 @@ #include "wlan_hdd_he.h" #include "wma_he.h" #include "wlan_utility.h" +#include "wlan_mlme_ucfg_api.h" + /** * hdd_he_set_wni_cfg() - Update WNI CFG @@ -60,6 +62,7 @@ void hdd_update_tgt_he_cap(struct hdd_context *hdd_ctx, uint8_t value = 0; bool bval; + ucfg_mlme_update_tgt_he_cap(hdd_ctx->psoc, cfg); hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_CONTROL, he_cap->htc_he); hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_TWT_REQUESTOR, he_cap->twt_request); @@ -300,20 +303,15 @@ void wlan_hdd_check_11ax_support(struct hdd_beacon_data *beacon, int hdd_update_he_cap_in_cfg(struct hdd_context *hdd_ctx) { - uint32_t val, val1 = 0; + uint32_t val; + uint32_t val1 = 0; QDF_STATUS status; int ret; - struct hdd_config *config = hdd_ctx->config; + uint8_t enable_ul_ofdma, enable_ul_mimo; - ret = hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_STA_OBSSPD, - config->he_sta_obsspd); - if (ret) - return ret; - - status = sme_cfg_get_int(hdd_ctx->mac_handle, - WNI_CFG_HE_UL_MUMIMO, &val); + status = ucfg_mlme_cfg_get_he_ul_mumimo(hdd_ctx->psoc, &val); if (QDF_IS_STATUS_ERROR(status)) { - hdd_err("could not get WNI_CFG_HE_UL_MUMIMO"); + hdd_err("could not get CFG_HE_UL_MUMIMO"); return qdf_status_to_os_return(status); } @@ -321,13 +319,21 @@ int hdd_update_he_cap_in_cfg(struct hdd_context *hdd_ctx) * Bit 1 - corresponds to UL MIMO * Bit 2 - corresponds to UL OFDMA */ + ret = ucfg_mlme_cfg_get_enable_ul_mimo(hdd_ctx->psoc, + &enable_ul_mimo); + if (ret) + return ret; + ret = ucfg_mlme_cfg_get_enable_ul_ofdm(hdd_ctx->psoc, + &enable_ul_ofdma); + if (ret) + return ret; if (val & 0x1) - val1 = config->enable_ul_mimo & 0x1; + val1 = enable_ul_mimo & 0x1; if ((val >> 1) & 0x1) - val1 |= ((config->enable_ul_ofdma & 0x1) << 1); + val1 |= ((enable_ul_ofdma & 0x1) << 1); - ret = hdd_he_set_wni_cfg(hdd_ctx, WNI_CFG_HE_UL_MUMIMO, val1); + ret = ucfg_mlme_cfg_set_he_ul_mumimo(hdd_ctx->psoc, val1); return ret; } diff --git a/core/mac/src/pe/lim/lim_process_assoc_req_frame.c b/core/mac/src/pe/lim/lim_process_assoc_req_frame.c index 0e4ab83283ca..73f623e4cefd 100644 --- a/core/mac/src/pe/lim/lim_process_assoc_req_frame.c +++ b/core/mac/src/pe/lim/lim_process_assoc_req_frame.c @@ -551,7 +551,6 @@ static bool lim_check_11ax_basic_mcs(tpAniSirGlobal mac_ctx, tpSirAssocReq assoc_req, uint8_t sub_type) { - uint32_t val; uint16_t basic_mcs, sta_mcs, rx_mcs, tx_mcs, final_mcs; if (LIM_IS_AP_ROLE(session) && @@ -559,10 +558,8 @@ static bool lim_check_11ax_basic_mcs(tpAniSirGlobal mac_ctx, rx_mcs = assoc_req->he_cap.rx_he_mcs_map_lt_80; tx_mcs = assoc_req->he_cap.tx_he_mcs_map_lt_80; sta_mcs = HE_INTERSECT_MCS(rx_mcs, tx_mcs); - if (QDF_STATUS_SUCCESS != wlan_cfg_get_int(mac_ctx, - WNI_CFG_HE_OPS_BASIC_MCS_NSS, &val)) - val = WNI_CFG_HE_OPS_BASIC_MCS_NSS_DEF; - basic_mcs = (uint16_t)val; + basic_mcs = + (uint16_t)mac_ctx->mlme_cfg->he_caps.he_ops_basic_mcs_nss; final_mcs = HE_INTERSECT_MCS(sta_mcs, basic_mcs); if (final_mcs != basic_mcs) { lim_send_assoc_rsp_mgmt_frame(mac_ctx, @@ -574,6 +571,7 @@ static bool lim_check_11ax_basic_mcs(tpAniSirGlobal mac_ctx, } return true; } + #else static bool lim_chk_11ax_only(tpAniSirGlobal mac_ctx, tpSirMacMgmtHdr hdr, tpPESession session, tpSirAssocReq assoc_req, diff --git a/core/mac/src/pe/lim/lim_utils.c b/core/mac/src/pe/lim/lim_utils.c index 4aac3193968b..0f02a972628b 100644 --- a/core/mac/src/pe/lim/lim_utils.c +++ b/core/mac/src/pe/lim/lim_utils.c @@ -7024,9 +7024,8 @@ void lim_decide_he_op(tpAniSirGlobal mac_ctx, tpAddBssParams add_bss, he_ops->partial_bss_col = he_ops_from_ie->partial_bss_col; he_ops->bss_col_disabled = he_ops_from_ie->bss_col_disabled; - if (QDF_STATUS_SUCCESS != wlan_cfg_get_int(mac_ctx, - WNI_CFG_HE_OPS_BASIC_MCS_NSS, &val)) - val = WNI_CFG_HE_OPS_BASIC_MCS_NSS_DEF; + val = mac_ctx->mlme_cfg->he_caps.he_ops_basic_mcs_nss; + *((uint16_t *)he_ops->basic_mcs_nss) = (uint16_t)val; qdf_mem_copy(&session->he_op, he_ops, sizeof(*he_ops)); @@ -7488,22 +7487,14 @@ QDF_STATUS lim_send_he_caps_ie(tpAniSirGlobal mac_ctx, tpPESession session, static QDF_STATUS lim_populate_he_mcs_per_bw(tpAniSirGlobal mac_ctx, uint16_t *self_rx, uint16_t *self_tx, uint16_t peer_rx, uint16_t peer_tx, uint8_t nss, - uint32_t cfg_rx_param, uint32_t cfg_tx_param) + uint16_t rx_mcs, uint16_t tx_mcs) { - uint32_t val; pe_debug("peer rates: rx_mcs - 0x%04x tx_mcs - 0x%04x", peer_rx, peer_tx); - if (wlan_cfg_get_int(mac_ctx, cfg_rx_param, &val) != QDF_STATUS_SUCCESS) { - pe_err("could not retrieve HE_MCS"); - return QDF_STATUS_E_FAILURE; - } - *self_rx = (uint16_t) val; - if (wlan_cfg_get_int(mac_ctx, cfg_tx_param, &val) != QDF_STATUS_SUCCESS) { - pe_err("could not retrieve HE_MCS"); - return QDF_STATUS_E_FAILURE; - } - *self_tx = (uint16_t) val; + + *self_rx = rx_mcs; + *self_tx = tx_mcs; *self_rx = HE_INTERSECT_MCS(*self_rx, peer_tx); *self_tx = HE_INTERSECT_MCS(*self_tx, peer_rx); @@ -7566,17 +7557,24 @@ QDF_STATUS lim_populate_he_mcs_set(tpAniSirGlobal mac_ctx, &rates->rx_he_mcs_map_lt_80, &rates->tx_he_mcs_map_lt_80, peer_he_caps->rx_he_mcs_map_lt_80, peer_he_caps->tx_he_mcs_map_lt_80, nss, - WNI_CFG_HE_RX_MCS_MAP_LT_80, WNI_CFG_HE_TX_MCS_MAP_LT_80); + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_he_mcs_map_lt_80, + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tx_he_mcs_map_lt_80); lim_populate_he_mcs_per_bw(mac_ctx, &rates->rx_he_mcs_map_160, &rates->tx_he_mcs_map_160, *((uint16_t *)peer_he_caps->rx_he_mcs_map_160), *((uint16_t *)peer_he_caps->tx_he_mcs_map_160), nss, - WNI_CFG_HE_RX_MCS_MAP_160, WNI_CFG_HE_TX_MCS_MAP_160); + *((uint16_t *)mac_ctx->mlme_cfg->he_caps.dot11_he_cap. + rx_he_mcs_map_160), + *((uint16_t *)mac_ctx->mlme_cfg->he_caps.dot11_he_cap. + tx_he_mcs_map_160)); lim_populate_he_mcs_per_bw(mac_ctx, &rates->rx_he_mcs_map_80_80, &rates->tx_he_mcs_map_80_80, *((uint16_t *)peer_he_caps->rx_he_mcs_map_80_80), *((uint16_t *)peer_he_caps->tx_he_mcs_map_80_80), nss, - WNI_CFG_HE_RX_MCS_MAP_80_80, WNI_CFG_HE_TX_MCS_MAP_80_80); + *((uint16_t *)mac_ctx->mlme_cfg->he_caps.dot11_he_cap. + rx_he_mcs_map_80_80), + *((uint16_t *)mac_ctx->mlme_cfg->he_caps.dot11_he_cap. + tx_he_mcs_map_80_80)); if (!support_2x2) { /* disable 2 and higher NSS MCS sets */ rates->rx_he_mcs_map_lt_80 |= HE_MCS_INV_MSK_4_NSS(1); diff --git a/core/mac/src/sys/legacy/src/utils/src/parser_api.c b/core/mac/src/sys/legacy/src/utils/src/parser_api.c index 13ade4df2890..2a8aa56231c9 100644 --- a/core/mac/src/sys/legacy/src/utils/src/parser_api.c +++ b/core/mac/src/sys/legacy/src/utils/src/parser_api.c @@ -5920,240 +5920,28 @@ QDF_STATUS populate_dot11f_he_caps(tpAniSirGlobal mac_ctx, tpPESession session, { uint8_t *ppet; uint32_t value = 0; - QDF_STATUS status; he_cap->present = 1; if (!session) { - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_CONTROL, value); - he_cap->htc_he = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_TWT_REQUESTOR, value); - he_cap->twt_request = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_TWT_RESPONDER, value); - he_cap->twt_responder = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_FRAGMENTATION, value); - he_cap->fragmentation = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_MAX_FRAG_MSDU, value); - he_cap->max_num_frag_msdu_amsdu_exp = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_MIN_FRAG_SIZE, value); - he_cap->min_frag_size = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_TRIG_PAD, value); - he_cap->trigger_frm_mac_pad = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_MTID_AGGR_RX, value); - he_cap->multi_tid_aggr_rx_supp = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_LINK_ADAPTATION, value); - he_cap->he_link_adaptation = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_ALL_ACK, value); - he_cap->all_ack = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_TRIGD_RSP_SCHEDULING, - value); - he_cap->trigd_rsp_sched = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_BUFFER_STATUS_RPT, - value); - he_cap->a_bsr = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_BCAST_TWT, value); - he_cap->broadcast_twt = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_BA_32BIT, value); - he_cap->ba_32bit_bitmap = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_MU_CASCADING, value); - he_cap->mu_cascade = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_MULTI_TID, value); - he_cap->ack_enabled_multitid = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_OMI, value); - he_cap->omi_a_ctrl = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_OFDMA_RA, value); - he_cap->ofdma_ra = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_MAX_AMPDU_LEN, value); - he_cap->max_ampdu_len_exp_ext = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_AMSDU_FRAG, value); - he_cap->amsdu_frag = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_FLEX_TWT_SCHED, value); - he_cap->flex_twt_sched = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_RX_CTRL, value); - he_cap->rx_ctrl_frame = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_BSRP_AMPDU_AGGR, value); - he_cap->bsrp_ampdu_aggr = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_QTP, value); - he_cap->qtp = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_A_BQR, value); - he_cap->a_bqr = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_SR_RESPONDER, value); - he_cap->spatial_reuse_param_rspder = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_NDP_FEEDBACK_SUPP, - value); - he_cap->ndp_feedback_supp = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_OPS_SUPP, value); - he_cap->ops_supp = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_AMSDU_IN_AMPDU, value); - he_cap->amsdu_in_ampdu = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_SUB_CH_SEL_TX, value); - he_cap->he_sub_ch_sel_tx_supp = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_UL_2X996_RU, value); - he_cap->ul_2x996_tone_ru_supp = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_OM_CTRL_UL_MU_DIS_RX, - value); - he_cap->om_ctrl_ul_mu_data_dis_rx = value; - - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_CHAN_WIDTH, value); - he_cap->chan_width_0 = HE_CH_WIDTH_GET_BIT(value, 0); - he_cap->chan_width_1 = HE_CH_WIDTH_GET_BIT(value, 1); - he_cap->chan_width_2 = HE_CH_WIDTH_GET_BIT(value, 2); - he_cap->chan_width_3 = HE_CH_WIDTH_GET_BIT(value, 3); - he_cap->chan_width_4 = HE_CH_WIDTH_GET_BIT(value, 4); - he_cap->chan_width_5 = HE_CH_WIDTH_GET_BIT(value, 5); - he_cap->chan_width_6 = HE_CH_WIDTH_GET_BIT(value, 6); - - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_RX_PREAM_PUNC, value); - he_cap->rx_pream_puncturing = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_CLASS_OF_DEVICE, value); - he_cap->device_class = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_LDPC, value); - he_cap->ldpc_coding = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_LTF_PPDU, value); - he_cap->he_1x_ltf_800_gi_ppdu = value; - CFG_GET_INT(status, mac_ctx, - WNI_CFG_HE_MIDAMBLE_RX_MAX_NSTS, value); - he_cap->midamble_tx_rx_max_nsts = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_LTF_NDP, value); - he_cap->he_4x_ltf_3200_gi_ndp = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_TX_STBC_LT80, value); - he_cap->tx_stbc_lt_80mhz = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_RX_STBC_LT80, value); - he_cap->rx_stbc_lt_80mhz = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_DOPPLER, value); - he_cap->doppler = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_UL_MUMIMO, value); - he_cap->ul_mu = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_DCM_TX, value); - he_cap->dcm_enc_tx = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_DCM_RX, value); - he_cap->dcm_enc_rx = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_MU_PPDU, value); - he_cap->ul_he_mu = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_SU_BEAMFORMER, value); - he_cap->su_beamformer = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_SU_BEAMFORMEE, value); - he_cap->su_beamformee = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_MU_BEAMFORMER, value); - he_cap->mu_beamformer = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_BFEE_STS_LT80, value); - he_cap->bfee_sts_lt_80 = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_BFEE_STS_GT80, value); - he_cap->bfee_sts_gt_80 = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_NUM_SOUND_LT80, value); - he_cap->num_sounding_lt_80 = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_NUM_SOUND_GT80, value); - he_cap->num_sounding_gt_80 = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_SU_FEED_TONE16, value); - he_cap->su_feedback_tone16 = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_MU_FEED_TONE16, value); - he_cap->mu_feedback_tone16 = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_CODEBOOK_SU, value); - he_cap->codebook_su = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_CODEBOOK_MU, value); - he_cap->codebook_mu = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_BFRM_FEED, value); - he_cap->beamforming_feedback = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_ER_SU_PPDU, value); - he_cap->he_er_su_ppdu = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_DL_PART_BW, value); - he_cap->dl_mu_mimo_part_bw = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_PPET_PRESENT, value); - he_cap->ppet_present = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_SRP, value); - he_cap->srp = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_POWER_BOOST, value); - he_cap->power_boost = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_4x_LTF_GI, value); - he_cap->he_ltf_800_gi_4x = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_MAX_NC, value); - he_cap->max_nc = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_TX_STBC_GT80, value); - he_cap->tx_stbc_gt_80mhz = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_RX_STBC_GT80, value); - he_cap->rx_stbc_gt_80mhz = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_ER_4x_LTF_GI, value); - he_cap->er_he_ltf_800_gi_4x = value; - CFG_GET_INT(status, mac_ctx, - WNI_CFG_HE_PPDU_20_IN_40MHZ_2G, value); - he_cap->he_ppdu_20_in_40Mhz_2G = value; - CFG_GET_INT(status, mac_ctx, - WNI_CFG_HE_PPDU_20_IN_160_80P80MHZ, value); - he_cap->he_ppdu_20_in_160_80p80Mhz = value; - CFG_GET_INT(status, mac_ctx, - WNI_CFG_HE_PPDU_80_IN_160_80P80MHZ, value); - he_cap->he_ppdu_80_in_160_80p80Mhz = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_ER_1X_HE_LTF_GI, value); - he_cap->er_1x_he_ltf_gi = value; - CFG_GET_INT(status, mac_ctx, - WNI_CFG_HE_MIDAMBLE_TXRX_1X_HE_LTF, value); - he_cap->midamble_tx_rx_1x_he_ltf = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_DCM_MAX_BW, value); - he_cap->dcm_max_bw = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_LONGER_16_SIGB_OFDM_SYM, - value); - he_cap->longer_than_16_he_sigb_ofdm_sym = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_TX_1024_QAM_LT_242_RU, - value); - he_cap->tx_1024_qam_lt_242_tone_ru = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_RX_1024_QAM_LT_242_RU, - value); - he_cap->rx_1024_qam_lt_242_tone_ru = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_NON_TRIG_CQI_FEEDBACK, - value); - he_cap->non_trig_cqi_feedback = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_RX_FULL_BW_MU_CMPR_SIGB, - value); - he_cap->rx_full_bw_su_he_mu_compress_sigb = value; - CFG_GET_INT(status, mac_ctx, - WNI_CFG_HE_RX_FULL_BW_MU_NON_CMPR_SIGB, - value); - he_cap->rx_full_bw_su_he_mu_non_cmpr_sigb = value; - CFG_GET_INT(status, mac_ctx, - WNI_CFG_HE_RX_MCS_MAP_LT_80, value); - he_cap->rx_he_mcs_map_lt_80 = value; - CFG_GET_INT(status, mac_ctx, - WNI_CFG_HE_TX_MCS_MAP_LT_80, value); - he_cap->tx_he_mcs_map_lt_80 = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_RX_MCS_MAP_160, value); - *((uint16_t *)he_cap->rx_he_mcs_map_160) = value; - CFG_GET_INT(status, mac_ctx, WNI_CFG_HE_TX_MCS_MAP_160, value); - *((uint16_t *)he_cap->tx_he_mcs_map_160) = value; - CFG_GET_INT(status, mac_ctx, - WNI_CFG_HE_RX_MCS_MAP_80_80, value); - *((uint16_t *)he_cap->rx_he_mcs_map_80_80) = value; - CFG_GET_INT(status, mac_ctx, - WNI_CFG_HE_TX_MCS_MAP_80_80, value); - *((uint16_t *)he_cap->tx_he_mcs_map_80_80) = value; - - if (he_cap->ppet_present) { - value = WNI_CFG_HE_PPET_LEN; - /* if session less then take 5g cap */ - CFG_GET_STR(status, mac_ctx, WNI_CFG_HE_PPET_5G, - he_cap->ppet.ppe_threshold.ppe_th, - value, value); - ppet = he_cap->ppet.ppe_threshold.ppe_th; - he_cap->ppet.ppe_threshold.num_ppe_th = - lim_truncate_ppet(ppet, value); - } else { - he_cap->ppet.ppe_threshold.num_ppe_th = 0; - } - + qdf_mem_copy(he_cap, &mac_ctx->mlme_cfg->he_caps.dot11_he_cap, + sizeof(tDot11fIEhe_cap)); return QDF_STATUS_SUCCESS; } - + /** TODO: String items needs attention. **/ qdf_mem_copy(he_cap, &session->he_config, sizeof(*he_cap)); if (he_cap->ppet_present) { value = WNI_CFG_HE_PPET_LEN; /* if session is present, populate PPET based on band */ if (IS_5G_CH(session->currentOperChannel)) - CFG_GET_STR(status, mac_ctx, WNI_CFG_HE_PPET_5G, - he_cap->ppet.ppe_threshold.ppe_th, - value, value); + qdf_mem_copy(he_cap->ppet.ppe_threshold.ppe_th, + mac_ctx->mlme_cfg->he_caps.he_ppet_5g, + value); else - CFG_GET_STR(status, mac_ctx, WNI_CFG_HE_PPET_2G, - he_cap->ppet.ppe_threshold.ppe_th, - value, value); + qdf_mem_copy(he_cap->ppet.ppe_threshold.ppe_th, + mac_ctx->mlme_cfg->he_caps.he_ppet_2g, + value); + ppet = he_cap->ppet.ppe_threshold.ppe_th; he_cap->ppet.ppe_threshold.num_ppe_th = lim_truncate_ppet(ppet, value); diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 1fe1c1e15282..504e013c4324 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -61,6 +61,7 @@ #include #include "wlan_mlme_public_struct.h" #include "wlan_mlme_main.h" +#include "cfg_ucfg_api.h" static tSelfRecoveryStats g_self_recovery_stats; @@ -13011,9 +13012,12 @@ void sme_update_he_cap_nss(mac_handle_t hal, uint8_t session_id, sme_err("invalid Nss value %d", nss); } csr_session = CSR_GET_SESSION(mac_ctx, session_id); - sme_cfg_get_int(hal, WNI_CFG_HE_RX_MCS_MAP_LT_80, &rx_mcs_map); - sme_cfg_get_int(hal, WNI_CFG_HE_TX_MCS_MAP_LT_80, &tx_mcs_map); + rx_mcs_map = + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_he_mcs_map_lt_80; + tx_mcs_map = + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tx_he_mcs_map_lt_80; mcs_map = rx_mcs_map & 0x3; + if (nss == 1) { tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, HE_MCS_DISABLE, 2); rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, HE_MCS_DISABLE, 2); @@ -13023,8 +13027,12 @@ void sme_update_he_cap_nss(mac_handle_t hal, uint8_t session_id, } sme_info("new HE Nss MCS MAP: Rx 0x%0X, Tx: 0x%0X", rx_mcs_map, tx_mcs_map); - sme_cfg_set_int(hal, WNI_CFG_HE_RX_MCS_MAP_LT_80, rx_mcs_map); - sme_cfg_set_int(hal, WNI_CFG_HE_TX_MCS_MAP_LT_80, tx_mcs_map); + if (cfg_in_range(CFG_HE_RX_MCS_MAP_LT_80, rx_mcs_map)) + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_he_mcs_map_lt_80 = + rx_mcs_map; + if (cfg_in_range(CFG_HE_TX_MCS_MAP_LT_80, tx_mcs_map)) + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tx_he_mcs_map_lt_80 = + tx_mcs_map; csr_update_session_he_cap(mac_ctx, csr_session); } @@ -13035,8 +13043,6 @@ int sme_update_he_mcs(mac_handle_t hal, uint8_t session_id, uint16_t he_mcs) struct csr_roam_session *csr_session; uint16_t mcs_val = 0; uint16_t mcs_map = HE_MCS_ALL_DISABLED; - uint32_t wni_cfg_tx_param = 0; - uint32_t wni_cfg_rx_param = 0; csr_session = CSR_GET_SESSION(mac_ctx, session_id); if (!csr_session) { @@ -13059,24 +13065,40 @@ int sme_update_he_mcs(mac_handle_t hal, uint8_t session_id, uint16_t he_mcs) } else { mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1); } - wni_cfg_tx_param = WNI_CFG_HE_TX_MCS_MAP_LT_80; - wni_cfg_rx_param = WNI_CFG_HE_RX_MCS_MAP_LT_80; + if (cfg_in_range(CFG_HE_TX_MCS_MAP_LT_80, mcs_map)) + mac_ctx->mlme_cfg->he_caps.dot11_he_cap. + tx_he_mcs_map_lt_80 = mcs_map; + if (cfg_in_range(CFG_HE_RX_MCS_MAP_LT_80, mcs_map)) + mac_ctx->mlme_cfg->he_caps.dot11_he_cap. + rx_he_mcs_map_lt_80 = mcs_map; break; case HE_160_MCS0_7: case HE_160_MCS0_9: case HE_160_MCS0_11: mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1); - wni_cfg_tx_param = WNI_CFG_HE_TX_MCS_MAP_160; - wni_cfg_rx_param = WNI_CFG_HE_RX_MCS_MAP_160; + if (cfg_in_range(CFG_HE_TX_MCS_MAP_160, mcs_map)) + qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap. + tx_he_mcs_map_160, &mcs_map, + sizeof(uint16_t)); + if (cfg_in_range(CFG_HE_RX_MCS_MAP_160, mcs_map)) + qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap. + rx_he_mcs_map_160, &mcs_map, + sizeof(uint16_t)); break; case HE_80p80_MCS0_7: case HE_80p80_MCS0_9: case HE_80p80_MCS0_11: mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1); - wni_cfg_tx_param = WNI_CFG_HE_TX_MCS_MAP_80_80; - wni_cfg_rx_param = WNI_CFG_HE_RX_MCS_MAP_80_80; + if (cfg_in_range(CFG_HE_TX_MCS_MAP_80_80, mcs_map)) + qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap. + tx_he_mcs_map_80_80, &mcs_map, + sizeof(uint16_t)); + if (cfg_in_range(CFG_HE_RX_MCS_MAP_80_80, mcs_map)) + qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap. + rx_he_mcs_map_80_80, &mcs_map, + sizeof(uint16_t)); break; default: @@ -13084,8 +13106,6 @@ int sme_update_he_mcs(mac_handle_t hal, uint8_t session_id, uint16_t he_mcs) return -EINVAL; } sme_info("new HE MCS 0x%0x", mcs_map); - sme_cfg_set_int(hal, wni_cfg_tx_param, mcs_map); - sme_cfg_set_int(hal, wni_cfg_rx_param, mcs_map); csr_update_session_he_cap(mac_ctx, csr_session); return 0; @@ -13153,15 +13173,45 @@ void sme_set_he_mu_edca_def_cfg(mac_handle_t hal) int sme_update_he_tx_bfee_supp(mac_handle_t hal, uint8_t session_id, uint8_t cfg_val) { - return sme_update_he_cap(hal, session_id, WNI_CFG_HE_SU_BEAMFORMEE, - cfg_val); + tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); + struct csr_roam_session *session; + + session = CSR_GET_SESSION(mac_ctx, session_id); + + if (!session) { + sme_err("No session for id %d", session_id); + return -EINVAL; + } + if (cfg_val <= 1) + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.su_beamformee = cfg_val; + else + return -EINVAL; + + csr_update_session_he_cap(mac_ctx, session); + return 0; } int sme_update_he_trigger_frm_mac_pad(mac_handle_t hal, uint8_t session_id, uint8_t cfg_val) { - return sme_update_he_cap(hal, session_id, WNI_CFG_HE_TRIG_PAD, - cfg_val); + tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); + struct csr_roam_session *session; + + session = CSR_GET_SESSION(mac_ctx, session_id); + + if (!session) { + sme_err("No session for id %d", session_id); + return -EINVAL; + } + if (cfg_in_range(CFG_HE_TRIG_PAD, cfg_val)) + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.trigger_frm_mac_pad = + cfg_val; + else + return -EINVAL; + + csr_update_session_he_cap(mac_ctx, session); + return 0; + } int sme_update_he_om_ctrl_supp(mac_handle_t hal, uint8_t session_id, @@ -13286,8 +13336,23 @@ void sme_reset_he_om_ctrl(mac_handle_t hal) int sme_update_he_tx_bfee_nsts(mac_handle_t hal, uint8_t session_id, uint8_t cfg_val) { - return sme_update_he_cap(hal, session_id, WNI_CFG_HE_BFEE_STS_LT80, - cfg_val); + tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); + struct csr_roam_session *session; + + session = CSR_GET_SESSION(mac_ctx, session_id); + + if (!session) { + sme_err("No session for id %d", session_id); + return -EINVAL; + } + if (cfg_in_range(CFG_HE_BFEE_STS_LT80, cfg_val)) + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.bfee_sts_lt_80 = + cfg_val; + else + return -EINVAL; + + csr_update_session_he_cap(mac_ctx, session); + return 0; } void sme_set_he_tx_bf_cbf_rates(uint8_t session_id) @@ -13328,47 +13393,100 @@ void sme_config_su_ppdu_queue(uint8_t session_id, bool enable) int sme_update_he_tx_stbc_cap(mac_handle_t hal, uint8_t session_id, int value) { - int ret; + tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); + struct csr_roam_session *session; uint32_t he_cap_val = 0; he_cap_val = value ? 1 : 0; + session = CSR_GET_SESSION(mac_ctx, session_id); - ret = sme_update_he_cap(hal, session_id, - WNI_CFG_HE_TX_STBC_LT80, he_cap_val); - if (ret) - return ret; - - return sme_update_he_cap(hal, session_id, - WNI_CFG_HE_TX_STBC_GT80, he_cap_val); + if (!session) { + sme_err("No session for id %d", session_id); + return -EINVAL; + } + if (he_cap_val <= 1) + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tx_stbc_lt_80mhz = + he_cap_val; + else + return -EINVAL; + if (he_cap_val <= 1) + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tx_stbc_gt_80mhz = + he_cap_val; + else + return -EINVAL; + csr_update_session_he_cap(mac_ctx, session); + return 0; } int sme_update_he_rx_stbc_cap(mac_handle_t hal, uint8_t session_id, int value) { - int ret; + tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); + struct csr_roam_session *session; uint32_t he_cap_val = 0; he_cap_val = value ? 1 : 0; + session = CSR_GET_SESSION(mac_ctx, session_id); - ret = sme_update_he_cap(hal, session_id, - WNI_CFG_HE_RX_STBC_LT80, he_cap_val); - if (ret) - return ret; - - return sme_update_he_cap(hal, session_id, - WNI_CFG_HE_RX_STBC_GT80, he_cap_val); + if (!session) { + sme_err("No session for id %d", session_id); + return -EINVAL; + } + if (he_cap_val <= 1) + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_stbc_lt_80mhz = + he_cap_val; + else + return -EINVAL; + if (he_cap_val <= 1) + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_stbc_gt_80mhz = + he_cap_val; + else + return -EINVAL; + csr_update_session_he_cap(mac_ctx, session); + return 0; } int sme_update_he_frag_supp(mac_handle_t hal, uint8_t session_id, uint16_t he_frag) { - return sme_update_he_cap(hal, session_id, - WNI_CFG_HE_FRAGMENTATION, he_frag); + tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); + struct csr_roam_session *session; + + session = CSR_GET_SESSION(mac_ctx, session_id); + + if (!session) { + sme_err("No session for id %d", session_id); + return -EINVAL; + } + if (cfg_in_range(CFG_HE_FRAGMENTATION, he_frag)) + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.fragmentation = he_frag; + else + return -EINVAL; + + csr_update_session_he_cap(mac_ctx, session); + return 0; + } int sme_update_he_ldpc_supp(mac_handle_t hal, uint8_t session_id, uint16_t he_ldpc) { - return sme_update_he_cap(hal, session_id, WNI_CFG_HE_LDPC, he_ldpc); + tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); + struct csr_roam_session *session; + + session = CSR_GET_SESSION(mac_ctx, session_id); + + if (!session) { + sme_err("No session for id %d", session_id); + return -EINVAL; + } + if (he_ldpc <= 1) + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ldpc_coding = he_ldpc; + else + return -EINVAL; + + csr_update_session_he_cap(mac_ctx, session); + return 0; + } #endif diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index d91fb53e7d40..01cdafec480c 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -2415,217 +2415,25 @@ static void csr_start_bss_copy_he_cap(tSirSmeStartBssReq *req, void csr_update_session_he_cap(tpAniSirGlobal mac_ctx, struct csr_roam_session *session) { - mac_handle_t mac_hdl = MAC_HANDLE(mac_ctx); - uint32_t value = 0; tDot11fIEhe_cap *he_cap = &session->he_config; he_cap->present = true; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_CONTROL, &value); - he_cap->htc_he = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_TWT_REQUESTOR, &value); - he_cap->twt_request = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_TWT_RESPONDER, &value); - he_cap->twt_responder = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_FRAGMENTATION, &value); - he_cap->fragmentation = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_MAX_FRAG_MSDU, &value); - he_cap->max_num_frag_msdu_amsdu_exp = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_MIN_FRAG_SIZE, &value); - he_cap->min_frag_size = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_TRIG_PAD, &value); - he_cap->trigger_frm_mac_pad = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_MTID_AGGR_RX, &value); - he_cap->multi_tid_aggr_rx_supp = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_LINK_ADAPTATION, &value); - he_cap->he_link_adaptation = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_ALL_ACK, &value); - he_cap->all_ack = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_TRIGD_RSP_SCHEDULING, &value); - he_cap->trigd_rsp_sched = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_BUFFER_STATUS_RPT, &value); - he_cap->a_bsr = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_BCAST_TWT, &value); - he_cap->broadcast_twt = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_BA_32BIT, &value); - he_cap->ba_32bit_bitmap = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_MU_CASCADING, &value); - he_cap->mu_cascade = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_MULTI_TID, &value); - he_cap->ack_enabled_multitid = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_OMI, &value); - he_cap->omi_a_ctrl = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_OFDMA_RA, &value); - he_cap->ofdma_ra = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_MAX_AMPDU_LEN, &value); - he_cap->max_ampdu_len_exp_ext = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_AMSDU_FRAG, &value); - he_cap->amsdu_frag = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_FLEX_TWT_SCHED, &value); - he_cap->flex_twt_sched = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_RX_CTRL, &value); - he_cap->rx_ctrl_frame = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_BSRP_AMPDU_AGGR, &value); - he_cap->bsrp_ampdu_aggr = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_QTP, &value); - he_cap->qtp = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_A_BQR, &value); - he_cap->a_bqr = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_SR_RESPONDER, &value); - he_cap->spatial_reuse_param_rspder = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_NDP_FEEDBACK_SUPP, &value); - he_cap->ndp_feedback_supp = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_OPS_SUPP, &value); - he_cap->ops_supp = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_AMSDU_IN_AMPDU, &value); - he_cap->amsdu_in_ampdu = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_SUB_CH_SEL_TX, &value); - he_cap->he_sub_ch_sel_tx_supp = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_UL_2X996_RU, &value); - he_cap->ul_2x996_tone_ru_supp = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_OM_CTRL_UL_MU_DIS_RX, &value); - he_cap->om_ctrl_ul_mu_data_dis_rx = value; - - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_CHAN_WIDTH, &value); - he_cap->chan_width_0 = HE_CH_WIDTH_GET_BIT(value, 0); - he_cap->chan_width_1 = HE_CH_WIDTH_GET_BIT(value, 1); - he_cap->chan_width_2 = HE_CH_WIDTH_GET_BIT(value, 2); - he_cap->chan_width_3 = HE_CH_WIDTH_GET_BIT(value, 3); - he_cap->chan_width_4 = HE_CH_WIDTH_GET_BIT(value, 4); - he_cap->chan_width_5 = HE_CH_WIDTH_GET_BIT(value, 5); - he_cap->chan_width_6 = HE_CH_WIDTH_GET_BIT(value, 6); - - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_RX_PREAM_PUNC, &value); - he_cap->rx_pream_puncturing = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_CLASS_OF_DEVICE, &value); - he_cap->device_class = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_LDPC, &value); - he_cap->ldpc_coding = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_LTF_PPDU, &value); - he_cap->he_1x_ltf_800_gi_ppdu = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_MIDAMBLE_RX_MAX_NSTS, &value); - he_cap->midamble_tx_rx_max_nsts = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_LTF_NDP, &value); - he_cap->he_4x_ltf_3200_gi_ndp = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_TX_STBC_LT80, &value); - he_cap->tx_stbc_lt_80mhz = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_RX_STBC_LT80, &value); - he_cap->rx_stbc_lt_80mhz = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_DOPPLER, &value); - he_cap->doppler = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_UL_MUMIMO, &value); - he_cap->ul_mu = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_DCM_TX, &value); - he_cap->dcm_enc_tx = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_DCM_RX, &value); - he_cap->dcm_enc_rx = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_MU_PPDU, &value); - he_cap->ul_he_mu = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_SU_BEAMFORMEE, &value); - he_cap->su_beamformee = value; - if (he_cap->su_beamformee) { - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_BFEE_STS_LT80, &value); - he_cap->bfee_sts_lt_80 = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_BFEE_STS_GT80, &value); - he_cap->bfee_sts_gt_80 = value; - } else { - he_cap->bfee_sts_lt_80 = 0; - he_cap->bfee_sts_gt_80 = 0; - } - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_SU_BEAMFORMER, &value); - he_cap->su_beamformer = value; - if (he_cap->su_beamformer) { - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_MU_BEAMFORMER, &value); - he_cap->mu_beamformer = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_NUM_SOUND_LT80, &value); - he_cap->num_sounding_lt_80 = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_NUM_SOUND_GT80, &value); - he_cap->num_sounding_gt_80 = value; - } else { - he_cap->mu_beamformer = 0; - he_cap->num_sounding_lt_80 = 0; - he_cap->num_sounding_gt_80 = 0; - } - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_SU_FEED_TONE16, &value); - he_cap->su_feedback_tone16 = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_MU_FEED_TONE16, &value); - he_cap->mu_feedback_tone16 = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_CODEBOOK_SU, &value); - he_cap->codebook_su = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_CODEBOOK_MU, &value); - he_cap->codebook_mu = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_BFRM_FEED, &value); - he_cap->beamforming_feedback = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_ER_SU_PPDU, &value); - he_cap->he_er_su_ppdu = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_DL_PART_BW, &value); - he_cap->dl_mu_mimo_part_bw = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_PPET_PRESENT, &value); - he_cap->ppet_present = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_SRP, &value); - he_cap->srp = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_POWER_BOOST, &value); - he_cap->power_boost = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_4x_LTF_GI, &value); - he_cap->he_ltf_800_gi_4x = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_MAX_NC, &value); - he_cap->max_nc = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_TX_STBC_GT80, &value); - he_cap->tx_stbc_gt_80mhz = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_RX_STBC_GT80, &value); - he_cap->rx_stbc_gt_80mhz = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_ER_4x_LTF_GI, &value); - he_cap->er_he_ltf_800_gi_4x = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_PPDU_20_IN_40MHZ_2G, &value); - he_cap->he_ppdu_20_in_40Mhz_2G = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_PPDU_20_IN_160_80P80MHZ, &value); - he_cap->he_ppdu_20_in_160_80p80Mhz = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_PPDU_80_IN_160_80P80MHZ, &value); - he_cap->he_ppdu_80_in_160_80p80Mhz = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_ER_1X_HE_LTF_GI, &value); - he_cap->er_1x_he_ltf_gi = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_MIDAMBLE_TXRX_1X_HE_LTF, &value); - he_cap->midamble_tx_rx_1x_he_ltf = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_DCM_MAX_BW, &value); - he_cap->dcm_max_bw = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_LONGER_16_SIGB_OFDM_SYM, &value); - he_cap->longer_than_16_he_sigb_ofdm_sym = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_TX_1024_QAM_LT_242_RU, &value); - he_cap->tx_1024_qam_lt_242_tone_ru = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_RX_1024_QAM_LT_242_RU, &value); - he_cap->rx_1024_qam_lt_242_tone_ru = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_NON_TRIG_CQI_FEEDBACK, &value); - he_cap->non_trig_cqi_feedback = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_RX_FULL_BW_MU_CMPR_SIGB, &value); - he_cap->rx_full_bw_su_he_mu_compress_sigb = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_RX_FULL_BW_MU_NON_CMPR_SIGB, - &value); - he_cap->rx_full_bw_su_he_mu_non_cmpr_sigb = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_RX_MCS_MAP_LT_80, &value); - he_cap->rx_he_mcs_map_lt_80 = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_TX_MCS_MAP_LT_80, &value); - he_cap->tx_he_mcs_map_lt_80 = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_RX_MCS_MAP_160, &value); - *((uint16_t *)he_cap->rx_he_mcs_map_160) = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_TX_MCS_MAP_160, &value); - *((uint16_t *)he_cap->tx_he_mcs_map_160) = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_RX_MCS_MAP_80_80, &value); - *((uint16_t *)he_cap->rx_he_mcs_map_80_80) = value; - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_TX_MCS_MAP_80_80, &value); - *((uint16_t *)he_cap->tx_he_mcs_map_80_80) = value; + qdf_mem_copy(&session->he_config, + &mac_ctx->mlme_cfg->he_caps.dot11_he_cap, + sizeof(session->he_config)); if (he_cap->ppet_present) { - value = WNI_CFG_HE_PPET_LEN; /* till now operating channel is not decided yet, use 5g cap */ - sme_cfg_get_str(mac_hdl, WNI_CFG_HE_PPET_5G, - he_cap->ppet.ppe_threshold.ppe_th, &value); + qdf_mem_copy(he_cap->ppet.ppe_threshold.ppe_th, + mac_ctx->mlme_cfg->he_caps.he_ppet_5g, + WNI_CFG_HE_PPET_LEN); he_cap->ppet.ppe_threshold.num_ppe_th = lim_truncate_ppet(he_cap->ppet.ppe_threshold.ppe_th, - value); + WNI_CFG_HE_PPET_LEN); } else { he_cap->ppet.ppe_threshold.num_ppe_th = 0; } - sme_cfg_get_int(mac_hdl, WNI_CFG_HE_STA_OBSSPD, &value); - session->he_sta_obsspd = value; + session->he_sta_obsspd = mac_ctx->mlme_cfg->he_caps.he_sta_obsspd; } #else