[ODUHIGH-343]: PUCCH resource allocation (check for SR PRBs, if unavailable block... 80/7080/2
authorbarveankit <anbarve@radisys.com>
Thu, 18 Nov 2021 08:03:13 +0000 (13:33 +0530)
committerbarveankit <anbarve@radisys.com>
Thu, 18 Nov 2021 08:35:55 +0000 (14:05 +0530)
Change-Id: Ic21e6c51241bc8baa731073e918e096dac16037e
Signed-off-by: barveankit <anbarve@radisys.com>
src/5gnrsch/sch_common.c

index fa396ef..55a6537 100644 (file)
@@ -320,12 +320,14 @@ uint8_t fillUlSchedPucchFormat(uint8_t pucchFormat, SchPucchInfo *ulSchedPucch,\
  *  @return  void
  **/
 
-uint8_t fillUlSchedPucchDedicatedCfg(uint16_t numSlots, SchPucchCfg *pucchDedCfg,\
+uint8_t fillUlSchedPucchDedicatedCfg(SchCellCb *cell, SchPucchCfg *pucchDedCfg,\
    SlotTimingInfo *slotInfo, SchPucchInfo *ulSchedPucch)
 {
    uint8_t ret, resrcSetIdx, resrcIdx, schedReqIdx, srPeriodicity = 0;
    uint16_t srOffset = 0;
-
+   uint16_t numSlots = cell->numSlots;
+   bool isAllocated = false;
+   uint16_t pucchStartPrb;
    ret = ROK;
    if(pucchDedCfg->resrcSet && pucchDedCfg->resrc)
    {
@@ -335,20 +337,31 @@ uint8_t fillUlSchedPucchDedicatedCfg(uint16_t numSlots, SchPucchCfg *pucchDedCfg
          for(resrcIdx = 0; resrcIdx < pucchDedCfg->resrc->resrcToAddModListCount; resrcIdx++)
          {
             if(pucchDedCfg->resrcSet->resrcSetToAddModList[resrcSetIdx].resrcList[resrcSetIdx] ==\
-              pucchDedCfg->resrc->resrcToAddModList[resrcIdx].resrcId)
-           {
+                  pucchDedCfg->resrc->resrcToAddModList[resrcIdx].resrcId)
+            {
                ulSchedPucch->intraFreqHop = pucchDedCfg->resrc->resrcToAddModList[resrcIdx].intraFreqHop;
                ulSchedPucch->secondPrbHop = pucchDedCfg->resrc->resrcToAddModList[resrcIdx].secondPrbHop;
                ulSchedPucch->fdAlloc.startPrb = pucchDedCfg->resrc->resrcToAddModList[resrcIdx].startPrb;
-              ulSchedPucch->pucchFormat = pucchDedCfg->resrc->resrcToAddModList[resrcIdx].pucchFormat;
-              ret = fillUlSchedPucchFormat(ulSchedPucch->pucchFormat, ulSchedPucch,\
-                       &pucchDedCfg->resrc->resrcToAddModList[resrcIdx], NULLP);
-              if(ret == RFAILED)
-                 return ret;
-           }
+               ulSchedPucch->pucchFormat = pucchDedCfg->resrc->resrcToAddModList[resrcIdx].pucchFormat;
+               ret = fillUlSchedPucchFormat(ulSchedPucch->pucchFormat, ulSchedPucch,\
+                     &pucchDedCfg->resrc->resrcToAddModList[resrcIdx], NULLP);
+               if(ret == RFAILED)
+                  return ret;
+
+               pucchStartPrb = pucchDedCfg->resrc->resrcToAddModList[resrcIdx].startPrb;
+               ret = allocatePrbUl(cell, *slotInfo, ulSchedPucch->tdAlloc.startSymb, ulSchedPucch->tdAlloc.numSymb, &pucchStartPrb, PUCCH_NUM_PRB_FORMAT_0_1_4);
+               if(ret == ROK)
+               {
+                  isAllocated = true;
+                  break;
+               }
+            }
          }
+         if(isAllocated)
+         break;
       }
    }
+
    if(pucchDedCfg->format1)
    {
       memset(&ulSchedPucch->cmnFormatCfg, 0, sizeof(SchPucchFormatCfg));
@@ -356,7 +369,12 @@ uint8_t fillUlSchedPucchDedicatedCfg(uint16_t numSlots, SchPucchCfg *pucchDedCfg
       if(ret == RFAILED)
          return ret;
    }
-   
+
+   if(!isAllocated)
+   {
+      return RFAILED;
+   }
+
    /* setting SR and UCI flag */
    if(pucchDedCfg->schedReq)
    {
@@ -388,19 +406,20 @@ uint8_t fillUlSchedPucchDedicatedCfg(uint16_t numSlots, SchPucchCfg *pucchDedCfg
  *  @return  ROK/RFAILED
  **/
 
-uint16_t fillPucchResourceInfo(SchPucchInfo *schPucchInfo, Inst inst)
+uint16_t fillPucchResourceInfo(SchPucchInfo *schPucchInfo, Inst inst, SlotTimingInfo slotInfo)
 {
    uint8_t ret = ROK, ueIdx = 0, pucchIdx = 0;
    SchCellCb  *cell = schCb[inst].cells[inst];
    SchPucchCfgCmn *pucchCfg = NULLP;
    SchBwpParams *ulBwp = NULLP;
+   uint16_t startPrb;
 
    GET_UE_IDX(schPucchInfo->rnti, ueIdx);
    if(cell->ueCb[ueIdx].ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfgPres)
    {
       /* fill pucch dedicated cfg */
-      ret = fillUlSchedPucchDedicatedCfg(cell->numSlots,\
-       &cell->ueCb[ueIdx].ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfg, &cell->slotInfo, schPucchInfo);
+      ret = fillUlSchedPucchDedicatedCfg(cell,\
+       &cell->ueCb[ueIdx].ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfg, &slotInfo, schPucchInfo);
       if(ret == RFAILED)
       {
          memset(schPucchInfo, 0, sizeof(SchPucchInfo));
@@ -415,15 +434,21 @@ uint16_t fillPucchResourceInfo(SchPucchInfo *schPucchInfo, Inst inst)
       pucchCfg = &cell->cellCfg.schInitialUlBwp.pucchCommon;
       pucchIdx = pucchCfg->pucchResourceCommon;
       ulBwp = &cell->cellCfg.schInitialUlBwp.bwp;
-      schPucchInfo->fdAlloc.startPrb = ulBwp->freqAlloc.startPrb + pucchResourceSet[pucchIdx][3];
-      schPucchInfo->fdAlloc.numPrb = PUCCH_NUM_PRB_FORMAT_0_1_4;
-      schPucchInfo->tdAlloc.startSymb = pucchResourceSet[pucchIdx][1];
-      schPucchInfo->tdAlloc.numSymb = pucchResourceSet[pucchIdx][2];
-      schPucchInfo->pucchFormat = pucchResourceSet[pucchIdx][0];
-
-      /* set SR and UCI flag to false */
-      schPucchInfo->srFlag  = true;
-      schPucchInfo->uciFlag = true;
+      startPrb = ulBwp->freqAlloc.startPrb + pucchResourceSet[pucchIdx][3];
+      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.numPrb = PUCCH_NUM_PRB_FORMAT_0_1_4;
+         schPucchInfo->tdAlloc.startSymb = pucchResourceSet[pucchIdx][1];
+         schPucchInfo->tdAlloc.numSymb = pucchResourceSet[pucchIdx][2];
+         schPucchInfo->pucchFormat = pucchResourceSet[pucchIdx][0];
+
+         /* set SR and UCI flag to false */
+         schPucchInfo->srFlag  = true;
+         schPucchInfo->uciFlag = true;
+      }
    }
    /* set HARQ flag to true */
    schPucchInfo->harqFlag = true;
@@ -477,10 +502,13 @@ uint8_t schUlResAlloc(SchCellCb *cell, Inst schInst)
 
    if(schUlSlotInfo->pucchPres)
    {
-      ulSchedInfo.dataType |= SCH_DATATYPE_UCI;
-      fillPucchResourceInfo(&schUlSlotInfo->schPucchInfo, schInst);
-      memcpy(&ulSchedInfo.schPucchInfo, &schUlSlotInfo->schPucchInfo,
-           sizeof(SchPucchInfo));
+      ret = fillPucchResourceInfo(&schUlSlotInfo->schPucchInfo, schInst, ulTimingInfo);
+      if (ret == ROK)
+      {
+         ulSchedInfo.dataType |= SCH_DATATYPE_UCI;
+         memcpy(&ulSchedInfo.schPucchInfo, &schUlSlotInfo->schPucchInfo,
+               sizeof(SchPucchInfo));
+      }
       memset(&schUlSlotInfo->schPucchInfo, 0, sizeof(SchPucchInfo));
    }