[EPIC-ID: ODUHIGH-488][TASK-ID: ODUHIGH-494]SCH framework update to support different...
[o-du/l2.git] / src / 5gnrsch / sch_common.c
index 204affa..dff28ca 100644 (file)
@@ -43,13 +43,6 @@ File:     sch_common.c
 #include "sch.h"
 #include "sch_utils.h"
 
-SchMacUlSchInfoFunc schMacUlSchInfoOpts[] =
-{
-   packSchMacUlSchInfo,
-   MacProcUlSchInfo,
-   packSchMacUlSchInfo
-};
-
 /**
  * @brief common resource allocation for SSB
  *
@@ -204,7 +197,7 @@ int sendUlSchInfoToMac(UlSchedInfo *ulSchedInfo, Inst inst)
    FILL_PST_SCH_TO_MAC(pst, inst);
    pst.event = EVENT_UL_SCH_INFO;
 
-   return(*schMacUlSchInfoOpts[pst.selector])(&pst, ulSchedInfo);
+   return(MacMessageRouter(&pst, (void *)ulSchedInfo));
 }
 
 /**
@@ -413,15 +406,26 @@ uint16_t fillPucchResourceInfo(SchPucchInfo *schPucchInfo, Inst inst, SlotTiming
    SchCellCb  *cell = schCb[inst].cells[inst];
    SchPucchCfgCmn *pucchCfg = NULLP;
    SchBwpParams *ulBwp = NULLP;
+#ifdef NR_DRX 
+   SchUeCb *ueCb = NULLP;
+#endif
    uint16_t startPrb;
 
    GET_UE_ID(schPucchInfo->rnti, ueId);
    ueIdx = ueId -1;
-   if(cell->ueCb[ueIdx].ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfgPres)
+#ifdef NR_DRX 
+   ueCb = schGetUeCb(cell, schPucchInfo->rnti);
+   if(ueCb->ueDrxInfoPres)
+   {
+      if(!ueCb->drxUeCb.drxUlUeActiveStatus)
+         return RFAILED;
+   }
+#endif
+   if(cell->ueCb[ueIdx].ueCfg.spCellCfg.servCellRecfg.initUlBwp.pucchCfgPres)
    {
       /* fill pucch dedicated cfg */
       ret = fillUlSchedPucchDedicatedCfg(cell,\
-       &cell->ueCb[ueIdx].ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfg, &slotInfo, schPucchInfo);
+       &cell->ueCb[ueIdx].ueCfg.spCellCfg.servCellRecfg.initUlBwp.pucchCfg, &slotInfo, schPucchInfo);
       if(ret == RFAILED)
       {
          memset(schPucchInfo, 0, sizeof(SchPucchInfo));
@@ -470,14 +474,16 @@ uint16_t fillPucchResourceInfo(SchPucchInfo *schPucchInfo, Inst inst, SlotTiming
 uint8_t schUlResAlloc(SchCellCb *cell, Inst schInst)
 {
    int ret = ROK;
+#ifdef NR_DRX 
    SchUeCb   *ueCb;
+#endif
    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);
+   ADD_DELTA_TO_TIME(cell->slotInfo,ulTimingInfo,PHY_DELTA_UL+SCHED_DELTA, cell->numSlots);
 
    ulSchedInfo.cellId = cell->cellId;
    ulSchedInfo.slotIndInfo.cellId = ulSchedInfo.cellId;
@@ -497,7 +503,7 @@ uint8_t schUlResAlloc(SchCellCb *cell, Inst schInst)
       ueCb = schGetUeCb(cell, ulSchedInfo.crnti);
       if(ueCb->ueDrxInfoPres)
       {
-         if(ueCb->drxUeCb.drxUlUeActiveStatus)
+         if(!ueCb->drxUeCb.drxUlUeActiveStatus)
             return RFAILED;
       }
 #endif
@@ -517,6 +523,10 @@ uint8_t schUlResAlloc(SchCellCb *cell, Inst schInst)
          memcpy(&ulSchedInfo.schPucchInfo, &schUlSlotInfo->schPucchInfo,
                sizeof(SchPucchInfo));
       }
+      else
+      {
+         return RFAILED;
+      }
       memset(&schUlSlotInfo->schPucchInfo, 0, sizeof(SchPucchInfo));
    }
 
