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"
56 static S16 rgSCHDbmInitUeCbLst ARGS(( RgSchCellCb *cellCb, uint16_t numBins));
58 static S16 rgSCHDbmInitUeTfuPendLst ARGS(( RgSchCellCb *cellCb, uint16_t numBins));
60 static Void rgSCHDbmInitDedLcLst ARGS((RgSchUeCb *ueCb));
61 static Void rgSCHDbmInitCmnLcLst ARGS((RgSchCellCb *cellCb));
63 static S16 rgSCHDbmInitSpsUeCbLst ARGS((RgSchCellCb *cellCb,
66 static Void rgSCHDbmInitRaCbLst ARGS(( RgSchCellCb *cellCb));
68 static Void rgSCHDbmInitRaReqLst ARGS(( RgSchCellCb *cellCb));
70 static Void rgSCHDbmInitCrntRgrCfgLst ARGS(( RgSchCellCb *cellCb));
71 static Void rgSCHDbmInitPndngRgrCfgLst ARGS(( RgSchCellCb *cellCb));
74 S16 rgSCHDbmPutEmtcRnti ARGS((RgSchCellCb *cellCb,RgSchRntiLnk *rntiLnk));
81 /* forward references */
84 * @brief Handler for Initializing the cell.
88 * Function : rgSCHDbmInitCell
90 * Initializes the lists belonging to the cell.
93 * @param[in] RgSchCellCb *cellCb
98 S16 rgSCHDbmInitCell(RgSchCellCb *cellCb)
102 /* Initialize ue list */
103 if ((ret = rgSCHDbmInitUeCbLst(cellCb, RGSCH_MAX_UE_BIN_PER_CELL)) != ROK)
106 if ((ret = rgSCHDbmInitUeTfuPendLst(cellCb,
107 RGSCH_MAX_UE_BIN_PER_CELL)) != ROK)
112 /* Initialize SPS Ue list */
113 if ((ret = rgSCHDbmInitSpsUeCbLst(cellCb, RGSCH_MAX_UE_BIN_PER_CELL)) != ROK)
115 #endif /* LTEMAC_SPS */
117 /* Initialize BCCH/PCCH logical channels */
118 rgSCHDbmInitCmnLcLst(cellCb);
120 /* Initialize configuration lists */
121 rgSCHDbmInitCrntRgrCfgLst(cellCb);
122 rgSCHDbmInitPndngRgrCfgLst(cellCb);
125 /* Initialize raReq list */
126 rgSCHDbmInitRaReqLst(cellCb);
129 /* Initialize raCb list */
130 rgSCHDbmInitRaCbLst(cellCb);
132 /* Initialize l2mList */
134 cmLListInit(&cellCb->l2mList);
135 #endif /* LTE_L2_MEAS */
139 } /* rgSCHDbmInitCell */
142 * @brief Handler for initializing the ueCbLst under the cellCb.
146 * Function : rgSCHDbmInitUeCbLst
155 static S16 rgSCHDbmInitUeCbLst(RgSchCellCb *cellCb,uint16_t numBins)
157 RgSchUeCellInfo ueCellInfo;
159 /* Fix: syed It is better to compute offset dynamically
160 * rather than hardcoding it as 0 */
161 return (cmHashListInit(&cellCb->ueLst, numBins, (uint16_t)((PTR)&(ueCellInfo.ueLstEnt) - (PTR)&ueCellInfo), FALSE,
162 CM_HASH_KEYTYPE_CONID,
163 rgSchCb[cellCb->instIdx].rgSchInit.region,
164 rgSchCb[cellCb->instIdx].rgSchInit.pool));
166 } /* rgSCHDbmInitUeCbLst */
169 * @brief Handler for de-initializing the ueCbLst under the cellCb.
173 * Function : rgSCHDbmDeInitUeCbLst
181 S16 rgSCHDbmDeInitUeCbLst(RgSchCellCb *cellCb)
184 return (cmHashListDeinit(&cellCb->ueLst));
186 } /* rgSCHDbmDeInitUeCbLst */
190 * @brief Handler for initializing the spsUeCbLst under the cellCb.
194 * Function : rgSCHDbmInitSpsUeCbLst
203 static S16 rgSCHDbmInitSpsUeCbLst(RgSchCellCb *cellCb,uint16_t numBins)
207 return (cmHashListInit(&cellCb->spsUeLst, numBins, (uint16_t) ((PTR) &(ue.spsUeLstEnt) - (PTR) &ue), FALSE,
208 CM_HASH_KEYTYPE_CONID,
209 rgSchCb[cellCb->instIdx].rgSchInit.region,
210 rgSchCb[cellCb->instIdx].rgSchInit.pool));
212 } /* rgSCHDbmInitSpsUeCbLst */
215 * @brief Handler for de-initializing the spsUeCbLst under the cellCb.
219 * Function : rgSCHDbmDeInitSpsUeCbLst
227 S16 rgSCHDbmDeInitSpsUeCbLst(RgSchCellCb *cellCb)
230 return (cmHashListDeinit(&cellCb->spsUeLst));
232 } /* rgSCHDbmDeInitSpsUeCbLst */
234 #endif /* LTEMAC_SPS */
237 * @brief Handler for inserting the ueCb in to the ueCbLst under the cellCb.
241 * Function : rgSCHDbmInsUeCb
250 S16 rgSCHDbmInsUeCb(RgSchCellCb *cellCb,RgSchUeCb *ueCb)
252 RgSchUeCellInfo *ueCellInfo = NULLP;
254 ueCellInfo = ueCb->cellInfo[ueCb->cellIdToCellIdxMap[RG_SCH_CELLINDEX(cellCb)]];
256 return (cmHashListInsert(&cellCb->ueLst, (PTR)ueCellInfo,
257 (uint8_t *)&ueCb->ueId, (uint16_t)sizeof(ueCb->ueId)));
259 } /* rgSCHDbmInsUeCb */
263 * @brief Handler for inserting the ueCb in to the spsUeCbLst under the cellCb.
267 * Function : rgSCHDbmInsSpsUeCb
276 S16 rgSCHDbmInsSpsUeCb(RgSchCellCb *cellCb,RgSchUeCb *ueCb)
278 return (cmHashListInsert(&cellCb->spsUeLst, (PTR)ueCb,
279 (uint8_t *)&ueCb->spsRnti, (uint16_t)sizeof(ueCb->spsRnti)));
281 } /* end of rgSCHDbmInsSpsUeCb */
283 #endif /* LTEMAC_SPS */
286 * @brief Handler for accessing the existing ueCb identified by the key ueId
287 * in the ueCbLst under the cellCb.
291 * Function : rgSCHDbmGetUeCb
298 RgSchUeCb* rgSCHDbmGetUeCb(RgSchCellCb *cellCb,CmLteRnti ueId)
300 RgSchUeCellInfo *ueCellInfo = NULLP;
302 cmHashListFind(&cellCb->ueLst, (uint8_t *)&ueId,
303 sizeof(ueId), 0, (PTR *)&ueCellInfo);
305 return (!ueCellInfo?NULLP:ueCellInfo->ue);
306 } /* rgSCHDbmGetUeCb */
310 * @brief Handler for accessing the existing ueCb identified by the key
311 * spsRnti in the spsUeCbLst under the cellCb.
315 * Function : rgSCHDbmGetSpsUeCb
322 RgSchUeCb* rgSCHDbmGetSpsUeCb(RgSchCellCb *cellCb, CmLteRnti spsRnti)
324 RgSchUeCb *ueCb = NULLP;
326 cmHashListFind(&cellCb->spsUeLst, (uint8_t *)&spsRnti,
327 sizeof(spsRnti), 0, (PTR *)&ueCb);
329 } /* rgSCHDbmGetSpsUeCb */
333 * @brief Handler for accessing the existing next ueCb in the ueCbLst under the
338 * Function : rgSCHDbmGetNextUeCb
345 RgSchUeCb* rgSCHDbmGetNextUeCb(RgSchCellCb *cellCb, RgSchUeCb *ueCb)
347 RgSchUeCellInfo *ueCellInfo = NULLP;
348 RgSchUeCellInfo *nextUeCellInfo = NULLP;
352 ueCellInfo = ueCb->cellInfo[
353 ueCb->cellIdToCellIdxMap[RG_SCH_CELLINDEX(cellCb)]];
356 cmHashListGetNext(&cellCb->ueLst, (PTR) ueCellInfo, (PTR *)&nextUeCellInfo);
357 return (!nextUeCellInfo?NULLP:nextUeCellInfo->ue);
358 } /* rgSCHDbmGetNextUeCb */
362 * @brief Handler for accessing the existing next ueCb stored in the spsUeCbLst
363 * using SPS-Rnti under the cellCb.
367 * Function : rgSCHDbmGetNextSpsUeCb
374 RgSchUeCb* rgSCHDbmGetNextSpsUeCb(RgSchCellCb *cellCb, RgSchUeCb *ueCb)
376 RgSchUeCb *nextUeCb = NULLP;
378 cmHashListGetNext(&cellCb->spsUeLst, (PTR) ueCb, (PTR *)&nextUeCb);
380 } /* end of rgSCHDbmGetNextSpsUeCb */
382 #endif /* LTEMAC_SPS */
386 * @brief Handler for Cleaning up L2 Meas related Data in
391 * Function : rgSCHDbmDelL2MUe
400 S16 rgSCHDbmDelL2MUe(RgSchCellCb *cellCb,RgSchUeCb *ueCb)
403 RgSchCmnUlUe *ueUl = RG_SCH_CMN_GET_UL_UE(ueCb, cellCb);
405 ueUl->hqEnt.numBusyHqProcs = 0;
406 /* Clean cell level UE Active Count */
407 for (lcCnt =0; lcCnt < RGSCH_MAX_LC_PER_UE; lcCnt++)
409 if (ueCb->ul.lcCb[lcCnt].isValid)
411 if((ueCb->ul.lcCb[lcCnt].qciCb->ulUeCount) &&
413 (1 << (ueCb->ul.lcCb[lcCnt].qciCb->qci -1))))
415 ueCb->ul.lcCb[lcCnt].qciCb->ulUeCount--;
416 ueCb->ulActiveLCs &= ~(1 <<
417 (ueCb->ul.lcCb[lcCnt].qciCb->qci -1));
421 if (ueCb->dl.lcCb[lcCnt])
423 if (ueCb->qciActiveLCs[ueCb->dl.lcCb[lcCnt]->qciCb->qci])
425 ueCb->dl.lcCb[lcCnt]->qciCb->dlUeCount--;
426 ueCb->qciActiveLCs[ueCb->dl.lcCb[lcCnt]->qciCb->qci] = 0;
432 } /* rgSCHDbmDelL2MUe */
437 * @brief Handler for deleting the existing ueCb from the ueCbLst under the
442 * Function : rgSCHDbmDelUeCb
451 S16 rgSCHDbmDelUeCb(RgSchCellCb *cellCb,RgSchUeCb *ueCb)
453 RgSchUeCellInfo *ueCellInfo = NULLP;
455 ueCellInfo = ueCb->cellInfo[ueCb->cellIdToCellIdxMap[RG_SCH_CELLINDEX(cellCb)]];
457 return (cmHashListDelete(&cellCb->ueLst, (PTR)ueCellInfo));
458 } /* rgSCHDbmDelUeCb */
462 * @brief Handler for deleting the existing ueCb from the spsUeCbLst under the
467 * Function : rgSCHDbmDelSpsUeCb
476 S16 rgSCHDbmDelSpsUeCb(RgSchCellCb *cellCb,RgSchUeCb *ueCb)
479 return (cmHashListDelete(&cellCb->spsUeLst, (PTR)ueCb));
480 } /* end of rgSCHDbmDelSpsUeCb */
482 #endif /* LTEMAC_SPS */
485 * @brief Handler for Initializing the UE.
489 * Function : rgSCHDbmInitUe
491 * Initializes the lists belonging to the UE.
494 * @param[in] RgSchUeCb *ueCb
499 S16 rgSCHDbmInitUe(RgSchUeCb *ueCb)
503 /* Initialize Dedicated logical channels */
504 rgSCHDbmInitDedLcLst(ueCb);
507 } /* rgSCHDbmInitUe */
510 * @brief Handler for Initializing the dedicated logical channels.
514 * Function : rgSCHDbmInitDedLcLst
516 * Initializes dedicated logical channels.
518 * @param[in] RgSchUeCb *ueCb
521 static Void rgSCHDbmInitDedLcLst(RgSchUeCb *ueCb)
525 for (idx = 0; idx < RGSCH_MAX_LC_PER_UE; ++idx)
527 /* Set Dedicated LCs as not configured */
528 ueCb->ul.lcCb[idx].isValid = FALSE;
529 ueCb->dl.lcCb[idx] = NULLP;
532 /* Stack Crash problems for TRACE5 Changes. Added the return below */
536 } /* rgSCHDbmInitDedLcLst */
539 * @brief Handler for Initializing the common logical channel list of the cell.
543 * Function : rgSCHDbmInitCmnLcLst
545 * Initializes following common logical channels belonging to the cell.
550 * @param[in] RgSchCellCb *cellCb
553 static Void rgSCHDbmInitCmnLcLst(RgSchCellCb *cellCb)
557 for (idx = 0; idx < RGSCH_MAX_CMN_LC_CB; idx++)
559 cellCb->cmnLcCb[idx].lcId = RGSCH_INVALID_LC_ID;
562 /* Stack Crash problems for TRACE5 Changes. Added the return below */
565 } /* rgSCHDbmInitCmnLcLst */
568 * @brief Handler for inserting dedicated DL logical channel.
572 * Function : rgSCHDbmInsDlDedLcCb
574 * @param[in] RgSchUeCb *ueCb
575 * @param[in] RgSchDlLcCb* dlLcCb
578 Void rgSCHDbmInsDlDedLcCb(RgSchUeCb *ueCb, RgSchDlLcCb *dlLcCb )
581 ueCb->dl.lcCb[dlLcCb->lcId - 1] = dlLcCb;
583 } /* rgSCHDbmInsDlDedLcCb */
586 * @brief Handler for deleting dedicated DL logical channel.
590 * Function : rgSCHDbmDelDlDedLcCb
592 * @param[in] RgSchUeCb *ueCb
593 * @param[in] RgSchDlLcCb* dlLcCb
596 Void rgSCHDbmDelDlDedLcCb(RgSchUeCb *ueCb, RgSchDlLcCb *dlLcCb )
600 /* Clean cell level UE Active Count */
602 if (ueCb->dl.lcCb[dlLcCb->lcId - 1])
605 && (ueCb->qciActiveLCs[dlLcCb->qciCb->qci]))
607 ueCb->qciActiveLCs[dlLcCb->qciCb->qci]--;
608 if (!(ueCb->qciActiveLCs[dlLcCb->qciCb->qci]))
610 dlLcCb->qciCb->dlUeCount--;
614 #endif /* LTE_L2_MEAS */
616 ueCb->dl.lcCb[dlLcCb->lcId - 1] = NULLP;
618 /* Stack Crash problems for TRACE5 Changes. Added the return below */
621 } /* rgSCHDbmDelDlDedLcCb */
624 * @brief Handler for accessing the existing dl dedicated lcCb at idx in the
625 * lcCbLst of the ueCb.
629 * Function : rgSCHDbmGetDlDedLcCb
633 * @return RgSchDlLcCb*
635 RgSchDlLcCb* rgSCHDbmGetDlDedLcCb(RgSchUeCb *ueCb, CmLteLcId idx)
637 if (idx < RGSCH_DEDLC_MIN_LCID || idx > RGSCH_DEDLC_MAX_LCID)
641 return (ueCb->dl.lcCb[idx-1]);
643 } /* rgSCHDbmGetDlDedLcCb */
646 * @brief Handler for accessing the existing first dl dedicated lcCb at idx
647 * in the lcCbLst of the ueCb.
651 * Function : rgSCHDbmGetFirstDlDedLcCb
655 * @return RgSchDlLcCb*
657 RgSchDlLcCb* rgSCHDbmGetFirstDlDedLcCb(RgSchUeCb *ueCb)
661 for(idx = 0; idx < RGSCH_DEDLC_MAX_LCID; idx++)
663 if(ueCb->dl.lcCb[idx])
665 return (ueCb->dl.lcCb[idx]);
669 } /* rgSCHDbmGetFirstDlDedLcCb */
671 * @brief Handler for accessing the existing next dl dedicated lcCb at idx
672 * in the lcCbLst of the ueCb.
676 * Function : rgSCHDbmGetNextDlDedLcCb
681 * @return RgSchDlLcCb*
683 RgSchDlLcCb* rgSCHDbmGetNextDlDedLcCb(RgSchUeCb *ueCb,RgSchDlLcCb *lcCb)
689 return (rgSCHDbmGetFirstDlDedLcCb(ueCb));
692 for(idx = lcCb->lcId; idx < RGSCH_DEDLC_MAX_LCID; idx++)
694 if(ueCb->dl.lcCb[idx])
696 return (ueCb->dl.lcCb[idx]);
700 } /* rgSCHDbmGetNextDlDedLcCb */
703 * @brief Handler for accessing the existing dl common lcCb identified by the key lcId
704 * in the lcCbLst of the ueCb.
708 * Function : rgSCHDbmGetCmnLcCb
713 * @return RgSchClcDlLcCb*
715 RgSchClcDlLcCb* rgSCHDbmGetCmnLcCb(RgSchCellCb *cellCb, CmLteLcId lcId)
719 for(idx = 0; idx < RGSCH_MAX_CMN_LC_CB; idx++)
721 if(cellCb->cmnLcCb[idx].lcId == lcId)
723 return (&(cellCb->cmnLcCb[idx]));
727 } /* rgSCHDbmGetCmnLcCb */
730 * @brief Handler for accessing the existing BCCH mapped on to BCH in the
731 * lcCbLst of the ueCb.
735 * Function : rgSCHDbmGetBcchOnBch
739 * @return RgSchClcDlLcCb*
741 RgSchClcDlLcCb* rgSCHDbmGetBcchOnBch(RgSchCellCb *cellCb )
744 if(cellCb->cmnLcCb[RGSCH_BCCH_BCH_IDX].lcId != RGSCH_INVALID_LC_ID)
746 return (&(cellCb->cmnLcCb[RGSCH_BCCH_BCH_IDX]));
749 } /* rgSCHDbmGetBcchOnBch */
752 * @brief Handler for accessing the existing BCCH mapped on to DLSCH in the
753 * lcCbLst of the ueCb.
757 * Function : rgSCHDbmGetFirstBcchOnDlsch
761 * @return RgSchClcDlLcCb*
763 RgSchClcDlLcCb* rgSCHDbmGetFirstBcchOnDlsch(RgSchCellCb *cellCb)
766 if(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1].lcId != RGSCH_INVALID_LC_ID)
768 return (&(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1]));
771 } /* rgSCHDbmGetFirstBcchOnDlsch */
774 * @brief Handler for accessing the existing BCCH mapped on to DLSCH in the
775 * lcCbLst of the ueCb.
779 * Function : rgSCHDbmGetSecondBcchOnDlsch
783 * @return RgSchClcDlLcCb*
785 RgSchClcDlLcCb* rgSCHDbmGetSecondBcchOnDlsch(RgSchCellCb *cellCb)
788 if(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2].lcId != RGSCH_INVALID_LC_ID)
790 return (&(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2]));
793 } /* rgSCHDbmGetSecondBcchOnDlsch */
796 * @brief Handler for accessing the existing PCCH in the lcCbLst of the ueCb.
800 * Function : rgSCHDbmGetPcch
804 * @return RgSchClcDlLcCb*
806 RgSchClcDlLcCb* rgSCHDbmGetPcch(RgSchCellCb *cellCb)
809 if(cellCb->cmnLcCb[RGSCH_PCCH_IDX].lcId != RGSCH_INVALID_LC_ID)
811 return (&(cellCb->cmnLcCb[RGSCH_PCCH_IDX]));
814 } /* rgSCHDbmGetPcch */
817 * @brief Handler for inserting the BCCH mapped on to BCH in the
818 * lcCbLst of the ueCb.
822 * Function : rgSCHDbmInsBcchOnBch
828 Void rgSCHDbmInsBcchOnBch(RgSchCellCb *cellCb, RgSchClcDlLcCb *cmnDlLcCb)
831 cellCb->cmnLcCb[RGSCH_BCCH_BCH_IDX].lcId = cmnDlLcCb->lcId;
832 cellCb->cmnLcCb[RGSCH_BCCH_BCH_IDX].boLst = cmnDlLcCb->boLst;
834 /* Stack Crash problems for TRACE5 Changes. Added the return below */
837 } /* rgSCHDbmInsBcchOnBch */
840 * @brief Handler for inserting the BCCH mapped on to DLSCH in the
841 * lcCbLst of the ueCb.
845 * Function : rgSCHDbmInsBcchOnDlsch
851 Void rgSCHDbmInsBcchOnDlsch(RgSchCellCb *cellCb, RgSchClcDlLcCb *cmnDlLcCb)
853 if(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1].lcId == RGSCH_INVALID_LC_ID)
855 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1].lcId = cmnDlLcCb->lcId;
856 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1].boLst = cmnDlLcCb->boLst;
857 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1].si = FALSE;
859 else if(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2].lcId == RGSCH_INVALID_LC_ID)
861 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2].lcId = cmnDlLcCb->lcId;
862 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2].boLst = cmnDlLcCb->boLst;
863 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2].si = TRUE;
866 /* Stack Crash problems for TRACE5 Changes. Added the return below */
869 } /* rgSCHDbmInsBcchOnDlsch */
873 * @brief Handler for inserting the PCCH in the lcCbLst of the ueCb.
877 * Function : rgSCHDbmInsPcch
883 Void rgSCHDbmInsPcch(RgSchCellCb *cellCb, RgSchClcDlLcCb *cmnDlLcCb)
886 cellCb->cmnLcCb[RGSCH_PCCH_IDX].lcId = cmnDlLcCb->lcId;
887 cellCb->cmnLcCb[RGSCH_PCCH_IDX].boLst = cmnDlLcCb->boLst;
889 /* Stack Crash problems for TRACE5 Changes. Added the return below */
892 } /* rgSCHDbmInsPcch */
895 * @brief Handler for initializing the boLst.
899 * Function : rgSCHDbmInitCmnLcBoLst
902 * @param[in] *cmnDlLcCb
905 Void rgSCHDbmInitCmnLcBoLst(RgSchClcDlLcCb *cmnDlLcCb)
908 cmLListInit(&cmnDlLcCb->boLst);
910 } /* rgSCHDbmInitCmnLcBoLst */
913 * @brief Handler for inserting the bo report in to the boLst.
917 * Function : rgSCHDbmInsCmnLcBoRpt
920 * @param[in] *cmnDlLcCb
924 Void rgSCHDbmInsCmnLcBoRpt(RgSchClcDlLcCb *cmnDlLcCb,RgSchClcBoRpt *cmnBoRpt)
926 cmnBoRpt->boLstEnt.next = NULLP;
927 cmnBoRpt->boLstEnt.prev = NULLP;
928 cmnBoRpt->boLstEnt.node = (PTR)cmnBoRpt;
929 cmLListAdd2Tail(&cmnDlLcCb->boLst, &cmnBoRpt->boLstEnt);
931 } /* rgSCHDbmInsCmnLcBoRpt */
935 * @brief Handler for initializing the raCbLst.
939 * Function : rgSCHDbmInitRaCbLst
945 static Void rgSCHDbmInitRaCbLst(RgSchCellCb *cellCb)
948 cmLListInit(&cellCb->raInfo.raCbLst);
950 } /* rgSCHDbmInitRaCbLst */
954 * @brief Handler for accessing the existing raCb in the raCbLst.
958 * Function : rgSCHDbmGetRaCb
965 RgSchRaCb* rgSCHDbmGetRaCb(RgSchCellCb *cellCb, CmLteRnti key)
969 CM_LLIST_FIRST_NODE(&cellCb->raInfo.raCbLst,tmpNode);
972 if(((RgSchRaCb *)tmpNode->node)->tmpCrnti == key)
974 return ((RgSchRaCb *)(tmpNode->node));
976 CM_LLIST_NEXT_NODE(&cellCb->raInfo.raCbLst,tmpNode);
979 } /* rgSCHDbmGetRaCb */
983 * @brief Handler for initializing the raReqLst.
987 * Function : rgSCHDbmInitRaReqLst
993 static Void rgSCHDbmInitRaReqLst(RgSchCellCb *cellCb)
997 /* ccpu00133557- Memory Leak Fix- initializing for the all nodes
999 for(idx = 0; idx < RGSCH_RAREQ_ARRAY_SIZE; idx++)
1001 cmLListInit(&cellCb->raInfo.raReqLst[idx]);
1004 } /* rgSCHDbmInitRaReqLst */
1008 * @brief Handler for initializing the crnt rgr cfgLst.
1012 * Function : rgSCHDbmInitCrntRgrCfgLst
1015 * @param[in] *cellCb
1018 static Void rgSCHDbmInitCrntRgrCfgLst(RgSchCellCb *cellCb)
1021 cmLListInit(&cellCb->rgCfgInfo.crntRgrCfgLst);
1023 } /* rgSCHDbmInitCrntRgrCfgLst */
1026 * @brief Handler for initializing the pndng rgr cfgLst.
1030 * Function : rgSCHDbmInitPndngRgrCfgLst
1033 * @param[in] *cellCb
1036 static Void rgSCHDbmInitPndngRgrCfgLst(RgSchCellCb *cellCb)
1039 cmLListInit(&cellCb->rgCfgInfo.pndngRgrCfgLst);
1041 } /* rgSCHDbmInitPndngRgrCfgLst */
1044 * @brief Handler for inserting the cfgElem in to the crntRgrCfgLst.
1048 * Function : rgSCHDbmInsCrntRgrCfgElem
1051 * @param[in] *cellCb
1052 * @param[in] *cfgElem
1055 Void rgSCHDbmInsCrntRgrCfgElem(RgSchCellCb *cellCb,RgSchCfgElem *cfgElem)
1057 cfgElem->cfgReqLstEnt.next = NULLP;
1058 cfgElem->cfgReqLstEnt.prev = NULLP;
1059 cmLListAdd2Tail(&cellCb->rgCfgInfo.crntRgrCfgLst, &cfgElem->cfgReqLstEnt);
1061 } /* rgSCHDbmInsCrntRgrCfgElem */
1064 * @brief Handler for inserting the cfgElem in to the pndngRgrCfgLst.
1068 * Function : rgSCHDbmInsPndngRgrCfgElem
1071 * @param[in] *cellCb
1072 * @param[in] *cfgElem
1075 Void rgSCHDbmInsPndngRgrCfgElem(RgSchCellCb *cellCb,RgSchCfgElem *cfgElem)
1078 cfgElem->cfgReqLstEnt.next = NULLP;
1079 cfgElem->cfgReqLstEnt.prev = NULLP;
1080 cfgElem->cfgReqLstEnt.node = (PTR)cfgElem;
1081 cmLListAdd2Tail(&cellCb->rgCfgInfo.pndngRgrCfgLst, &cfgElem->cfgReqLstEnt);
1083 } /* rgSCHDbmInsPndngRgrCfgElem */
1086 * @brief Handler for accessing the existing cfgElem in the crntRgrCfgLst.
1090 * Function : rgSCHDbmGetNextCrntRgrCfgElem
1093 * @param[in] *cellCb
1094 * @param[in] *cfgElem
1095 * @return RgSchCfgElem*
1097 RgSchCfgElem* rgSCHDbmGetNextCrntRgrCfgElem(RgSchCellCb *cellCb,RgSchCfgElem *cfgElem)
1102 return ( cellCb->rgCfgInfo.crntRgrCfgLst.first ?
1103 (RgSchCfgElem *)(cellCb->rgCfgInfo.crntRgrCfgLst.first->node) : NULLP );
1105 return ( cfgElem->cfgReqLstEnt.next ?
1106 (RgSchCfgElem *)(cfgElem->cfgReqLstEnt.next->node) : NULLP );
1107 } /* rgSCHDbmGetNextCrntRgrCfgElem */
1110 * @brief Handler for accessing the existing cfgElem in the pndngRgrCfgLst.
1114 * Function : rgSCHDbmGetNextPndngRgrCfgElem
1117 * @param[in] *cellCb
1118 * @param[in] *cfgElem
1119 * @return RgSchCfgElem*
1121 RgSchCfgElem* rgSCHDbmGetNextPndngRgrCfgElem(RgSchCellCb *cellCb,RgSchCfgElem *cfgElem)
1126 return ( cellCb->rgCfgInfo.pndngRgrCfgLst.first ?
1127 (RgSchCfgElem *)(cellCb->rgCfgInfo.pndngRgrCfgLst.first->node) : NULLP );
1129 return ( cfgElem->cfgReqLstEnt.next ?
1130 (RgSchCfgElem *)(cfgElem->cfgReqLstEnt.next->node) : NULLP );
1131 } /* rgSCHDbmGetNextPndngRgrCfgElem */
1134 * @brief Handler for extracting the existing cfgElem from the pndngRgrCfgLst.
1138 * Function : rgSCHDbmGetPndngRgrCfgElemByKey
1141 * @param[in] *cellCb
1143 * @return RgSchCfgElem*
1145 RgSchCfgElem* rgSCHDbmGetPndngRgrCfgElemByKey(RgSchCellCb *cellCb,CmLteTimingInfo key)
1149 CM_LLIST_FIRST_NODE(&cellCb->rgCfgInfo.pndngRgrCfgLst,tmpNode);
1152 if((((RgSchCfgElem *)tmpNode->node)->actvTime.sfn == key.sfn) &&
1153 (((RgSchCfgElem *)tmpNode->node)->actvTime.slot == key.slot))
1155 return ((RgSchCfgElem *)(tmpNode->node));
1157 CM_LLIST_NEXT_NODE(&cellCb->rgCfgInfo.pndngRgrCfgLst,tmpNode);
1160 } /* rgSCHDbmGetPndngRgrCfgElemByKey */
1163 * @brief Handler for deleting the existing cfgElem from the crntRgrCfgLst.
1167 * Function : rgSCHDbmDelCrntRgrCfgElem
1170 * @param[in] *cellCb
1171 * @param[in] *cfgElem
1172 * @return RgSchCfgElem*
1174 RgSchCfgElem* rgSCHDbmDelCrntRgrCfgElem(RgSchCellCb *cellCb,RgSchCfgElem *cfgElem)
1177 if(cmLListDelFrm(&cellCb->rgCfgInfo.crntRgrCfgLst,&cfgElem->cfgReqLstEnt))
1179 return ((RgSchCfgElem *)(cfgElem->cfgReqLstEnt.node));
1182 } /* rgSCHDbmDelCrntRgrCfgElem */
1185 * @brief Handler for deleting the existing cfgElem from the pndngRgrCfgLst.
1189 * Function : rgSCHDbmDelPndngRgrCfgElem
1192 * @param[in] *cellCb
1193 * @param[in] *cfgElem
1194 * @return RgSchCfgElem*
1196 RgSchCfgElem* rgSCHDbmDelPndngRgrCfgElem(RgSchCellCb *cellCb,RgSchCfgElem *cfgElem)
1198 if(cmLListDelFrm(&cellCb->rgCfgInfo.pndngRgrCfgLst,&cfgElem->cfgReqLstEnt))
1200 return ((RgSchCfgElem *)(cfgElem->cfgReqLstEnt.node));
1203 } /* rgSCHDbmDelPndngRgrCfgElem */
1206 * @brief Handler for initializing the rntiDb.
1210 * Function : rgSCHDbmRntiDbInit
1213 * @param[in] *cellCb
1214 * @param[in] rntiStart
1215 * @param[in] maxRntis
1220 S16 rgSCHDbmRntiDbInit(RgSchCellCb *cellCb,uint16_t rntiStart,uint16_t maxRntis)
1223 RgSchRntiLnk *rntiPool;
1225 /* Fix for Change Request ccpu00099150 */
1226 if(rgSCHUtlAllocSBuf(cellCb->instIdx,
1227 (Data **)&cellCb->rntiDb.rntiPool,maxRntis*sizeof(RgSchRntiLnk)) != ROK)
1231 cellCb->rntiDb.rntiStart = rntiStart;
1232 cellCb->rntiDb.maxRntis = maxRntis;
1234 cellCb->rntiDb.count = maxRntis;
1237 rntiPool = cellCb->rntiDb.rntiPool;
1240 rntiPool[0].rnti = rnti;
1241 rntiPool[0].prv = NULLP;
1242 rntiPool[0].nxt = NULLP;
1243 cellCb->rntiDb.lastRnti = &rntiPool[0];
1248 rntiPool[0].rnti = rnti++;
1249 rntiPool[0].prv = NULLP;
1250 rntiPool[0].nxt = &rntiPool[1];
1251 for (idx = 1; idx < maxRntis - 1; ++idx)
1253 rntiPool[idx].rnti = rnti++;
1254 rntiPool[idx].prv = &rntiPool[idx-1];
1255 rntiPool[idx].nxt = &rntiPool[idx+1];
1257 rntiPool[idx].rnti = rnti++;
1258 rntiPool[idx].prv = &rntiPool[idx-1];
1259 rntiPool[idx].nxt = NULLP;
1260 cellCb->rntiDb.lastRnti = &rntiPool[idx];
1262 cellCb->rntiDb.freeRnti = &rntiPool[0];
1264 } /* rgSCHDbmRntiDbInit */
1267 * @brief Handler for de-initializing the rntiDb.
1271 * Function : rgSCHDbmRntiDbDeInit
1274 * @param[in] *cellCb
1277 Void rgSCHDbmRntiDbDeInit(RgSchCellCb *cellCb)
1279 /* ccpu00117052 - MOD - Passing double pointer
1280 for proper NULLP assignment*/
1281 rgSCHUtlFreeSBuf(cellCb->instIdx, (Data **)(&(cellCb->rntiDb.rntiPool)),
1282 cellCb->rntiDb.maxRntis*sizeof(RgSchRntiLnk));
1283 cellCb->rntiDb.maxRntis = 0;
1284 cellCb->rntiDb.freeRnti = NULLP;
1285 cellCb->rntiDb.lastRnti = NULLP;
1286 cmLListInit(&cellCb->rntiDb.rntiGuardPool);
1288 /* Stack Crash problems for TRACE5 Changes. Added the return below */
1291 } /* rgSCHDbmRntiDbDeInit */
1294 * @brief Handler for accessing the free RNTI.
1298 * Function : rgSCHDbmGetRnti
1301 * @param[in] *cellCb
1302 * @return RgSchRntiLnk*
1304 RgSchRntiLnk* rgSCHDbmGetRnti(RgSchCellCb *cellCb)
1306 RgSchRntiLnk *rntiLnk;
1308 if (!(cellCb->rntiDb.freeRnti))
1310 DU_LOG("\nERROR --> SCH : RNTI exhausted count:%d",
1311 cellCb->rntiDb.count);
1315 rntiLnk = cellCb->rntiDb.freeRnti;
1316 cellCb->rntiDb.freeRnti = rntiLnk->nxt;
1318 /* setting prv and nxt to NULLP may not be needed */
1319 rntiLnk->prv = NULLP;
1320 rntiLnk->nxt = NULLP;
1322 if (cellCb->rntiDb.freeRnti != NULLP)
1324 cellCb->rntiDb.freeRnti->prv = NULLP;
1328 cellCb->rntiDb.lastRnti = NULLP;
1331 cellCb->rntiDb.count--;
1333 DU_LOG("\nINFO --> SCH : rgSCHDbmGetRnti::rntiLnk->rnti %u\n",rntiLnk->rnti);
1335 } /* rgSCHDbmGetRnti */
1338 * @brief Handler for releasing the RNTI.
1342 * Function : rgSCHDbmRlsRnti
1345 * @param[in] *cellCb
1346 * @param[in] rntiLnk
1349 Void rgSCHDbmRlsRnti(RgSchCellCb *cellCb,RgSchRntiLnk *rntiLnk)
1352 if(ROK==rgSCHDbmPutEmtcRnti(cellCb,rntiLnk))
1357 rntiLnk->nxt = NULLP;
1358 if (cellCb->rntiDb.lastRnti)
1360 cellCb->rntiDb.lastRnti->nxt = rntiLnk;
1361 rntiLnk->prv = cellCb->rntiDb.lastRnti;
1365 rntiLnk->prv = NULLP;
1366 cellCb->rntiDb.freeRnti = rntiLnk;
1368 cellCb->rntiDb.lastRnti = rntiLnk;
1370 cellCb->rntiDb.count++;
1372 /* Stack Crash problems for TRACE5 Changes. Added the return below */
1375 } /* rgSCHDbmRlsRnti */
1379 * @brief Handler for initializing the ueTfuPendLst under the cellCb.
1383 * Function : rgSCHDbmInitUeTfuPendLst
1386 * @param[in] *cellCb
1387 * @param[in] numBins
1392 static S16 rgSCHDbmInitUeTfuPendLst(RgSchCellCb *cellCb,uint16_t numBins)
1394 RgSchUePucchRecpInfo pucchInfo;
1396 /* Fix: syed It is better to compute offset dynamically
1397 * rather than hardcoding it as 0 */
1398 if(cmHashListInit(&cellCb->ueTfuPendLst, numBins, (uint16_t)((PTR)&(pucchInfo.hashLstEnt) - (PTR)&pucchInfo), FALSE,
1399 CM_HASH_KEYTYPE_CONID,
1400 rgSchCb[cellCb->instIdx].rgSchInit.region,
1401 rgSchCb[cellCb->instIdx].rgSchInit.pool) != ROK)
1408 } /* rgSCHDbmInitUeTfuPendLst */
1411 * @brief Handler for de-initializing the ueTfuPendLst under the cellCb.
1415 * Function : rgSCHDbmDeInitUeTfuPendLst
1418 * @param[in] *cellCb
1423 S16 rgSCHDbmDeInitUeTfuPendLst(RgSchCellCb *cellCb)
1426 cmHashListDeinit(&cellCb->ueTfuPendLst);
1429 } /* rgSCHDbmDeInitUeTfuPendLst */
1432 /**********************************************************************
1435 **********************************************************************/