packSchMacDlAlloc
};
+SchMacDlPageAllocFunc schMacDlPageAllocOpts[] =
+{
+ packSchMacDlPageAlloc,
+ MacProcDlPageAlloc,
+ packSchMacDlPageAlloc
+};
+
/*******************************************************************
*
* @brief Handles sending DL broadcast alloc to MAC
}
+/*******************************************************************
+ *
+ * @brief Handles sending DL Page alloc to MAC
+ *
+ * @details
+ *
+ * Function : sendDlPAgeAllocToMac
+ *
+ * Functionality:
+ * Sends DL Page Resource Allocation to MAC from SCH
+ *
+ * @params[in]
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t sendDlPageAllocToMac(DlPageAlloc *dlPageAlloc, Inst inst)
+{
+ Pst pst;
+
+ memset(&pst, 0, sizeof(Pst));
+ FILL_PST_SCH_TO_MAC(pst, inst);
+ pst.event = EVENT_DL_PAGING_ALLOC;
+
+ return(*schMacDlPageAllocOpts[pst.selector])(&pst, dlPageAlloc);
+
+}
+
/*******************************************************************
*
* @brief Handles slot indication at SCH
memset(dciSlotAlloc, 0, sizeof(DlMsgAlloc));
dciSlotAlloc->crnti = crnti;
}
- dciSlotAlloc = cell->schDlSlotInfo[pdcchTime.slot]->dlMsgAlloc[ueId -1];
-
+ else
+ {
+ dciSlotAlloc = cell->schDlSlotInfo[pdcchTime.slot]->dlMsgAlloc[ueId -1];
+ }
/* Dl ded Msg info is copied, this was earlier filled in macSchDlRlcBoInfo */
fillDlMsgInfo(&dciSlotAlloc->dlMsgSchedInfo[dciSlotAlloc->numSchedInfo].dlMsgInfo, dciSlotAlloc->crnti);
if ((ueCb->dlLcPrbEst.defLcList.count == 0) && \
- ((ueCb->dlLcPrbEst.dedLcInfo != NULL) && (ueCb->dlLcPrbEst.dedLcInfo->dedLcList.count == 0)))
+ ((ueCb->dlLcPrbEst.dedLcInfo == NULL) || (ueCb->dlLcPrbEst.dedLcInfo->dedLcList.count == 0)))
{
DU_LOG("\nDEBUG --> SCH : No pending BO for any LC id\n");
- if(*(uint8_t *)cell->ueToBeScheduled.first->node == ueId)
- {
- SCH_FREE(cell->ueToBeScheduled.first->node, sizeof(uint8_t));
- deleteNodeFromLList(&cell->ueToBeScheduled, cell->ueToBeScheduled.first);
- }
UNSET_ONE_BIT(ueId, cell->boIndBitMap);
/* Free the dl ded msg info allocated in macSchDlRlcBoInfo */
}
else
memset(&dciSlotAlloc->dlMsgSchedInfo[dciSlotAlloc->numSchedInfo], 0, sizeof(DlMsgSchInfo));
- return false;
+
+ /*TRUE because this UE has nothing to be scheduled*/
+ return true;
}
/*[Step3]: Calculate Best FREE BLOCK with MAX PRB count*/
- maxFreePRB = searchLargestFreeBlockDL(cell, pdschTime, &startPrb);
+ maxFreePRB = searchLargestFreeBlock(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*/
|| ((maxFreePRB < ueCb->dlLcPrbEst.dedLcInfo->rsvdDedicatedPRB)))
{
ueCb->dlLcPrbEst.sharedNumPrb = maxFreePRB;
- DU_LOG("\nWARNING --> SCH : Only Default Slice is scheduled, sharedPRB Count:%d",\
+ DU_LOG("\nDEBUG --> SCH : DL Only Default Slice is scheduled, sharedPRB Count:%d",\
ueCb->dlLcPrbEst.sharedNumPrb);
/*PRB Alloc for Default LCs*/
prbAllocUsingRRMPolicy(&(ueCb->dlLcPrbEst.defLcList), FALSE, mcsIdx, pdschNumSymbols,\
- &(ueCb->dlLcPrbEst.sharedNumPrb), NULLP, &isTxPayloadLenAdded);
+ &(ueCb->dlLcPrbEst.sharedNumPrb), NULLP, &isTxPayloadLenAdded, NULLP);
}
else
{
/*PRB Alloc for Dedicated LCs*/
prbAllocUsingRRMPolicy(&(ueCb->dlLcPrbEst.dedLcInfo->dedLcList), TRUE, mcsIdx, pdschNumSymbols,\
- &(ueCb->dlLcPrbEst.sharedNumPrb), &(ueCb->dlLcPrbEst.dedLcInfo->rsvdDedicatedPRB), &isTxPayloadLenAdded);
+ &(ueCb->dlLcPrbEst.sharedNumPrb), &(ueCb->dlLcPrbEst.dedLcInfo->rsvdDedicatedPRB), &isTxPayloadLenAdded, NULLP);
/*PRB Alloc for Default LCs*/
prbAllocUsingRRMPolicy(&(ueCb->dlLcPrbEst.defLcList), FALSE, mcsIdx, pdschNumSymbols, \
- &(ueCb->dlLcPrbEst.sharedNumPrb), &(ueCb->dlLcPrbEst.dedLcInfo->rsvdDedicatedPRB), &isTxPayloadLenAdded);
+ &(ueCb->dlLcPrbEst.sharedNumPrb), &(ueCb->dlLcPrbEst.dedLcInfo->rsvdDedicatedPRB), &isTxPayloadLenAdded, NULLP);
}
}
/*[Step5]:Traverse each LCID in LcList to calculate the exact Scheduled Bytes
* using allocated BO per LC and Update dlMsgAlloc(BO report for MAC*/
if(ueCb->dlLcPrbEst.dedLcInfo != NULLP)
- updateGrantSizeForBoRpt(&(ueCb->dlLcPrbEst.dedLcInfo->dedLcList), dciSlotAlloc, &(accumalatedSize));
+ updateGrantSizeForBoRpt(&(ueCb->dlLcPrbEst.dedLcInfo->dedLcList), dciSlotAlloc, NULLP, &(accumalatedSize));
- updateGrantSizeForBoRpt(&(ueCb->dlLcPrbEst.defLcList), dciSlotAlloc, &(accumalatedSize));
+ updateGrantSizeForBoRpt(&(ueCb->dlLcPrbEst.defLcList), dciSlotAlloc, NULLP, &(accumalatedSize));
/*Below case will hit if NO LC(s) are allocated due to resource crunch*/
if (!accumalatedSize)
return true;
}
+/*******************************************************************
+*
+* @brief Process DL Resource allocation for Page
+*
+* @details
+*
+* Function : schProcDlPageAlloc
+*
+* Functionality: Process DL Resource allocation for Page
+*
+* @params[in] SchCellCb *cell, SlotTimingInfo currTime, Inst schInst
+*
+* @return pointer to return Value(ROK, RFAILED)
+*
+* ****************************************************************/
+uint8_t schProcDlPageAlloc(SchCellCb *cell, SlotTimingInfo currTime, Inst schInst)
+{
+ DlPageAlloc dlPageAlloc;
+ CmLList *pageInfoNode = NULLP;
+ SchPageInfo *pageInfo = NULLP;
+ SlotTimingInfo pdschTime;
+ uint32_t tbSize = 0;
+ uint16_t startPrb = 0, maxFreePRB = 0, nPRB = 0;
+ uint8_t ret = RFAILED;
+
+ pageInfoNode = schPageInfoSearchFromPageList(currTime, &(cell->pageCb.pageIndInfoRecord[currTime.sfn]));
+
+ if(pageInfoNode == NULLP)
+ {
+ return ROK;
+ }
+ pageInfo = (SchPageInfo *)pageInfoNode->node;
+
+ while(true)
+ {
+ dlPageAlloc.cellId = currTime.cellId;
+
+ ADD_DELTA_TO_TIME(currTime, dlPageAlloc.dlPageTime, PHY_DELTA_DL + SCHED_DELTA);
+ dlPageAlloc.shortMsgInd = FALSE;
+ pdschTime = dlPageAlloc.dlPageTime;
+
+ /*Calculate Best FREE BLOCK with MAX PRB count*/
+ maxFreePRB = searchLargestFreeBlock(cell, pdschTime, &startPrb, DIR_DL);
+
+ if(maxFreePRB != 0)
+ {
+ tbSize = calculateEstimateTBSize(pageInfo->msgLen, pageInfo->mcs, NUM_PDSCH_SYMBOL, maxFreePRB, &nPRB);
+ }
+ else
+ {
+ DU_LOG("\nERROR --> SCH: Unable to get any free block for Paging at SFN:%d, SLOT:%d",\
+ pdschTime.sfn, pdschTime.slot);
+ break;
+ }
+ /*Fill PDCCH: PDCCH Cfg is same as SIB1 as Paging will be a broadcast message*/
+ memcpy(&dlPageAlloc.pagePdcchCfg, &cell->cellCfg.sib1SchCfg.sib1PdcchCfg, sizeof(PdcchCfg));
+ dlPageAlloc.pagePdcchCfg.dci.rnti = P_RNTI;
+
+ /*Fill BWP*/
+ memcpy(&dlPageAlloc.bwp, &cell->cellCfg.sib1SchCfg.bwp, sizeof(BwpCfg));
+
+ /*Fill PDSCH*/
+ if(schFillPagePdschCfg(cell, &dlPageAlloc.pagePdschCfg, pdschTime, tbSize, pageInfo->mcs, startPrb) != ROK)
+ {
+ DU_LOG("\nERROR --> SCH: Issue in PDSCH Allocation for Paging at SFN:%d, SLOT:%d",\
+ pdschTime.sfn, pdschTime.slot);
+ break;
+ }
+ dlPageAlloc.pagePdcchCfg.dci.pdschCfg = &dlPageAlloc.pagePdschCfg;
+
+ /*Fill Page PDU information*/
+ dlPageAlloc.dlPagePduLen = pageInfo->msgLen;
+
+ SCH_ALLOC(dlPageAlloc.dlPagePdu, sizeof(dlPageAlloc.dlPagePduLen));
+
+ if(dlPageAlloc.dlPagePdu == NULLP)
+ {
+ DU_LOG("\nERROR --> SCH: Memory Allocation Failed during Page Resource allocation");
+ break;
+ }
+ memcpy(dlPageAlloc.dlPagePdu, pageInfo->pagePdu, dlPageAlloc.dlPagePduLen);
+
+ /* Send msg to MAC */
+ if(sendDlPageAllocToMac(&dlPageAlloc, schInst) != ROK)
+ {
+ DU_LOG("\nERROR --> SCH : Sending DL Paging allocation from SCH to MAC failed");
+ SCH_FREE(dlPageAlloc.dlPagePdu, sizeof(dlPageAlloc.dlPagePduLen));
+ break;
+ }
+ ret = ROK;
+ break;
+ }
+
+ /*Remove the Page Node*/
+ SCH_FREE(pageInfo->pagePdu, pageInfo->msgLen);
+ schDeleteFromPageInfoList(&(cell->pageCb.pageIndInfoRecord[currTime.sfn]), pageInfoNode);
+
+ return(ret);
+
+}
+
/*******************************************************************
*
* @brief Handles slot indication at SCH
}
}
+ /*Process Paging Msg*/
+ schProcDlPageAlloc(cell, *slotInd, schInst);
+
/* Select first UE in the linked list to be scheduled next */
pendingUeNode = cell->ueToBeScheduled.first;
if(pendingUeNode)
if(cell->raReq[ueId-1] != NULLP)
{
isRarPending = true;
- isRarScheduled = schProcessRaReq(cell, *slotInd, ueId);
+ isRarScheduled = schProcessRaReq(schInst, cell, *slotInd, ueId);
}
/* If MSG4 is pending for this UE, schedule PDCCH,PDSCH to send MSG4 and