@@ -754,7 +764,7 @@ uint16_t schAllocPucchResource(SchCellCb *cell, SlotTimingInfo pucchTime, uint16
       /* 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 */
+      ADD_DELTA_TO_TIME(pucchTime, pucchTime, 3, cell->numSlots); /* SLOT_DELAY=3 */
       cmLListAdd2Tail(&(ueCb->hqDlmap[pucchTime.slot]->hqList), &hqP->ulSlotLnk);
    }
    return ROK;
@@ -799,8 +809,8 @@ uint8_t schDlRsrcAllocDlMsg(SchCellCb *cell, SlotTimingInfo slotTime, uint16_t c
 
    GET_UE_ID(crnti, ueId);
    ueCb  = cell->ueCb[ueId-1];
-   coreset1 = ueCb.ueCfg.spCellCfg.servCellCfg.initDlBwp.pdcchCfg.cRSetToAddModList[0];
-   pdschCfg = ueCb.ueCfg.spCellCfg.servCellCfg.initDlBwp.pdschCfg;
+   coreset1 = ueCb.ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdcchCfg.cRSetToAddModList[0];
+   pdschCfg = ueCb.ueCfg.spCellCfg.servCellRecfg.initDlBwp.pdschCfg;
 
    /* fill BWP */
    bwp->freqAlloc.numPrb = MAX_NUM_RB;
@@ -1635,7 +1645,7 @@ void updateGrantSizeForBoRpt(CmLListCp *lcLL, DlMsgAlloc *dlMsgAlloc,\
                   lcNode->lcId,lcNode->reqBO, dlMsgSchInfo->numLc, *accumalatedBOSize);
 
             dlMsgSchInfo->numLc++;
-            /*The LC has been fully allocated, clean it*/
+            /* The LC has been fully allocated, clean it */
             if(lcNode->reqBO == 0)
             {
                handleLcLList(lcLL, lcNode->lcId, DELETE);
@@ -1830,137 +1840,64 @@ uint8_t schProcessMsg4Req(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId
 
 /*******************************************************************
  *
- * @brief  Handler to calculate TBS size for BSR requested
+ * @brief sch Process pending Sr or Bsr Req
  *
  * @details
  *
- *    Function :  schCalculateUlTbs
- *
- *    Functionality: Function will note the required TBS for each LCGIDX and use
- *    the Priority LCG List and RRM policy to allocate the TBS size
+ *    Function : updateBsrAndLcList
  *
- * @params [in] ueCb (Pointer to UE CB)
- *         [in] puschTime (Time slot where PUSCH will be sent)
- *         [in] symbLen (No of Symbols used for PUSCH transmission)
- *         [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)
+ *    Functionality:
+ *       Updating the BSRInfo in UECB and Lclist
  *
- * @return uint8_t : ROK > Scheduling of UL grant is successful
- *                   RFAILED > vice versa
+ * @params[in] SchCellCb *cell,  SlotTimingInfo currTime 
+ * @return ROK     - success
+ *         RFAILED - failure
  *
- * ****************************************************************/
-uint8_t schCalculateUlTbs(SchUeCb *ueCb, SlotTimingInfo puschTime, uint8_t symbLen,\
-                          uint16_t *startPrb, uint32_t *totTBS, bool isRetx, SchUlHqProcCb *hqP)
+ *******************************************************************/
+void updateBsrAndLcList(CmLListCp *lcLL, BsrInfo *bsrInfo, uint8_t status)
 {
-   uint16_t mcsIdx = 0;
-   CmLListCp *lcLL = NULLP;
-   uint16_t lcgIdx = 0, lcId =0, maxFreePRB = 0;
-   uint16_t rsvdDedicatedPRB;
-   *startPrb = 0;
-   *totTBS = 0;
+   CmLList *node = NULLP, *next = NULLP;
+   LcInfo *lcNode = NULLP;
 
-   /* check for BSR */
-   for(lcgIdx=0; lcgIdx<MAX_NUM_LOGICAL_CHANNEL_GROUPS; lcgIdx++)
+   if(lcLL == NULLP)
    {
-      if(ueCb->bsrInfo[lcgIdx].dataVol == 0)
-      {
-         continue;
-      }
-
-      /*TODO: lcgIdx and LCID has been implemented as one to one mapping.
-       * Need to check the mapping to figure out the LCID and lcgIdx once L2
-       * spec specifies any logic*/
-      lcId = lcgIdx;
-      if(ueCb->ulInfo.ulLcCtxt[lcId].isDedicated)
-      {
-         lcLL = &(hqP->ulLcPrbEst.dedLcList);
-         rsvdDedicatedPRB = ueCb->ulInfo.ulLcCtxt[lcId].rsvdDedicatedPRB;
-      }
-      else
-      {
-         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 RFAILED;
-      }
+      DU_LOG("\nERROR --> SCH: LcList not present");
+      return;
    }
 
-   if ((hqP->ulLcPrbEst.defLcList.count == 0) && (hqP->ulLcPrbEst.dedLcList.count == 0))
+   if(lcLL->count)
    {
-      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 ROK;
+      node = lcLL->first;
    }
-
-   maxFreePRB = searchLargestFreeBlock(ueCb->cellCb, puschTime, startPrb, DIR_UL);
-
-   /*[Step4]: Estimation of PRB and BO which can be allocated to each LC in
-    * the list based on RRM policy*/
-
-   /*Either this UE contains no reservedPRB pool fir dedicated S-NSSAI or 
-    * Num of Free PRB available is not enough to reserve Dedicated PRBs*/
-   if(maxFreePRB != 0)
+   else
    {
-      mcsIdx = ueCb->ueCfg.ulModInfo.mcsIndex;
-      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",\
-               hqP->ulLcPrbEst.sharedNumPrb);
-
-         /*PRB Alloc for Default LCs*/
-         prbAllocUsingRRMPolicy(&(hqP->ulLcPrbEst.defLcList), FALSE, mcsIdx, symbLen,\
-               &(hqP->ulLcPrbEst.sharedNumPrb), NULLP, NULLP,&(ueCb->srRcvd));
-      }
-      else
-      {
-         hqP->ulLcPrbEst.sharedNumPrb = maxFreePRB - rsvdDedicatedPRB;
-
-         /*PRB Alloc for Dedicated LCs*/
-         prbAllocUsingRRMPolicy(&(hqP->ulLcPrbEst.dedLcList), TRUE, mcsIdx, symbLen,\
-               &(hqP->ulLcPrbEst.sharedNumPrb), &(rsvdDedicatedPRB),\
-               NULLP,&(ueCb->srRcvd));
-
-         /*PRB Alloc for Default LCs*/
-         prbAllocUsingRRMPolicy(&(hqP->ulLcPrbEst.defLcList), FALSE, mcsIdx, symbLen, \
-               &(hqP->ulLcPrbEst.sharedNumPrb), &(rsvdDedicatedPRB),\
-               NULLP,&(ueCb->srRcvd));
-      }
+      /*lcLL is empty*/
+      return;
    }
-   /*[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(hqP->ulLcPrbEst.dedLcList.count != 0)
-      updateGrantSizeForBoRpt(&(hqP->ulLcPrbEst.dedLcList), 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)
+   while(node)
    {
-      if(maxFreePRB == 0)
+      next = node->next;
+      lcNode = (LcInfo *)node->node;
+      if(lcNode != NULLP)
       {
-         DU_LOG("\nERROR  --> SCH : NO FREE PRB!!");
+          /*Only when Status is OK then allocation is marked as ZERO and reqBO
+           * is updated in UE's DB. If Failure, then allocation is added to reqBO 
+           * and same is updated in Ue's DB inside BSR Info structure*/
+         if(status == ROK)
+         {
+            lcNode->allocBO = 0;
+         }
+
+         lcNode->reqBO += lcNode->allocBO;
+         bsrInfo[lcNode->lcId].dataVol = lcNode->reqBO;
+         if(lcNode->reqBO == 0)
+         {
+            handleLcLList(lcLL, lcNode->lcId, DELETE);
+         }
       }
-      else
-      {
-         /*Schedule the LC for next slot*/
-         DU_LOG("\nDEBUG  -->  SCH : No LC has been scheduled");
-      }      
-      return RFAILED;
-   }   
-   return ROK;
+      node = next;
+   }
 }
 
 /*******************************************************************
@@ -1983,14 +1920,9 @@ uint8_t schCalculateUlTbs(SchUeCb *ueCb, SlotTimingInfo puschTime, uint8_t symbL
 bool schProcessSrOrBsrReq(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId, bool isRetx, SchUlHqProcCb **hqP)
 {
    bool k2Found = FALSE;
-   uint8_t ret = RFAILED;
    uint8_t startSymb = 0, symbLen = 0;
    uint8_t k2TblIdx = 0, k2Index = 0, k2Val = 0;
-   uint16_t startPrb = 0;
-   uint32_t totDataReq = 0; /* in bytes */
    SchUeCb *ueCb;
