Преглед изворни кода

qcacld-3.0: ADD HE CFG items in MLME component

Refactor HE cap cfg items to new mlme component using
updated cfg architecture.

Change-Id: Ib983d3fc983dfffd2eee7efd1a4e3681d26d84a6
CRs-Fixed: 2351420
Bala Venkatesh пре 6 година
родитељ
комит
23ed2e89e2

+ 155 - 93
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);

+ 11 - 15
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 */
 /*
  * <ini>
  * he_dynamic_frag_support - configure dynamic fragmentation
@@ -584,7 +580,8 @@
 				3, \
 				0, \
 				CFG_VALUE_OR_DEFAULT, \
-				"HE Dynamic Twt Fragmentation")
+				"HE Dynamic Fragmentation")
+
 
 /*
  * <ini>
@@ -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) \

+ 56 - 0
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

+ 7 - 89
mlme/dispatcher/inc/wlan_mlme_public_struct.h

@@ -26,6 +26,7 @@
 #include <wlan_cmn.h>
 #include <reg_services_public_struct.h>
 #include <wmi_unified_param.h>
+#include <sir_api.h>
 
 #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;

+ 77 - 0
mlme/dispatcher/inc/wlan_mlme_ucfg_api.h

@@ -28,6 +28,7 @@
 #include <wlan_cmn.h>
 #include <wlan_mlme_api.h>
 #include <wlan_mlme_main.h>
+#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

+ 348 - 0
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)
 {