diff --git a/lib/include/srslte/interfaces/sched_interface.h b/lib/include/srslte/interfaces/sched_interface.h index 427562f97..2d712f63c 100644 --- a/lib/include/srslte/interfaces/sched_interface.h +++ b/lib/include/srslte/interfaces/sched_interface.h @@ -146,9 +146,10 @@ public: std::vector supported_cc_list; ///< list of UE supported CCs. First index for PCell ant_info_ded_t dl_ant_info; bool use_tbs_index_alt = false; - bool support_ul_64qam = false; uint32_t measgap_period = 0; uint32_t measgap_offset = 0; + enum class ul64qam_cap { undefined, disabled, enabled }; + ul64qam_cap support_ul64qam = ul64qam_cap::undefined; }; typedef struct { diff --git a/srsenb/hdr/stack/mac/sched_ue.h b/srsenb/hdr/stack/mac/sched_ue.h index f75290c1b..b407f1d09 100644 --- a/srsenb/hdr/stack/mac/sched_ue.h +++ b/srsenb/hdr/stack/mac/sched_ue.h @@ -73,7 +73,7 @@ struct cc_sched_ue { uint32_t ul_cqi_tti = 0; bool dl_cqi_rx = false; - uint32_t max_mcs_dl = 28, max_mcs_dl_alt = 27, max_mcs_ul = 28; + uint32_t max_mcs_dl = 28, max_mcs_ul = 28; uint32_t max_aggr_level = 3; int fixed_mcs_ul = 0, fixed_mcs_dl = 0; diff --git a/srsenb/src/stack/mac/sched_ue.cc b/srsenb/src/stack/mac/sched_ue.cc index 8e2f71660..27fcace8d 100644 --- a/srsenb/src/stack/mac/sched_ue.cc +++ b/srsenb/src/stack/mac/sched_ue.cc @@ -1201,17 +1201,17 @@ int sched_ue::enb_to_ue_cc_idx(uint32_t enb_cc_idx) const int cc_sched_ue::cqi_to_tbs(uint32_t nof_prb, uint32_t nof_re, bool use_tbs_index_alt, bool is_ul, uint32_t* mcs) { + using ul64qam_cap = sched_interface::ue_cfg_t::ul64qam_cap; uint32_t cqi, max_mcs, max_Qm; float max_coderate; if (is_ul) { - cqi = ul_cqi; - // if cell supports UL 64QAM but the UE does not support it, cap the mcs to avoid Qm == 6 - max_mcs = (not cfg->support_ul_64qam and cell_params->cfg.enable_64qam) ? std::min(max_mcs_ul, 20u) : max_mcs_ul; - max_Qm = cfg->support_ul_64qam ? 6 : 4; + cqi = ul_cqi; + max_mcs = max_mcs_ul; + max_Qm = cfg->support_ul64qam == ul64qam_cap::enabled ? 6 : 4; max_coderate = srslte_cqi_to_coderate(std::min(cqi + 1u, 15u), false); } else { cqi = dl_cqi; - max_mcs = cfg->use_tbs_index_alt ? max_mcs_dl_alt : max_mcs_dl; + max_mcs = max_mcs_dl; max_Qm = use_tbs_index_alt ? 8 : 6; max_coderate = srslte_cqi_to_coderate(std::min(cqi + 1u, 15u), use_tbs_index_alt); } @@ -1262,11 +1262,6 @@ cc_sched_ue::cc_sched_ue(const sched_interface::ue_cfg_t& cfg_, dl_cqi = (ue_cc_idx == 0) ? cell_params->cfg.initial_dl_cqi : 0; set_cfg(cfg_); - // set max mcs - max_mcs_ul = cell_params->sched_cfg->pusch_max_mcs >= 0 ? cell_params->sched_cfg->pusch_max_mcs : 28; - max_mcs_dl = cell_params->sched_cfg->pdsch_max_mcs >= 0 ? cell_params->sched_cfg->pdsch_max_mcs : 28; - max_mcs_dl_alt = - cell_params->sched_cfg->pdsch_max_mcs >= 0 ? SRSLTE_MIN(cell_params->sched_cfg->pdsch_max_mcs, 27) : 27; max_aggr_level = cell_params->sched_cfg->max_aggr_level >= 0 ? cell_params->sched_cfg->max_aggr_level : 3; // set fixed mcs @@ -1299,6 +1294,17 @@ void cc_sched_ue::set_cfg(const sched_interface::ue_cfg_t& cfg_) cfg = &cfg_; cfg_tti = last_tti; + // set max mcs + max_mcs_ul = cell_params->sched_cfg->pusch_max_mcs >= 0 ? cell_params->sched_cfg->pusch_max_mcs : 28u; + if (cell_params->cfg.enable_64qam) { + const uint32_t max_64qam_mcs[] = {20, 24, 28}; + max_mcs_ul = std::min(max_mcs_ul, max_64qam_mcs[(size_t)cfg->support_ul64qam]); + } + max_mcs_dl = cell_params->sched_cfg->pdsch_max_mcs >= 0 ? std::min(cell_params->sched_cfg->pdsch_max_mcs, 28) : 28u; + if (cfg->use_tbs_index_alt) { + max_mcs_dl = std::min(max_mcs_dl, 27u); + } + if (ue_cc_idx == 0) { // PCell is always active cc_state_ = cc_st::active; diff --git a/srsenb/src/stack/rrc/mac_controller.cc b/srsenb/src/stack/rrc/mac_controller.cc index 108bba885..592115a86 100644 --- a/srsenb/src/stack/rrc/mac_controller.cc +++ b/srsenb/src/stack/rrc/mac_controller.cc @@ -62,9 +62,9 @@ void ue_cfg_apply_srb_updates(ue_cfg_t& ue_cfg, const srb_to_add_mod_list_l& srb * Adds to sched_interface::ue_cfg_t the changes present in the asn1 RRCReconfiguration message that should * only take effect after the RRCReconfigurationComplete is received */ -void ue_cfg_apply_reconf_complete_updates(ue_cfg_t& ue_cfg, - const rrc_conn_recfg_r8_ies_s& conn_recfg, - const ue_cell_ded_list& ue_cell_list); +void ue_cfg_apply_reconf_complete_updates(ue_cfg_t& ue_cfg, + const rrc_conn_recfg_r8_ies_s& conn_recfg, + const ue_cell_ded_list& ue_cell_list); /** * Adds to sched_interface::ue_cfg_t the changes present in the asn1 RRCReconfiguration message related to @@ -389,9 +389,9 @@ void ue_cfg_apply_srb_updates(ue_cfg_t& ue_cfg, const srb_to_add_mod_list_l& srb } } -void ue_cfg_apply_reconf_complete_updates(ue_cfg_t& ue_cfg, - const rrc_conn_recfg_r8_ies_s& conn_recfg, - const ue_cell_ded_list& ue_cell_list) +void ue_cfg_apply_reconf_complete_updates(ue_cfg_t& ue_cfg, + const rrc_conn_recfg_r8_ies_s& conn_recfg, + const ue_cell_ded_list& ue_cell_list) { // Configure RadioResourceConfigDedicated if (conn_recfg.rr_cfg_ded_present) { @@ -499,8 +499,11 @@ void ue_cfg_apply_conn_reconf(ue_cfg_t& ue_cfg, const rrc_conn_recfg_r8_ies_s& c void ue_cfg_apply_capabilities(ue_cfg_t& ue_cfg, const rrc_cfg_t& rrc_cfg, const srslte::rrc_ue_capabilities_t& uecaps) { - ue_cfg.support_ul_64qam = - uecaps.support_ul_64qam and rrc_cfg.sibs[1].sib2().rr_cfg_common.pusch_cfg_common.pusch_cfg_basic.enable64_qam; + bool enb_enable64qam = rrc_cfg.sibs[1].sib2().rr_cfg_common.pusch_cfg_common.pusch_cfg_basic.enable64_qam; + ue_cfg.support_ul64qam = ue_cfg_t::ul64qam_cap::undefined; + if (enb_enable64qam) { + ue_cfg.support_ul64qam = uecaps.support_ul_64qam ? ue_cfg_t::ul64qam_cap::enabled : ue_cfg_t::ul64qam_cap::disabled; + } } } // namespace srsenb