-   SchPuschInfo *puschInfo;
-   DciInfo  *dciInfo = NULLP;
    SchK2TimingInfoTbl *k2InfoTbl=NULLP;
    SlotTimingInfo dciTime, puschTime;
    
@@ -2017,13 +1949,13 @@ bool schProcessSrOrBsrReq(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId
    }
 
    /* Calculating time frame to send DCI for SR */
-   ADD_DELTA_TO_TIME(currTime, dciTime, PHY_DELTA_DL + SCHED_DELTA);
+   ADD_DELTA_TO_TIME(currTime, dciTime, PHY_DELTA_DL + SCHED_DELTA, cell->numSlots);
 #ifdef NR_TDD
    if(schGetSlotSymbFrmt(dciTime.slot, cell->slotFrmtBitMap) == DL_SLOT)
 #endif
    {     
-      if(ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.k2TblPrsnt)
-         k2InfoTbl = &ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.k2InfoTbl;
+      if(ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.k2TblPrsnt)
+         k2InfoTbl = &ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.k2InfoTbl;
       else
          k2InfoTbl =  &cell->cellCfg.schInitialUlBwp.k2InfoTbl;
 
@@ -2031,7 +1963,7 @@ bool schProcessSrOrBsrReq(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId
       {
          k2Index = k2InfoTbl->k2TimingInfo[dciTime.slot].k2Indexes[k2TblIdx];
 
-         if(!ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.k2TblPrsnt)
+         if(!ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.k2TblPrsnt)
          {
             k2Val = cell->cellCfg.schInitialUlBwp.puschCommon.timeDomRsrcAllocList[k2Index].k2;
             startSymb = cell->cellCfg.schInitialUlBwp.puschCommon.timeDomRsrcAllocList[k2Index].startSymbol;
@@ -2039,13 +1971,13 @@ bool schProcessSrOrBsrReq(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId
          }
          else
          {
-            k2Val = ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.puschCfg.timeDomRsrcAllocList[k2Index].k2;
-            startSymb =  ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.puschCfg.timeDomRsrcAllocList[k2Index].startSymbol;
-            symbLen =  ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.puschCfg.timeDomRsrcAllocList[k2Index].symbolLength;
+            k2Val = ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.puschCfg.timeDomRsrcAllocList[k2Index].k2;
+            startSymb =  ueCb->ueCfg.spCellCfg.servCellRecfg.initUlBwp.puschCfg.timeDomRsrcAllocList[k2Index].startSymbol;
+            symbLen =  ueCb->ueCfg.spCellCfg.servCellRecfg.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);
+         ADD_DELTA_TO_TIME(dciTime, puschTime, k2Val, cell->numSlots);
 #ifdef NR_TDD
          if(schGetSlotSymbFrmt(puschTime.slot, cell->slotFrmtBitMap) == DL_SLOT)
             continue;
@@ -2055,58 +1987,18 @@ bool schProcessSrOrBsrReq(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId
             continue;
          }
          k2Found = true;
+         if(hqP)
+         {
+            ADD_DELTA_TO_TIME(puschTime, (*hqP)->puschTime, 0, cell->numSlots);
+         }
          break;
       }
    }
    
    if(k2Found == 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);
-
-               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, isRetx, *hqP) == ROK)
-         {
-            if(cell->schUlSlotInfo[puschTime.slot]->schPuschInfo)
-            {
-               puschInfo = cell->schUlSlotInfo[puschTime.slot]->schPuschInfo;
-               if(puschInfo != NULLP)
-               {
-                  /* Fill DCI for UL grant */
-                  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((*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((*hqP)->ulLcPrbEst.dedLcList.count != 0)
-            updateBsrAndLcList(&((*hqP)->ulLcPrbEst.dedLcList), ueCb->bsrInfo, RFAILED);
-         updateBsrAndLcList(&((*hqP)->ulLcPrbEst.defLcList), ueCb->bsrInfo, RFAILED);
-      }
+      if(cell->api->SchScheduleUlLc(dciTime, puschTime, startSymb, symbLen, isRetx, hqP) != ROK)
+         return false;
    }
    else
    {
@@ -2116,69 +2008,6 @@ bool schProcessSrOrBsrReq(SchCellCb *cell, SlotTimingInfo currTime, uint8_t ueId
    return true;
 }
 
-
-/*******************************************************************
- *
- * @brief sch Process pending Sr or Bsr Req
- *
- * @details
- *
- *    Function : updateBsrAndLcList
- *
- *    Functionality:
- *       Updating the BSRInfo in UECB and Lclist
- *
- * @params[in] SchCellCb *cell,  SlotTimingInfo currTime 
- * @return ROK     - success
- *         RFAILED - failure
- *
- *******************************************************************/
-void updateBsrAndLcList(CmLListCp *lcLL, BsrInfo *bsrInfo, uint8_t status)
-{
-   CmLList *node = NULLP, *next = NULLP;
-   LcInfo *lcNode = NULLP;
-
-   if(lcLL == NULLP)
-   {
-      DU_LOG("\nERROR --> SCH: LcList not present");
-      return;
-   }
-
-   if(lcLL->count)
-   {
-      node = lcLL->first;
-   }
-   else
-   {
-      /*lcLL is empty*/
-      return;
-   }
-
-   while(node)
-   {
-      next = node->next;
-      lcNode = (LcInfo *)node->node;
-      if(lcNode != NULLP)
-      {
-          /*Only when Status is OK then allocation is marked as ZERO and reqBO
-           * is updated in UE's DB. If Failure, then allocation is added to reqBO 
-           * and same is updated in Ue's DB inside BSR Info structure*/
-         if(status == ROK)
-         {
-            lcNode->allocBO = 0;
-         }
-
-         lcNode->reqBO += lcNode->allocBO;
-         bsrInfo[lcNode->lcId].dataVol = lcNode->reqBO;
-         if(lcNode->reqBO == 0)
-         {
-            handleLcLList(lcLL, lcNode->lcId, DELETE);
-         }
-      }
-      node = next;
-   }
-}
-
 /********************************************************************************
  *
  * @brief Increment the Slot by a input factor