X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrsch%2Fsch_common.c;h=a16cda5423efb9071bfc919bce647cec25a84298;hb=d169699deebeb7cd144e15ee58bc8032acbd5299;hp=23b648bd63f479015ca1ec5586b441e655b2c31c;hpb=0bb62f25ad9d8f9ff8724572f96e51a898937f0c;p=o-du%2Fl2.git diff --git a/src/5gnrsch/sch_common.c b/src/5gnrsch/sch_common.c index 23b648bd6..a16cda542 100644 --- a/src/5gnrsch/sch_common.c +++ b/src/5gnrsch/sch_common.c @@ -389,6 +389,7 @@ uint8_t fillUlSchedPucchDedicatedCfg(SchCellCb *cell, SchPucchCfg *pucchDedCfg,\ ulSchedPucch->srFlag = true; ulSchedPucch->uciFlag = true; } + ulSchedPucch->harqFlag = true;//check how to enable? } return ret; } @@ -451,10 +452,6 @@ uint16_t fillPucchResourceInfo(SchPucchInfo *schPucchInfo, Inst inst, SlotTiming schPucchInfo->uciFlag = true; } } - /* set HARQ flag to true */ - schPucchInfo->harqFlag = true; - schPucchInfo->numHarqBits = 1; /* 1 bit for HARQ */ - return ROK; } @@ -535,13 +532,16 @@ uint8_t schUlResAlloc(SchCellCb *cell, Inst schInst) * Functionality: * Fills pdcch and pdsch info for msg4 * - * @params[in] + * @params[in] SchCellCb *cell, SlotTimingInfo msg4Time + * @params[in] uint8_t ueId, DlMsgAlloc *dlMsgAlloc + * @params[in] uint8_t pdschStartSymbol, uint8_t pdschNumSymbols + * @params[in] bool isRetx, SchDlHqProcCb *hqP * @return ROK - success * RFAILED - failure * * ****************************************************************/ uint8_t schDlRsrcAllocMsg4(SchCellCb *cell, SlotTimingInfo msg4Time, uint8_t ueId, DlMsgAlloc *dlMsgAlloc,\ -uint8_t pdschStartSymbol, uint8_t pdschNumSymbols) + uint8_t pdschStartSymbol, uint8_t pdschNumSymbols, bool isRetx, SchDlHqProcCb *hqP) { uint8_t coreset0Idx = 0; uint8_t firstSymbol = 0; @@ -575,7 +575,7 @@ uint8_t pdschStartSymbol, uint8_t pdschNumSymbols) bwp = &msg4Alloc->bwp; coreset0Idx = initialBwp->pdcchCommon.commonSearchSpace.coresetId; - fillDlMsgInfo(&msg4Alloc->dlMsgInfo, cell->raCb[ueId-1].tcrnti); + fillDlMsgInfo(&msg4Alloc->dlMsgInfo, cell->raCb[ueId-1].tcrnti, isRetx, hqP); msg4Alloc->dlMsgInfo.dlMsgPduLen = cell->raCb[ueId-1].dlMsgPduLen; /* derive the sib1 coreset0 params from table 13-1 spec 38.213 */ @@ -638,8 +638,17 @@ uint8_t pdschStartSymbol, uint8_t pdschNumSymbols) pdsch->codeword[cwCount].qamModOrder = 2; pdsch->codeword[cwCount].mcsIndex = mcs; /* mcs configured to 4 */ pdsch->codeword[cwCount].mcsTable = 0; /* notqam256 */ - pdsch->codeword[cwCount].rvIndex = 0; - tbSize = schCalcTbSize(msg4Alloc->dlMsgInfo.dlMsgPduLen + TX_PAYLOAD_HDR_LEN); /* MSG4 size + FAPI header size*/ + if(isRetx != TRUE) + { + tbSize = schCalcTbSize(msg4Alloc->dlMsgInfo.dlMsgPduLen + TX_PAYLOAD_HDR_LEN); /* MSG4 size + FAPI header size*/ + hqP->tbInfo[cwCount].tbSzReq = tbSize; + pdsch->codeword[cwCount].rvIndex = 0; + } + else + { + pdsch->codeword[cwCount].rvIndex = (pdsch->codeword[cwCount].rvIndex +1) & 0x03; + tbSize = hqP->tbInfo[cwCount].tbSzReq; + } pdsch->codeword[cwCount].tbSize = tbSize; } pdsch->dataScramblingId = cell->cellCfg.phyCellId; @@ -712,23 +721,32 @@ uint8_t pdschStartSymbol, uint8_t pdschNumSymbols) * Scheduling for Pucch Resource * * @params[in] SchCellCb *cell, SlotTimingInfo pucchTime, crnti + * @params[in] SchUeCb *ueCb, bool isRetx, SchDlHqProcCb *hqP * @return ROK - success * RFAILED - failure * *******************************************************************/ -uint16_t schAllocPucchResource(SchCellCb *cell, SlotTimingInfo pucchTime, uint16_t crnti) +uint16_t schAllocPucchResource(SchCellCb *cell, SlotTimingInfo pucchTime, uint16_t crnti, + SchUeCb *ueCb, bool isRetx, SchDlHqProcCb *hqP) { uint16_t pucchSlot = 0; SchUlSlotInfo *schUlSlotInfo = NULLP; - + pucchSlot = pucchTime.slot; schUlSlotInfo = cell->schUlSlotInfo[pucchSlot]; memset(&schUlSlotInfo->schPucchInfo, 0, sizeof(SchPucchInfo)); schUlSlotInfo->pucchPres = true; schUlSlotInfo->schPucchInfo.rnti = crnti; - + if(ueCb != NULLP) + { + /* set HARQ flag to true */ + schUlSlotInfo->schPucchInfo.harqFlag = true; + schUlSlotInfo->schPucchInfo.numHarqBits = 1; /* 1 bit for HARQ */ + ADD_DELTA_TO_TIME(pucchTime, pucchTime, 3); /* SLOT_DELAY=3 */ + cmLListAdd2Tail(&(ueCb->hqDlmap[pucchTime.slot]->hqList), &hqP->ulSlotLnk); + } return ROK; } @@ -743,13 +761,18 @@ uint16_t schAllocPucchResource(SchCellCb *cell, SlotTimingInfo pucchTime, uint16 * Functionality: * Fills pdcch and pdsch info for dl msg * - * @params[in] + * @params[in] SchCellCb *cell, SlotTimingInfo slotTime + * @params[in] uint16_t crnti, uint32_t tbSize + * @params[in] DlMsgAlloc *dlMsgAlloc, uint16_t startPRB + * @params[in] uint8_t pdschStartSymbol, uint8_t pdschNumSymbols + * @params[in] bool isRetx, SchDlHqProcCb *hqP * @return ROK - success * RFAILED - failure * * ****************************************************************/ uint8_t schDlRsrcAllocDlMsg(SchCellCb *cell, SlotTimingInfo slotTime, uint16_t crnti, - uint32_t tbSize, DlMsgAlloc *dlMsgAlloc, uint16_t startPRB, uint8_t pdschStartSymbol, uint8_t pdschNumSymbols) + uint32_t tbSize, DlMsgAlloc *dlMsgAlloc, uint16_t startPRB, uint8_t pdschStartSymbol, + uint8_t pdschNumSymbols, bool isRetx, SchDlHqProcCb *hqP) { uint8_t ueId=0; PdcchCfg *pdcch = NULLP; @@ -816,7 +839,11 @@ uint8_t schDlRsrcAllocDlMsg(SchCellCb *cell, SlotTimingInfo slotTime, uint16_t c pdsch->codeword[cwCount].mcsTable = ueCb.ueCfg.dlModInfo.mcsTable; pdsch->codeword[cwCount].rvIndex = 0; - tbSize +=TX_PAYLOAD_HDR_LEN; + if (isRetx != TRUE) + { + tbSize +=TX_PAYLOAD_HDR_LEN; + hqP->tbInfo[cwCount].tbSzReq = tbSize; + } pdsch->codeword[cwCount].tbSize = tbSize; } pdsch->dataScramblingId = cell->cellCfg.phyCellId; @@ -1628,18 +1655,25 @@ void updateGrantSizeForBoRpt(CmLListCp *lcLL, DlMsgAlloc *dlMsgAlloc,\ * fill DL message information for MSG4 and Dedicated DL Msg * * @params[in] DlMsgInfo *dlMsgInfo, uint8_t crnti +* @params[in] bool isRetx, SchDlHqProcCb *hqP * @return void * *******************************************************************/ -void fillDlMsgInfo(DlMsgInfo *dlMsgInfo, uint8_t crnti) +void fillDlMsgInfo(DlMsgInfo *dlMsgInfo, uint8_t crnti, bool isRetx, SchDlHqProcCb *hqP) { + hqP->tbInfo[0].isEnabled = TRUE; + hqP->tbInfo[0].state = HQ_TB_WAITING; + hqP->tbInfo[0].txCntr++; + hqP->tbInfo[1].isEnabled = TRUE; + hqP->tbInfo[1].state = HQ_TB_WAITING; + hqP->tbInfo[1].txCntr++; dlMsgInfo->crnti = crnti; - dlMsgInfo->ndi = 1; - dlMsgInfo->harqProcNum = 0; + dlMsgInfo->ndi = hqP->tbInfo[0].ndi; /*How to handle two tb case?TBD*/ + dlMsgInfo->harqProcNum = hqP->procId; dlMsgInfo->dlAssignIdx = 0; dlMsgInfo->pucchTpc = 0; dlMsgInfo->pucchResInd = 0; - dlMsgInfo->harqFeedbackInd = 0; + dlMsgInfo->harqFeedbackInd = hqP->k1; dlMsgInfo->dciFormatId = 1; } @@ -1654,13 +1688,17 @@ void fillDlMsgInfo(DlMsgInfo *dlMsgInfo, uint8_t crnti) * Functionality: * sch Process pending Msg4 Req * - * @params[in] SchCellCb *cell, SlotTimingInfo currTime + * @params[in] SchCellCb *cell, cell cb struct pointer + * @params[in] SlotTimingInfo currTime, current timing info + * @params[in] uint8_t ueId, ue ID + * @params[in] bool isRetxMsg4, indicator to MSG4 retransmission + * @params[in] SchDlHqProcCb **msg4HqProc, address of MSG4 HARQ proc pointer * @return ROK - success * RFAILED - failure * *******************************************************************/ -bool schProcessMsg4Req(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId) +uint8_t schProcessMsg4Req(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId, bool isRetxMsg4, SchDlHqProcCb **msg4HqProc) { uint8_t pdschStartSymbol = 0, pdschNumSymbols = 0; SlotTimingInfo pdcchTime, pdschTime, pucchTime; @@ -1670,13 +1708,23 @@ bool schProcessMsg4Req(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId) if(cell == NULL) { DU_LOG("\nERROR --> SCH: schDlRsrcAllocMsg4() : Cell is NULL"); - return false; + return RFAILED; } - + + if (isRetxMsg4 == FALSE) + { + if (RFAILED == schDlGetAvlHqProcess(cell, &cell->ueCb[ueId - 1], msg4HqProc)) + { + DU_LOG("\nERROR --> SCH: schDlRsrcAllocMsg4() : No process"); + return RFAILED; + } + } + if(findValidK0K1Value(cell, currTime, ueId, false, &pdschStartSymbol, &pdschNumSymbols, &pdcchTime, &pdschTime,\ - &pucchTime) != true ) + &pucchTime, isRetxMsg4, *msg4HqProc) != true ) { - return false; + DU_LOG("\nERROR --> SCH: schDlRsrcAllocMsg4() : k0 k1 not found"); + return RFAILED; } if(cell->schDlSlotInfo[pdcchTime.slot]->dlMsgAlloc[ueId-1] == NULL) @@ -1685,7 +1733,7 @@ bool schProcessMsg4Req(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId) if(dciSlotAlloc == NULLP) { DU_LOG("\nERROR --> SCH : Memory Allocation failed for dciSlotAlloc"); - return false; + return RFAILED; } cell->schDlSlotInfo[pdcchTime.slot]->dlMsgAlloc[ueId-1] = dciSlotAlloc; memset(dciSlotAlloc, 0, sizeof(DlMsgAlloc)); @@ -1695,7 +1743,7 @@ bool schProcessMsg4Req(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId) dciSlotAlloc = cell->schDlSlotInfo[pdcchTime.slot]->dlMsgAlloc[ueId-1]; /* Fill PDCCH and PDSCH scheduling information for Msg4 */ - if((schDlRsrcAllocMsg4(cell, pdschTime, ueId, dciSlotAlloc, pdschStartSymbol, pdschNumSymbols)) != ROK) + if((schDlRsrcAllocMsg4(cell, pdschTime, ueId, dciSlotAlloc, pdschStartSymbol, pdschNumSymbols, isRetxMsg4, *msg4HqProc)) != ROK) { DU_LOG("\nERROR --> SCH: Scheduling of Msg4 failed in slot [%d]", pdschTime.slot); if(dciSlotAlloc->numSchedInfo == 0) @@ -1705,7 +1753,7 @@ bool schProcessMsg4Req(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId) } else memset(&dciSlotAlloc->dlMsgSchedInfo[dciSlotAlloc->numSchedInfo], 0, sizeof(DlMsgSchInfo)); - return false; + return RFAILED; } /* Check if both DCI and RAR are sent in the same slot. @@ -1732,7 +1780,7 @@ bool schProcessMsg4Req(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId) } else memset(&dciSlotAlloc->dlMsgSchedInfo[dciSlotAlloc->numSchedInfo], 0, sizeof(DlMsgSchInfo)); - return false; + return RFAILED; } cell->schDlSlotInfo[pdschTime.slot]->dlMsgAlloc[ueId-1] = msg4SlotAlloc; memset(msg4SlotAlloc, 0, sizeof(DlMsgAlloc)); @@ -1757,13 +1805,17 @@ bool schProcessMsg4Req(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId) } /* PUCCH resource */ - schAllocPucchResource(cell, pucchTime, cell->raCb[ueId-1].tcrnti); + schAllocPucchResource(cell, pucchTime, cell->raCb[ueId-1].tcrnti, &cell->ueCb[ueId-1], isRetxMsg4, *msg4HqProc); cell->schDlSlotInfo[pdcchTime.slot]->pdcchUe = ueId; cell->schDlSlotInfo[pdschTime.slot]->pdschUe = ueId; cell->schUlSlotInfo[pucchTime.slot]->pucchUe = ueId; cell->raCb[ueId-1].msg4recvd = FALSE; - return true; + if(isRetxMsg4) + { + cell->ueCb[ueId-1].retxMsg4HqProc= NULLP; + } + return ROK; } /******************************************************************* @@ -1783,18 +1835,20 @@ bool schProcessMsg4Req(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId) * [out] startPrb(Pointer to startPRB which will be calculated while * finding the best Free Block) * [out] totTBS(Pointer to total TBS size) + * [in] isRetx (to indicate retransmission) + * [in] hqP (UL Harq process pointer) * - * @return bool : true > Scheduling of UL grant is successful - * false > vice versa + * @return uint8_t : ROK > Scheduling of UL grant is successful + * RFAILED > vice versa * * ****************************************************************/ -bool schCalculateUlTbs(SchUeCb *ueCb, SlotTimingInfo puschTime, uint8_t symbLen,\ - uint16_t *startPrb, uint32_t *totTBS) +uint8_t schCalculateUlTbs(SchUeCb *ueCb, SlotTimingInfo puschTime, uint8_t symbLen,\ + uint16_t *startPrb, uint32_t *totTBS, bool isRetx, SchUlHqProcCb *hqP) { uint16_t mcsIdx = 0; CmLListCp *lcLL = NULLP; uint16_t lcgIdx = 0, lcId =0, maxFreePRB = 0; - + uint16_t rsvdDedicatedPRB; *startPrb = 0; *totTBS = 0; @@ -1812,33 +1866,32 @@ bool schCalculateUlTbs(SchUeCb *ueCb, SlotTimingInfo puschTime, uint8_t symbLen, lcId = lcgIdx; if(ueCb->ulInfo.ulLcCtxt[lcId].isDedicated) { - lcLL = &(ueCb->ulLcPrbEst.dedLcInfo->dedLcList); + lcLL = &(hqP->ulLcPrbEst.dedLcList); + rsvdDedicatedPRB = ueCb->ulInfo.ulLcCtxt[lcId].rsvdDedicatedPRB; } else { - lcLL = &(ueCb->ulLcPrbEst.defLcList); + lcLL = &(hqP->ulLcPrbEst.defLcList); } /*[Step2]: Update the reqPRB and Payloadsize for this LC in the appropriate List*/ if(updateLcListReqPRB(lcLL, lcId, ueCb->bsrInfo[lcgIdx].dataVol) != ROK) { - DU_LOG("\nERROR --> SCH: LcgId:%d updation failed",lcId); - return false; + DU_LOG("\nERROR --> SCH: LcgId:%d updation failed",lcId); + return RFAILED; } } - if ((ueCb->ulLcPrbEst.defLcList.count == 0) && \ - ((ueCb->ulLcPrbEst.dedLcInfo == NULL) || (ueCb->ulLcPrbEst.dedLcInfo->dedLcList.count == 0))) + if ((hqP->ulLcPrbEst.defLcList.count == 0) && (hqP->ulLcPrbEst.dedLcList.count == 0)) { - if(ueCb->srRcvd) + if( (ueCb->srRcvd) || (isRetx) ) { *startPrb = MAX_NUM_RB; *totTBS = schCalcTbSize(UL_GRANT_SIZE); } - /*Returning true when NO Grant is there for UE as this is not scheduling - * error*/ - return (true); + * error*/ + return ROK; } maxFreePRB = searchLargestFreeBlock(ueCb->cellCb, puschTime, startPrb, DIR_UL); @@ -1851,38 +1904,37 @@ bool schCalculateUlTbs(SchUeCb *ueCb, SlotTimingInfo puschTime, uint8_t symbLen, if(maxFreePRB != 0) { mcsIdx = ueCb->ueCfg.ulModInfo.mcsIndex; - if((ueCb->ulLcPrbEst.dedLcInfo == NULLP) - || ((maxFreePRB < ueCb->ulLcPrbEst.dedLcInfo->rsvdDedicatedPRB))) - { - ueCb->ulLcPrbEst.sharedNumPrb = maxFreePRB; + if((hqP->ulLcPrbEst.dedLcList.count == 0) || ((maxFreePRB < rsvdDedicatedPRB))) + { + hqP->ulLcPrbEst.sharedNumPrb = maxFreePRB; DU_LOG("\nDEBUG --> SCH : UL Only Default Slice is scheduled, sharedPRB Count:%d",\ - ueCb->ulLcPrbEst.sharedNumPrb); + hqP->ulLcPrbEst.sharedNumPrb); /*PRB Alloc for Default LCs*/ - prbAllocUsingRRMPolicy(&(ueCb->ulLcPrbEst.defLcList), FALSE, mcsIdx, symbLen,\ - &(ueCb->ulLcPrbEst.sharedNumPrb), NULLP, NULLP,&(ueCb->srRcvd)); + prbAllocUsingRRMPolicy(&(hqP->ulLcPrbEst.defLcList), FALSE, mcsIdx, symbLen,\ + &(hqP->ulLcPrbEst.sharedNumPrb), NULLP, NULLP,&(ueCb->srRcvd)); } else { - ueCb->ulLcPrbEst.sharedNumPrb = maxFreePRB - ueCb->ulLcPrbEst.dedLcInfo->rsvdDedicatedPRB; + hqP->ulLcPrbEst.sharedNumPrb = maxFreePRB - rsvdDedicatedPRB; /*PRB Alloc for Dedicated LCs*/ - prbAllocUsingRRMPolicy(&(ueCb->ulLcPrbEst.dedLcInfo->dedLcList), TRUE, mcsIdx, symbLen,\ - &(ueCb->ulLcPrbEst.sharedNumPrb), &(ueCb->ulLcPrbEst.dedLcInfo->rsvdDedicatedPRB),\ + prbAllocUsingRRMPolicy(&(hqP->ulLcPrbEst.dedLcList), TRUE, mcsIdx, symbLen,\ + &(hqP->ulLcPrbEst.sharedNumPrb), &(rsvdDedicatedPRB),\ NULLP,&(ueCb->srRcvd)); /*PRB Alloc for Default LCs*/ - prbAllocUsingRRMPolicy(&(ueCb->ulLcPrbEst.defLcList), FALSE, mcsIdx, symbLen, \ - &(ueCb->ulLcPrbEst.sharedNumPrb), &(ueCb->ulLcPrbEst.dedLcInfo->rsvdDedicatedPRB),\ + prbAllocUsingRRMPolicy(&(hqP->ulLcPrbEst.defLcList), FALSE, mcsIdx, symbLen, \ + &(hqP->ulLcPrbEst.sharedNumPrb), &(rsvdDedicatedPRB),\ NULLP,&(ueCb->srRcvd)); } } /*[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->ulLcPrbEst.dedLcInfo != NULLP) - updateGrantSizeForBoRpt(&(ueCb->ulLcPrbEst.dedLcInfo->dedLcList), NULLP, ueCb->bsrInfo, totTBS); + if(hqP->ulLcPrbEst.dedLcList.count != 0) + updateGrantSizeForBoRpt(&(hqP->ulLcPrbEst.dedLcList), NULLP, ueCb->bsrInfo, totTBS); - updateGrantSizeForBoRpt(&(ueCb->ulLcPrbEst.defLcList), NULLP, ueCb->bsrInfo, totTBS); + updateGrantSizeForBoRpt(&(hqP->ulLcPrbEst.defLcList), NULLP, ueCb->bsrInfo, totTBS); /*Below case will hit if NO LC(s) are allocated due to resource crunch*/ if (*totTBS == 0) @@ -1895,10 +1947,10 @@ bool schCalculateUlTbs(SchUeCb *ueCb, SlotTimingInfo puschTime, uint8_t symbLen, { /*Schedule the LC for next slot*/ DU_LOG("\nDEBUG --> SCH : No LC has been scheduled"); - } - return (false); - } - return (true); + } + return RFAILED; + } + return ROK; } /******************************************************************* @@ -1912,14 +1964,15 @@ bool schCalculateUlTbs(SchUeCb *ueCb, SlotTimingInfo puschTime, uint8_t symbLen, * Functionality: * sch Process pending Sr or Bsr Req * - * @params[in] SchCellCb *cell, SlotTimingInfo currTime - * @return ROK - success - * RFAILED - failure + * @params[in] SchCellCb *cell, SlotTimingInfo currTime + * @params[in] uint8_t ueId, Bool isRetx, SchUlHqProcCb **hqP + * @return true - success + * false - failure * *******************************************************************/ -bool schProcessSrOrBsrReq(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId) +bool schProcessSrOrBsrReq(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId, bool isRetx, SchUlHqProcCb **hqP) { - bool k2Found = FALSE, ret = FALSE; + bool k2Found = FALSE, ret = RFAILED; uint8_t startSymb = 0, symbLen = 0; uint8_t k2TblIdx = 0, k2Index = 0, k2Val = 0; uint16_t startPrb = 0; @@ -1929,10 +1982,10 @@ bool schProcessSrOrBsrReq(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId DciInfo *dciInfo = NULLP; SchK2TimingInfoTbl *k2InfoTbl=NULLP; SlotTimingInfo dciTime, puschTime; - + if(cell == NULLP) { - DU_LOG("\nERROR --> SCH: schDlRsrcAllocMsg4() : Cell is NULL"); + DU_LOG("\nERROR --> SCH: schProcessSrOrBsrReq() : Cell is NULL"); return false; } @@ -1940,9 +1993,18 @@ bool schProcessSrOrBsrReq(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId if(ueCb == NULLP) { - DU_LOG("\nERROR --> SCH: schDlRsrcAllocMsg4() : UE is NULL"); + DU_LOG("\nERROR --> SCH: schProcessSrOrBsrReq() : UE is NULL"); return false; } + + if (isRetx == FALSE) + { + if (schUlGetAvlHqProcess(cell, ueCb, hqP) != ROK) + { + return RFAILED; + } + } + /* Calculating time frame to send DCI for SR */ ADD_DELTA_TO_TIME(currTime, dciTime, PHY_DELTA_DL + SCHED_DELTA); #ifdef NR_TDD @@ -1970,7 +2032,7 @@ bool schProcessSrOrBsrReq(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId startSymb = ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.puschCfg.timeDomRsrcAllocList[k2Index].startSymbol; symbLen = ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.puschCfg.timeDomRsrcAllocList[k2Index].symbolLength; } - + /* Check for number of Symbol of PUSCH should be same as original in case of transmisson*/ /* Calculating time frame to send PUSCH for SR */ ADD_DELTA_TO_TIME(dciTime, puschTime, k2Val); #ifdef NR_TDD @@ -1988,25 +2050,28 @@ bool schProcessSrOrBsrReq(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId if(k2Found == true) { - ret = schCalculateUlTbs(ueCb, puschTime, symbLen, &startPrb, &totDataReq); - if(totDataReq > 0 && ret == TRUE) + ret = schCalculateUlTbs(ueCb, puschTime, symbLen, &startPrb, &totDataReq, isRetx, *hqP); + + if(totDataReq > 0 && ret == ROK) { SCH_ALLOC(dciInfo, sizeof(DciInfo)); if(!dciInfo) { DU_LOG("\nERROR --> SCH : Memory Allocation failed for dciInfo alloc"); + if(isRetx != TRUE) + { + if((*hqP)->ulLcPrbEst.dedLcList.count != 0) + updateBsrAndLcList(&((*hqP)->ulLcPrbEst.dedLcList), ueCb->bsrInfo, RFAILED); - if(ueCb->ulLcPrbEst.dedLcInfo != NULLP) - updateBsrAndLcList(&(ueCb->ulLcPrbEst.dedLcInfo->dedLcList), ueCb->bsrInfo, RFAILED); - - updateBsrAndLcList(&(ueCb->ulLcPrbEst.defLcList), ueCb->bsrInfo, RFAILED); + updateBsrAndLcList(&((*hqP)->ulLcPrbEst.defLcList), ueCb->bsrInfo, RFAILED); + } return false; } cell->schDlSlotInfo[dciTime.slot]->ulGrant = dciInfo; memset(dciInfo,0,sizeof(DciInfo)); /* Update PUSCH allocation */ - if(schFillPuschAlloc(ueCb, puschTime, totDataReq, startSymb, symbLen, startPrb) == ROK) + if(schFillPuschAlloc(ueCb, puschTime, totDataReq, startSymb, symbLen, startPrb, isRetx, *hqP) == ROK) { if(cell->schUlSlotInfo[puschTime.slot]->schPuschInfo) { @@ -2014,24 +2079,22 @@ bool schProcessSrOrBsrReq(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId if(puschInfo != NULLP) { /* Fill DCI for UL grant */ - schFillUlDci(ueCb, puschInfo, dciInfo); + schFillUlDci(ueCb, puschInfo, dciInfo, isRetx, *hqP); memcpy(&dciInfo->slotIndInfo, &dciTime, sizeof(SlotTimingInfo)); ueCb->srRcvd = false; ueCb->bsrRcvd = false; cell->schUlSlotInfo[puschTime.slot]->puschUe = ueId; - if(ueCb->ulLcPrbEst.dedLcInfo != NULLP) - updateBsrAndLcList(&(ueCb->ulLcPrbEst.dedLcInfo->dedLcList), ueCb->bsrInfo, ROK); - - updateBsrAndLcList(&(ueCb->ulLcPrbEst.defLcList), ueCb->bsrInfo, ROK); + if((*hqP)->ulLcPrbEst.dedLcList.count != 0) + updateBsrAndLcList(&((*hqP)->ulLcPrbEst.dedLcList), ueCb->bsrInfo, ROK); + updateBsrAndLcList(&((*hqP)->ulLcPrbEst.defLcList), ueCb->bsrInfo, ROK); + cmLListAdd2Tail(&(ueCb->hqUlmap[puschTime.slot]->hqList), &(*hqP)->ulSlotLnk); return true; } } } - - if(ueCb->ulLcPrbEst.dedLcInfo != NULLP) - updateBsrAndLcList(&(ueCb->ulLcPrbEst.dedLcInfo->dedLcList), ueCb->bsrInfo, RFAILED); - - updateBsrAndLcList(&(ueCb->ulLcPrbEst.defLcList), ueCb->bsrInfo, RFAILED); + if((*hqP)->ulLcPrbEst.dedLcList.count != 0) + updateBsrAndLcList(&((*hqP)->ulLcPrbEst.dedLcList), ueCb->bsrInfo, RFAILED); + updateBsrAndLcList(&((*hqP)->ulLcPrbEst.defLcList), ueCb->bsrInfo, RFAILED); } } return (ret);