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
109 S16 rgSCHDbmInitCell(cellCb)
115 /* Initialize ue list */
116 if ((ret = rgSCHDbmInitUeCbLst(cellCb, RGSCH_MAX_UE_BIN_PER_CELL)) != ROK)
119 if ((ret = rgSCHDbmInitUeTfuPendLst(cellCb,
120 RGSCH_MAX_UE_BIN_PER_CELL)) != ROK)
125 /* Initialize SPS Ue list */
126 if ((ret = rgSCHDbmInitSpsUeCbLst(cellCb, RGSCH_MAX_UE_BIN_PER_CELL)) != ROK)
128 #endif /* LTEMAC_SPS */
130 /* Initialize BCCH/PCCH logical channels */
131 rgSCHDbmInitCmnLcLst(cellCb);
133 /* Initialize configuration lists */
134 rgSCHDbmInitCrntRgrCfgLst(cellCb);
135 rgSCHDbmInitPndngRgrCfgLst(cellCb);
138 /* Initialize raReq list */
139 rgSCHDbmInitRaReqLst(cellCb);
142 /* Initialize raCb list */
143 rgSCHDbmInitRaCbLst(cellCb);
145 /* Initialize l2mList */
147 cmLListInit(&cellCb->l2mList);
148 #endif /* LTE_L2_MEAS */
152 } /* rgSCHDbmInitCell */
155 * @brief Handler for initializing the ueCbLst under the cellCb.
159 * Function : rgSCHDbmInitUeCbLst
169 static S16 rgSCHDbmInitUeCbLst
175 static S16 rgSCHDbmInitUeCbLst(cellCb, numBins)
180 RgSchUeCellInfo ueCellInfo;
182 /* Fix: syed It is better to compute offset dynamically
183 * rather than hardcoding it as 0 */
184 return (cmHashListInit(&cellCb->ueLst, numBins, (uint16_t)((PTR)&(ueCellInfo.ueLstEnt) - (PTR)&ueCellInfo), FALSE,
185 CM_HASH_KEYTYPE_CONID,
186 rgSchCb[cellCb->instIdx].rgSchInit.region,
187 rgSchCb[cellCb->instIdx].rgSchInit.pool));
189 } /* rgSCHDbmInitUeCbLst */
192 * @brief Handler for de-initializing the ueCbLst under the cellCb.
196 * Function : rgSCHDbmDeInitUeCbLst
205 S16 rgSCHDbmDeInitUeCbLst
210 S16 rgSCHDbmDeInitUeCbLst(cellCb)
215 return (cmHashListDeinit(&cellCb->ueLst));
217 } /* rgSCHDbmDeInitUeCbLst */
221 * @brief Handler for initializing the spsUeCbLst under the cellCb.
225 * Function : rgSCHDbmInitSpsUeCbLst
235 static S16 rgSCHDbmInitSpsUeCbLst
241 static S16 rgSCHDbmInitSpsUeCbLst(cellCb, numBins)
248 return (cmHashListInit(&cellCb->spsUeLst, numBins, (uint16_t) ((PTR) &(ue.spsUeLstEnt) - (PTR) &ue), FALSE,
249 CM_HASH_KEYTYPE_CONID,
250 rgSchCb[cellCb->instIdx].rgSchInit.region,
251 rgSchCb[cellCb->instIdx].rgSchInit.pool));
253 } /* rgSCHDbmInitSpsUeCbLst */
256 * @brief Handler for de-initializing the spsUeCbLst under the cellCb.
260 * Function : rgSCHDbmDeInitSpsUeCbLst
269 S16 rgSCHDbmDeInitSpsUeCbLst
274 S16 rgSCHDbmDeInitSpsUeCbLst(cellCb)
279 return (cmHashListDeinit(&cellCb->spsUeLst));
281 } /* rgSCHDbmDeInitSpsUeCbLst */
283 #endif /* LTEMAC_SPS */
286 * @brief Handler for inserting the ueCb in to the ueCbLst under the cellCb.
290 * Function : rgSCHDbmInsUeCb
306 S16 rgSCHDbmInsUeCb(cellCb, ueCb)
311 RgSchUeCellInfo *ueCellInfo = NULLP;
313 ueCellInfo = ueCb->cellInfo[ueCb->cellIdToCellIdxMap[RG_SCH_CELLINDEX(cellCb)]];
315 return (cmHashListInsert(&cellCb->ueLst, (PTR)ueCellInfo,
316 (uint8_t *)&ueCb->ueId, (uint16_t)sizeof(ueCb->ueId)));
318 } /* rgSCHDbmInsUeCb */
322 * @brief Handler for inserting the ueCb in to the spsUeCbLst under the cellCb.
326 * Function : rgSCHDbmInsSpsUeCb
336 S16 rgSCHDbmInsSpsUeCb
342 S16 rgSCHDbmInsSpsUeCb(cellCb, ueCb)
347 return (cmHashListInsert(&cellCb->spsUeLst, (PTR)ueCb,
348 (uint8_t *)&ueCb->spsRnti, (uint16_t)sizeof(ueCb->spsRnti)));
350 } /* end of rgSCHDbmInsSpsUeCb */
352 #endif /* LTEMAC_SPS */
355 * @brief Handler for accessing the existing ueCb identified by the key ueId
356 * in the ueCbLst under the cellCb.
360 * Function : rgSCHDbmGetUeCb
368 RgSchUeCb* rgSCHDbmGetUeCb
374 RgSchUeCb* rgSCHDbmGetUeCb(cellCb, ueId)
379 RgSchUeCellInfo *ueCellInfo = NULLP;
381 cmHashListFind(&cellCb->ueLst, (uint8_t *)&ueId,
382 sizeof(ueId), 0, (PTR *)&ueCellInfo);
384 return (!ueCellInfo?NULLP:ueCellInfo->ue);
385 } /* rgSCHDbmGetUeCb */
389 * @brief Handler for accessing the existing ueCb identified by the key
390 * spsRnti in the spsUeCbLst under the cellCb.
394 * Function : rgSCHDbmGetSpsUeCb
402 RgSchUeCb* rgSCHDbmGetSpsUeCb
408 RgSchUeCb* rgSCHDbmGetSpsUeCb(cellCb, spsRnti)
413 RgSchUeCb *ueCb = NULLP;
415 cmHashListFind(&cellCb->spsUeLst, (uint8_t *)&spsRnti,
416 sizeof(spsRnti), 0, (PTR *)&ueCb);
418 } /* rgSCHDbmGetSpsUeCb */
422 * @brief Handler for accessing the existing next ueCb in the ueCbLst under the
427 * Function : rgSCHDbmGetNextUeCb
435 RgSchUeCb* rgSCHDbmGetNextUeCb
441 RgSchUeCb* rgSCHDbmGetNextUeCb(cellCb, ueCb)
446 RgSchUeCellInfo *ueCellInfo = NULLP;
447 RgSchUeCellInfo *nextUeCellInfo = NULLP;
451 ueCellInfo = ueCb->cellInfo[
452 ueCb->cellIdToCellIdxMap[RG_SCH_CELLINDEX(cellCb)]];
455 cmHashListGetNext(&cellCb->ueLst, (PTR) ueCellInfo, (PTR *)&nextUeCellInfo);
456 return (!nextUeCellInfo?NULLP:nextUeCellInfo->ue);
457 } /* rgSCHDbmGetNextUeCb */
461 * @brief Handler for accessing the existing next ueCb stored in the spsUeCbLst
462 * using SPS-Rnti under the cellCb.
466 * Function : rgSCHDbmGetNextSpsUeCb
474 RgSchUeCb* rgSCHDbmGetNextSpsUeCb
480 RgSchUeCb* rgSCHDbmGetNextSpsUeCb(cellCb, ueCb)
485 RgSchUeCb *nextUeCb = NULLP;
487 cmHashListGetNext(&cellCb->spsUeLst, (PTR) ueCb, (PTR *)&nextUeCb);
489 } /* end of rgSCHDbmGetNextSpsUeCb */
491 #endif /* LTEMAC_SPS */
495 * @brief Handler for Cleaning up L2 Meas related Data in
500 * Function : rgSCHDbmDelL2MUe
516 S16 rgSCHDbmDelL2MUe(cellCb, ueCb)
522 RgSchCmnUlUe *ueUl = RG_SCH_CMN_GET_UL_UE(ueCb, cellCb);
524 ueUl->hqEnt.numBusyHqProcs = 0;
525 /* Clean cell level UE Active Count */
526 for (lcCnt =0; lcCnt < RGSCH_MAX_LC_PER_UE; lcCnt++)
528 if (ueCb->ul.lcCb[lcCnt].isValid)
530 if((ueCb->ul.lcCb[lcCnt].qciCb->ulUeCount) &&
532 (1 << (ueCb->ul.lcCb[lcCnt].qciCb->qci -1))))
534 ueCb->ul.lcCb[lcCnt].qciCb->ulUeCount--;
535 ueCb->ulActiveLCs &= ~(1 <<
536 (ueCb->ul.lcCb[lcCnt].qciCb->qci -1));
540 if (ueCb->dl.lcCb[lcCnt])
542 if (ueCb->qciActiveLCs[ueCb->dl.lcCb[lcCnt]->qciCb->qci])
544 ueCb->dl.lcCb[lcCnt]->qciCb->dlUeCount--;
545 ueCb->qciActiveLCs[ueCb->dl.lcCb[lcCnt]->qciCb->qci] = 0;
551 } /* rgSCHDbmDelL2MUe */
556 * @brief Handler for deleting the existing ueCb from the ueCbLst under the
561 * Function : rgSCHDbmDelUeCb
577 S16 rgSCHDbmDelUeCb(cellCb, ueCb)
582 RgSchUeCellInfo *ueCellInfo = NULLP;
584 ueCellInfo = ueCb->cellInfo[ueCb->cellIdToCellIdxMap[RG_SCH_CELLINDEX(cellCb)]];
586 return (cmHashListDelete(&cellCb->ueLst, (PTR)ueCellInfo));
587 } /* rgSCHDbmDelUeCb */
591 * @brief Handler for deleting the existing ueCb from the spsUeCbLst under the
596 * Function : rgSCHDbmDelSpsUeCb
606 S16 rgSCHDbmDelSpsUeCb
612 S16 rgSCHDbmDelSpsUeCb(cellCb, ueCb)
618 return (cmHashListDelete(&cellCb->spsUeLst, (PTR)ueCb));
619 } /* end of rgSCHDbmDelSpsUeCb */
621 #endif /* LTEMAC_SPS */
624 * @brief Handler for Initializing the UE.
628 * Function : rgSCHDbmInitUe
630 * Initializes the lists belonging to the UE.
633 * @param[in] RgSchUeCb *ueCb
644 S16 rgSCHDbmInitUe(ueCb)
650 /* Initialize Dedicated logical channels */
651 rgSCHDbmInitDedLcLst(ueCb);
654 } /* rgSCHDbmInitUe */
657 * @brief Handler for Initializing the dedicated logical channels.
661 * Function : rgSCHDbmInitDedLcLst
663 * Initializes dedicated logical channels.
665 * @param[in] RgSchUeCb *ueCb
669 static Void rgSCHDbmInitDedLcLst
674 static Void rgSCHDbmInitDedLcLst(ueCb)
680 for (idx = 0; idx < RGSCH_MAX_LC_PER_UE; ++idx)
682 /* Set Dedicated LCs as not configured */
683 ueCb->ul.lcCb[idx].isValid = FALSE;
684 ueCb->dl.lcCb[idx] = NULLP;
687 /* Stack Crash problems for TRACE5 Changes. Added the return below */
691 } /* rgSCHDbmInitDedLcLst */
694 * @brief Handler for Initializing the common logical channel list of the cell.
698 * Function : rgSCHDbmInitCmnLcLst
700 * Initializes following common logical channels belonging to the cell.
705 * @param[in] RgSchCellCb *cellCb
709 static Void rgSCHDbmInitCmnLcLst
714 static Void rgSCHDbmInitCmnLcLst(cellCb)
720 for (idx = 0; idx < RGSCH_MAX_CMN_LC_CB; idx++)
722 cellCb->cmnLcCb[idx].lcId = RGSCH_INVALID_LC_ID;
725 /* Stack Crash problems for TRACE5 Changes. Added the return below */
728 } /* rgSCHDbmInitCmnLcLst */
731 * @brief Handler for inserting dedicated DL logical channel.
735 * Function : rgSCHDbmInsDlDedLcCb
737 * @param[in] RgSchUeCb *ueCb
738 * @param[in] RgSchDlLcCb* dlLcCb
742 Void rgSCHDbmInsDlDedLcCb
748 Void rgSCHDbmInsDlDedLcCb(ueCb, dlLcCb)
754 ueCb->dl.lcCb[dlLcCb->lcId - 1] = dlLcCb;
756 } /* rgSCHDbmInsDlDedLcCb */
759 * @brief Handler for deleting dedicated DL logical channel.
763 * Function : rgSCHDbmDelDlDedLcCb
765 * @param[in] RgSchUeCb *ueCb
766 * @param[in] RgSchDlLcCb* dlLcCb
770 Void rgSCHDbmDelDlDedLcCb
776 Void rgSCHDbmDelDlDedLcCb(ueCb, dlLcCb)
783 /* Clean cell level UE Active Count */
785 if (ueCb->dl.lcCb[dlLcCb->lcId - 1])
788 && (ueCb->qciActiveLCs[dlLcCb->qciCb->qci]))
790 ueCb->qciActiveLCs[dlLcCb->qciCb->qci]--;
791 if (!(ueCb->qciActiveLCs[dlLcCb->qciCb->qci]))
793 dlLcCb->qciCb->dlUeCount--;
797 #endif /* LTE_L2_MEAS */
799 ueCb->dl.lcCb[dlLcCb->lcId - 1] = NULLP;
801 /* Stack Crash problems for TRACE5 Changes. Added the return below */
804 } /* rgSCHDbmDelDlDedLcCb */
807 * @brief Handler for accessing the existing dl dedicated lcCb at idx in the
808 * lcCbLst of the ueCb.
812 * Function : rgSCHDbmGetDlDedLcCb
816 * @return RgSchDlLcCb*
819 RgSchDlLcCb* rgSCHDbmGetDlDedLcCb
825 RgSchDlLcCb* rgSCHDbmGetDlDedLcCb(ueCb, idx)
830 if (idx < RGSCH_DEDLC_MIN_LCID || idx > RGSCH_DEDLC_MAX_LCID)
834 return (ueCb->dl.lcCb[idx-1]);
836 } /* rgSCHDbmGetDlDedLcCb */
839 * @brief Handler for accessing the existing first dl dedicated lcCb at idx
840 * in the lcCbLst of the ueCb.
844 * Function : rgSCHDbmGetFirstDlDedLcCb
848 * @return RgSchDlLcCb*
851 RgSchDlLcCb* rgSCHDbmGetFirstDlDedLcCb
856 RgSchDlLcCb* rgSCHDbmGetFirstDlDedLcCb(ueCb)
862 for(idx = 0; idx < RGSCH_DEDLC_MAX_LCID; idx++)
864 if(ueCb->dl.lcCb[idx])
866 return (ueCb->dl.lcCb[idx]);
870 } /* rgSCHDbmGetFirstDlDedLcCb */
872 * @brief Handler for accessing the existing next dl dedicated lcCb at idx
873 * in the lcCbLst of the ueCb.
877 * Function : rgSCHDbmGetNextDlDedLcCb
882 * @return RgSchDlLcCb*
885 RgSchDlLcCb* rgSCHDbmGetNextDlDedLcCb
891 RgSchDlLcCb* rgSCHDbmGetNextDlDedLcCb(ueCb, lcCb)
900 return (rgSCHDbmGetFirstDlDedLcCb(ueCb));
903 for(idx = lcCb->lcId; idx < RGSCH_DEDLC_MAX_LCID; idx++)
905 if(ueCb->dl.lcCb[idx])
907 return (ueCb->dl.lcCb[idx]);
911 } /* rgSCHDbmGetNextDlDedLcCb */
914 * @brief Handler for accessing the existing dl common lcCb identified by the key lcId
915 * in the lcCbLst of the ueCb.
919 * Function : rgSCHDbmGetCmnLcCb
924 * @return RgSchClcDlLcCb*
927 RgSchClcDlLcCb* rgSCHDbmGetCmnLcCb
933 RgSchClcDlLcCb* rgSCHDbmGetCmnLcCb(cellCb, lcId)
940 for(idx = 0; idx < RGSCH_MAX_CMN_LC_CB; idx++)
942 if(cellCb->cmnLcCb[idx].lcId == lcId)
944 return (&(cellCb->cmnLcCb[idx]));
948 } /* rgSCHDbmGetCmnLcCb */
951 * @brief Handler for accessing the existing BCCH mapped on to BCH in the
952 * lcCbLst of the ueCb.
956 * Function : rgSCHDbmGetBcchOnBch
960 * @return RgSchClcDlLcCb*
963 RgSchClcDlLcCb* rgSCHDbmGetBcchOnBch
968 RgSchClcDlLcCb* rgSCHDbmGetBcchOnBch(cellCb)
973 if(cellCb->cmnLcCb[RGSCH_BCCH_BCH_IDX].lcId != RGSCH_INVALID_LC_ID)
975 return (&(cellCb->cmnLcCb[RGSCH_BCCH_BCH_IDX]));
978 } /* rgSCHDbmGetBcchOnBch */
981 * @brief Handler for accessing the existing BCCH mapped on to DLSCH in the
982 * lcCbLst of the ueCb.
986 * Function : rgSCHDbmGetFirstBcchOnDlsch
990 * @return RgSchClcDlLcCb*
993 RgSchClcDlLcCb* rgSCHDbmGetFirstBcchOnDlsch
998 RgSchClcDlLcCb* rgSCHDbmGetFirstBcchOnDlsch(cellCb)
1003 if(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1].lcId != RGSCH_INVALID_LC_ID)
1005 return (&(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1]));
1008 } /* rgSCHDbmGetFirstBcchOnDlsch */
1011 * @brief Handler for accessing the existing BCCH mapped on to DLSCH in the
1012 * lcCbLst of the ueCb.
1016 * Function : rgSCHDbmGetSecondBcchOnDlsch
1019 * @param[in] *cellCb
1020 * @return RgSchClcDlLcCb*
1023 RgSchClcDlLcCb* rgSCHDbmGetSecondBcchOnDlsch
1028 RgSchClcDlLcCb* rgSCHDbmGetSecondBcchOnDlsch(cellCb)
1029 RgSchCellCb *cellCb;
1033 if(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2].lcId != RGSCH_INVALID_LC_ID)
1035 return (&(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2]));
1038 } /* rgSCHDbmGetSecondBcchOnDlsch */
1041 * @brief Handler for accessing the existing PCCH in the lcCbLst of the ueCb.
1045 * Function : rgSCHDbmGetPcch
1048 * @param[in] *cellCb
1049 * @return RgSchClcDlLcCb*
1052 RgSchClcDlLcCb* rgSCHDbmGetPcch
1057 RgSchClcDlLcCb* rgSCHDbmGetPcch(cellCb)
1058 RgSchCellCb *cellCb;
1062 if(cellCb->cmnLcCb[RGSCH_PCCH_IDX].lcId != RGSCH_INVALID_LC_ID)
1064 return (&(cellCb->cmnLcCb[RGSCH_PCCH_IDX]));
1067 } /* rgSCHDbmGetPcch */
1070 * @brief Handler for inserting the BCCH mapped on to BCH in the
1071 * lcCbLst of the ueCb.
1075 * Function : rgSCHDbmInsBcchOnBch
1078 * @param[in] *cellCb
1082 Void rgSCHDbmInsBcchOnBch
1084 RgSchCellCb *cellCb,
1085 RgSchClcDlLcCb *cmnDlLcCb
1088 Void rgSCHDbmInsBcchOnBch(cellCb, cmnDlLcCb)
1089 RgSchCellCb *cellCb;
1090 RgSchClcDlLcCb *cmnDlLcCb;
1094 cellCb->cmnLcCb[RGSCH_BCCH_BCH_IDX].lcId = cmnDlLcCb->lcId;
1095 cellCb->cmnLcCb[RGSCH_BCCH_BCH_IDX].boLst = cmnDlLcCb->boLst;
1097 /* Stack Crash problems for TRACE5 Changes. Added the return below */
1100 } /* rgSCHDbmInsBcchOnBch */
1103 * @brief Handler for inserting the BCCH mapped on to DLSCH in the
1104 * lcCbLst of the ueCb.
1108 * Function : rgSCHDbmInsBcchOnDlsch
1111 * @param[in] *cellCb
1115 Void rgSCHDbmInsBcchOnDlsch
1117 RgSchCellCb *cellCb,
1118 RgSchClcDlLcCb *cmnDlLcCb
1121 Void rgSCHDbmInsBcchOnDlsch(cellCb, cmnDlLcCb)
1122 RgSchCellCb *cellCb;
1123 RgSchClcDlLcCb *cmnDlLcCb;
1126 if(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1].lcId == RGSCH_INVALID_LC_ID)
1128 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1].lcId = cmnDlLcCb->lcId;
1129 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1].boLst = cmnDlLcCb->boLst;
1130 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX1].si = FALSE;
1132 else if(cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2].lcId == RGSCH_INVALID_LC_ID)
1134 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2].lcId = cmnDlLcCb->lcId;
1135 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2].boLst = cmnDlLcCb->boLst;
1136 cellCb->cmnLcCb[RGSCH_BCCH_DLSCH_IDX2].si = TRUE;
1139 /* Stack Crash problems for TRACE5 Changes. Added the return below */
1142 } /* rgSCHDbmInsBcchOnDlsch */
1146 * @brief Handler for inserting the PCCH in the lcCbLst of the ueCb.
1150 * Function : rgSCHDbmInsPcch
1153 * @param[in] *cellCb
1157 Void rgSCHDbmInsPcch
1159 RgSchCellCb *cellCb,
1160 RgSchClcDlLcCb *cmnDlLcCb
1163 Void rgSCHDbmInsPcch(cellCb, cmnDlLcCb)
1164 RgSchCellCb *cellCb;
1165 RgSchClcDlLcCb *cmnDlLcCb;
1169 cellCb->cmnLcCb[RGSCH_PCCH_IDX].lcId = cmnDlLcCb->lcId;
1170 cellCb->cmnLcCb[RGSCH_PCCH_IDX].boLst = cmnDlLcCb->boLst;
1172 /* Stack Crash problems for TRACE5 Changes. Added the return below */
1175 } /* rgSCHDbmInsPcch */
1178 * @brief Handler for initializing the boLst.
1182 * Function : rgSCHDbmInitCmnLcBoLst
1185 * @param[in] *cmnDlLcCb
1189 Void rgSCHDbmInitCmnLcBoLst
1191 RgSchClcDlLcCb *cmnDlLcCb
1194 Void rgSCHDbmInitCmnLcBoLst(cmnDlLcCb)
1195 RgSchClcDlLcCb *cmnDlLcCb;
1199 cmLListInit(&cmnDlLcCb->boLst);
1201 } /* rgSCHDbmInitCmnLcBoLst */
1204 * @brief Handler for inserting the bo report in to the boLst.
1208 * Function : rgSCHDbmInsCmnLcBoRpt
1211 * @param[in] *cmnDlLcCb
1216 Void rgSCHDbmInsCmnLcBoRpt
1218 RgSchClcDlLcCb *cmnDlLcCb,
1219 RgSchClcBoRpt *cmnBoRpt
1222 Void rgSCHDbmInsCmnLcBoRpt(cmnDlLcCb, cmnBoRpt)
1223 RgSchClcDlLcCb *cmnDlLcCb;
1224 RgSchClcBoRpt *cmnBoRpt;
1227 cmnBoRpt->boLstEnt.next = NULLP;
1228 cmnBoRpt->boLstEnt.prev = NULLP;
1229 cmnBoRpt->boLstEnt.node = (PTR)cmnBoRpt;
1230 cmLListAdd2Tail(&cmnDlLcCb->boLst, &cmnBoRpt->boLstEnt);
1232 } /* rgSCHDbmInsCmnLcBoRpt */
1236 * @brief Handler for initializing the raCbLst.
1240 * Function : rgSCHDbmInitRaCbLst
1243 * @param[in] *cellCb
1247 static Void rgSCHDbmInitRaCbLst
1252 static Void rgSCHDbmInitRaCbLst(cellCb)
1253 RgSchCellCb *cellCb;
1257 cmLListInit(&cellCb->raInfo.raCbLst);
1259 } /* rgSCHDbmInitRaCbLst */
1263 * @brief Handler for accessing the existing raCb in the raCbLst.
1267 * Function : rgSCHDbmGetRaCb
1270 * @param[in] *cellCb
1272 * @return RgSchRaCb*
1275 RgSchRaCb* rgSCHDbmGetRaCb
1277 RgSchCellCb *cellCb,
1281 RgSchRaCb* rgSCHDbmGetRaCb(cellCb, key)
1282 RgSchCellCb *cellCb;
1288 CM_LLIST_FIRST_NODE(&cellCb->raInfo.raCbLst,tmpNode);
1291 if(((RgSchRaCb *)tmpNode->node)->tmpCrnti == key)
1293 return ((RgSchRaCb *)(tmpNode->node));
1295 CM_LLIST_NEXT_NODE(&cellCb->raInfo.raCbLst,tmpNode);
1298 } /* rgSCHDbmGetRaCb */
1302 * @brief Handler for initializing the raReqLst.
1306 * Function : rgSCHDbmInitRaReqLst
1309 * @param[in] *cellCb
1313 static Void rgSCHDbmInitRaReqLst
1318 static Void rgSCHDbmInitRaReqLst(cellCb)
1319 RgSchCellCb *cellCb;
1324 /* ccpu00133557- Memory Leak Fix- initializing for the all nodes
1326 for(idx = 0; idx < RGSCH_RAREQ_ARRAY_SIZE; idx++)
1328 cmLListInit(&cellCb->raInfo.raReqLst[idx]);
1331 } /* rgSCHDbmInitRaReqLst */
1335 * @brief Handler for initializing the crnt rgr cfgLst.
1339 * Function : rgSCHDbmInitCrntRgrCfgLst
1342 * @param[in] *cellCb
1346 static Void rgSCHDbmInitCrntRgrCfgLst
1351 static Void rgSCHDbmInitCrntRgrCfgLst(cellCb)
1352 RgSchCellCb *cellCb;
1356 cmLListInit(&cellCb->rgCfgInfo.crntRgrCfgLst);
1358 } /* rgSCHDbmInitCrntRgrCfgLst */
1361 * @brief Handler for initializing the pndng rgr cfgLst.
1365 * Function : rgSCHDbmInitPndngRgrCfgLst
1368 * @param[in] *cellCb
1372 static Void rgSCHDbmInitPndngRgrCfgLst
1377 static Void rgSCHDbmInitPndngRgrCfgLst(cellCb)
1378 RgSchCellCb *cellCb;
1382 cmLListInit(&cellCb->rgCfgInfo.pndngRgrCfgLst);
1384 } /* rgSCHDbmInitPndngRgrCfgLst */
1387 * @brief Handler for inserting the cfgElem in to the crntRgrCfgLst.
1391 * Function : rgSCHDbmInsCrntRgrCfgElem
1394 * @param[in] *cellCb
1395 * @param[in] *cfgElem
1399 Void rgSCHDbmInsCrntRgrCfgElem
1401 RgSchCellCb *cellCb,
1402 RgSchCfgElem *cfgElem
1405 Void rgSCHDbmInsCrntRgrCfgElem(cellCb, cfgElem)
1406 RgSchCellCb *cellCb;
1407 RgSchCfgElem *cfgElem;
1410 cfgElem->cfgReqLstEnt.next = NULLP;
1411 cfgElem->cfgReqLstEnt.prev = NULLP;
1412 cmLListAdd2Tail(&cellCb->rgCfgInfo.crntRgrCfgLst, &cfgElem->cfgReqLstEnt);
1414 } /* rgSCHDbmInsCrntRgrCfgElem */
1417 * @brief Handler for inserting the cfgElem in to the pndngRgrCfgLst.
1421 * Function : rgSCHDbmInsPndngRgrCfgElem
1424 * @param[in] *cellCb
1425 * @param[in] *cfgElem
1429 Void rgSCHDbmInsPndngRgrCfgElem
1431 RgSchCellCb *cellCb,
1432 RgSchCfgElem *cfgElem
1435 Void rgSCHDbmInsPndngRgrCfgElem(cellCb, cfgElem)
1436 RgSchCellCb *cellCb;
1437 RgSchCfgElem *cfgElem;
1441 cfgElem->cfgReqLstEnt.next = NULLP;
1442 cfgElem->cfgReqLstEnt.prev = NULLP;
1443 cfgElem->cfgReqLstEnt.node = (PTR)cfgElem;
1444 cmLListAdd2Tail(&cellCb->rgCfgInfo.pndngRgrCfgLst, &cfgElem->cfgReqLstEnt);
1446 } /* rgSCHDbmInsPndngRgrCfgElem */
1449 * @brief Handler for accessing the existing cfgElem in the crntRgrCfgLst.
1453 * Function : rgSCHDbmGetNextCrntRgrCfgElem
1456 * @param[in] *cellCb
1457 * @param[in] *cfgElem
1458 * @return RgSchCfgElem*
1461 RgSchCfgElem* rgSCHDbmGetNextCrntRgrCfgElem
1463 RgSchCellCb *cellCb,
1464 RgSchCfgElem *cfgElem
1467 RgSchCfgElem* rgSCHDbmGetNextCrntRgrCfgElem(cellCb, cfgElem)
1468 RgSchCellCb *cellCb;
1469 RgSchCfgElem *cfgElem;
1475 return ( cellCb->rgCfgInfo.crntRgrCfgLst.first ?
1476 (RgSchCfgElem *)(cellCb->rgCfgInfo.crntRgrCfgLst.first->node) : NULLP );
1478 return ( cfgElem->cfgReqLstEnt.next ?
1479 (RgSchCfgElem *)(cfgElem->cfgReqLstEnt.next->node) : NULLP );
1480 } /* rgSCHDbmGetNextCrntRgrCfgElem */
1483 * @brief Handler for accessing the existing cfgElem in the pndngRgrCfgLst.
1487 * Function : rgSCHDbmGetNextPndngRgrCfgElem
1490 * @param[in] *cellCb
1491 * @param[in] *cfgElem
1492 * @return RgSchCfgElem*
1495 RgSchCfgElem* rgSCHDbmGetNextPndngRgrCfgElem
1497 RgSchCellCb *cellCb,
1498 RgSchCfgElem *cfgElem
1501 RgSchCfgElem* rgSCHDbmGetNextPndngRgrCfgElem(cellCb, cfgElem)
1502 RgSchCellCb *cellCb;
1503 RgSchCfgElem *cfgElem;
1509 return ( cellCb->rgCfgInfo.pndngRgrCfgLst.first ?
1510 (RgSchCfgElem *)(cellCb->rgCfgInfo.pndngRgrCfgLst.first->node) : NULLP );
1512 return ( cfgElem->cfgReqLstEnt.next ?
1513 (RgSchCfgElem *)(cfgElem->cfgReqLstEnt.next->node) : NULLP );
1514 } /* rgSCHDbmGetNextPndngRgrCfgElem */
1517 * @brief Handler for extracting the existing cfgElem from the pndngRgrCfgLst.
1521 * Function : rgSCHDbmGetPndngRgrCfgElemByKey
1524 * @param[in] *cellCb
1526 * @return RgSchCfgElem*
1529 RgSchCfgElem* rgSCHDbmGetPndngRgrCfgElemByKey
1531 RgSchCellCb *cellCb,
1535 RgSchCfgElem* rgSCHDbmGetPndngRgrCfgElemByKey(cellCb, key)
1536 RgSchCellCb *cellCb;
1537 CmLteTimingInfo key;
1542 CM_LLIST_FIRST_NODE(&cellCb->rgCfgInfo.pndngRgrCfgLst,tmpNode);
1545 if((((RgSchCfgElem *)tmpNode->node)->actvTime.sfn == key.sfn) &&
1546 (((RgSchCfgElem *)tmpNode->node)->actvTime.slot == key.slot))
1548 return ((RgSchCfgElem *)(tmpNode->node));
1550 CM_LLIST_NEXT_NODE(&cellCb->rgCfgInfo.pndngRgrCfgLst,tmpNode);
1553 } /* rgSCHDbmGetPndngRgrCfgElemByKey */
1556 * @brief Handler for deleting the existing cfgElem from the crntRgrCfgLst.
1560 * Function : rgSCHDbmDelCrntRgrCfgElem
1563 * @param[in] *cellCb
1564 * @param[in] *cfgElem
1565 * @return RgSchCfgElem*
1568 RgSchCfgElem* rgSCHDbmDelCrntRgrCfgElem
1570 RgSchCellCb *cellCb,
1571 RgSchCfgElem *cfgElem
1574 RgSchCfgElem* rgSCHDbmDelCrntRgrCfgElem(cellCb, cfgElem)
1575 RgSchCellCb *cellCb;
1576 RgSchCfgElem *cfgElem;
1580 if(cmLListDelFrm(&cellCb->rgCfgInfo.crntRgrCfgLst,&cfgElem->cfgReqLstEnt))
1582 return ((RgSchCfgElem *)(cfgElem->cfgReqLstEnt.node));
1585 } /* rgSCHDbmDelCrntRgrCfgElem */
1588 * @brief Handler for deleting the existing cfgElem from the pndngRgrCfgLst.
1592 * Function : rgSCHDbmDelPndngRgrCfgElem
1595 * @param[in] *cellCb
1596 * @param[in] *cfgElem
1597 * @return RgSchCfgElem*
1600 RgSchCfgElem* rgSCHDbmDelPndngRgrCfgElem
1602 RgSchCellCb *cellCb,
1603 RgSchCfgElem *cfgElem
1606 RgSchCfgElem* rgSCHDbmDelPndngRgrCfgElem(cellCb, cfgElem)
1607 RgSchCellCb *cellCb;
1608 RgSchCfgElem *cfgElem;
1611 if(cmLListDelFrm(&cellCb->rgCfgInfo.pndngRgrCfgLst,&cfgElem->cfgReqLstEnt))
1613 return ((RgSchCfgElem *)(cfgElem->cfgReqLstEnt.node));
1616 } /* rgSCHDbmDelPndngRgrCfgElem */
1619 * @brief Handler for initializing the rntiDb.
1623 * Function : rgSCHDbmRntiDbInit
1626 * @param[in] *cellCb
1627 * @param[in] rntiStart
1628 * @param[in] maxRntis
1634 S16 rgSCHDbmRntiDbInit
1636 RgSchCellCb *cellCb,
1641 S16 rgSCHDbmRntiDbInit(cellCb, rntiStart, maxRntis)
1642 RgSchCellCb *cellCb;
1648 RgSchRntiLnk *rntiPool;
1650 /* Fix for Change Request ccpu00099150 */
1651 if(rgSCHUtlAllocSBuf(cellCb->instIdx,
1652 (Data **)&cellCb->rntiDb.rntiPool,maxRntis*sizeof(RgSchRntiLnk)) != ROK)
1656 cellCb->rntiDb.rntiStart = rntiStart;
1657 cellCb->rntiDb.maxRntis = maxRntis;
1659 cellCb->rntiDb.count = maxRntis;
1662 rntiPool = cellCb->rntiDb.rntiPool;
1665 rntiPool[0].rnti = rnti;
1666 rntiPool[0].prv = NULLP;
1667 rntiPool[0].nxt = NULLP;
1668 cellCb->rntiDb.lastRnti = &rntiPool[0];
1673 rntiPool[0].rnti = rnti++;
1674 rntiPool[0].prv = NULLP;
1675 rntiPool[0].nxt = &rntiPool[1];
1676 for (idx = 1; idx < maxRntis - 1; ++idx)
1678 rntiPool[idx].rnti = rnti++;
1679 rntiPool[idx].prv = &rntiPool[idx-1];
1680 rntiPool[idx].nxt = &rntiPool[idx+1];
1682 rntiPool[idx].rnti = rnti++;
1683 rntiPool[idx].prv = &rntiPool[idx-1];
1684 rntiPool[idx].nxt = NULLP;
1685 cellCb->rntiDb.lastRnti = &rntiPool[idx];
1687 cellCb->rntiDb.freeRnti = &rntiPool[0];
1689 } /* rgSCHDbmRntiDbInit */
1692 * @brief Handler for de-initializing the rntiDb.
1696 * Function : rgSCHDbmRntiDbDeInit
1699 * @param[in] *cellCb
1703 Void rgSCHDbmRntiDbDeInit
1708 Void rgSCHDbmRntiDbDeInit(cellCb)
1709 RgSchCellCb *cellCb;
1712 /* ccpu00117052 - MOD - Passing double pointer
1713 for proper NULLP assignment*/
1714 rgSCHUtlFreeSBuf(cellCb->instIdx, (Data **)(&(cellCb->rntiDb.rntiPool)),
1715 cellCb->rntiDb.maxRntis*sizeof(RgSchRntiLnk));
1716 cellCb->rntiDb.maxRntis = 0;
1717 cellCb->rntiDb.freeRnti = NULLP;
1718 cellCb->rntiDb.lastRnti = NULLP;
1719 cmLListInit(&cellCb->rntiDb.rntiGuardPool);
1721 /* Stack Crash problems for TRACE5 Changes. Added the return below */
1724 } /* rgSCHDbmRntiDbDeInit */
1727 * @brief Handler for accessing the free RNTI.
1731 * Function : rgSCHDbmGetRnti
1734 * @param[in] *cellCb
1735 * @return RgSchRntiLnk*
1738 RgSchRntiLnk* rgSCHDbmGetRnti
1743 RgSchRntiLnk* rgSCHDbmGetRnti(cellCb)
1744 RgSchCellCb *cellCb;
1747 RgSchRntiLnk *rntiLnk;
1749 if (!(cellCb->rntiDb.freeRnti))
1751 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,"RNTI exhausted count:%d",
1752 cellCb->rntiDb.count);
1756 rntiLnk = cellCb->rntiDb.freeRnti;
1757 cellCb->rntiDb.freeRnti = rntiLnk->nxt;
1759 /* setting prv and nxt to NULLP may not be needed */
1760 rntiLnk->prv = NULLP;
1761 rntiLnk->nxt = NULLP;
1763 if (cellCb->rntiDb.freeRnti != NULLP)
1765 cellCb->rntiDb.freeRnti->prv = NULLP;
1769 cellCb->rntiDb.lastRnti = NULLP;
1772 cellCb->rntiDb.count--;
1774 printf("rgSCHDbmGetRnti::rntiLnk->rnti %u\n",rntiLnk->rnti);
1776 } /* rgSCHDbmGetRnti */
1779 * @brief Handler for releasing the RNTI.
1783 * Function : rgSCHDbmRlsRnti
1786 * @param[in] *cellCb
1787 * @param[in] rntiLnk
1791 Void rgSCHDbmRlsRnti
1793 RgSchCellCb *cellCb,
1794 RgSchRntiLnk *rntiLnk
1797 Void rgSCHDbmRlsRnti(cellCb, rntiLnk)
1798 RgSchCellCb *cellCb;
1799 RgSchRntiLnk *rntiLnk;
1803 if(ROK==rgSCHDbmPutEmtcRnti(cellCb,rntiLnk))
1808 rntiLnk->nxt = NULLP;
1809 if (cellCb->rntiDb.lastRnti)
1811 cellCb->rntiDb.lastRnti->nxt = rntiLnk;
1812 rntiLnk->prv = cellCb->rntiDb.lastRnti;
1816 rntiLnk->prv = NULLP;
1817 cellCb->rntiDb.freeRnti = rntiLnk;
1819 cellCb->rntiDb.lastRnti = rntiLnk;
1821 cellCb->rntiDb.count++;
1823 /* Stack Crash problems for TRACE5 Changes. Added the return below */
1826 } /* rgSCHDbmRlsRnti */
1830 * @brief Handler for initializing the ueTfuPendLst under the cellCb.
1834 * Function : rgSCHDbmInitUeTfuPendLst
1837 * @param[in] *cellCb
1838 * @param[in] numBins
1844 static S16 rgSCHDbmInitUeTfuPendLst
1846 RgSchCellCb *cellCb,
1850 static S16 rgSCHDbmInitUeTfuPendLst(cellCb, numBins)
1851 RgSchCellCb *cellCb;
1855 RgSchUePucchRecpInfo pucchInfo;
1857 /* Fix: syed It is better to compute offset dynamically
1858 * rather than hardcoding it as 0 */
1859 if(cmHashListInit(&cellCb->ueTfuPendLst, numBins, (uint16_t)((PTR)&(pucchInfo.hashLstEnt) - (PTR)&pucchInfo), FALSE,
1860 CM_HASH_KEYTYPE_CONID,
1861 rgSchCb[cellCb->instIdx].rgSchInit.region,
1862 rgSchCb[cellCb->instIdx].rgSchInit.pool) != ROK)
1869 } /* rgSCHDbmInitUeTfuPendLst */
1872 * @brief Handler for de-initializing the ueTfuPendLst under the cellCb.
1876 * Function : rgSCHDbmDeInitUeTfuPendLst
1879 * @param[in] *cellCb
1885 S16 rgSCHDbmDeInitUeTfuPendLst
1890 S16 rgSCHDbmDeInitUeTfuPendLst(cellCb)
1891 RgSchCellCb *cellCb;
1895 cmHashListDeinit(&cellCb->ueTfuPendLst);
1898 } /* rgSCHDbmDeInitUeTfuPendLst */
1901 /**********************************************************************
1904 **********************************************************************/