* @return ROK/RFAILED
**/
-uint16_t fillPucchResourceInfo(uint8_t ueId, SchPucchInfo *schPucchInfo, Inst inst, SlotTimingInfo slotInfo)
+uint16_t fillPucchResourceInfo(SchCellCb *cell, uint8_t ueId, SchPucchInfo *schPucchInfo, SlotTimingInfo slotInfo,\
+ SchPdcchAllocInfo *pdcchAllocInfo)
{
- uint8_t ret = ROK, ueIdx = 0, pucchIdx = 0;
- SchCellCb *cell = schCb[inst].cells[inst];
+ uint8_t ret = RFAILED, ueIdx = 0, pucchIdx = 0;
+ uint8_t val_pri = 0, r_pucch = 0, cRSetIdx = 0;
+ uint16_t startPrb = 0, n_cce = 0, N_cce = 0;
SchPucchCfgCmn *pucchCfg = NULLP;
- SchBwpParams *ulBwp = NULLP;
-#ifdef NR_DRX
+ SchBwpDlCfg *initialDlBwp = NULLP;
+ SchBwpUlCfg *initialUlBwp = NULLP;
SchUeCb *ueCb = NULLP;
-#endif
- uint16_t startPrb;
ueIdx = ueId -1;
-#ifdef NR_DRX
ueCb = &(cell->ueCb[ueIdx]);
+#ifdef NR_DRX
if(ueCb->ueDrxInfoPres)
{
if(!ueCb->drxUeCb.drxUlUeActiveStatus)
{
/* fill pucch dedicated cfg */
ret = fillUlSchedPucchDedicatedCfg(cell,\
- &cell->ueCb[ueIdx].ueCfg.spCellCfg.servCellRecfg.initUlBwp.pucchCfg, &slotInfo, schPucchInfo);
+ &cell->ueCb[ueIdx].ueCfg.spCellCfg.servCellRecfg.initUlBwp.pucchCfg, &slotInfo, schPucchInfo);
if(ret == RFAILED)
{
memset(schPucchInfo, 0, sizeof(SchPucchInfo));
DU_LOG("\nERROR --> SCH : Filling PUCCH dedicated cfg failed at fillPucchResourceInfo()");
- return ret;
+ return ret;
}
}
else
{
/* fill pucch common cfg */
- /* derive pucchResourceSet from schCellCfg */
pucchCfg = &cell->cellCfg.ulCfgCommon.schInitialUlBwp.pucchCommon;
pucchIdx = pucchCfg->pucchResourceCommon;
- ulBwp = &cell->cellCfg.ulCfgCommon.schInitialUlBwp.bwp;
- startPrb = ulBwp->freqAlloc.startPrb + pucchResourceSet[pucchIdx][3];
+ initialUlBwp = &cell->cellCfg.ulCfgCommon.schInitialUlBwp;
+
+ /*As per Spec 38.213, Sec 9.2.1, StartPrb is determined by by DCI and PDCCH CCE location
+ * N_cce = Num of CCEs in COreset used for PDCCH
+ * n_cce = first index of CCE used for PDCCH
+ * val_pri = PUCCH resource indicator field in DCI format 1_0/1_1*/
+ /* derive pucchResourceSet from schCellCfg */
+ if(pdcchAllocInfo != NULLP)
+ {
+ for(cRSetIdx = 0; cRSetIdx < MAX_NUM_CRSET; cRSetIdx++ )
+ {
+ if(ueCb->pdcchInfo[cRSetIdx].cRSetRef->cRSetId == pdcchAllocInfo->cRSetId)
+ {
+ N_cce = ueCb->pdcchInfo[cRSetIdx].totalCceCount;
+ break;
+ }
+ }
+ n_cce = pdcchAllocInfo->cceIndex;
+ }
+ else
+ {
+ initialDlBwp = &cell->cellCfg.dlCfgCommon.schInitialDlBwp;
+ /* derive the sib1 coreset0 params from table 13-1 spec 38.213 */
+ N_cce = coresetIdxTable[initialDlBwp->pdcchCommon.commonSearchSpace.coresetId][1] * \
+ coresetIdxTable[initialDlBwp->pdcchCommon.commonSearchSpace.coresetId][2];
+ n_cce = 4;/*As per current Implementation, default value of cceIndex for CORESET0 is 4*/
+ }
+ val_pri = PUCCH_RES_IND;
+
+ /*Following calculation are derived from Spec 38.213, Sec 9.2.1*/
+ r_pucch = (floor((2 * n_cce)/N_cce)) + (2 * val_pri);
+
+ if((floor(r_pucch/8)) == 0)
+ {
+ startPrb = pucchResourceSet[pucchIdx][3] + (floor(r_pucch/pucchResourceSet[pucchIdx][4]));
+ }
+ else if((floor(r_pucch/8)) == 1)
+ {
+ startPrb = initialUlBwp->bwp.freqAlloc.numPrb - 1 - pucchResourceSet[pucchIdx][3] - \
+ (floor((r_pucch - 8)/pucchResourceSet[pucchIdx][4]));
+ }
+ else
+ {
+ DU_LOG("\nERROR --> SCH: Invalid value of r_pucch:%d (greater than 15) ", r_pucch);
+ memset(schPucchInfo, 0, sizeof(SchPucchInfo));
+ return ret;
+ }
ret = allocatePrbUl(cell, slotInfo, pucchResourceSet[pucchIdx][1], pucchResourceSet[pucchIdx][2],\
&startPrb, PUCCH_NUM_PRB_FORMAT_0_1_4);
if (ret == ROK)
{
- schPucchInfo->fdAlloc.startPrb = ulBwp->freqAlloc.startPrb + pucchResourceSet[pucchIdx][3];
+ schPucchInfo->fdAlloc.startPrb = startPrb;
schPucchInfo->fdAlloc.numPrb = PUCCH_NUM_PRB_FORMAT_0_1_4;
schPucchInfo->tdAlloc.startSymb = pucchResourceSet[pucchIdx][1];
schPucchInfo->tdAlloc.numSymb = pucchResourceSet[pucchIdx][2];
schPucchInfo->srFlag = true;
}
}
- return ROK;
+ return ret;
}
/**
uint8_t schUlResAlloc(SchCellCb *cell, Inst schInst)
{
int ret = ROK;
-#ifdef NR_DRX
- SchUeCb *ueCb;
-#endif
+ uint8_t ueIdx = 0;
UlSchedInfo ulSchedInfo;
SchUlSlotInfo *schUlSlotInfo = NULLP;
SlotTimingInfo ulTimingInfo;
memset(&ulSchedInfo, 0, sizeof(UlSchedInfo));
/* add PHY delta */
- ADD_DELTA_TO_TIME(cell->slotInfo,ulTimingInfo,PHY_DELTA_UL+SCHED_DELTA, cell->numSlots);
+ ADD_DELTA_TO_TIME(cell->slotInfo,ulTimingInfo,gConfigInfo.gPhyDeltaUl+SCHED_DELTA, cell->numSlots);
ulSchedInfo.cellId = cell->cellId;
ulSchedInfo.slotIndInfo.cellId = ulSchedInfo.cellId;
/* Schedule resources for PRACH */
if(cell->firstSib1Transmitted)
- schPrachResAlloc(cell, &ulSchedInfo, ulTimingInfo);
+ schPrachResAlloc(cell, &ulSchedInfo, ulTimingInfo);
schUlSlotInfo = cell->schUlSlotInfo[ulTimingInfo.slot];
- if(schUlSlotInfo->schPuschInfo)
+ if(schUlSlotInfo->puschPres)
{
- GET_CRNTI(ulSchedInfo.crnti, schUlSlotInfo->puschUe);
/* Check the ue drx status if the UE is active for uplink scheduling or not */
-#ifdef NR_DRX
- ueCb = schGetUeCb(cell, ulSchedInfo.crnti);
- if(ueCb->ueDrxInfoPres)
+ ulSchedInfo.dataType |= SCH_DATATYPE_PUSCH;
+ for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
{
- if(!ueCb->drxUeCb.drxUlUeActiveStatus)
- return RFAILED;
+ if(schUlSlotInfo->schPuschInfo[ueIdx] != NULLP)
+ {
+ memcpy(&ulSchedInfo.schPuschInfo[ueIdx], schUlSlotInfo->schPuschInfo[ueIdx],
+ sizeof(SchPuschInfo));
+ SCH_FREE(schUlSlotInfo->schPuschInfo[ueIdx], sizeof(SchPuschInfo));
+ schUlSlotInfo->schPuschInfo[ueIdx] = NULL;
+ }
}
-#endif
- ulSchedInfo.dataType |= SCH_DATATYPE_PUSCH;
- memcpy(&ulSchedInfo.schPuschInfo, schUlSlotInfo->schPuschInfo,
- sizeof(SchPuschInfo));
- SCH_FREE(schUlSlotInfo->schPuschInfo, sizeof(SchPuschInfo));
- schUlSlotInfo->schPuschInfo = NULL;
}
if(schUlSlotInfo->pucchPres)
{
- GET_CRNTI(ulSchedInfo.crnti, schUlSlotInfo->pucchUe);
- ret = fillPucchResourceInfo(schUlSlotInfo->pucchUe, &schUlSlotInfo->schPucchInfo, schInst, ulTimingInfo);
- if (ret == ROK)
- {
- ulSchedInfo.dataType |= SCH_DATATYPE_UCI;
- memcpy(&ulSchedInfo.schPucchInfo, &schUlSlotInfo->schPucchInfo,
- sizeof(SchPucchInfo));
- }
- else
- {
- return RFAILED;
- }
- memset(&schUlSlotInfo->schPucchInfo, 0, sizeof(SchPucchInfo));
+ ulSchedInfo.dataType |= SCH_DATATYPE_UCI;
+ memcpy(&ulSchedInfo.schPucchInfo, &schUlSlotInfo->schPucchInfo,
+ (sizeof(SchPucchInfo) * MAX_NUM_UE));
+ memset(&schUlSlotInfo->schPucchInfo, 0, (sizeof(SchPucchInfo) * MAX_NUM_UE));
}
- /* Send msg to MAC */
- ret = sendUlSchInfoToMac(&ulSchedInfo, schInst);
- if(ret != ROK)
+ if(ulSchedInfo.dataType > 0)
{
- DU_LOG("\nERROR --> SCH : Sending UL Sch info from SCH to MAC failed");
+ /* Send msg to MAC */
+ ret = sendUlSchInfoToMac(&ulSchedInfo, schInst);
+ if(ret != ROK)
+ {
+ DU_LOG("\nERROR --> SCH : Sending UL Sch info from SCH to MAC failed");
+ }
}
/* Update DL PRB Usage for all stats group which requested for DL Total PRB Usage */
* Scheduling for Pucch Resource
*
* @params[in] SchCellCb *cell, SlotTimingInfo pucchTime, crnti
- * @params[in] SchUeCb *ueCb, bool isRetx, SchDlHqProcCb *hqP
+ * @params[in] SchUeCb *ueCb, SchDlHqProcCb *hqP, SchPdcchAllocInfo *pdcchAllocInfo
* @return ROK - success
* RFAILED - failure
*
*******************************************************************/
-uint16_t schAllocPucchResource(SchCellCb *cell, SlotTimingInfo pucchTime, uint16_t crnti,
- SchUeCb *ueCb, bool isRetx, SchDlHqProcCb *hqP)
+uint8_t schAllocPucchResource(SchCellCb *cell, uint8_t ueId, SlotTimingInfo pucchTime, SchUeCb *ueCb,\
+ SchDlHqProcCb *hqP, SchPdcchAllocInfo *pdcchAllocInfo)
{
+ uint8_t ret = RFAILED;
uint16_t pucchSlot = 0;
SchUlSlotInfo *schUlSlotInfo = NULLP;
pucchSlot = pucchTime.slot;
schUlSlotInfo = cell->schUlSlotInfo[pucchSlot];
- memset(&schUlSlotInfo->schPucchInfo, 0, sizeof(SchPucchInfo));
- schUlSlotInfo->pucchPres = true;
+ ret = fillPucchResourceInfo(cell, ueId, &schUlSlotInfo->schPucchInfo[ueId - 1],\
+ pucchTime, pdcchAllocInfo);
+ if(ret != ROK)
+ {
+ return ret;
+ }
+
+ schUlSlotInfo->pucchPres = true;
if(ueCb != NULLP)
{
/* set HARQ flag to true */
- schUlSlotInfo->schPucchInfo.harqInfo.harqBitLength = 1; /* 1 bit for HARQ */
+ schUlSlotInfo->schPucchInfo[ueId - 1].harqInfo.harqBitLength = 1; /* 1 bit for HARQ */
ADD_DELTA_TO_TIME(pucchTime, pucchTime, 3, cell->numSlots); /* SLOT_DELAY=3 */
- cmLListAdd2Tail(&(ueCb->hqDlmap[pucchTime.slot]->hqList), &hqP->ulSlotLnk);
+ cmLListAdd2Tail(&(ueCb->hqDlmap[pucchTime.slot]->hqList), &hqP->dlSlotLnk);
}
return ROK;
}
dlMsgSchInfo->harqProcNum = hqP->procId;
dlMsgSchInfo->dlAssignIdx = 0;
dlMsgSchInfo->pucchTpc = 0;
- dlMsgSchInfo->pucchResInd = 0;
+ dlMsgSchInfo->pucchResInd = PUCCH_RES_IND;
dlMsgSchInfo->harqFeedbackInd = hqP->k1;
dlMsgSchInfo->dciFormatId = 1;
}
}
}
- /* PUCCH resource */
- schAllocPucchResource(cell, pucchTime, cell->raCb[ueId-1].tcrnti, &cell->ueCb[ueId-1], isRetxMsg4, *msg4HqProc);
-
cell->schDlSlotInfo[pdcchTime.slot]->pdcchUe = ueId;
- cell->schUlSlotInfo[pucchTime.slot]->pucchUe = ueId;
+
cell->raCb[ueId-1].msg4recvd = FALSE;
if(isRetxMsg4)
{
}
/* Calculating time frame to send DCI for SR */
- ADD_DELTA_TO_TIME(currTime, dciTime, PHY_DELTA_DL + SCHED_DELTA, cell->numSlots);
+ ADD_DELTA_TO_TIME(currTime, dciTime, gConfigInfo.gPhyDeltaDl + SCHED_DELTA, cell->numSlots);
#ifdef NR_TDD
if(schGetSlotSymbFrmt(dciTime.slot, cell->slotFrmtBitMap) == DL_SLOT)
#endif
if(schGetSlotSymbFrmt(puschTime.slot, cell->slotFrmtBitMap) == DL_SLOT)
continue;
#endif
- if(cell->schUlSlotInfo[puschTime.slot]->puschUe != 0)
+ if((cell->schUlSlotInfo[puschTime.slot]->schPuschInfo[ueId - 1] != NULLP)
+ && cell->schUlSlotInfo[puschTime.slot]->schPuschInfo[ueId - 1]->crnti == ueCb->crnti)
{
continue;
}
}
else
{
- DU_LOG("\nDEBUG --> SCH : schProcessSrOrBsrReq(): K2 value is not found");
+ /* K2 value not found*/
return false;
}
return true;
currTime = cell->slotInfo;
/* Calculating time frame to send DCI for MSG3 Retx*/
- ADD_DELTA_TO_TIME(currTime, dciTime, PHY_DELTA_DL + SCHED_DELTA, cell->numSlots);
+ ADD_DELTA_TO_TIME(currTime, dciTime, gConfigInfo.gPhyDeltaDl + SCHED_DELTA, cell->numSlots);
#ifdef NR_TDD
/* Consider this slot for sending DCI, only if it is a DL slot */
if(schGetSlotSymbFrmt(dciSlot, raCb->cell->slotFrmtBitMap) == DL_SLOT)
if(cell->schDlSlotInfo[dciSlot]->pdcchUe != 0)
return false;
- k2Found = schGetMsg3K2(cell, &raCb->msg3HqProc, dciTime.slot, &msg3Time, TRUE);
+ k2Found = schGetMsg3K2(cell, raCb->ueId, &raCb->msg3HqProc, dciTime.slot, &msg3Time, TRUE);
if (!k2Found)
{
return RFAILED;
}
cell->schDlSlotInfo[msg3Time.slot]->ulGrant = dciInfo;
- SCH_ALLOC(cell->schUlSlotInfo[msg3Time.slot]->schPuschInfo, sizeof(SchPuschInfo));
+ SCH_ALLOC(cell->schUlSlotInfo[msg3Time.slot]->schPuschInfo[raCb->ueId - 1], sizeof(SchPuschInfo));
+ cell->schUlSlotInfo[msg3Time.slot]->puschPres = true;
memset(dciInfo,0,sizeof(DciInfo));
- schFillUlDciForMsg3Retx(raCb, cell->schUlSlotInfo[msg3Time.slot]->schPuschInfo, dciInfo);
+ schFillUlDciForMsg3Retx(raCb, cell->schUlSlotInfo[msg3Time.slot]->schPuschInfo[raCb->ueId - 1], dciInfo);
}
raCb->retxMsg3HqProc = NULLP;
return ROK;
* -# true
* -# false
**/
-bool schGetMsg3K2(SchCellCb *cell, SchUlHqProcCb* msg3HqProc, uint16_t dlTime, SlotTimingInfo *msg3Time, bool isRetx)
+bool schGetMsg3K2(SchCellCb *cell, uint8_t ueId, SchUlHqProcCb* msg3HqProc, uint16_t dlTime, SlotTimingInfo *msg3Time, bool isRetx)
{
bool k2Found = false;
uint8_t k2TblIdx = 0;
#ifdef NR_TDD
uint8_t totalCfgSlot = 0;
#endif
+ uint16_t crnti = 0;
SchK2TimingInfoTbl *msg3K2InfoTbl=NULLP;
SlotTimingInfo currTime, msg3TempTime;
currTime = cell->slotInfo;
msg3MinSchTime = minMsg3SchTime[cell->numerology];
msg3Delta = puschDeltaTable[puschMu];
}
-
+
+ GET_UE_ID(crnti, ueId);
for(k2TblIdx = 0; k2TblIdx < numK2; k2TblIdx++)
{
k2Index = msg3K2InfoTbl->k2TimingInfo[dlTime].k2Indexes[k2TblIdx];
if(schGetSlotSymbFrmt(msg3TempTime.slot % totalCfgSlot, cell->slotFrmtBitMap) == DL_SLOT)
continue;
#endif
- /* If PUSCH is already scheduled on this slot, another PUSCH
- * pdu cannot be scheduled here */
- if(cell->schUlSlotInfo[msg3TempTime.slot]->puschUe != 0)
+ /* If PUSCH is already scheduled on this slot for this UE, another PUSCH
+ * pdu cannot be scheduled here for same UE*/
+ if((cell->schUlSlotInfo[msg3TempTime.slot]->schPuschInfo[ueId - 1] != NULLP)
+ && cell->schUlSlotInfo[msg3TempTime.slot]->schPuschInfo[ueId - 1]->crnti == crnti)
continue;
k2Found = true;
break;