From 3aac6f35c3325acb978a5be4e3b3ad626db2ff0e Mon Sep 17 00:00:00 2001
From: "masayuki.harada" <masayuki.harada@jp.fujitsu.com>
Date: Thu, 7 Nov 2019 16:54:08 +0900
Subject: [PATCH] Fix cqi_req clear timing, and schedule PUSCH when CQI has not
 been received for a long time in fairRR scheduler.

---
 openair2/LAYER2/MAC/eNB_scheduler_fairRR.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c b/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c
index 5b4eca635c..2006059d15 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c
@@ -2092,7 +2092,8 @@ void ulsch_scheduler_pre_ue_select_fairRR(
       UE_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
 
       if ( ((UE_sched_ctl->ul_inactivity_timer>20)&&(UE_sched_ctl->ul_scheduled==0))  ||
-           ((UE_sched_ctl->ul_inactivity_timer>10)&&(UE_sched_ctl->ul_scheduled==0)&&(mac_eNB_get_rrc_status(module_idP,UE_RNTI(module_idP,UE_id)) < RRC_CONNECTED))) {
+           ((UE_sched_ctl->ul_inactivity_timer>10)&&(UE_sched_ctl->ul_scheduled==0)&&(mac_eNB_get_rrc_status(module_idP,UE_RNTI(module_idP,UE_id)) < RRC_CONNECTED)) ||
+           ((UE_sched_ctl->cqi_req_timer>300)&&(UE_sched_ctl->ul_scheduled==0)) ) {
         first_ue_id[CC_id][ue_first_num[CC_id]]= UE_id;
         first_ue_total[CC_id] [ue_first_num[CC_id]] = 0;
         ue_first_num[CC_id]++;
@@ -2200,7 +2201,8 @@ void ulsch_scheduler_pre_ue_select_fairRR(
 
     if ( (bytes_to_schedule > 0) || (UE_list->UE_template[CC_id][UE_id].ul_SR > 0) ||
          ((UE_sched_ctl->ul_inactivity_timer>20)&&(UE_sched_ctl->ul_scheduled==0))  ||
-         ((UE_sched_ctl->ul_inactivity_timer>10)&&(UE_sched_ctl->ul_scheduled==0)&&(mac_eNB_get_rrc_status(module_idP,UE_RNTI(module_idP,UE_id)) < RRC_CONNECTED)) ) {
+         ((UE_sched_ctl->ul_inactivity_timer>10)&&(UE_sched_ctl->ul_scheduled==0)&&(mac_eNB_get_rrc_status(module_idP,UE_RNTI(module_idP,UE_id)) < RRC_CONNECTED)) ||
+           ((UE_sched_ctl->cqi_req_timer>300)&&(UE_sched_ctl->ul_scheduled==0)) ) {
       hi_dci0_pdu   = &HI_DCI0_req->hi_dci0_pdu_list[HI_DCI0_req->number_of_dci+HI_DCI0_req->number_of_hi];
       format_flag = 2;
       aggregation=get_aggregation(get_bw_index(module_idP,CC_id),UE_list->UE_sched_ctrl[UE_id].dl_cqi[CC_id],format0);
@@ -2782,19 +2784,25 @@ void schedule_ulsch_rnti_fairRR(module_id_t   module_idP,
 
       if (status < RRC_CONNECTED)
         cqi_req = 0;
-      else if (UE_sched_ctrl->cqi_req_timer>30) {
+      else if (UE_sched_ctrl->cqi_received == 1){
+        LOG_D(MAC,"Clearing CQI request timer\n");
+        UE_sched_ctrl->cqi_req_flag = 0;
+        UE_sched_ctrl->cqi_received = 0;
+        UE_sched_ctrl->cqi_req_timer = 0;
+        cqi_req = 0;
+      }else if (UE_sched_ctrl->cqi_req_timer>30) {
         cqi_req = 1;
 
         // To be safe , do not ask CQI in special SFs:36.213/7.2.3 CQI definition
         if (cc->tdd_Config) {
           switch (cc->tdd_Config->subframeAssignment) {
             case 1:
-              if( sched_subframeP == 1 || sched_subframeP == 6 ) cqi_req=0;
+              if( subframeP == 1 || subframeP == 6 ) cqi_req=0;
 
               break;
 
             case 3:
-              if( sched_subframeP == 1 ) cqi_req=0;
+              if( subframeP == 1 ) cqi_req=0;
 
               break;
 
@@ -2805,7 +2813,6 @@ void schedule_ulsch_rnti_fairRR(module_id_t   module_idP,
         }
 
         if(cqi_req == 1) {
-          UE_sched_ctrl->cqi_req_timer=0;
           UE_sched_ctrl->cqi_req_flag |= 1 << sched_subframeP;
         }
       } else
@@ -2884,6 +2891,7 @@ void schedule_ulsch_rnti_fairRR(module_id_t   module_idP,
         //store for possible retransmission
         UE_template->nb_rb_ul[harq_pid]    = rb_table[rb_table_index];
         UE_template->first_rb_ul[harq_pid] = first_rb[CC_id];
+        UE_template->cqi_req[harq_pid] = cqi_req;
         UE_sched_ctrl->ul_scheduled |= (1<<harq_pid);
 
         if (UE_id == UE_list->head)
@@ -3054,6 +3062,7 @@ void schedule_ulsch_rnti_fairRR(module_id_t   module_idP,
         //store for possible retransmission
         UE_template->nb_rb_ul[harq_pid]    = ulsch_ue_select[CC_id].list[ulsch_ue_num].nb_rb;
         UE_template->first_rb_ul[harq_pid] = ulsch_ue_select[CC_id].list[ulsch_ue_num].start_rb;
+        cqi_req = UE_template->cqi_req[harq_pid];
         UE_sched_ctrl->ul_scheduled |= (1<<harq_pid);
         // Cyclic shift for DM RS
         cshift = 0;// values from 0 to 7 can be used for mapping the cyclic shift (36.211 , Table 5.5.2.1.1-1)
-- 
2.26.2