diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h index 405bb6ca95a1d9d38c13313b0d83523ca2eb0bfe..078b4fde24914972b40a9fcbb8e96b9c8477170f 100644 --- a/openair2/LAYER2/MAC/defs.h +++ b/openair2/LAYER2/MAC/defs.h @@ -742,6 +742,7 @@ typedef struct { uint16_t ta_timer; int16_t ta_update; int32_t context_active_timer; + int32_t cqi_req_timer; int32_t ul_inactivity_timer; int32_t ul_failure_timer; int32_t ra_pdcch_order_sent; diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index dbc094034b73d9da1c8e05928783bb4fdc08bd49..5f68448e6b5ccd9eedb2fb11d7e4011ee52127b0 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -127,6 +127,8 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, // increment this, it is cleared when we receive an sdu eNB_mac_inst[module_idP].UE_list.UE_sched_ctrl[i].ul_inactivity_timer++; + + eNB_mac_inst[module_idP].UE_list.UE_sched_ctrl[i].cqi_req_timer++; if (mac_xface->get_eNB_UE_stats(module_idP, CC_id, rnti)==NULL) { // mac_remove_ue(module_idP, i, frameP, subframeP); diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index 150071163915f7333fbbb908802ac37cfbbc04d5..69539261013dc1df6414c27bb1d6503c6f5d0c21 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -873,7 +873,14 @@ void schedule_ulsch_rnti(module_id_t module_idP, UE_template->ul_SR = 0; aggregation = process_ue_cqi(module_idP,UE_id); // =2 by default!! status = mac_eNB_get_rrc_status(module_idP,rnti); - cqi_req = (status < RRC_CONNECTED)? 0:1; + if (status < RRC_CONNECTED) + cqi_req = 0; + else if (UE_list->UE_sched_ctrl[UE_id].cqi_req_timer>30) { + cqi_req = 1; + UE_list->UE_sched_ctrl[UE_id].cqi_req_timer=0; + } + else + cqi_req = 0; //power control //compute the expected ULSCH RX power (for the stats) @@ -918,7 +925,9 @@ void schedule_ulsch_rnti(module_id_t module_idP, UE_list->eNB_UE_stats[CC_id][UE_id].target_rx_power=target_rx_power; UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1=UE_template->pre_assigned_mcs_ul; mcs = cmin (UE_template->pre_assigned_mcs_ul, openair_daq_vars.target_ue_ul_mcs); // adjust, based on user-defined MCS - + if ((cqi_req==1) && (mcs==20)) { + mcs=19; + } if (UE_template->pre_allocated_rb_table_index_ul >=0) { rb_table_index=UE_template->pre_allocated_rb_table_index_ul; } else { diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 691542e277833824ac3dab84bc504b36612727b0..aa0c440c20c85ae3cca7e95f3d93a3204124228c 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -318,7 +318,7 @@ static LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; int multi_thread=1; uint32_t target_dl_mcs = 28; //maximum allowed mcs -uint32_t target_ul_mcs = 19; +uint32_t target_ul_mcs = 20; uint32_t timing_advance = 0; uint8_t exit_missed_slots=1; uint64_t num_missed_slots=0; // counter for the number of missed slots