Set DL MCS when receiving CQI report
- Introduce generic get_mcs_from_cqi() that gets MCS for a particular CQI - Set MCS after receiving CQI - Distinguish "global" max MCS from UE-measured max MCS
This commit is contained in:
@@ -404,13 +404,9 @@ int get_mcs_from_bler(module_id_t mod_id, int CC_id, frame_t frame, sub_frame_t
|
|||||||
const NR_ServingCellConfigCommon_t *scc = nrmac->common_channels[CC_id].ServingCellConfigCommon;
|
const NR_ServingCellConfigCommon_t *scc = nrmac->common_channels[CC_id].ServingCellConfigCommon;
|
||||||
const int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
|
const int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
|
||||||
int max_allowed_mcs = (mcs_table == 1) ? 27 : 28;
|
int max_allowed_mcs = (mcs_table == 1) ? 27 : 28;
|
||||||
int max_mcs = nrmac->dl_max_mcs;
|
|
||||||
|
|
||||||
if (nrmac->dl_max_mcs>max_allowed_mcs)
|
|
||||||
max_mcs = max_allowed_mcs;
|
|
||||||
|
|
||||||
NR_DL_bler_stats_t *bler_stats = &nrmac->UE_info.UE_sched_ctrl[UE_id].dl_bler_stats;
|
|
||||||
|
|
||||||
|
NR_UE_sched_ctrl_t *sched_ctrl = &nrmac->UE_info.UE_sched_ctrl[UE_id];
|
||||||
|
NR_DL_bler_stats_t *bler_stats = &sched_ctrl->dl_bler_stats;
|
||||||
/* first call: everything is zero. Initialize to sensible default */
|
/* first call: everything is zero. Initialize to sensible default */
|
||||||
if (bler_stats->last_frame_slot == 0 && bler_stats->mcs == 0) {
|
if (bler_stats->last_frame_slot == 0 && bler_stats->mcs == 0) {
|
||||||
bler_stats->last_frame_slot = frame * n + slot;
|
bler_stats->last_frame_slot = frame * n + slot;
|
||||||
@@ -458,6 +454,7 @@ int get_mcs_from_bler(module_id_t mod_id, int CC_id, frame_t frame, sub_frame_t
|
|||||||
if (bler_stats->rd2_bler > nrmac->dl_rd2_bler_threshold && old_mcs > 6) {
|
if (bler_stats->rd2_bler > nrmac->dl_rd2_bler_threshold && old_mcs > 6) {
|
||||||
new_mcs -= 2;
|
new_mcs -= 2;
|
||||||
} else if (bler_stats->rd2_bler < nrmac->dl_rd2_bler_threshold) {*/
|
} else if (bler_stats->rd2_bler < nrmac->dl_rd2_bler_threshold) {*/
|
||||||
|
const int max_mcs = min(max_allowed_mcs, min(sched_ctrl->dl_max_mcs, nrmac->dl_max_mcs));
|
||||||
if (bler_stats->bler < nrmac->dl_bler_target_lower && old_mcs < max_mcs && dtx > 9)
|
if (bler_stats->bler < nrmac->dl_bler_target_lower && old_mcs < max_mcs && dtx > 9)
|
||||||
new_mcs += 1;
|
new_mcs += 1;
|
||||||
else if (bler_stats->bler > nrmac->dl_bler_target_upper && old_mcs > 6)
|
else if (bler_stats->bler > nrmac->dl_bler_target_upper && old_mcs > 6)
|
||||||
@@ -772,7 +769,6 @@ void pf_dl(module_id_t module_id,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Calculate coeff */
|
/* Calculate coeff */
|
||||||
set_dl_mcs(sched_pdsch,sched_ctrl,&mac->dl_max_mcs,ps->mcsTableIdx);
|
|
||||||
sched_pdsch->mcs = get_mcs_from_bler(module_id, /* CC_id = */ 0, frame, slot, UE_id, ps->mcsTableIdx);
|
sched_pdsch->mcs = get_mcs_from_bler(module_id, /* CC_id = */ 0, frame, slot, UE_id, ps->mcsTableIdx);
|
||||||
layers[UE_id] = set_dl_nrOfLayers(sched_ctrl);
|
layers[UE_id] = set_dl_nrOfLayers(sched_ctrl);
|
||||||
const uint8_t Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx);
|
const uint8_t Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx);
|
||||||
|
|||||||
@@ -145,7 +145,6 @@ uint8_t set_dl_nrOfLayers(NR_UE_sched_ctrl_t *sched_ctrl) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint16_t set_pm_index(NR_UE_sched_ctrl_t *sched_ctrl,
|
uint16_t set_pm_index(NR_UE_sched_ctrl_t *sched_ctrl,
|
||||||
int layers,
|
int layers,
|
||||||
int N1, int N2,
|
int N1, int N2,
|
||||||
@@ -169,51 +168,45 @@ uint16_t set_pm_index(NR_UE_sched_ctrl_t *sched_ctrl,
|
|||||||
AssertFatal(1==0,"More than 2 antenna ports not yet supported\n");
|
AssertFatal(1==0,"More than 2 antenna ports not yet supported\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t get_mcs_from_cqi(int mcs_table, int cqi_table, int cqi_idx)
|
||||||
void set_dl_mcs(NR_sched_pdsch_t *sched_pdsch,
|
{
|
||||||
NR_UE_sched_ctrl_t *sched_ctrl,
|
if (cqi_idx <= 0) {
|
||||||
uint8_t *target_mcs,
|
LOG_E(NR_MAC, "invalid cqi_idx %d, default to MCS 9\n", cqi_idx);
|
||||||
uint8_t mcs_table_idx) {
|
return 9;
|
||||||
|
|
||||||
if (sched_ctrl->set_mcs) {
|
|
||||||
// TODO for wideband case and multiple TB
|
|
||||||
int cqi_idx = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_1tb;
|
|
||||||
uint16_t target_coderate,target_qm;
|
|
||||||
if (cqi_idx>0) {
|
|
||||||
int cqi_table = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.cqi_table;
|
|
||||||
if (cqi_table != mcs_table_idx)
|
|
||||||
LOG_W(NR_MAC,"Indices of MCS tables don't correspond yet, cri_ri_li_pmi_cqi_report.cqi_table %d, mcs_table_index %d\n",cqi_table,mcs_table_idx);
|
|
||||||
switch (cqi_table) {
|
|
||||||
case 0:
|
|
||||||
target_qm = cqi_table1[cqi_idx][0];
|
|
||||||
target_coderate = cqi_table1[cqi_idx][1];
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
target_qm = cqi_table2[cqi_idx][0];
|
|
||||||
target_coderate = cqi_table2[cqi_idx][1];
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
target_qm = cqi_table3[cqi_idx][0];
|
|
||||||
target_coderate = cqi_table3[cqi_idx][1];
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
AssertFatal(1==0,"Invalid cqi table index %d\n",cqi_table);
|
|
||||||
}
|
|
||||||
int max_mcs = 28;
|
|
||||||
int R,Qm;
|
|
||||||
if (mcs_table_idx == 1)
|
|
||||||
max_mcs = 27;
|
|
||||||
for (int i=0; i<=max_mcs; i++) {
|
|
||||||
R = nr_get_code_rate_dl(i, mcs_table_idx);
|
|
||||||
Qm = nr_get_Qm_dl(i, mcs_table_idx);
|
|
||||||
if ((Qm == target_qm) && (target_coderate <= R)) {
|
|
||||||
*target_mcs = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sched_ctrl->set_mcs = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mcs_table != cqi_table) {
|
||||||
|
LOG_E(NR_MAC, "indices of CQI (%d) and MCS (%d) tables don't correspond yet\n", cqi_table, mcs_table);
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t target_coderate, target_qm;
|
||||||
|
switch (cqi_table) {
|
||||||
|
case 0:
|
||||||
|
target_qm = cqi_table1[cqi_idx][0];
|
||||||
|
target_coderate = cqi_table1[cqi_idx][1];
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
target_qm = cqi_table2[cqi_idx][0];
|
||||||
|
target_coderate = cqi_table2[cqi_idx][1];
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
target_qm = cqi_table3[cqi_idx][0];
|
||||||
|
target_coderate = cqi_table3[cqi_idx][1];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AssertFatal(1==0,"Invalid cqi table index %d\n",cqi_table);
|
||||||
|
}
|
||||||
|
const int max_mcs = mcs_table == 1 ? 27 : 28;
|
||||||
|
for (int i = 0; i <= max_mcs; i++) {
|
||||||
|
const int R = nr_get_code_rate_dl(i, mcs_table);
|
||||||
|
const int Qm = nr_get_Qm_dl(i, mcs_table);
|
||||||
|
if (Qm == target_qm && target_coderate <= R)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_E(NR_MAC, "could not find maximum MCS from cqi_idx %d, default to 9\n", cqi_idx);
|
||||||
|
return 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_dl_dmrs_ports(NR_pdsch_semi_static_t *ps) {
|
void set_dl_dmrs_ports(NR_pdsch_semi_static_t *ps) {
|
||||||
@@ -2359,7 +2352,7 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG
|
|||||||
compute_csi_bitlen (CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE_info, UE_id, mod_idP);
|
compute_csi_bitlen (CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE_info, UE_id, mod_idP);
|
||||||
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
|
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
|
||||||
memset(sched_ctrl, 0, sizeof(*sched_ctrl));
|
memset(sched_ctrl, 0, sizeof(*sched_ctrl));
|
||||||
sched_ctrl->set_mcs = true;
|
sched_ctrl->dl_max_mcs = 28; /* do not limit MCS for individual UEs */
|
||||||
sched_ctrl->set_pmi = false;
|
sched_ctrl->set_pmi = false;
|
||||||
sched_ctrl->ta_frame = 0;
|
sched_ctrl->ta_frame = 0;
|
||||||
sched_ctrl->ta_update = 31;
|
sched_ctrl->ta_update = 31;
|
||||||
|
|||||||
@@ -1250,7 +1250,12 @@ void evaluate_cqi_report(uint8_t *payload,
|
|||||||
sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_2tb = temp_cqi;
|
sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_2tb = temp_cqi;
|
||||||
LOG_D(MAC,"Wide-band CQI for the second TB %d\n", temp_cqi);
|
LOG_D(MAC,"Wide-band CQI for the second TB %d\n", temp_cqi);
|
||||||
}
|
}
|
||||||
sched_ctrl->set_mcs = true;
|
|
||||||
|
// TODO for wideband case and multiple TB
|
||||||
|
const int cqi_idx = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_1tb;
|
||||||
|
const int mcs_table = sched_ctrl->pdsch_semi_static.mcsTableIdx;
|
||||||
|
const int cqi_table = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.cqi_table;
|
||||||
|
sched_ctrl->dl_max_mcs = get_mcs_from_cqi(mcs_table, cqi_table, cqi_idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -514,10 +514,7 @@ uint16_t set_pm_index(NR_UE_sched_ctrl_t *sched_ctrl,
|
|||||||
int xp_pdsch_antenna_ports,
|
int xp_pdsch_antenna_ports,
|
||||||
int codebook_mode);
|
int codebook_mode);
|
||||||
|
|
||||||
void set_dl_mcs(NR_sched_pdsch_t *sched_pdsch,
|
uint8_t get_mcs_from_cqi(int mcs_table, int cqi_table, int cqi_idx);
|
||||||
NR_UE_sched_ctrl_t *sched_ctrl,
|
|
||||||
uint8_t *target_mcs,
|
|
||||||
uint8_t mcs_table_idx);
|
|
||||||
|
|
||||||
uint8_t set_dl_nrOfLayers(NR_UE_sched_ctrl_t *sched_ctrl);
|
uint8_t set_dl_nrOfLayers(NR_UE_sched_ctrl_t *sched_ctrl);
|
||||||
|
|
||||||
|
|||||||
@@ -613,6 +613,9 @@ typedef struct {
|
|||||||
NR_pdsch_semi_static_t pdsch_semi_static;
|
NR_pdsch_semi_static_t pdsch_semi_static;
|
||||||
/// Sched PDSCH: scheduling decisions, copied into HARQ and cleared every TTI
|
/// Sched PDSCH: scheduling decisions, copied into HARQ and cleared every TTI
|
||||||
NR_sched_pdsch_t sched_pdsch;
|
NR_sched_pdsch_t sched_pdsch;
|
||||||
|
/// UE-estimated maximum MCS (from CSI-RS)
|
||||||
|
uint8_t dl_max_mcs;
|
||||||
|
|
||||||
/// For UL synchronization: store last UL scheduling grant
|
/// For UL synchronization: store last UL scheduling grant
|
||||||
frame_t last_ul_frame;
|
frame_t last_ul_frame;
|
||||||
sub_frame_t last_ul_slot;
|
sub_frame_t last_ul_slot;
|
||||||
@@ -641,7 +644,6 @@ typedef struct {
|
|||||||
int ul_failure;
|
int ul_failure;
|
||||||
struct CSI_Report CSI_report;
|
struct CSI_Report CSI_report;
|
||||||
bool SR;
|
bool SR;
|
||||||
bool set_mcs;
|
|
||||||
bool set_pmi;
|
bool set_pmi;
|
||||||
/// information about every HARQ process
|
/// information about every HARQ process
|
||||||
NR_UE_harq_t harq_processes[NR_MAX_NB_HARQ_PROCESSES];
|
NR_UE_harq_t harq_processes[NR_MAX_NB_HARQ_PROCESSES];
|
||||||
|
|||||||
Reference in New Issue
Block a user