1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /************************************************************************
25 Desc: C source code for Entry point fucntions
29 **********************************************************************/
31 /** @file rg_sch_dbm.c
32 @brief This file contains the APIs exposed for the database handling of the scheduler.
34 /* header include files -- defines (.h) */
35 #include "common_def.h"
40 #include "rg_sch_err.h"
41 #include "rg_sch_inf.h"
43 #include "rg_sch_cmn.h"
45 /* header/extern include files (.x) */
49 #include "rgm.x" /* layer management typedefs for MAC */
50 #include "rg_sch_inf.x"
52 #include "rg_sch_cmn.x"
53 #include "rl_interface.h"
54 #include "rl_common.h"
58 static S16 rgSCHDbmInitUeCbLst ARGS(( RgSchCellCb *cellCb, uint16_t numBins));
60 static S16 rgSCHDbmInitUeTfuPendLst ARGS(( RgSchCellCb *cellCb, uint16_t numBins));
62 static Void rgSCHDbmInitDedLcLst ARGS((RgSchUeCb *ueCb));
63 static Void rgSCHDbmInitCmnLcLst ARGS((RgSchCellCb *cellCb));
65 static S16 rgSCHDbmInitSpsUeCbLst ARGS((RgSchCellCb *cellCb,
68 static Void rgSCHDbmInitRaCbLst ARGS(( RgSchCellCb *cellCb));
70 static Void rgSCHDbmInitRaReqLst ARGS(( RgSchCellCb *cellCb));
72 static Void rgSCHDbmInitCrntRgrCfgLst ARGS(( RgSchCellCb *cellCb));
73 static Void rgSCHDbmInitPndngRgrCfgLst ARGS(( RgSchCellCb *cellCb));
76 S16 rgSCHDbmPutEmtcRnti ARGS((RgSchCellCb *cellCb,RgSchRntiLnk *rntiLnk));
83 /* forward references */
86 * @brief Handler for Initializing the cell.
90 * Function : rgSCHDbmInitCell
92 * Initializes the lists belonging to the cell.
95 * @param[in] RgSchCellCb *cellCb
100 S16 rgSCHDbmInitCell(RgSchCellCb *cellCb)
104 /* Initialize ue list */
105 if ((ret = rgSCHDbmInitUeCbLst(cellCb, RGSCH_MAX_UE_BIN_PER_CELL)) != ROK)
108 if ((ret = rgSCHDbmInitUeTfuPendLst(cellCb,
109 RGSCH_MAX_UE_BIN_PER_CELL)) != ROK)
114 /* Initialize SPS Ue list */
115 if ((ret = rgSCHDbmInitSpsUeCbLst(cellCb, RGSCH_MAX_UE_BIN_PER_CELL)) != ROK)
117 #endif /* LTEMAC_SPS */
119 /* Initialize BCCH/PCCH logical channels */
120 rgSCHDbmInitCmnLcLst(cellCb);
122 /* Initialize configuration lists */
123 rgSCHDbmInitCrntRgrCfgLst(cellCb);
124 rgSCHDbmInitPndngRgrCfgLst(cellCb);
127 /* Initialize raReq list */
128 rgSCHDbmInitRaReqLst(cellCb);
131 /* Initialize raCb list */
132 rgSCHDbmInitRaCbLst(cellCb);
134 /* Initialize l2mList */
136 cmLListInit(&cellCb->l2mList);
137 #endif /* LTE_L2_MEAS */
141 } /* rgSCHDbmInitCell */
144 * @brief Handler for initializing the ueCbLst under the cellCb.
148 * Function : rgSCHDbmInitUeCbLst
157 static S16 rgSCHDbmInitUeCbLst(RgSchCellCb *cellCb,uint16_t numBins)
159 RgSchUeCellInfo ueCellInfo;
161 /* Fix: syed It is better to compute offset dynamically
162 * rather than hardcoding it as 0 */
163 return (cmHashListInit(&cellCb->ueLst, numBins, (uint16_t)((PTR)&(ueCellInfo.ueLstEnt) - (PTR)&ueCellInfo), FALSE,
164 CM_HASH_KEYTYPE_CONID,
165 rgSchCb[cellCb->instIdx].rgSchInit.region,
166 rgSchCb[cellCb->instIdx].rgSchInit.pool));
168 } /* rgSCHDbmInitUeCbLst */
171 * @brief Handler for de-initializing the ueCbLst under the cellCb.
175 * Function : rgSCHDbmDeInitUeCbLst
183 S16 rgSCHDbmDeInitUeCbLst(RgSchCellCb *cellCb)
186 return (cmHashListDeinit(&cellCb->ueLst));
188 } /* rgSCHDbmDeInitUeCbLst */
192 * @brief Handler for initializing the spsUeCbLst under the cellCb.
196 * Function : rgSCHDbmInitSpsUeCbLst
205 static S16 rgSCHDbmInitSpsUeCbLst(RgSchCellCb *cellCb,uint16_t numBins)
209 return (cmHashListInit(&cellCb->spsUeLst, numBins, (uint16_t) ((PTR) &(ue.spsUeLstEnt) - (PTR) &ue), FALSE,
210 CM_HASH_KEYTYPE_CONID,
211 rgSchCb[cellCb->instIdx].rgSchInit.region,
212 rgSchCb[cellCb->instIdx].rgSchInit.pool));
214 } /* rgSCHDbmInitSpsUeCbLst */
217 * @brief Handler for de-initializing the spsUeCbLst under the cellCb.
221 * Function : rgSCHDbmDeInitSpsUeCbLst
229 S16 rgSCHDbmDeInitSpsUeCbLst(RgSchCellCb *cellCb)
232 return (cmHashListDeinit(&cellCb->spsUeLst));
234 } /* rgSCHDbmDeInitSpsUeCbLst */
236 #endif /* LTEMAC_SPS */
239 * @brief Handler for inserting the ueCb in to the ueCbLst under the cellCb.
243 * Function : rgSCHDbmInsUeCb
252 S16 rgSCHDbmInsUeCb(RgSchCellCb *cellCb,RgSchUeCb *ueCb)
254 RgSchUeCellInfo *ueCellInfo = NULLP;
256 ueCellInfo = ueCb->cellInfo[ueCb->cellIdToCellIdxMap[RG_SCH_CELLINDEX(cellCb)]];
258 return (cmHashListInsert(&cellCb->ueLst, (PTR)ueCellInfo,
259 (uint8_t *)&ueCb->ueId, (uint16_t)sizeof(ueCb->ueId)));
261 } /* rgSCHDbmInsUeCb */
265 * @brief Handler for inserting the ueCb in to the spsUeCbLst under the cellCb.
269 * Function : rgSCHDbmInsSpsUeCb
278 S16 rgSCHDbmInsSpsUeCb(RgSchCellCb *cellCb,RgSchUeCb *ueCb)
280 return (cmHashListInsert(&cellCb->spsUeLst, (PTR)ueCb,
281 (uint8_t *)&ueCb->spsRnti, (uint16_t)sizeof(ueCb->spsRnti)));
283 } /* end of rgSCHDbmInsSpsUeCb */
285 #endif /* LTEMAC_SPS */
288 * @brief Handler for accessing the existing ueCb identified by the key ueId
289 * in the ueCbLst under the cellCb.
293 * Function : rgSCHDbmGetUeCb
300 RgSchUeCb* rgSCHDbmGetUeCb(RgSchCellCb *cellCb,CmLteRnti ueId)
302 RgSchUeCellInfo *ueCellInfo = NULLP;
304 cmHashListFind(&cellCb->ueLst, (uint8_t *)&ueId,
305 sizeof(ueId), 0, (PTR *)&ueCellInfo);
307 return (!ueCellInfo?NULLP:ueCellInfo->ue);
308 } /* rgSCHDbmGetUeCb */
312 * @brief Handler for accessing the existing ueCb identified by the key
313 * spsRnti in the spsUeCbLst under the cellCb.
317 * Function : rgSCHDbmGetSpsUeCb
324 RgSchUeCb* rgSCHDbmGetSpsUeCb(RgSchCellCb *cellCb, CmLteRnti spsRnti)
326 RgSchUeCb *ueCb = NULLP;
328 cmHashListFind(&cellCb->spsUeLst, (uint8_t *)&spsRnti,
329 sizeof(spsRnti), 0, (PTR *)&ueCb);
331 } /* rgSCHDbmGetSpsUeCb */
335 * @brief Handler for accessing the existing next ueCb in the ueCbLst under the
340 * Function : rgSCHDbmGetNextUeCb
347 RgSchUeCb* rgSCHDbmGetNextUeCb(RgSchCellCb *cellCb, RgSchUeCb *ueCb)
349 RgSchUeCellInfo *ueCellInfo = NULLP;
350 RgSchUeCellInfo *nextUeCellInfo = NULLP;
354 ueCellInfo = ueCb->cellInfo[
355 ueCb->cellIdToCellIdxMap[RG_SCH_CELLINDEX(cellCb)]];
358 cmHashListGetNext(&cellCb->ueLst, (PTR) ueCellInfo, (PTR *)&nextUeCellInfo);
359 return (!nextUeCellInfo?NULLP:nextUeCellInfo->ue);
360 } /* rgSCHDbmGetNextUeCb */
364 * @brief Handler for accessing the existing next ueCb stored in the spsUeCbLst
365 * using SPS-Rnti under the cellCb.
369 * Function : rgSCHDbmGetNextSpsUeCb
376 RgSchUeCb* rgSCHDbmGetNextSpsUeCb(RgSchCellCb *cellCb, RgSchUeCb *ueCb)
378 RgSchUeCb *nextUeCb = NULLP;
380 cmHashListGetNext(&cellCb->spsUeLst, (PTR) ueCb, (PTR *)&nextUeCb);
382 } /* end of rgSCHDbmGetNextSpsUeCb */
384 #endif /* LTEMAC_SPS */
388 * @brief Handler for Cleaning up L2 Meas related Data in
393 * Function : rgSCHDbmDelL2MUe
402 S16 rgSCHDbmDelL2MUe(RgSchCellCb *cellCb,RgSchUeCb *ueCb)
405 RgSchCmnUlUe *ueUl = RG_SCH_CMN_GET_UL_UE(ueCb, cellCb);
407 ueUl->hqEnt.numBusyHqProcs = 0;
408 /* Clean cell level UE Active Count */
409 for (lcCnt =0; lcCnt < RGSCH_MAX_LC_PER_UE; lcCnt++)
411 if (ueCb->ul.lcCb[lcCnt].isValid)
413 if((ueCb->ul.lcCb[lcCnt].qciCb->ulUeCount) &&
415 (1 << (ueCb->ul.lcCb[lcCnt].qciCb->qci -1))))
417 ueCb->ul.lcCb[lcCnt].qciCb->ulUeCount--;
418 ueCb->ulActiveLCs &= ~(1 <<
419 (ueCb->ul.lcCb[lcCnt].qciCb->qci -1));
423 if (ueCb->dl.lcCb[lcCnt])
425 if (ueCb->qciActiveLCs[ueCb->dl.lcCb[lcCnt]->qciCb->qci])
427 ueCb->dl.lcCb[lcCnt]->qciCb->dlUeCount--;
428 ueCb->qciActiveLCs[ueCb->dl.lcCb[lcCnt]->qciCb->qci] = 0;
434 } /* rgSCHDbmDelL2MUe */
439 * @brief Handler for deleting the existing ueCb from the ueCbLst under the
444 * Function : rgSCHDbmDelUeCb
453 S16 rgSCHDbmDelUeCb(RgSchCellCb *cellCb,RgSchUeCb *ueCb)
455 RgSchUeCellInfo *ueCellInfo = NULLP;
457 ueCellInfo = ueCb->cellInfo[ueCb->cellIdToCellIdxMap[RG_SCH_CELLINDEX(cellCb)]];
459 return (cmHashListDelete(&cellCb->ueLst, (PTR)ueCellInfo));
460 } /* rgSCHDbmDelUeCb */
464 * @brief Handler for deleting the existing ueCb from the spsUeCbLst under the
469 * Function : rgSCHDbmDelSpsUeCb
478 S16 rgSCHDbmDelSpsUeCb(RgSchCellCb *cellCb,RgSchUeCb *ueCb)
481 return (cmHashListDelete(&cellCb->spsUeLst, (PTR)ueCb));
482 } /* end of rgSCHDbmDelSpsUeCb */
484 #endif /* LTEMAC_SPS */
487 * @brief Handler for Initializing the UE.
491 * Function : rgSCHDbmInitUe
493 * Initializes the lists belonging to the UE.
496 * @param[in] RgSchUeCb *ueCb
501 S16 rgSCHDbmInitUe(RgSchUeCb *ueCb)
505 /* Initialize Dedicated logical channels */
506 rgSCHDbmInitDedLcLst(ueCb);
509 } /* rgSCHDbmInitUe */
512 * @brief Handler for Initializing the dedicated logical channels.
516 * Function : rgSCHDbmInitDedLcLst
518 * Initializes dedicated logical channels.
520 * @param[in] RgSchUeCb *ueCb
523 static Void rgSCHDbmInitDedLcLst(RgSchUeCb *ueCb)
527 for (idx = 0; idx < RGSCH_MAX_LC_PER_UE; ++idx)
529 /* Set Dedicated LCs as not configured */
530 ueCb->ul.lcCb[idx].isValid = FALSE;
531 ueCb->dl.lcCb[idx] = NULLP;
534 /* Stack Crash problems for TRACE5 Changes. Added the return below */
538 } /* rgSCHDbmInitDedLcLst */
541 * @brief Handler for Initializing the common logical channel list of the cell.
545 * Function : rgSCHDbmInitCmnLcLst
547 * Initializes following common logical channels belonging to the cell.
552 * @param[in] RgSchCellCb *cellCb
555 static Void rgSCHDbmInitCmnLcLst(RgSchCellCb *cellCb)
559 for (idx = 0; idx < RGSCH_MAX_CMN_LC_CB; idx++)
561 cellCb->cmnLcCb[idx].lcId = RGSCH_INVALID_LC_ID;
564 /* Stack Crash problems for TRACE5 Changes. Added the return below */
567 } /* rgSCHDbmInitCmnLcLst */
570 * @brief Handler for inserting dedicated DL logical channel.
574 * Function : rgSCHDbmInsDlDedLcCb
576 * @param[in] RgSchUeCb *ueCb
577 * @param[in] RgSchDlLcCb* dlLcCb
580 Void rgSCHDbmInsDlDedLcCb(RgSchUeCb *ueCb, RgSchDlLcCb *dlLcCb )
583 ueCb->dl.lcCb[dlLcCb->lcId - 1] = dlLcCb;
585 } /* rgSCHDbmInsDlDedLcCb */
588 * @brief Handler for deleting dedicated DL logical channel.
592 * Function : rgSCHDbmDelDlDedLcCb
594 * @param[in] RgSchUeCb *ueCb
595 * @param[in] RgSchDlLcCb* dlLcCb
598 Void rgSCHDbmDelDlDedLcCb(RgSchUeCb *ueCb, RgSchDlLcCb *dlLcCb )
602 /* Clean cell level UE Active Count */
604 if (ueCb->dl.lcCb[dlLcCb->lcId - 1])
607 && (ueCb->qciActiveLCs[dlLcCb->qciCb->qci]))
609 ueCb->qciActiveLCs[dlLcCb->qciCb->qci]--;
610 if (!(ueCb->qciActiveLCs[dlLcCb->qciCb->qci]))
612 dlLcCb->qciCb->dlUeCount--;
616 #endif /* LTE_L2_MEAS */
618 ueCb->dl.lcCb[dlLcCb->lcId - 1] = NULLP;
620 /* Stack Crash problems for TRACE5 Changes. Added the return below */
623 } /* rgSCHDbmDelDlDedLcCb */
626 * @brief Handler for accessing the existing dl dedicated lcCb at idx in the
627 * lcCbLst of the ueCb.
631 * Function : rgSCHDbmGetDlDedLcCb
635 * @return RgSchDlLcCb*
637 RgSchDlLcCb* rgSCHDbmGetDlDedLcCb(RgSchUeCb *ueCb, CmLteLcId idx)
639 if (idx < RGSCH_DEDLC_MIN_LCID || idx > RGSCH_DEDLC_MAX_LCID)
643 return (ueCb->dl.lcCb[idx-1]);
645 } /* rgSCHDbmGetDlDedLcCb */
648 * @brief Handler for accessing the existing first dl dedicated lcCb at idx
649 * in the lcCbLst of the ueCb.
653 * Function : rgSCHDbmGetFirstDlDedLcCb
657 * @return RgSchDlLcCb*
659 RgSchDlLcCb* rgSCHDbmGetFirstDlDedLcCb(RgSchUeCb *ueCb)
663 for(idx = 0; idx < RGSCH_DEDLC_MAX_LCID; idx++)
665 if(ueCb->dl.lcCb[idx])
667 return (ueCb->dl.lcCb[idx]);
671 } /* rgSCHDbmGetFirstDlDedLcCb */
673 * @brief Handler for accessing the existing next dl dedicated lcCb at idx
674 * in the lcCbLst of the ueCb.
678 * Function : rgSCHDbmGetNextDlDedLcCb
683 * @return RgSchDlLcCb*
685 RgSchDlLcCb* rgSCHDbmGetNextDlDedLcCb(RgSchUeCb *ueCb,RgSchDlLcCb *lcCb)
691 return (rgSCHDbmGetFirstDlDedLcCb(ueCb));
694 for(idx = lcCb->lcId; idx < RGSCH_DEDLC_MAX_LCID; idx++)
696 if(ueCb->dl.lcCb[idx])
698 return (ueCb->dl.lcCb[idx]);
702 } /* rgSCHDbmGetNextDlDedLcCb */
705 * @brief Handler for accessing the existing dl common lcCb identified by the key lcId
706 * in the lcCbLst of the ueCb.
710 * Function : rgSCHDbmGetCmnLcCb
715 * @return RgSchClcDlLcCb*
717 RgSchClcDlLcCb* rgSCHDbmGetCmnLcCb(RgSchCellCb *cellCb, CmLteLcId lcId)
721 for(idx = 0; idx < RGSCH_MAX_CMN_LC_CB; idx++)
723 if(cellCb->cmnLcCb[idx].lcId == lcId)
725 return (&(cellCb->cmnLcCb[idx]));
729 } /* rgSCHDbmGetCmnLcCb */
732 * @brief Handler for accessing the existing BCCH mapped on to BCH in the
733 * lcCbLst of the ueCb.
737 * Function : rgSCHDbmGetBcchOnBch
741 * @return RgSchClcDlLcCb*
743 RgSchClcDlLcCb* rgSCHDbmGetBcchOnBch(RgSchCellCb *cellCb )
746 if(cellCb->cmnLcCb[RGSCH_BCCH_BCH_IDX].lcId != RGSCH_INVALID_LC_ID)
748 return (&(cellCb->cmnLcCb[RGSCH_BCCH_BCH_IDX]));
751 } /* rgSCHDbmGetBcchOnBch */
754 * @brief Handler for accessing the existing BCCH mapped on to DLSCH in the
755 * lcCbLst of the ueCb.
759 * Function : rgSCHDbmGetFirstBcchOnDlsch
763 * @return RgSchClcDlLcCb*
765 RgSchClcDlLcCb* rgSCHDbmGetFirstBcchOnDlsch(RgSchCellCb *cellCb)
768 if(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1].lcId != RGSCH_INVALID_LC_ID)
770 return (&(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1]));
773 } /* rgSCHDbmGetFirstBcchOnDlsch */
776 * @brief Handler for accessing the existing BCCH mapped on to DLSCH in the
777 * lcCbLst of the ueCb.
781 * Function : rgSCHDbmGetSecondBcchOnDlsch
785 * @return RgSchClcDlLcCb*
787 RgSchClcDlLcCb* rgSCHDbmGetSecondBcchOnDlsch(RgSchCellCb *cellCb)
790 if(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2].lcId != RGSCH_INVALID_LC_ID)
792 return (&(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2]));
795 } /* rgSCHDbmGetSecondBcchOnDlsch */
798 * @brief Handler for accessing the existing PCCH in the lcCbLst of the ueCb.
802 * Function : rgSCHDbmGetPcch
806 * @return RgSchClcDlLcCb*
808 RgSchClcDlLcCb* rgSCHDbmGetPcch(RgSchCellCb *cellCb)
811 if(cellCb->cmnLcCb[RGSCH_PCCH_IDX].lcId != RGSCH_INVALID_LC_ID)
813 return (&(cellCb->cmnLcCb[RGSCH_PCCH_IDX]));
816 } /* rgSCHDbmGetPcch */
819 * @brief Handler for inserting the BCCH mapped on to BCH in the
820 * lcCbLst of the ueCb.
824 * Function : rgSCHDbmInsBcchOnBch
830 Void rgSCHDbmInsBcchOnBch(RgSchCellCb *cellCb, RgSchClcDlLcCb *cmnDlLcCb)
833 cellCb->cmnLcCb[RGSCH_BCCH_BCH_IDX].lcId = cmnDlLcCb->lcId;
834 cellCb->cmnLcCb[RGSCH_BCCH_BCH_IDX].boLst = cmnDlLcCb->boLst;
836 /* Stack Crash problems for TRACE5 Changes. Added the return below */
839 } /* rgSCHDbmInsBcchOnBch */
842 * @brief Handler for inserting the BCCH mapped on to DLSCH in the
843 * lcCbLst of the ueCb.
847 * Function : rgSCHDbmInsBcchOnDlsch
853 Void rgSCHDbmInsBcchOnDlsch(RgSchCellCb *cellCb, RgSchClcDlLcCb *cmnDlLcCb)
855 if(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1].lcId == RGSCH_INVALID_LC_ID)
857 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1].lcId = cmnDlLcCb->lcId;
858 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1].boLst = cmnDlLcCb->boLst;
859 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1].si = FALSE;
861 else if(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2].lcId == RGSCH_INVALID_LC_ID)
863 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2].lcId = cmnDlLcCb->lcId;
864 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2].boLst = cmnDlLcCb->boLst;
865 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2].si = TRUE;
868 /* Stack Crash problems for TRACE5 Changes. Added the return below */
871 } /* rgSCHDbmInsBcchOnDlsch */
875 * @brief Handler for inserting the PCCH in the lcCbLst of the ueCb.
879 * Function : rgSCHDbmInsPcch
885 Void rgSCHDbmInsPcch(RgSchCellCb *cellCb, RgSchClcDlLcCb *cmnDlLcCb)
888 cellCb->cmnLcCb[RGSCH_PCCH_IDX].lcId = cmnDlLcCb->lcId;
889 cellCb->cmnLcCb[RGSCH_PCCH_IDX].boLst = cmnDlLcCb->boLst;
891 /* Stack Crash problems for TRACE5 Changes. Added the return below */
894 } /* rgSCHDbmInsPcch */
897 * @brief Handler for initializing the boLst.
901 * Function : rgSCHDbmInitCmnLcBoLst
904 * @param[in] *cmnDlLcCb
907 Void rgSCHDbmInitCmnLcBoLst(RgSchClcDlLcCb *cmnDlLcCb)
910 cmLListInit(&cmnDlLcCb->boLst);
912 } /* rgSCHDbmInitCmnLcBoLst */
915 * @brief Handler for inserting the bo report in to the boLst.
919 * Function : rgSCHDbmInsCmnLcBoRpt
922 * @param[in] *cmnDlLcCb
926 Void rgSCHDbmInsCmnLcBoRpt(RgSchClcDlLcCb *cmnDlLcCb,RgSchClcBoRpt *cmnBoRpt)
928 cmnBoRpt->boLstEnt.next = NULLP;
929 cmnBoRpt->boLstEnt.prev = NULLP;
930 cmnBoRpt->boLstEnt.node = (PTR)cmnBoRpt;
931 cmLListAdd2Tail(&cmnDlLcCb->boLst, &cmnBoRpt->boLstEnt);
933 } /* rgSCHDbmInsCmnLcBoRpt */
937 * @brief Handler for initializing the raCbLst.
941 * Function : rgSCHDbmInitRaCbLst
947 static Void rgSCHDbmInitRaCbLst(RgSchCellCb *cellCb)
950 cmLListInit(&cellCb->raInfo.raCbLst);
952 } /* rgSCHDbmInitRaCbLst */
956 * @brief Handler for accessing the existing raCb in the raCbLst.
960 * Function : rgSCHDbmGetRaCb
967 RgSchRaCb* rgSCHDbmGetRaCb(RgSchCellCb *cellCb, CmLteRnti key)
971 CM_LLIST_FIRST_NODE(&cellCb->raInfo.raCbLst,tmpNode);
974 if(((RgSchRaCb *)tmpNode->node)->tmpCrnti == key)
976 return ((RgSchRaCb *)(tmpNode->node));
978 CM_LLIST_NEXT_NODE(&cellCb->raInfo.raCbLst,tmpNode);
981 } /* rgSCHDbmGetRaCb */
985 * @brief Handler for initializing the raReqLst.
989 * Function : rgSCHDbmInitRaReqLst
995 static Void rgSCHDbmInitRaReqLst(RgSchCellCb *cellCb)
999 /* ccpu00133557- Memory Leak Fix- initializing for the all nodes
1001 for(idx = 0; idx < RGSCH_RAREQ_ARRAY_SIZE; idx++)
1003 cmLListInit(&cellCb->raInfo.raReqLst[idx]);
1006 } /* rgSCHDbmInitRaReqLst */
1010 * @brief Handler for initializing the crnt rgr cfgLst.
1014 * Function : rgSCHDbmInitCrntRgrCfgLst
1017 * @param[in] *cellCb
1020 static Void rgSCHDbmInitCrntRgrCfgLst(RgSchCellCb *cellCb)
1023 cmLListInit(&cellCb->rgCfgInfo.crntRgrCfgLst);
1025 } /* rgSCHDbmInitCrntRgrCfgLst */
1028 * @brief Handler for initializing the pndng rgr cfgLst.
1032 * Function : rgSCHDbmInitPndngRgrCfgLst
1035 * @param[in] *cellCb
1038 static Void rgSCHDbmInitPndngRgrCfgLst(RgSchCellCb *cellCb)
1041 cmLListInit(&cellCb->rgCfgInfo.pndngRgrCfgLst);
1043 } /* rgSCHDbmInitPndngRgrCfgLst */
1046 * @brief Handler for inserting the cfgElem in to the crntRgrCfgLst.
1050 * Function : rgSCHDbmInsCrntRgrCfgElem
1053 * @param[in] *cellCb
1054 * @param[in] *cfgElem
1057 Void rgSCHDbmInsCrntRgrCfgElem(RgSchCellCb *cellCb,RgSchCfgElem *cfgElem)
1059 cfgElem->cfgReqLstEnt.next = NULLP;
1060 cfgElem->cfgReqLstEnt.prev = NULLP;
1061 cmLListAdd2Tail(&cellCb->rgCfgInfo.crntRgrCfgLst, &cfgElem->cfgReqLstEnt);
1063 } /* rgSCHDbmInsCrntRgrCfgElem */
1066 * @brief Handler for inserting the cfgElem in to the pndngRgrCfgLst.
1070 * Function : rgSCHDbmInsPndngRgrCfgElem
1073 * @param[in] *cellCb
1074 * @param[in] *cfgElem
1077 Void rgSCHDbmInsPndngRgrCfgElem(RgSchCellCb *cellCb,RgSchCfgElem *cfgElem)
1080 cfgElem->cfgReqLstEnt.next = NULLP;
1081 cfgElem->cfgReqLstEnt.prev = NULLP;
1082 cfgElem->cfgReqLstEnt.node = (PTR)cfgElem;
1083 cmLListAdd2Tail(&cellCb->rgCfgInfo.pndngRgrCfgLst, &cfgElem->cfgReqLstEnt);
1085 } /* rgSCHDbmInsPndngRgrCfgElem */
1088 * @brief Handler for accessing the existing cfgElem in the crntRgrCfgLst.
1092 * Function : rgSCHDbmGetNextCrntRgrCfgElem
1095 * @param[in] *cellCb
1096 * @param[in] *cfgElem
1097 * @return RgSchCfgElem*
1099 RgSchCfgElem* rgSCHDbmGetNextCrntRgrCfgElem(RgSchCellCb *cellCb,RgSchCfgElem *cfgElem)
1104 return ( cellCb->rgCfgInfo.crntRgrCfgLst.first ?
1105 (RgSchCfgElem *)(cellCb->rgCfgInfo.crntRgrCfgLst.first->node) : NULLP );
1107 return ( cfgElem->cfgReqLstEnt.next ?
1108 (RgSchCfgElem *)(cfgElem->cfgReqLstEnt.next->node) : NULLP );
1109 } /* rgSCHDbmGetNextCrntRgrCfgElem */
1112 * @brief Handler for accessing the existing cfgElem in the pndngRgrCfgLst.
1116 * Function : rgSCHDbmGetNextPndngRgrCfgElem
1119 * @param[in] *cellCb
1120 * @param[in] *cfgElem
1121 * @return RgSchCfgElem*
1123 RgSchCfgElem* rgSCHDbmGetNextPndngRgrCfgElem(RgSchCellCb *cellCb,RgSchCfgElem *cfgElem)
1128 return ( cellCb->rgCfgInfo.pndngRgrCfgLst.first ?
1129 (RgSchCfgElem *)(cellCb->rgCfgInfo.pndngRgrCfgLst.first->node) : NULLP );
1131 return ( cfgElem->cfgReqLstEnt.next ?
1132 (RgSchCfgElem *)(cfgElem->cfgReqLstEnt.next->node) : NULLP );
1133 } /* rgSCHDbmGetNextPndngRgrCfgElem */
1136 * @brief Handler for extracting the existing cfgElem from the pndngRgrCfgLst.
1140 * Function : rgSCHDbmGetPndngRgrCfgElemByKey
1143 * @param[in] *cellCb
1145 * @return RgSchCfgElem*
1147 RgSchCfgElem* rgSCHDbmGetPndngRgrCfgElemByKey(RgSchCellCb *cellCb,CmLteTimingInfo key)
1151 CM_LLIST_FIRST_NODE(&cellCb->rgCfgInfo.pndngRgrCfgLst,tmpNode);
1154 if((((RgSchCfgElem *)tmpNode->node)->actvTime.sfn == key.sfn) &&
1155 (((RgSchCfgElem *)tmpNode->node)->actvTime.slot == key.slot))
1157 return ((RgSchCfgElem *)(tmpNode->node));
1159 CM_LLIST_NEXT_NODE(&cellCb->rgCfgInfo.pndngRgrCfgLst,tmpNode);
1162 } /* rgSCHDbmGetPndngRgrCfgElemByKey */
1165 * @brief Handler for deleting the existing cfgElem from the crntRgrCfgLst.
1169 * Function : rgSCHDbmDelCrntRgrCfgElem
1172 * @param[in] *cellCb
1173 * @param[in] *cfgElem
1174 * @return RgSchCfgElem*
1176 RgSchCfgElem* rgSCHDbmDelCrntRgrCfgElem(RgSchCellCb *cellCb,RgSchCfgElem *cfgElem)
1179 if(cmLListDelFrm(&cellCb->rgCfgInfo.crntRgrCfgLst,&cfgElem->cfgReqLstEnt))
1181 return ((RgSchCfgElem *)(cfgElem->cfgReqLstEnt.node));
1184 } /* rgSCHDbmDelCrntRgrCfgElem */
1187 * @brief Handler for deleting the existing cfgElem from the pndngRgrCfgLst.
1191 * Function : rgSCHDbmDelPndngRgrCfgElem
1194 * @param[in] *cellCb
1195 * @param[in] *cfgElem
1196 * @return RgSchCfgElem*
1198 RgSchCfgElem* rgSCHDbmDelPndngRgrCfgElem(RgSchCellCb *cellCb,RgSchCfgElem *cfgElem)
1200 if(cmLListDelFrm(&cellCb->rgCfgInfo.pndngRgrCfgLst,&cfgElem->cfgReqLstEnt))
1202 return ((RgSchCfgElem *)(cfgElem->cfgReqLstEnt.node));
1205 } /* rgSCHDbmDelPndngRgrCfgElem */
1208 * @brief Handler for initializing the rntiDb.
1212 * Function : rgSCHDbmRntiDbInit
1215 * @param[in] *cellCb
1216 * @param[in] rntiStart
1217 * @param[in] maxRntis
1222 S16 rgSCHDbmRntiDbInit(RgSchCellCb *cellCb,uint16_t rntiStart,uint16_t maxRntis)
1225 RgSchRntiLnk *rntiPool;
1227 /* Fix for Change Request ccpu00099150 */
1228 if(rgSCHUtlAllocSBuf(cellCb->instIdx,
1229 (Data **)&cellCb->rntiDb.rntiPool,maxRntis*sizeof(RgSchRntiLnk)) != ROK)
1233 cellCb->rntiDb.rntiStart = rntiStart;
1234 cellCb->rntiDb.maxRntis = maxRntis;
1236 cellCb->rntiDb.count = maxRntis;
1239 rntiPool = cellCb->rntiDb.rntiPool;
1242 rntiPool[0].rnti = rnti;
1243 rntiPool[0].prv = NULLP;
1244 rntiPool[0].nxt = NULLP;
1245 cellCb->rntiDb.lastRnti = &rntiPool[0];
1250 rntiPool[0].rnti = rnti++;
1251 rntiPool[0].prv = NULLP;
1252 rntiPool[0].nxt = &rntiPool[1];
1253 for (idx = 1; idx < maxRntis - 1; ++idx)
1255 rntiPool[idx].rnti = rnti++;
1256 rntiPool[idx].prv = &rntiPool[idx-1];
1257 rntiPool[idx].nxt = &rntiPool[idx+1];
1259 rntiPool[idx].rnti = rnti++;
1260 rntiPool[idx].prv = &rntiPool[idx-1];
1261 rntiPool[idx].nxt = NULLP;
1262 cellCb->rntiDb.lastRnti = &rntiPool[idx];
1264 cellCb->rntiDb.freeRnti = &rntiPool[0];
1266 } /* rgSCHDbmRntiDbInit */
1269 * @brief Handler for de-initializing the rntiDb.
1273 * Function : rgSCHDbmRntiDbDeInit
1276 * @param[in] *cellCb
1279 Void rgSCHDbmRntiDbDeInit(RgSchCellCb *cellCb)
1281 /* ccpu00117052 - MOD - Passing double pointer
1282 for proper NULLP assignment*/
1283 rgSCHUtlFreeSBuf(cellCb->instIdx, (Data **)(&(cellCb->rntiDb.rntiPool)),
1284 cellCb->rntiDb.maxRntis*sizeof(RgSchRntiLnk));
1285 cellCb->rntiDb.maxRntis = 0;
1286 cellCb->rntiDb.freeRnti = NULLP;
1287 cellCb->rntiDb.lastRnti = NULLP;
1288 cmLListInit(&cellCb->rntiDb.rntiGuardPool);
1290 /* Stack Crash problems for TRACE5 Changes. Added the return below */
1293 } /* rgSCHDbmRntiDbDeInit */
1296 * @brief Handler for accessing the free RNTI.
1300 * Function : rgSCHDbmGetRnti
1303 * @param[in] *cellCb
1304 * @return RgSchRntiLnk*
1306 RgSchRntiLnk* rgSCHDbmGetRnti(RgSchCellCb *cellCb)
1308 RgSchRntiLnk *rntiLnk;
1310 if (!(cellCb->rntiDb.freeRnti))
1312 DU_LOG("\nERROR --> SCH : RNTI exhausted count:%d",
1313 cellCb->rntiDb.count);
1317 rntiLnk = cellCb->rntiDb.freeRnti;
1318 cellCb->rntiDb.freeRnti = rntiLnk->nxt;
1320 /* setting prv and nxt to NULLP may not be needed */
1321 rntiLnk->prv = NULLP;
1322 rntiLnk->nxt = NULLP;
1324 if (cellCb->rntiDb.freeRnti != NULLP)
1326 cellCb->rntiDb.freeRnti->prv = NULLP;
1330 cellCb->rntiDb.lastRnti = NULLP;
1333 cellCb->rntiDb.count--;
1335 DU_LOG("\nINFO --> SCH : rgSCHDbmGetRnti::rntiLnk->rnti %u\n",rntiLnk->rnti);
1337 } /* rgSCHDbmGetRnti */
1340 * @brief Handler for releasing the RNTI.
1344 * Function : rgSCHDbmRlsRnti
1347 * @param[in] *cellCb
1348 * @param[in] rntiLnk
1351 Void rgSCHDbmRlsRnti(RgSchCellCb *cellCb,RgSchRntiLnk *rntiLnk)
1354 if(ROK==rgSCHDbmPutEmtcRnti(cellCb,rntiLnk))
1359 rntiLnk->nxt = NULLP;
1360 if (cellCb->rntiDb.lastRnti)
1362 cellCb->rntiDb.lastRnti->nxt = rntiLnk;
1363 rntiLnk->prv = cellCb->rntiDb.lastRnti;
1367 rntiLnk->prv = NULLP;
1368 cellCb->rntiDb.freeRnti = rntiLnk;
1370 cellCb->rntiDb.lastRnti = rntiLnk;
1372 cellCb->rntiDb.count++;
1374 /* Stack Crash problems for TRACE5 Changes. Added the return below */
1377 } /* rgSCHDbmRlsRnti */
1381 * @brief Handler for initializing the ueTfuPendLst under the cellCb.
1385 * Function : rgSCHDbmInitUeTfuPendLst
1388 * @param[in] *cellCb
1389 * @param[in] numBins
1394 static S16 rgSCHDbmInitUeTfuPendLst(RgSchCellCb *cellCb,uint16_t numBins)
1396 RgSchUePucchRecpInfo pucchInfo;
1398 /* Fix: syed It is better to compute offset dynamically
1399 * rather than hardcoding it as 0 */
1400 if(cmHashListInit(&cellCb->ueTfuPendLst, numBins, (uint16_t)((PTR)&(pucchInfo.hashLstEnt) - (PTR)&pucchInfo), FALSE,
1401 CM_HASH_KEYTYPE_CONID,
1402 rgSchCb[cellCb->instIdx].rgSchInit.region,
1403 rgSchCb[cellCb->instIdx].rgSchInit.pool) != ROK)
1410 } /* rgSCHDbmInitUeTfuPendLst */
1413 * @brief Handler for de-initializing the ueTfuPendLst under the cellCb.
1417 * Function : rgSCHDbmDeInitUeTfuPendLst
1420 * @param[in] *cellCb
1425 S16 rgSCHDbmDeInitUeTfuPendLst(RgSchCellCb *cellCb)
1428 cmHashListDeinit(&cellCb->ueTfuPendLst);
1431 } /* rgSCHDbmDeInitUeTfuPendLst */
1434 /**********************************************************************
1437 **********************************************************************/