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
Цей коміт міститься в:
@@ -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);
|
||||
|
@@ -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) \
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
|
@@ -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)
|
||||
{
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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,
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
@@ -61,6 +61,7 @@
|
||||
#include <wlan_spectral_utils_api.h>
|
||||
#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
|
||||
|
||||
|
@@ -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
|
||||
|
Посилання в новій задачі
Заблокувати користувача