diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index 07d8ed4513..cc450cc4c0 100644 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -1691,6 +1691,7 @@ static uint32_t nr_get_sf_periodicBSRTimer(long periodicBSR) static void configure_maccellgroup(NR_UE_MAC_INST_t *mac, const NR_MAC_CellGroupConfig_t *mcg) { NR_UE_SCHEDULING_INFO *si = &mac->scheduling_info; + int scs = mac->current_UL_BWP->scs; if (mcg->drx_Config) LOG_E(NR_MAC, "DRX not implemented! Configuration not handled!\n"); if (mcg->schedulingRequestConfig) { @@ -1699,8 +1700,7 @@ static void configure_maccellgroup(NR_UE_MAC_INST_t *mac, const NR_MAC_CellGroup for (int i = 0; i < src->schedulingRequestToReleaseList->list.count; i++) { if (*src->schedulingRequestToReleaseList->list.array[i] == si->sr_id) { si->SR_COUNTER = 0; - si->sr_ProhibitTimer = 0; - si->sr_ProhibitTimer_Running = 0; + nr_timer_setup(&si->sr_ProhibitTimer, 0, 1); // default value is 0ms si->sr_id = -1; // invalid init value } else @@ -1715,13 +1715,16 @@ static void configure_maccellgroup(NR_UE_MAC_INST_t *mac, const NR_MAC_CellGroup "Current implementation cannot handle more than 1 SR configuration\n"); si->sr_id = sr->schedulingRequestId; si->sr_TransMax = sr->sr_TransMax; + int target_ms = 0; if (sr->sr_ProhibitTimer) - LOG_E(NR_MAC, "SR prohibit timer not properly implemented\n"); + target_ms = 1 << *sr->sr_ProhibitTimer; + // length of slot is (1/2^scs)ms + nr_timer_setup(&si->sr_ProhibitTimer, target_ms << scs, 1); // 1 slot update rate } } } if (mcg->bsr_Config) { - int subframes_per_slot = nr_slots_per_frame[mac->current_UL_BWP->scs] / 10; + int subframes_per_slot = nr_slots_per_frame[scs] / 10; uint32_t periodic_sf = nr_get_sf_periodicBSRTimer(mcg->bsr_Config->periodicBSR_Timer); uint32_t target = periodic_sf < UINT_MAX ? periodic_sf * subframes_per_slot : periodic_sf; nr_timer_setup(&si->periodicBSR_Timer, target, 1); // 1 slot update rate diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h index 4a79b6e38d..5990b4aecc 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h @@ -222,10 +222,8 @@ typedef struct { NR_timer_t retxBSR_Timer; /// periodicBSR-Timer NR_timer_t periodicBSR_Timer; - /// default value is 0: not configured - uint16_t sr_ProhibitTimer; - /// sr ProhibitTime running - uint8_t sr_ProhibitTimer_Running; + /// sr ProhibitTimer + NR_timer_t sr_ProhibitTimer; // Maximum number of SR transmissions uint32_t sr_TransMax; int sr_id; diff --git a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c index a7185ee7d2..2db6f69c09 100644 --- a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c +++ b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c @@ -165,6 +165,7 @@ void reset_mac_inst(NR_UE_MAC_INST_t *nr_mac) } nr_timer_stop(&nr_mac->ra.contention_resolution_timer); nr_timer_stop(&nr_mac->scheduling_info.sr_DelayTimer); + nr_timer_stop(&nr_mac->scheduling_info.sr_ProhibitTimer); nr_timer_stop(&nr_mac->scheduling_info.retxBSR_Timer); // consider all timeAlignmentTimers as expired and perform the corresponding actions in clause 5.2 @@ -187,8 +188,6 @@ void reset_mac_inst(NR_UE_MAC_INST_t *nr_mac) // cancel any triggered Scheduling Request procedure nr_mac->scheduling_info.SR_COUNTER = 0; nr_mac->scheduling_info.SR_pending = 0; - nr_mac->scheduling_info.sr_ProhibitTimer = 0; - nr_mac->scheduling_info.sr_ProhibitTimer_Running = 0; nr_mac->scheduling_info.sr_id = -1; // invalid init value // cancel any triggered Buffer Status Reporting procedure diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 5520c49315..4a910761be 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -2504,14 +2504,8 @@ int8_t nr_ue_get_SR(NR_UE_MAC_INST_t *mac, frame_t frameP, slot_t slot) si->SR_pending); // todo si->SR_COUNTER++; - // start the sr-prohibittimer : rel 9 and above - if (si->sr_ProhibitTimer > 0) { // timer configured - si->sr_ProhibitTimer--; - si->sr_ProhibitTimer_Running = 1; - } else { - si->sr_ProhibitTimer_Running = 0; - } - //mac->ul_active =1; + // start the sr-prohibittimer + nr_timer_start(&si->sr_ProhibitTimer); return (1); //instruct phy to signal SR } else { // notify RRC to relase PUCCH/SRS @@ -2526,6 +2520,7 @@ int8_t nr_ue_get_SR(NR_UE_MAC_INST_t *mac, frame_t frameP, slot_t slot) } si->SR_pending = 0; si->SR_COUNTER = 0; + nr_timer_stop(&si->sr_ProhibitTimer); return (0); } } diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index 1e92d08344..69a98d22ae 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -133,6 +133,7 @@ static void trigger_regular_bsr(NR_UE_MAC_INST_t *mac, NR_LogicalChannelIdentity void update_mac_timers(NR_UE_MAC_INST_t *mac) { nr_timer_tick(&mac->ra.contention_resolution_timer); + nr_timer_tick(&mac->scheduling_info.sr_ProhibitTimer); nr_timer_tick(&mac->scheduling_info.sr_DelayTimer); bool retxBSR_expired = nr_timer_tick(&mac->scheduling_info.retxBSR_Timer); if (retxBSR_expired) { @@ -2678,6 +2679,7 @@ static void nr_ue_get_sdu_mac_ce_post(NR_UE_MAC_INST_t *mac, LOG_D(NR_MAC, "[UE %d][SR] Gave SDU to PHY, clearing any scheduling request\n", mac->ue_id); sched_info->SR_pending = 0; sched_info->SR_COUNTER = 0; + nr_timer_stop(&sched_info->sr_ProhibitTimer); /* Actions when a BSR is sent */ if (mac_ce_p->bsr_ce_len) {