X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrsch%2Fsch_fcfs.c;h=e949f3b10a607693d009de85d8f0fb920df3a7da;hb=2e3617064e27b8d7bb5ba74319f8c1c99491b8dd;hp=259158eee47846da9d19233807c7945dfa0cf6c4;hpb=531da47c7bfb6ce138a454f66eb184729860beef;p=o-du%2Fl2.git diff --git a/src/5gnrsch/sch_fcfs.c b/src/5gnrsch/sch_fcfs.c index 259158eee..e949f3b10 100644 --- a/src/5gnrsch/sch_fcfs.c +++ b/src/5gnrsch/sch_fcfs.c @@ -41,6 +41,7 @@ File: sch_fcfs.c #include "du_app_mac_inf.h" #include "mac_sch_interface.h" #include "sch.h" +#include "sch_tmr.h" #include "sch_utils.h" #include "sch_fcfs.h" #ifdef NR_DRX @@ -976,17 +977,18 @@ uint8_t schFcfsScheduleUlLc(SlotTimingInfo dciTime, SlotTimingInfo puschTime, ui * RFAILED * * ****************************************************************/ -uint32_t schFcfsScheduleDlLc(SlotTimingInfo pdcchTime, SlotTimingInfo pdschTime, uint8_t pdschNumSymbols, bool isRetx, SchDlHqProcCb **hqP) +uint32_t schFcfsScheduleDlLc(SlotTimingInfo pdcchTime, SlotTimingInfo pdschTime, uint8_t pdschNumSymbols, \ + uint16_t *startPrb, bool isRetx, SchDlHqProcCb **hqP) { SchFcfsHqProcCb *fcfsHqProcCb; SchUeCb *ueCb; uint8_t lcIdx = 0; - uint16_t startPrb = 0, maxFreePRB = 0; + uint16_t maxFreePRB = 0; uint16_t mcsIdx = 0; uint32_t accumalatedSize = 0; CmLListCp *lcLL = NULLP; uint16_t rsvdDedicatedPRB = 0; - DlMsgAlloc *dciSlotAlloc; + DlMsgSchInfo *dciSlotAlloc; /* TX_PAYLOAD_HDR_LEN: Overhead which is to be Added once for any UE while estimating Accumulated TB Size * Following flag added to keep the record whether TX_PAYLOAD_HDR_LEN is added to the first Node getting allocated. @@ -1002,7 +1004,7 @@ uint32_t schFcfsScheduleDlLc(SlotTimingInfo pdcchTime, SlotTimingInfo pdschTime, { /*Re-Initalization per UE*/ /* scheduled LC data fill */ - dciSlotAlloc->dlMsgSchedInfo[dciSlotAlloc->numSchedInfo].numLc = 0; + dciSlotAlloc->transportBlock[0].numLc = 0; isTxPayloadLenAdded = FALSE; /*Re-initlaize the flag for every UE*/ accumalatedSize = 0; @@ -1028,17 +1030,14 @@ uint32_t schFcfsScheduleDlLc(SlotTimingInfo pdcchTime, SlotTimingInfo pdschTime, { DU_LOG("\nERROR --> SCH : Updation in LC List Failed"); /* Free the dl ded msg info allocated in macSchDlRlcBoInfo */ - if(dciSlotAlloc->numSchedInfo == 0) + if(!dciSlotAlloc->dlMsgPdschCfg) { - SCH_FREE(dciSlotAlloc, sizeof(DlMsgAlloc)); + SCH_FREE(dciSlotAlloc, sizeof(DlMsgSchInfo)); (*hqP)->hqEnt->cell->schDlSlotInfo[pdcchTime.slot]->dlMsgAlloc[ueCb->ueId -1] = NULL; } - else - memset(&dciSlotAlloc->dlMsgSchedInfo[dciSlotAlloc->numSchedInfo], 0, sizeof(DlMsgSchInfo)); - return false; + return accumalatedSize; } } - ueCb->dlInfo.dlLcCtxt[lcIdx].bo = 0; }//End of for loop if ((fcfsHqProcCb->lcCb.defLcList.count == 0) && (fcfsHqProcCb->lcCb.dedLcList.count == 0)) @@ -1047,21 +1046,18 @@ uint32_t schFcfsScheduleDlLc(SlotTimingInfo pdcchTime, SlotTimingInfo pdschTime, UNSET_ONE_BIT((*hqP)->hqEnt->ue->ueId, (*hqP)->hqEnt->cell->boIndBitMap); /* Free the dl ded msg info allocated in macSchDlRlcBoInfo */ - if(dciSlotAlloc->numSchedInfo == 0) + if(!dciSlotAlloc->dlMsgPdschCfg) { - SCH_FREE(dciSlotAlloc, sizeof(DlMsgAlloc)); + SCH_FREE(dciSlotAlloc, sizeof(DlMsgSchInfo)); (*hqP)->hqEnt->cell->schDlSlotInfo[pdcchTime.slot]->dlMsgAlloc[ueCb->ueId -1] = NULL; } - else - memset(&dciSlotAlloc->dlMsgSchedInfo[dciSlotAlloc->numSchedInfo], 0, sizeof(DlMsgSchInfo)); - /*TRUE because this UE has nothing to be scheduled*/ - return true; + return accumalatedSize; } } /*[Step3]: Calculate Best FREE BLOCK with MAX PRB count*/ - maxFreePRB = searchLargestFreeBlock((*hqP)->hqEnt->cell, pdschTime, &startPrb, DIR_DL); + maxFreePRB = searchLargestFreeBlock((*hqP)->hqEnt->cell, pdschTime, startPrb, DIR_DL); /*[Step4]: Estimation of PRB and BO which can be allocated to each LC in * the list based on RRM policy*/ @@ -1077,7 +1073,7 @@ uint32_t schFcfsScheduleDlLc(SlotTimingInfo pdcchTime, SlotTimingInfo pdschTime, if((fcfsHqProcCb->lcCb.dedLcList.count == NULLP) || ((maxFreePRB < rsvdDedicatedPRB))) { fcfsHqProcCb->lcCb.sharedNumPrb = maxFreePRB; - DU_LOG("\nDEBUG --> SCH : DL Only Default Slice is scheduled, sharedPRB Count:%d",\ + DU_LOG("\nDEBUG --> SCH : DL Only Default Slice is scheduled, sharedPRB Count:%d",\ fcfsHqProcCb->lcCb.sharedNumPrb); /*PRB Alloc for Default LCs*/ @@ -1157,18 +1153,25 @@ void schFcfsScheduleSlot(SchCellCb *cell, SlotTimingInfo *slotInd, Inst schInst) SchUlHqProcCb *ulHqP = NULLP; CmLList *pendingUeNode; CmLList *node; - uint8_t ueId; + uint8_t ueId, ueCount = 0; bool isRarPending = false, isRarScheduled = false; bool isMsg4Pending = false, isMsg4Scheduled = false; bool isDlMsgPending = false, isDlMsgScheduled = false; bool isUlGrantPending = false, isUlGrantScheduled = false; fcfsCell = (SchFcfsCellCb *)cell->schSpcCell; - + /* Select first UE in the linked list to be scheduled next */ pendingUeNode = fcfsCell->ueToBeScheduled.first; - if(pendingUeNode) + ueCount = fcfsCell->ueToBeScheduled.count; + + while(pendingUeNode && ueCount > 0) { + /*Since Multi-UE perTTI is not supported, re-init following parameters.*/ + isRarPending = false; isRarScheduled = false; + isMsg4Pending = false; isMsg4Scheduled = false; + isDlMsgPending = false; isDlMsgScheduled = false; + isUlGrantPending = false; isUlGrantScheduled = false; if(pendingUeNode->node) { ueId = *(uint8_t *)(pendingUeNode->node); @@ -1312,20 +1315,32 @@ void schFcfsScheduleSlot(SchCellCb *cell, SlotTimingInfo *slotInd, Inst schInst) } } - if(!isUlGrantPending && !isDlMsgPending) - { - /* No action required */ - } - else if((isUlGrantPending && !isUlGrantScheduled) || (isDlMsgPending && !isDlMsgScheduled)) - { - cmLListAdd2Tail(&fcfsCell->ueToBeScheduled, cmLListDelFrm(&fcfsCell->ueToBeScheduled, pendingUeNode)); - } - else + if(isUlGrantPending || isDlMsgPending) { - schFcfsRemoveUeFrmScheduleLst(cell, pendingUeNode); + if((isUlGrantPending && !isUlGrantScheduled) || (isDlMsgPending && !isDlMsgScheduled)) + { + cmLListAdd2Tail(&fcfsCell->ueToBeScheduled, cmLListDelFrm(&fcfsCell->ueToBeScheduled, pendingUeNode)); + } + else + { + schFcfsRemoveUeFrmScheduleLst(cell, pendingUeNode); + } } } } + if(!isUlGrantPending && !isDlMsgPending && !isRarPending && !isMsg4Pending) + { + DU_LOG("\nERROR --> SCH: In SchFcfsScheduleSlot, UE:%d is wrongly queued\ + in Pending UE List without any actions, Removing the UE from the list",ueId); + schFcfsRemoveUeFrmScheduleLst(cell, pendingUeNode); + } + if(cell->schDlSlotInfo[slotInd->slot]->prbAlloc.numPrbAlloc >= MAX_NUM_RB) + { + DU_LOG("\nINFO --> SCH: No PRB available to proceed with next UE"); + return; + } + pendingUeNode = fcfsCell->ueToBeScheduled.first; + ueCount--; } }