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 static const char* RLOG_MODULE_NAME="MAC";
35 static int RLOG_FILE_ID=230;
36 static int RLOG_MODULE_ID=4096;
37 /* header include files -- defines (.h) */
38 #include "common_def.h"
43 #include "rg_sch_err.h"
44 #include "rg_sch_inf.h"
46 #include "rg_sch_cmn.h"
48 /* header/extern include files (.x) */
52 #include "rgm.x" /* layer management typedefs for MAC */
53 #include "rg_sch_inf.x"
55 #include "rg_sch_cmn.x"
56 #include "rl_interface.h"
57 #include "rl_common.h"
61 static S16 rgSCHDbmInitUeCbLst ARGS(( RgSchCellCb *cellCb, uint16_t numBins));
63 static S16 rgSCHDbmInitUeTfuPendLst ARGS(( RgSchCellCb *cellCb, uint16_t numBins));
65 static Void rgSCHDbmInitDedLcLst ARGS((RgSchUeCb *ueCb));
66 static Void rgSCHDbmInitCmnLcLst ARGS((RgSchCellCb *cellCb));
68 static S16 rgSCHDbmInitSpsUeCbLst ARGS((RgSchCellCb *cellCb,
71 static Void rgSCHDbmInitRaCbLst ARGS(( RgSchCellCb *cellCb));
73 static Void rgSCHDbmInitRaReqLst ARGS(( RgSchCellCb *cellCb));
75 static Void rgSCHDbmInitCrntRgrCfgLst ARGS(( RgSchCellCb *cellCb));
76 static Void rgSCHDbmInitPndngRgrCfgLst ARGS(( RgSchCellCb *cellCb));
79 S16 rgSCHDbmPutEmtcRnti ARGS((RgSchCellCb *cellCb,RgSchRntiLnk *rntiLnk));
86 /* forward references */
89 * @brief Handler for Initializing the cell.
93 * Function : rgSCHDbmInitCell
95 * Initializes the lists belonging to the cell.
98 * @param[in] RgSchCellCb *cellCb
103 S16 rgSCHDbmInitCell(RgSchCellCb *cellCb)
107 /* Initialize ue list */
108 if ((ret = rgSCHDbmInitUeCbLst(cellCb, RGSCH_MAX_UE_BIN_PER_CELL)) != ROK)
111 if ((ret = rgSCHDbmInitUeTfuPendLst(cellCb,
112 RGSCH_MAX_UE_BIN_PER_CELL)) != ROK)
117 /* Initialize SPS Ue list */
118 if ((ret = rgSCHDbmInitSpsUeCbLst(cellCb, RGSCH_MAX_UE_BIN_PER_CELL)) != ROK)
120 #endif /* LTEMAC_SPS */
122 /* Initialize BCCH/PCCH logical channels */
123 rgSCHDbmInitCmnLcLst(cellCb);
125 /* Initialize configuration lists */
126 rgSCHDbmInitCrntRgrCfgLst(cellCb);
127 rgSCHDbmInitPndngRgrCfgLst(cellCb);
130 /* Initialize raReq list */
131 rgSCHDbmInitRaReqLst(cellCb);
134 /* Initialize raCb list */
135 rgSCHDbmInitRaCbLst(cellCb);
137 /* Initialize l2mList */
139 cmLListInit(&cellCb->l2mList);
140 #endif /* LTE_L2_MEAS */
144 } /* rgSCHDbmInitCell */
147 * @brief Handler for initializing the ueCbLst under the cellCb.
151 * Function : rgSCHDbmInitUeCbLst
160 static S16 rgSCHDbmInitUeCbLst(RgSchCellCb *cellCb,uint16_t numBins)
162 RgSchUeCellInfo ueCellInfo;
164 /* Fix: syed It is better to compute offset dynamically
165 * rather than hardcoding it as 0 */
166 return (cmHashListInit(&cellCb->ueLst, numBins, (uint16_t)((PTR)&(ueCellInfo.ueLstEnt) - (PTR)&ueCellInfo), FALSE,
167 CM_HASH_KEYTYPE_CONID,
168 rgSchCb[cellCb->instIdx].rgSchInit.region,
169 rgSchCb[cellCb->instIdx].rgSchInit.pool));
171 } /* rgSCHDbmInitUeCbLst */
174 * @brief Handler for de-initializing the ueCbLst under the cellCb.
178 * Function : rgSCHDbmDeInitUeCbLst
186 S16 rgSCHDbmDeInitUeCbLst(RgSchCellCb *cellCb)
189 return (cmHashListDeinit(&cellCb->ueLst));
191 } /* rgSCHDbmDeInitUeCbLst */
195 * @brief Handler for initializing the spsUeCbLst under the cellCb.
199 * Function : rgSCHDbmInitSpsUeCbLst
208 static S16 rgSCHDbmInitSpsUeCbLst(RgSchCellCb *cellCb,uint16_t numBins)
212 return (cmHashListInit(&cellCb->spsUeLst, numBins, (uint16_t) ((PTR) &(ue.spsUeLstEnt) - (PTR) &ue), FALSE,
213 CM_HASH_KEYTYPE_CONID,
214 rgSchCb[cellCb->instIdx].rgSchInit.region,
215 rgSchCb[cellCb->instIdx].rgSchInit.pool));
217 } /* rgSCHDbmInitSpsUeCbLst */
220 * @brief Handler for de-initializing the spsUeCbLst under the cellCb.
224 * Function : rgSCHDbmDeInitSpsUeCbLst
232 S16 rgSCHDbmDeInitSpsUeCbLst(RgSchCellCb *cellCb)
235 return (cmHashListDeinit(&cellCb->spsUeLst));
237 } /* rgSCHDbmDeInitSpsUeCbLst */
239 #endif /* LTEMAC_SPS */
242 * @brief Handler for inserting the ueCb in to the ueCbLst under the cellCb.
246 * Function : rgSCHDbmInsUeCb
255 S16 rgSCHDbmInsUeCb(RgSchCellCb *cellCb,RgSchUeCb *ueCb)
257 RgSchUeCellInfo *ueCellInfo = NULLP;
259 ueCellInfo = ueCb->cellInfo[ueCb->cellIdToCellIdxMap[RG_SCH_CELLINDEX(cellCb)]];
261 return (cmHashListInsert(&cellCb->ueLst, (PTR)ueCellInfo,
262 (uint8_t *)&ueCb->ueId, (uint16_t)sizeof(ueCb->ueId)));
264 } /* rgSCHDbmInsUeCb */
268 * @brief Handler for inserting the ueCb in to the spsUeCbLst under the cellCb.
272 * Function : rgSCHDbmInsSpsUeCb
281 S16 rgSCHDbmInsSpsUeCb(RgSchCellCb *cellCb,RgSchUeCb *ueCb)
283 return (cmHashListInsert(&cellCb->spsUeLst, (PTR)ueCb,
284 (uint8_t *)&ueCb->spsRnti, (uint16_t)sizeof(ueCb->spsRnti)));
286 } /* end of rgSCHDbmInsSpsUeCb */
288 #endif /* LTEMAC_SPS */
291 * @brief Handler for accessing the existing ueCb identified by the key ueId
292 * in the ueCbLst under the cellCb.
296 * Function : rgSCHDbmGetUeCb
303 RgSchUeCb* rgSCHDbmGetUeCb(RgSchCellCb *cellCb,CmLteRnti ueId)
305 RgSchUeCellInfo *ueCellInfo = NULLP;
307 cmHashListFind(&cellCb->ueLst, (uint8_t *)&ueId,
308 sizeof(ueId), 0, (PTR *)&ueCellInfo);
310 return (!ueCellInfo?NULLP:ueCellInfo->ue);
311 } /* rgSCHDbmGetUeCb */
315 * @brief Handler for accessing the existing ueCb identified by the key
316 * spsRnti in the spsUeCbLst under the cellCb.
320 * Function : rgSCHDbmGetSpsUeCb
327 RgSchUeCb* rgSCHDbmGetSpsUeCb(RgSchCellCb *cellCb, CmLteRnti spsRnti)
329 RgSchUeCb *ueCb = NULLP;
331 cmHashListFind(&cellCb->spsUeLst, (uint8_t *)&spsRnti,
332 sizeof(spsRnti), 0, (PTR *)&ueCb);
334 } /* rgSCHDbmGetSpsUeCb */
338 * @brief Handler for accessing the existing next ueCb in the ueCbLst under the
343 * Function : rgSCHDbmGetNextUeCb
350 RgSchUeCb* rgSCHDbmGetNextUeCb(RgSchCellCb *cellCb, RgSchUeCb *ueCb)
352 RgSchUeCellInfo *ueCellInfo = NULLP;
353 RgSchUeCellInfo *nextUeCellInfo = NULLP;
357 ueCellInfo = ueCb->cellInfo[
358 ueCb->cellIdToCellIdxMap[RG_SCH_CELLINDEX(cellCb)]];
361 cmHashListGetNext(&cellCb->ueLst, (PTR) ueCellInfo, (PTR *)&nextUeCellInfo);
362 return (!nextUeCellInfo?NULLP:nextUeCellInfo->ue);
363 } /* rgSCHDbmGetNextUeCb */
367 * @brief Handler for accessing the existing next ueCb stored in the spsUeCbLst
368 * using SPS-Rnti under the cellCb.
372 * Function : rgSCHDbmGetNextSpsUeCb
379 RgSchUeCb* rgSCHDbmGetNextSpsUeCb(RgSchCellCb *cellCb, RgSchUeCb *ueCb)
381 RgSchUeCb *nextUeCb = NULLP;
383 cmHashListGetNext(&cellCb->spsUeLst, (PTR) ueCb, (PTR *)&nextUeCb);
385 } /* end of rgSCHDbmGetNextSpsUeCb */
387 #endif /* LTEMAC_SPS */
391 * @brief Handler for Cleaning up L2 Meas related Data in
396 * Function : rgSCHDbmDelL2MUe
405 S16 rgSCHDbmDelL2MUe(RgSchCellCb *cellCb,RgSchUeCb *ueCb)
408 RgSchCmnUlUe *ueUl = RG_SCH_CMN_GET_UL_UE(ueCb, cellCb);
410 ueUl->hqEnt.numBusyHqProcs = 0;
411 /* Clean cell level UE Active Count */
412 for (lcCnt =0; lcCnt < RGSCH_MAX_LC_PER_UE; lcCnt++)
414 if (ueCb->ul.lcCb[lcCnt].isValid)
416 if((ueCb->ul.lcCb[lcCnt].qciCb->ulUeCount) &&
418 (1 << (ueCb->ul.lcCb[lcCnt].qciCb->qci -1))))
420 ueCb->ul.lcCb[lcCnt].qciCb->ulUeCount--;
421 ueCb->ulActiveLCs &= ~(1 <<
422 (ueCb->ul.lcCb[lcCnt].qciCb->qci -1));
426 if (ueCb->dl.lcCb[lcCnt])
428 if (ueCb->qciActiveLCs[ueCb->dl.lcCb[lcCnt]->qciCb->qci])
430 ueCb->dl.lcCb[lcCnt]->qciCb->dlUeCount--;
431 ueCb->qciActiveLCs[ueCb->dl.lcCb[lcCnt]->qciCb->qci] = 0;
437 } /* rgSCHDbmDelL2MUe */
442 * @brief Handler for deleting the existing ueCb from the ueCbLst under the
447 * Function : rgSCHDbmDelUeCb
456 S16 rgSCHDbmDelUeCb(RgSchCellCb *cellCb,RgSchUeCb *ueCb)
458 RgSchUeCellInfo *ueCellInfo = NULLP;
460 ueCellInfo = ueCb->cellInfo[ueCb->cellIdToCellIdxMap[RG_SCH_CELLINDEX(cellCb)]];
462 return (cmHashListDelete(&cellCb->ueLst, (PTR)ueCellInfo));
463 } /* rgSCHDbmDelUeCb */
467 * @brief Handler for deleting the existing ueCb from the spsUeCbLst under the
472 * Function : rgSCHDbmDelSpsUeCb
481 S16 rgSCHDbmDelSpsUeCb(RgSchCellCb *cellCb,RgSchUeCb *ueCb)
484 return (cmHashListDelete(&cellCb->spsUeLst, (PTR)ueCb));
485 } /* end of rgSCHDbmDelSpsUeCb */
487 #endif /* LTEMAC_SPS */
490 * @brief Handler for Initializing the UE.
494 * Function : rgSCHDbmInitUe
496 * Initializes the lists belonging to the UE.
499 * @param[in] RgSchUeCb *ueCb
504 S16 rgSCHDbmInitUe(RgSchUeCb *ueCb)
508 /* Initialize Dedicated logical channels */
509 rgSCHDbmInitDedLcLst(ueCb);
512 } /* rgSCHDbmInitUe */
515 * @brief Handler for Initializing the dedicated logical channels.
519 * Function : rgSCHDbmInitDedLcLst
521 * Initializes dedicated logical channels.
523 * @param[in] RgSchUeCb *ueCb
526 static Void rgSCHDbmInitDedLcLst(RgSchUeCb *ueCb)
530 for (idx = 0; idx < RGSCH_MAX_LC_PER_UE; ++idx)
532 /* Set Dedicated LCs as not configured */
533 ueCb->ul.lcCb[idx].isValid = FALSE;
534 ueCb->dl.lcCb[idx] = NULLP;
537 /* Stack Crash problems for TRACE5 Changes. Added the return below */
541 } /* rgSCHDbmInitDedLcLst */
544 * @brief Handler for Initializing the common logical channel list of the cell.
548 * Function : rgSCHDbmInitCmnLcLst
550 * Initializes following common logical channels belonging to the cell.
555 * @param[in] RgSchCellCb *cellCb
558 static Void rgSCHDbmInitCmnLcLst(RgSchCellCb *cellCb)
562 for (idx = 0; idx < RGSCH_MAX_CMN_LC_CB; idx++)
564 cellCb->cmnLcCb[idx].lcId = RGSCH_INVALID_LC_ID;
567 /* Stack Crash problems for TRACE5 Changes. Added the return below */
570 } /* rgSCHDbmInitCmnLcLst */
573 * @brief Handler for inserting dedicated DL logical channel.
577 * Function : rgSCHDbmInsDlDedLcCb
579 * @param[in] RgSchUeCb *ueCb
580 * @param[in] RgSchDlLcCb* dlLcCb
583 Void rgSCHDbmInsDlDedLcCb(RgSchUeCb *ueCb, RgSchDlLcCb *dlLcCb )
586 ueCb->dl.lcCb[dlLcCb->lcId - 1] = dlLcCb;
588 } /* rgSCHDbmInsDlDedLcCb */
591 * @brief Handler for deleting dedicated DL logical channel.
595 * Function : rgSCHDbmDelDlDedLcCb
597 * @param[in] RgSchUeCb *ueCb
598 * @param[in] RgSchDlLcCb* dlLcCb
601 Void rgSCHDbmDelDlDedLcCb(RgSchUeCb *ueCb, RgSchDlLcCb *dlLcCb )
605 /* Clean cell level UE Active Count */
607 if (ueCb->dl.lcCb[dlLcCb->lcId - 1])
610 && (ueCb->qciActiveLCs[dlLcCb->qciCb->qci]))
612 ueCb->qciActiveLCs[dlLcCb->qciCb->qci]--;
613 if (!(ueCb->qciActiveLCs[dlLcCb->qciCb->qci]))
615 dlLcCb->qciCb->dlUeCount--;
619 #endif /* LTE_L2_MEAS */
621 ueCb->dl.lcCb[dlLcCb->lcId - 1] = NULLP;
623 /* Stack Crash problems for TRACE5 Changes. Added the return below */
626 } /* rgSCHDbmDelDlDedLcCb */
629 * @brief Handler for accessing the existing dl dedicated lcCb at idx in the
630 * lcCbLst of the ueCb.
634 * Function : rgSCHDbmGetDlDedLcCb
638 * @return RgSchDlLcCb*
640 RgSchDlLcCb* rgSCHDbmGetDlDedLcCb(RgSchUeCb *ueCb, CmLteLcId idx)
642 if (idx < RGSCH_DEDLC_MIN_LCID || idx > RGSCH_DEDLC_MAX_LCID)
646 return (ueCb->dl.lcCb[idx-1]);
648 } /* rgSCHDbmGetDlDedLcCb */
651 * @brief Handler for accessing the existing first dl dedicated lcCb at idx
652 * in the lcCbLst of the ueCb.
656 * Function : rgSCHDbmGetFirstDlDedLcCb
660 * @return RgSchDlLcCb*
662 RgSchDlLcCb* rgSCHDbmGetFirstDlDedLcCb(RgSchUeCb *ueCb)
666 for(idx = 0; idx < RGSCH_DEDLC_MAX_LCID; idx++)
668 if(ueCb->dl.lcCb[idx])
670 return (ueCb->dl.lcCb[idx]);
674 } /* rgSCHDbmGetFirstDlDedLcCb */
676 * @brief Handler for accessing the existing next dl dedicated lcCb at idx
677 * in the lcCbLst of the ueCb.
681 * Function : rgSCHDbmGetNextDlDedLcCb
686 * @return RgSchDlLcCb*
688 RgSchDlLcCb* rgSCHDbmGetNextDlDedLcCb(RgSchUeCb *ueCb,RgSchDlLcCb *lcCb)
694 return (rgSCHDbmGetFirstDlDedLcCb(ueCb));
697 for(idx = lcCb->lcId; idx < RGSCH_DEDLC_MAX_LCID; idx++)
699 if(ueCb->dl.lcCb[idx])
701 return (ueCb->dl.lcCb[idx]);
705 } /* rgSCHDbmGetNextDlDedLcCb */
708 * @brief Handler for accessing the existing dl common lcCb identified by the key lcId
709 * in the lcCbLst of the ueCb.
713 * Function : rgSCHDbmGetCmnLcCb
718 * @return RgSchClcDlLcCb*
720 RgSchClcDlLcCb* rgSCHDbmGetCmnLcCb(RgSchCellCb *cellCb, CmLteLcId lcId)
724 for(idx = 0; idx < RGSCH_MAX_CMN_LC_CB; idx++)
726 if(cellCb->cmnLcCb[idx].lcId == lcId)
728 return (&(cellCb->cmnLcCb[idx]));
732 } /* rgSCHDbmGetCmnLcCb */
735 * @brief Handler for accessing the existing BCCH mapped on to BCH in the
736 * lcCbLst of the ueCb.
740 * Function : rgSCHDbmGetBcchOnBch
744 * @return RgSchClcDlLcCb*
746 RgSchClcDlLcCb* rgSCHDbmGetBcchOnBch(RgSchCellCb *cellCb )
749 if(cellCb->cmnLcCb[RGSCH_BCCH_BCH_IDX].lcId != RGSCH_INVALID_LC_ID)
751 return (&(cellCb->cmnLcCb[RGSCH_BCCH_BCH_IDX]));
754 } /* rgSCHDbmGetBcchOnBch */
757 * @brief Handler for accessing the existing BCCH mapped on to DLSCH in the
758 * lcCbLst of the ueCb.
762 * Function : rgSCHDbmGetFirstBcchOnDlsch
766 * @return RgSchClcDlLcCb*
768 RgSchClcDlLcCb* rgSCHDbmGetFirstBcchOnDlsch(RgSchCellCb *cellCb)
771 if(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1].lcId != RGSCH_INVALID_LC_ID)
773 return (&(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1]));
776 } /* rgSCHDbmGetFirstBcchOnDlsch */
779 * @brief Handler for accessing the existing BCCH mapped on to DLSCH in the
780 * lcCbLst of the ueCb.
784 * Function : rgSCHDbmGetSecondBcchOnDlsch
788 * @return RgSchClcDlLcCb*
790 RgSchClcDlLcCb* rgSCHDbmGetSecondBcchOnDlsch(RgSchCellCb *cellCb)
793 if(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2].lcId != RGSCH_INVALID_LC_ID)
795 return (&(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2]));
798 } /* rgSCHDbmGetSecondBcchOnDlsch */
801 * @brief Handler for accessing the existing PCCH in the lcCbLst of the ueCb.
805 * Function : rgSCHDbmGetPcch
809 * @return RgSchClcDlLcCb*
811 RgSchClcDlLcCb* rgSCHDbmGetPcch(RgSchCellCb *cellCb)
814 if(cellCb->cmnLcCb[RGSCH_PCCH_IDX].lcId != RGSCH_INVALID_LC_ID)
816 return (&(cellCb->cmnLcCb[RGSCH_PCCH_IDX]));
819 } /* rgSCHDbmGetPcch */
822 * @brief Handler for inserting the BCCH mapped on to BCH in the
823 * lcCbLst of the ueCb.
827 * Function : rgSCHDbmInsBcchOnBch
833 Void rgSCHDbmInsBcchOnBch(RgSchCellCb *cellCb, RgSchClcDlLcCb *cmnDlLcCb)
836 cellCb->cmnLcCb[RGSCH_BCCH_BCH_IDX].lcId = cmnDlLcCb->lcId;
837 cellCb->cmnLcCb[RGSCH_BCCH_BCH_IDX].boLst = cmnDlLcCb->boLst;
839 /* Stack Crash problems for TRACE5 Changes. Added the return below */
842 } /* rgSCHDbmInsBcchOnBch */
845 * @brief Handler for inserting the BCCH mapped on to DLSCH in the
846 * lcCbLst of the ueCb.
850 * Function : rgSCHDbmInsBcchOnDlsch
856 Void rgSCHDbmInsBcchOnDlsch(RgSchCellCb *cellCb, RgSchClcDlLcCb *cmnDlLcCb)
858 if(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1].lcId == RGSCH_INVALID_LC_ID)
860 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1].lcId = cmnDlLcCb->lcId;
861 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1].boLst = cmnDlLcCb->boLst;
862 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1].si = FALSE;
864 else if(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2].lcId == RGSCH_INVALID_LC_ID)
866 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2].lcId = cmnDlLcCb->lcId;
867 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2].boLst = cmnDlLcCb->boLst;
868 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2].si = TRUE;
871 /* Stack Crash problems for TRACE5 Changes. Added the return below */
874 } /* rgSCHDbmInsBcchOnDlsch */
878 * @brief Handler for inserting the PCCH in the lcCbLst of the ueCb.
882 * Function : rgSCHDbmInsPcch
888 Void rgSCHDbmInsPcch(RgSchCellCb *cellCb, RgSchClcDlLcCb *cmnDlLcCb)
891 cellCb->cmnLcCb[RGSCH_PCCH_IDX].lcId = cmnDlLcCb->lcId;
892 cellCb->cmnLcCb[RGSCH_PCCH_IDX].boLst = cmnDlLcCb->boLst;
894 /* Stack Crash problems for TRACE5 Changes. Added the return below */
897 } /* rgSCHDbmInsPcch */
900 * @brief Handler for initializing the boLst.
904 * Function : rgSCHDbmInitCmnLcBoLst
907 * @param[in] *cmnDlLcCb
910 Void rgSCHDbmInitCmnLcBoLst(RgSchClcDlLcCb *cmnDlLcCb)
913 cmLListInit(&cmnDlLcCb->boLst);
915 } /* rgSCHDbmInitCmnLcBoLst */
918 * @brief Handler for inserting the bo report in to the boLst.
922 * Function : rgSCHDbmInsCmnLcBoRpt
925 * @param[in] *cmnDlLcCb
929 Void rgSCHDbmInsCmnLcBoRpt(RgSchClcDlLcCb *cmnDlLcCb,RgSchClcBoRpt *cmnBoRpt)
931 cmnBoRpt->boLstEnt.next = NULLP;
932 cmnBoRpt->boLstEnt.prev = NULLP;
933 cmnBoRpt->boLstEnt.node = (PTR)cmnBoRpt;
934 cmLListAdd2Tail(&cmnDlLcCb->boLst, &cmnBoRpt->boLstEnt);
936 } /* rgSCHDbmInsCmnLcBoRpt */
940 * @brief Handler for initializing the raCbLst.
944 * Function : rgSCHDbmInitRaCbLst
950 static Void rgSCHDbmInitRaCbLst(RgSchCellCb *cellCb)
953 cmLListInit(&cellCb->raInfo.raCbLst);
955 } /* rgSCHDbmInitRaCbLst */
959 * @brief Handler for accessing the existing raCb in the raCbLst.
963 * Function : rgSCHDbmGetRaCb
970 RgSchRaCb* rgSCHDbmGetRaCb(RgSchCellCb *cellCb, CmLteRnti key)
974 CM_LLIST_FIRST_NODE(&cellCb->raInfo.raCbLst,tmpNode);
977 if(((RgSchRaCb *)tmpNode->node)->tmpCrnti == key)
979 return ((RgSchRaCb *)(tmpNode->node));
981 CM_LLIST_NEXT_NODE(&cellCb->raInfo.raCbLst,tmpNode);
984 } /* rgSCHDbmGetRaCb */
988 * @brief Handler for initializing the raReqLst.
992 * Function : rgSCHDbmInitRaReqLst
998 static Void rgSCHDbmInitRaReqLst(RgSchCellCb *cellCb)
1002 /* ccpu00133557- Memory Leak Fix- initializing for the all nodes
1004 for(idx = 0; idx < RGSCH_RAREQ_ARRAY_SIZE; idx++)
1006 cmLListInit(&cellCb->raInfo.raReqLst[idx]);
1009 } /* rgSCHDbmInitRaReqLst */
1013 * @brief Handler for initializing the crnt rgr cfgLst.
1017 * Function : rgSCHDbmInitCrntRgrCfgLst
1020 * @param[in] *cellCb
1023 static Void rgSCHDbmInitCrntRgrCfgLst(RgSchCellCb *cellCb)
1026 cmLListInit(&cellCb->rgCfgInfo.crntRgrCfgLst);
1028 } /* rgSCHDbmInitCrntRgrCfgLst */
1031 * @brief Handler for initializing the pndng rgr cfgLst.
1035 * Function : rgSCHDbmInitPndngRgrCfgLst
1038 * @param[in] *cellCb
1041 static Void rgSCHDbmInitPndngRgrCfgLst(RgSchCellCb *cellCb)
1044 cmLListInit(&cellCb->rgCfgInfo.pndngRgrCfgLst);
1046 } /* rgSCHDbmInitPndngRgrCfgLst */
1049 * @brief Handler for inserting the cfgElem in to the crntRgrCfgLst.
1053 * Function : rgSCHDbmInsCrntRgrCfgElem
1056 * @param[in] *cellCb
1057 * @param[in] *cfgElem
1060 Void rgSCHDbmInsCrntRgrCfgElem(RgSchCellCb *cellCb,RgSchCfgElem *cfgElem)
1062 cfgElem->cfgReqLstEnt.next = NULLP;
1063 cfgElem->cfgReqLstEnt.prev = NULLP;
1064 cmLListAdd2Tail(&cellCb->rgCfgInfo.crntRgrCfgLst, &cfgElem->cfgReqLstEnt);
1066 } /* rgSCHDbmInsCrntRgrCfgElem */
1069 * @brief Handler for inserting the cfgElem in to the pndngRgrCfgLst.
1073 * Function : rgSCHDbmInsPndngRgrCfgElem
1076 * @param[in] *cellCb
1077 * @param[in] *cfgElem
1080 Void rgSCHDbmInsPndngRgrCfgElem(RgSchCellCb *cellCb,RgSchCfgElem *cfgElem)
1083 cfgElem->cfgReqLstEnt.next = NULLP;
1084 cfgElem->cfgReqLstEnt.prev = NULLP;
1085 cfgElem->cfgReqLstEnt.node = (PTR)cfgElem;
1086 cmLListAdd2Tail(&cellCb->rgCfgInfo.pndngRgrCfgLst, &cfgElem->cfgReqLstEnt);
1088 } /* rgSCHDbmInsPndngRgrCfgElem */
1091 * @brief Handler for accessing the existing cfgElem in the crntRgrCfgLst.
1095 * Function : rgSCHDbmGetNextCrntRgrCfgElem
1098 * @param[in] *cellCb
1099 * @param[in] *cfgElem
1100 * @return RgSchCfgElem*
1102 RgSchCfgElem* rgSCHDbmGetNextCrntRgrCfgElem(RgSchCellCb *cellCb,RgSchCfgElem *cfgElem)
1107 return ( cellCb->rgCfgInfo.crntRgrCfgLst.first ?
1108 (RgSchCfgElem *)(cellCb->rgCfgInfo.crntRgrCfgLst.first->node) : NULLP );
1110 return ( cfgElem->cfgReqLstEnt.next ?
1111 (RgSchCfgElem *)(cfgElem->cfgReqLstEnt.next->node) : NULLP );
1112 } /* rgSCHDbmGetNextCrntRgrCfgElem */
1115 * @brief Handler for accessing the existing cfgElem in the pndngRgrCfgLst.
1119 * Function : rgSCHDbmGetNextPndngRgrCfgElem
1122 * @param[in] *cellCb
1123 * @param[in] *cfgElem
1124 * @return RgSchCfgElem*
1126 RgSchCfgElem* rgSCHDbmGetNextPndngRgrCfgElem(RgSchCellCb *cellCb,RgSchCfgElem *cfgElem)
1131 return ( cellCb->rgCfgInfo.pndngRgrCfgLst.first ?
1132 (RgSchCfgElem *)(cellCb->rgCfgInfo.pndngRgrCfgLst.first->node) : NULLP );
1134 return ( cfgElem->cfgReqLstEnt.next ?
1135 (RgSchCfgElem *)(cfgElem->cfgReqLstEnt.next->node) : NULLP );
1136 } /* rgSCHDbmGetNextPndngRgrCfgElem */
1139 * @brief Handler for extracting the existing cfgElem from the pndngRgrCfgLst.
1143 * Function : rgSCHDbmGetPndngRgrCfgElemByKey
1146 * @param[in] *cellCb
1148 * @return RgSchCfgElem*
1150 RgSchCfgElem* rgSCHDbmGetPndngRgrCfgElemByKey(RgSchCellCb *cellCb,CmLteTimingInfo key)
1154 CM_LLIST_FIRST_NODE(&cellCb->rgCfgInfo.pndngRgrCfgLst,tmpNode);
1157 if((((RgSchCfgElem *)tmpNode->node)->actvTime.sfn == key.sfn) &&
1158 (((RgSchCfgElem *)tmpNode->node)->actvTime.slot == key.slot))
1160 return ((RgSchCfgElem *)(tmpNode->node));
1162 CM_LLIST_NEXT_NODE(&cellCb->rgCfgInfo.pndngRgrCfgLst,tmpNode);
1165 } /* rgSCHDbmGetPndngRgrCfgElemByKey */
1168 * @brief Handler for deleting the existing cfgElem from the crntRgrCfgLst.
1172 * Function : rgSCHDbmDelCrntRgrCfgElem
1175 * @param[in] *cellCb
1176 * @param[in] *cfgElem
1177 * @return RgSchCfgElem*
1179 RgSchCfgElem* rgSCHDbmDelCrntRgrCfgElem(RgSchCellCb *cellCb,RgSchCfgElem *cfgElem)
1182 if(cmLListDelFrm(&cellCb->rgCfgInfo.crntRgrCfgLst,&cfgElem->cfgReqLstEnt))
1184 return ((RgSchCfgElem *)(cfgElem->cfgReqLstEnt.node));
1187 } /* rgSCHDbmDelCrntRgrCfgElem */
1190 * @brief Handler for deleting the existing cfgElem from the pndngRgrCfgLst.
1194 * Function : rgSCHDbmDelPndngRgrCfgElem
1197 * @param[in] *cellCb
1198 * @param[in] *cfgElem
1199 * @return RgSchCfgElem*
1201 RgSchCfgElem* rgSCHDbmDelPndngRgrCfgElem(RgSchCellCb *cellCb,RgSchCfgElem *cfgElem)
1203 if(cmLListDelFrm(&cellCb->rgCfgInfo.pndngRgrCfgLst,&cfgElem->cfgReqLstEnt))
1205 return ((RgSchCfgElem *)(cfgElem->cfgReqLstEnt.node));
1208 } /* rgSCHDbmDelPndngRgrCfgElem */
1211 * @brief Handler for initializing the rntiDb.
1215 * Function : rgSCHDbmRntiDbInit
1218 * @param[in] *cellCb
1219 * @param[in] rntiStart
1220 * @param[in] maxRntis
1225 S16 rgSCHDbmRntiDbInit(RgSchCellCb *cellCb,uint16_t rntiStart,uint16_t maxRntis)
1228 RgSchRntiLnk *rntiPool;
1230 /* Fix for Change Request ccpu00099150 */
1231 if(rgSCHUtlAllocSBuf(cellCb->instIdx,
1232 (Data **)&cellCb->rntiDb.rntiPool,maxRntis*sizeof(RgSchRntiLnk)) != ROK)
1236 cellCb->rntiDb.rntiStart = rntiStart;
1237 cellCb->rntiDb.maxRntis = maxRntis;
1239 cellCb->rntiDb.count = maxRntis;
1242 rntiPool = cellCb->rntiDb.rntiPool;
1245 rntiPool[0].rnti = rnti;
1246 rntiPool[0].prv = NULLP;
1247 rntiPool[0].nxt = NULLP;
1248 cellCb->rntiDb.lastRnti = &rntiPool[0];
1253 rntiPool[0].rnti = rnti++;
1254 rntiPool[0].prv = NULLP;
1255 rntiPool[0].nxt = &rntiPool[1];
1256 for (idx = 1; idx < maxRntis - 1; ++idx)
1258 rntiPool[idx].rnti = rnti++;
1259 rntiPool[idx].prv = &rntiPool[idx-1];
1260 rntiPool[idx].nxt = &rntiPool[idx+1];
1262 rntiPool[idx].rnti = rnti++;
1263 rntiPool[idx].prv = &rntiPool[idx-1];
1264 rntiPool[idx].nxt = NULLP;
1265 cellCb->rntiDb.lastRnti = &rntiPool[idx];
1267 cellCb->rntiDb.freeRnti = &rntiPool[0];
1269 } /* rgSCHDbmRntiDbInit */
1272 * @brief Handler for de-initializing the rntiDb.
1276 * Function : rgSCHDbmRntiDbDeInit
1279 * @param[in] *cellCb
1282 Void rgSCHDbmRntiDbDeInit(RgSchCellCb *cellCb)
1284 /* ccpu00117052 - MOD - Passing double pointer
1285 for proper NULLP assignment*/
1286 rgSCHUtlFreeSBuf(cellCb->instIdx, (Data **)(&(cellCb->rntiDb.rntiPool)),
1287 cellCb->rntiDb.maxRntis*sizeof(RgSchRntiLnk));
1288 cellCb->rntiDb.maxRntis = 0;
1289 cellCb->rntiDb.freeRnti = NULLP;
1290 cellCb->rntiDb.lastRnti = NULLP;
1291 cmLListInit(&cellCb->rntiDb.rntiGuardPool);
1293 /* Stack Crash problems for TRACE5 Changes. Added the return below */
1296 } /* rgSCHDbmRntiDbDeInit */
1299 * @brief Handler for accessing the free RNTI.
1303 * Function : rgSCHDbmGetRnti
1306 * @param[in] *cellCb
1307 * @return RgSchRntiLnk*
1309 RgSchRntiLnk* rgSCHDbmGetRnti(RgSchCellCb *cellCb)
1311 RgSchRntiLnk *rntiLnk;
1313 if (!(cellCb->rntiDb.freeRnti))
1315 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,"RNTI exhausted count:%d",
1316 cellCb->rntiDb.count);
1320 rntiLnk = cellCb->rntiDb.freeRnti;
1321 cellCb->rntiDb.freeRnti = rntiLnk->nxt;
1323 /* setting prv and nxt to NULLP may not be needed */
1324 rntiLnk->prv = NULLP;
1325 rntiLnk->nxt = NULLP;
1327 if (cellCb->rntiDb.freeRnti != NULLP)
1329 cellCb->rntiDb.freeRnti->prv = NULLP;
1333 cellCb->rntiDb.lastRnti = NULLP;
1336 cellCb->rntiDb.count--;
1338 printf("rgSCHDbmGetRnti::rntiLnk->rnti %u\n",rntiLnk->rnti);
1340 } /* rgSCHDbmGetRnti */
1343 * @brief Handler for releasing the RNTI.
1347 * Function : rgSCHDbmRlsRnti
1350 * @param[in] *cellCb
1351 * @param[in] rntiLnk
1354 Void rgSCHDbmRlsRnti(RgSchCellCb *cellCb,RgSchRntiLnk *rntiLnk)
1357 if(ROK==rgSCHDbmPutEmtcRnti(cellCb,rntiLnk))
1362 rntiLnk->nxt = NULLP;
1363 if (cellCb->rntiDb.lastRnti)
1365 cellCb->rntiDb.lastRnti->nxt = rntiLnk;
1366 rntiLnk->prv = cellCb->rntiDb.lastRnti;
1370 rntiLnk->prv = NULLP;
1371 cellCb->rntiDb.freeRnti = rntiLnk;
1373 cellCb->rntiDb.lastRnti = rntiLnk;
1375 cellCb->rntiDb.count++;
1377 /* Stack Crash problems for TRACE5 Changes. Added the return below */
1380 } /* rgSCHDbmRlsRnti */
1384 * @brief Handler for initializing the ueTfuPendLst under the cellCb.
1388 * Function : rgSCHDbmInitUeTfuPendLst
1391 * @param[in] *cellCb
1392 * @param[in] numBins
1397 static S16 rgSCHDbmInitUeTfuPendLst(RgSchCellCb *cellCb,uint16_t numBins)
1399 RgSchUePucchRecpInfo pucchInfo;
1401 /* Fix: syed It is better to compute offset dynamically
1402 * rather than hardcoding it as 0 */
1403 if(cmHashListInit(&cellCb->ueTfuPendLst, numBins, (uint16_t)((PTR)&(pucchInfo.hashLstEnt) - (PTR)&pucchInfo), FALSE,
1404 CM_HASH_KEYTYPE_CONID,
1405 rgSchCb[cellCb->instIdx].rgSchInit.region,
1406 rgSchCb[cellCb->instIdx].rgSchInit.pool) != ROK)
1413 } /* rgSCHDbmInitUeTfuPendLst */
1416 * @brief Handler for de-initializing the ueTfuPendLst under the cellCb.
1420 * Function : rgSCHDbmDeInitUeTfuPendLst
1423 * @param[in] *cellCb
1428 S16 rgSCHDbmDeInitUeTfuPendLst(RgSchCellCb *cellCb)
1431 cmHashListDeinit(&cellCb->ueTfuPendLst);
1434 } /* rgSCHDbmDeInitUeTfuPendLst */
1437 /**********************************************************************
1440 **********************************************************************/