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 functions.
29 **********************************************************************/
31 /** @file rg_sch_cfg.c
32 @brief This module handles the configuration of SCH by RRC and RRM.
35 static const char* RLOG_MODULE_NAME="MAC";
36 static int RLOG_FILE_ID=186;
37 static int RLOG_MODULE_ID=4096;
39 /* header include files -- defines (.h) */
40 #include "envopt.h" /* environment options */
41 #include "envdep.h" /* environment dependent */
42 #include "envind.h" /* environment independent */
43 #include "gen.h" /* general layer */
44 #include "ssi.h" /* system service interface */
45 #include "cm_hash.h" /* common hash list */
46 #include "cm_mblk.h" /* common memory link list library */
47 #include "cm_llist.h" /* common linked list library */
48 #include "cm_err.h" /* common error */
49 #include "cm_lte.h" /* common LTE */
55 #include "rg_sch_inf.h"
57 #include "rg_sch_err.h"
58 #include "rg_sch_cmn.h"
59 #include "rl_interface.h"
60 #include "rl_common.h"
62 /* header/extern include files (.x) */
63 #include "gen.x" /* general layer typedefs */
64 #include "ssi.x" /* system services typedefs */
65 #include "cm5.x" /* common timers */
66 #include "cm_hash.x" /* common hash list */
67 #include "cm_lib.x" /* common library */
68 #include "cm_llist.x" /* common linked list */
69 #include "cm_mblk.x" /* memory management */
70 #include "cm_tkns.x" /* common tokens */
71 #include "cm_lte.x" /* common tokens */
72 #include "tfu.x" /* TFU types */
73 #include "lrg.x" /* layer management typedefs for MAC */
74 #include "rgr.x" /* layer management typedefs for MAC */
75 #include "rgm.x" /* layer management typedefs for MAC */
76 #include "rg_sch_inf.x" /* typedefs for MAC */
77 #include "rg_sch.x" /* typedefs for MAC */
78 /* [ccpu00124018]-MOD- Retrieving CQI value from cell config*/
79 #include "rg_sch_cmn.x"
80 #include "rg_sch_clist.x"
83 /* LTE-MAC Scheduler instance control block structures */
84 PUBLIC RgSchCb rgSchCb[RGSCH_MAX_INST];
86 #ifdef PHY_ERROR_LOGING
87 PUBLIC RgSchUlAllocCntr rgSchUlAllocCntr;
91 EXTERN Void rgSCHEmtcPOTrigger ARGS ((
96 EXTERN S16 rgSchEmtcUpdSiCfg ARGS ((
98 RgrCellRecfg *cellRecfg
101 EXTERN S16 rgSCHEmtcCfgVldtDrxReTxCfg ARGS((
105 EXTERN S16 rgSCHEmtcCfgVldtDrxUlReTxCfg ARGS((
110 PUBLIC S16 rgSCHEnbPfsDlCfg ARGS((
115 PRIVATE S16 rgSCHCfgRgrUeRecfgRntiChg ARGS (( RgSchCellCb *cell,
116 RgSchUeCb *ue, RgrUeRecfg *ueRecfg, RgSchErrInfo *errInfo));
117 PRIVATE S16 rgSCHCfgVldtUePwrCfg ARGS((RgSchCellCb *cell,
118 RgrUeUlPwrCfg *pwrCfg));
119 PRIVATE S16 rgSCHCfgVldtUeGrpPwrCfg ARGS((RgSchCellCb *cell,
120 RgrUeGrpPwrCfg *grpPwrCfg));
122 PRIVATE S16 rgSCHCfgVldtUeDlSpsCfg ARGS((RgSchCellCb *cell,
123 RgrUeSpsDlCfg *dlSpsCfg));
124 PRIVATE S16 rgSCHCfgVldtSpsReCfg ARGS ((RgSchCellCb *cell,
125 RgSchUeCb *ue, RgrUeRecfg *ueRecfg));
126 #endif /*LTEMAC_SPS*/
127 PRIVATE S16 rgSCHCfgVldtUeCqiModeCfg ARGS((RgSchCellCb *cell,RgrUeDlCqiCfg *ueDlCqiCfg));
128 PRIVATE S16 rgSCHCfgVldtUeMeasGapAckNakRepCfg ARGS ((RgSchCellCb *cell,
130 PRIVATE S16 rgSCHCfgVldtUeMeasGapAckNakRepRecfg ARGS ((RgSchCellCb *cell,
131 RgrUeRecfg *ueRecfg));
132 PRIVATE Void rgSCHCfgFreeDlDedLcCb ARGS((RgSchCellCb *cell, RgSchUeCb *ue,
134 PRIVATE Void rgSCHCfgFreeDlCmnLcCb ARGS((RgSchClcDlLcCb *cmnDlLc));
135 PRIVATE Void rgSCHCfgFreeUeCb ARGS((RgSchCellCb *cell, RgSchUeCb *ue));
136 PRIVATE Void rgSCHCfgFreeRgrCfgLst ARGS((RgSchCellCb *cell));
137 PRIVATE Void rgSCHCfgFreeCmnLcLst ARGS((RgSchCellCb *cell));
138 PRIVATE Void rgSCHCfgFreeUeLst ARGS((RgSchCellCb *cell));
140 PRIVATE Void rgSCHCfgFreeSpsUeLst ARGS((RgSchCellCb *cell));
142 PRIVATE S16 rgSCHCfgVldtRgrCmnLcCfg ARGS((Inst inst, RgrCellCfg *cellCfg,
143 RgSchErrInfo *errInfo));
144 PRIVATE S16 rgSCHCfgVldtRgrCellPwrCfg ARGS((Inst inst, RgrCellCfg *cellCfg,
145 RgSchErrInfo *errInfo));
146 PRIVATE S16 rgSCHCfgVldtRgrCellSchCfg ARGS((Inst inst, RgrCellCfg *cellCfg));
147 PRIVATE S16 rgSCHCfgVldtRgrSchCfg ARGS((Inst inst, RgrSchedEnbCfg *schedEnbCfg));
148 PRIVATE S16 rgSCHCfgVldtRgrCellRACfg ARGS((Inst inst, RgrCellCfg *cellCfg));
149 PRIVATE Void rgSCHCfgRgrUePhrMsg3 ARGS(( RgSchCellCb *cell,
150 RgSchRaCb *raCb,RgSchUeCb *ue, RgSchErrInfo *errInfo));
151 PRIVATE S16 rgSCHCfgRgrCmnLcCfg ARGS((RgSchCellCb *cell, RgrCmnLchCfg *lcCfg,
152 RgSchErrInfo *errInfo));
153 PUBLIC Void rgSCHSCellFreeBuf ARGS((Inst inst,RgSchUeCb *ue,RgrUeRecfg *ueRecfg,U8 idx));
155 PRIVATE S16 rgSCHCfgVldtRgrCellSiCfg ARGS(( Inst inst, RgrSiCfg *siCfg));
156 #endif/*RGR_SI_SCH */
158 /* LTE_ADV_FLAG_REMOVED_START */
159 PRIVATE S16 rgSCHCfgVldtRgrCellLteAdvCfg ARGS(( Inst inst,
160 RgrLteAdvancedCellConfig *lteAdvCfg, U8 dlTotalBw));
161 /* LTE_ADV_FLAG_REMOVED_END */
163 PRIVATE S16 rgSCHCfgVldtDrxUeCfg ARGS ((RgSchCellCb *cell,
164 RgrUeDrxCfg *ueDrxCfg));
165 PRIVATE S16 rgSCHCfgVldtDrxOnDurCfg ARGS((U8 onDurTmr));
166 PRIVATE S16 rgSCHCfgVldtDrxInActvCfg ARGS((U16 inActvTmr));
167 PRIVATE S16 rgSCHCfgVldtDrxReTxCfg ARGS((U8 reTxTmr));
168 PRIVATE S16 rgSCHCfgVldtDrxLngCycCfg ARGS((RgrDrxLongCycleOffst lngCycleOffst));
169 PRIVATE S16 rgSCHCfgVldtDrxLngCyclTmrs ARGS((U16 val));
170 PRIVATE S16 rgSCHCfgVldtDrxShrtCycCfg ARGS((RgrDrxShortDrx shrtCycCfg));
171 PRIVATE S16 rgSCHCfgVldtRgrCellCsgParamCfg ARGS((Inst inst,
172 RgrCellCsgParamCfg *csgParam));
175 PUBLIC S16 rgSCHCfgACqiUeCfg ARGS(( RgSchCellCb *cellCb,RgSchUeCb *ue, RgSchUeACqiCb *aCqiCb,
176 RgrTxMode ueTxMode,RgrUeAprdDlCqiCfg *aCqiCfg, CmLteUeCategory ueCat ));
178 PUBLIC S16 rgSCHCfgAcqiUeReCfg ARGS(( RgSchCellCb *cellCb, RgSchUeCb *ueCb,
179 RgrUeAprdDlCqiCfg *acqiCfg, CmLteUeCategory ueCat ));
181 PUBLIC S16 rgSCHUtlGetCfgPerOff ARGS(( RgSchPerTbl tbl, U16 cfgIdx,
182 U16 *peri, U16 *offset ));
184 PUBLIC S16 rgSCHCfgRiUeCfg ARGS((RgSchCellCb *cellCb, RgSchUeCb *ueCb,
185 RgrUePrdDlCqiCfg *cqiCfg, CmLteUeCategory ueCat ));
187 PUBLIC S16 rgSCHCfgPCqiUeCfg ARGS((RgSchCellCb *cellCb, RgSchUeCb *ueCb,
188 RgrUePrdDlCqiCfg *cqiCfg,CmLteUeCategory ueCat ));
190 PUBLIC S16 rgSCHCfgSrsUeCfg ARGS((RgSchCellCb *cellCb,RgSchUeCb *ueCb,
191 RgrUeUlSrsCfg *srsCfg ));
193 PUBLIC S16 rgSCHCfgSrUeCfg ARGS((RgSchCellCb *cellCb,RgSchUeCb *ueCb,
196 PUBLIC S16 rgSCHCfgPCqiUeReCfg ARGS((RgSchCellCb *cellCb, RgSchUeCb *ueCb,
197 RgrUePrdDlCqiCfg *cqiCfg,CmLteUeCategory ueCat));
199 PUBLIC S16 rgSCHCfgSrsUeReCfg ARGS((RgSchCellCb *cellCb, RgSchUeCb *ueCb,
200 RgrUeUlSrsCfg *srsCfg));
202 PUBLIC S16 rgSCHCfgSrUeReCfg ARGS((RgSchCellCb *cellCb, RgSchUeCb *ueCb,
205 PUBLIC S16 rgSCHCfgVldtRgrTxmodePuschMode ARGS((RgSchCellCb *cellCb,
206 RgrTxMode txMde, RgrAprdCqiMode puschMode,RgSchErrInfo *errInfo));
208 PUBLIC S16 rgSCHCfgVldtRgrUeACqiCfg ARGS(( RgSchCellCb *cellCb,
209 CmLteRnti crnti, RgrUeAprdDlCqiCfg *acqiCfg, RgrUeTxModeCfg txMode,
210 RgSchErrInfo *errInfo ));
212 PUBLIC S16 rgSCHCfgVldtRgrTxmodePucchMode ARGS((RgSchCellCb *cellCb,
213 RgrTxMode txMde, RgrPrdCqiMode pucchMode,RgSchErrInfo *errInfo));
216 PUBLIC S16 rgSCHCfgVldtRgrUePCqiCfg ARGS(( RgSchCellCb *cellCb,
217 CmLteRnti crnti, RgrUePrdDlCqiCfg *cqiCfg, Bool hdFdd,
218 RgrUeTxModeCfg txMode, RgSchErrInfo *errInfo));
220 PUBLIC S16 rgSCHCfgVldtRgrUePCqiCfg ARGS(( RgSchCellCb *cellCb,
221 CmLteRnti crnti, RgrUePrdDlCqiCfg *cqiCfg, RgrUeTxModeCfg txMode,
222 RgSchErrInfo *errInfo));
225 PUBLIC S16 rgSCHCfgVldtRgrUeUlSrsCfg ARGS ((RgSchCellCb *cellCb,
226 CmLteRnti crnti, RgrUeUlSrsCfg *srsCfg, Bool hdFdd,
227 RgSchErrInfo *errInfo));
229 PUBLIC S16 rgSCHCfgVldtRgrUeUlSrsCfg ARGS ((RgSchCellCb *cellCb,
230 CmLteRnti crnti, RgrUeUlSrsCfg *srsCfg,
231 RgSchErrInfo *errInfo));
235 PUBLIC S16 rgSCHCfgVldtRgrUeSrCfg ARGS((RgSchCellCb *cellCb, CmLteRnti crnti,
236 RgrUeSrCfg *srCfg, Bool hdFdd, RgSchErrInfo *errInfo));
238 PUBLIC S16 rgSCHCfgVldtRgrUeSrCfg ARGS((RgSchCellCb *cellCb, CmLteRnti crnti,
239 RgrUeSrCfg *srCfg, RgSchErrInfo *errInfo));
241 PRIVATE S16 rgSCHCfgVldtCqiSrSrsUeCfg ARGS (( RgSchCellCb *cellCb,
243 RgSchErrInfo *errInfo));
245 PRIVATE S16 rgSCHCfgVldtCqiSrSrsUeReCfg ARGS (( RgSchCellCb *cellCb,
248 RgSchErrInfo *errInfo ));
250 PUBLIC S16 rgSCHCfgPCqiSrsSrUeDel ARGS ((RgSchCellCb *cellCb,
253 PRIVATE Void rgSCHCfgUtlFetchAcqiBitSz ARGS (( RgSchUeACqiCb *acqiCb,U8 numTxAnt,
254 U8* cqiPmiSzR1,U8* cqiPmiSzRn1 ));
256 /* Added the function to be used instead of the
257 * MACRO RG_SCH_GET_PERIODICITY_TBL */
258 PRIVATE CONSTANT RgSchUePCqiSrsSrCfgIdxTbl* rgSCHCfgUtlGetPcqiSrsSrRiTbl ARGS ((
263 #endif /* TFU_UPGRADE */
264 PRIVATE Void rgSCHCfgUeTaRecfg ARGS (( RgSchCellCb *cellCb,
267 RgSchErrInfo *errInfo ));
269 PUBLIC S16 rgSCHSCellCfgUeCfg ARGS((
276 PUBLIC S16 rgSCHSCellCfgUePucchReCfg ARGS((
282 PUBLIC S16 rgSCHCfgVldtRgrUeSCellRecfg ARGS((
286 RgSchErrInfo *errInfo
288 PRIVATE S16 rgSCHSCellCfgUeCfgRollBack ARGS((
295 /* ccpu00117452 - MOD - Changed macro name from
296 RGR_RRM_DLPWR_CNTRL to RGR_CQI_REPT */
297 #if ((defined (RGR_CQI_REPT)) && (defined (RGR_V2)))
298 PRIVATE S16 rgSCHCfgUeCqiReptReCfg ARGS ((
304 PRIVATE S16 rgSCHCfgVldtCqiReptReCfg ARGS ((
309 /*LTE_L2_MEAS_PHASE2*/
311 PRIVATE S16 rgSchAddToL2Meas ARGS ((RgSchCellCb *cellCb,RgSchDlLcCb *dlLc));
314 PUBLIC S16 rgSCHEmtcCfgVldtDrxOnDurCfg
318 PUBLIC Void rgSCHUtlUpdEmtcY
322 EXTERN Void rgSCHEmtcHqPAlloc
330 CONSTANT RgSchSrsTxOffst rgSrsTxOffstTbl[RGSCH_MAX_SRS_SFCFG_IDX+1]=
331 {{1,{0,0,0,0,0,0,0,0}},
332 {1,{0,0,0,0,0,0,0,0}},
333 {1,{1,0,0,0,0,0,0,0}},
334 {1,{0,0,0,0,0,0,0,0}},
335 {1,{1,0,0,0,0,0,0,0}},
336 {1,{2,0,0,0,0,0,0,0}},
337 {1,{3,0,0,0,0,0,0,0}},
338 {2,{0,1,0,0,0,0,0,0}},
339 {2,{2,3,0,0,0,0,0,0}},
340 {1,{0,0,0,0,0,0,0,0}},
341 {1,{1,0,0,0,0,0,0,0}},
342 {1,{2,0,0,0,0,0,0,0}},
343 {1,{3,0,0,0,0,0,0,0}},
344 {7,{0,1,2,3,4,6,8,0}},
345 {8,{0,1,2,3,4,5,6,8}},
346 {0,{0,0,0,0,0,0,0,0}}};
351 /* SRSCfg Table: Ref 36.213, Table: 8.2.1 */
352 CONSTANT RgSchUePCqiSrsSrCfgIdxTbl
353 rgSchUeSrsCfgIdxFddTbl[RG_SCH_SRS_ISRS_INDX_MAX_FDD]=
365 /* Reference : 36.213 Table 8.2-2 */
366 CONSTANT RgSchUePCqiSrsSrCfgIdxTbl
367 rgSchUeSrsCfgIdxTddTbl[RG_SCH_SRS_ISRS_INDX_MAX_TDD]=
374 { 165,324,160, 165 },
376 /* RESERVED: Configuration Module should not allow Res values */
379 /*Reference: 36.213 Table:7.2.2-1A */
380 CONSTANT RgSchUePCqiSrsSrCfgIdxTbl
381 rgSchUePCqiCfgIdxFddTbl[RG_SCH_CQIPMI_CFGIDX_MAX_FDD]=
393 /* RESERVED: Configuration should not allow Res values */
396 /* Reference: 36.213 Table:7.2.2-1C */
397 CONSTANT RgSchUePCqiSrsSrCfgIdxTbl
398 rgSchUeCqiPmiCfgIdxTddTbl[RG_SCH_CQIPMI_CFGIDX_MAX_TDD]=
407 /* RESERVED: Configuration should not allow Res values */
410 /* Note: RI table is same for FDD and TDD */
411 /*Reference: 36.213 Table:7.2.2-1B */
412 CONSTANT RgSchUePCqiSrsSrCfgIdxTbl
413 rgSchUeRiCfgIdxTbl[RG_SCH_RI_CFGIDX_MAX]=
421 /* RESERVED: Configuration should not allow Res values */
424 /*Reference: 36.213 Table:7.2.2-2 */
425 CONSTANT RgSchUeBwSubSzBwParts
426 rgSchUeBwSubSzBwPartsTbl[RG_SCH_BW_SUBSZ_BWPARTS_MAX]=
428 {6,7, 0, 0}, /*TODO: 6,7, NA, NA */
436 /* Reference : 36.213 Table 10.1-5 */
437 /* Note: SR is same table for TDD and FDD */
438 CONSTANT RgSchUePCqiSrsSrCfgIdxTbl rgSchUeSrCfgIdxTbl[RG_SCH_ISR_INDX_MAX]=
445 /* RESERVED: Configuration should not allow Res values */
448 /*Reference:36.213: Derived from Table: 7.2.1-5 for Label L.
449 The Label L is CEIL(log2(BinCoe(N and M)))*/
450 CONSTANT U8 RgSCHUeAcqi2022LBitWidth[6][28] ={
451 {0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5},
452 {0,0,2,3,4,4,5,5,6,6,6,7,7,7,7,7,8,8,8,8,8,8,8,9,9,9,9,9},
453 {0,0,0,2,4,5,6,6,7,7,8,8,9,9,9,10,10,10,10,11,11,11,11,11,12,12,12,12},
454 {0,0,0,0,3,4,6,7,7,8,9,9,10,10,11,11,12,12,12,13,13,13,14,14,14,14,15,15},
455 {0,0,0,0,0,3,5,6,7,8,9,10,11,11,12,13,13,14,14,14,15,15,16,16,16,17,17,17},
456 {0,0,0,0,0,0,3,5,7,8,9,10,11,12,13,13,14,15,15,16,16,17,17,18,18,18,19,19}
461 EXTERN U8 rgSchCmnHarqRtt[];
463 EXTERN S16 rgSCHEmtcCellAlloc ARGS((RgSchCellCb *cel));
464 EXTERN Void rgSCHEmtcCellFree ARGS((RgSchCellCb *cel));
465 EXTERN Void rgSCHEmtcUeInfoFree ARGS((RgSchCellCb *cell, RgSchUeCb *ue));
466 EXTERN U8 rgSchfillPucchSrRepNumCountemtc ARGS((RgSchUeCb *ueCb));
467 EXTERN U8 rgSchfillPucchCqiRepNumCountemtc ARGS((RgSchUePCqiCb *cqiCb, RgSchUeCb *ueCb));
468 EXTERN S16 rgEmtcvalidateSiCfg ARGS((RgrSiCfgReqInfo *siCfg,RgSchCellCb *cell));
470 /* forward references */
474 * @brief Validates the SCH EndoeB configuration request from RRM to SCH.
478 * Function : rgSCHCfgVldtRgrSchedEnbCfg
481 * - Retrieve the cell control block.
483 * - Validate the range of configured values recieved in
484 * configuration request.
485 * - If validated successfully,
486 * - Return ROK and pointer to the cell.
489 * - Else return RFAILED.
490 * @param[in] Inst inst
491 * @param[in] RgrSchedEnbCfg *schedEnbCfg
492 * @param[out] RgSchCellCb **cell
493 * @param[out] RgSchErrInfo *errInfo
499 PUBLIC S16 rgSCHCfgVldtRgrSchedEnbCfg
502 RgrSchedEnbCfg *schedEnbCfg,
503 RgSchErrInfo *errInfo
506 PUBLIC S16 rgSCHCfgVldtRgrSchedEnbCfg(inst, schedEnbCfg, errInfo)
508 RgrSchedEnbCfg *schedEnbCfg;
509 RgSchErrInfo *errInfo;
512 TRC2(rgSCHCfgVldtRgrSchedEnbCfg);
513 RGSCHDBGPRM(inst, (rgSchPBuf(inst), "VALIDATE RGR SCH ENB CONFIG: \n"));
515 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_ENB_CFG;
518 if ((rgSCHCfgVldtRgrSchCfg(inst, schedEnbCfg)) != ROK)
520 RGSCHDBGERR(inst, (rgSchPBuf(inst), "Validation for scheduler related "
525 RLOG1(L_INFO, "MIMO_DBG:: SCH:: numAntPorts=%d\n",schedEnbCfg->numTxAntPorts);
527 /* Validation for the ENB parameters */
528 if ((schedEnbCfg->numTxAntPorts == 0) || (schedEnbCfg->numTxAntPorts > 4))
530 RGSCHDBGERR(inst, (rgSchPBuf(inst),"Invalid number of transmit antenna"
531 " ports %d\n", schedEnbCfg->numTxAntPorts));
535 /* Validate csg access mode */
536 if((schedEnbCfg->accsMode < RGR_CELL_ACCS_OPEN) ||
537 (schedEnbCfg->accsMode > RGR_CELL_ACCS_HYBRID))
539 RGSCHDBGERR(inst, (rgSchPBuf(inst), "Invalid CSG Access mode\n"));
543 errInfo->errCause = RGSCHERR_NONE;
544 RGSCHDBGINFO(inst, (rgSchPBuf(inst), "RGR SCHED ENB config validation done:"\n));
547 } /* rgSCHCfgVldtRgrSchedEnbCfg */
550 * @brief Validates the cell configuration request from RRM to MAC.
554 * Function : rgSCHCfgVldtRgrCellCfg
557 * - Retrieve the cell control block.
559 * - Validate the range of configured values recieved in
560 * configuration request.
561 * - If validated successfully,
562 * - Return ROK and pointer to the cell.
565 * - Else return RFAILED.
566 * @param[in] Inst inst
567 * @param[in] RgrCellCfg *cellCfg
568 * @param[out] RgSchCellCb **cell
569 * @param[out] RgSchErrInfo *errInfo
575 PUBLIC S16 rgSCHCfgVldtRgrCellCfg
580 RgSchErrInfo *errInfo
583 PUBLIC S16 rgSCHCfgVldtRgrCellCfg(inst, cellCfg, cell, errInfo)
587 RgSchErrInfo *errInfo;
590 TRC2(rgSCHCfgVldtRgrCellCfg);
592 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_CELL_CFG;
594 /* check if cell exists already */
595 if ((U8 *)cell != NULLP)
597 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Cell Id already exists");
601 if(cellCfg->macInst >= SCH_INST_START)
603 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCfg->cellId, "Invalid MAC Instance %d ",
608 if (cellCfg->macRnti.startRnti < RGSCH_MIN_MAC_RNTI )
610 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCfg->cellId, "Invalid start RNTI %d for cell ",
611 cellCfg->macRnti.startRnti);
615 if ((rgSCHCfgVldtRgrCellSchCfg(inst, cellCfg)) != ROK)
617 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId, "Validation for scheduler related "
622 if ((cellCfg->dlHqCfg.maxDlHqTx < RGSCH_MIN_HQ_TX) ||
623 (cellCfg->dlHqCfg.maxMsg4HqTx < RGSCH_MIN_HQ_TX))
625 RLOG_ARG2(L_ERROR,DBG_CELLID,cellCfg->cellId, "Invalid Downlink HARQ configuration:"
626 " maxDlHqTx %d maxMsg4HqTx %d", cellCfg->dlHqCfg.maxDlHqTx,
627 cellCfg->dlHqCfg.maxMsg4HqTx);
630 if ((cellCfg->cfiCfg.cfi < RGSCH_MIN_CFI_VAL) ||
631 (cellCfg->cfiCfg.cfi > RGSCH_MAX_CFI_VAL))
633 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCfg->cellId, "Invalid CFI configuration %d",
634 cellCfg->cfiCfg.cfi);
637 if (((cellCfg->puschSubBand.subbandStart) +
638 ((cellCfg->puschSubBand.numSubbands -1) * cellCfg->puschSubBand.size))
639 > (cellCfg->bwCfg.ulTotalBw - 1))
641 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCfg->cellId, "Invalid PUSCH subband configuration:"
642 " subBandStart %d numSubBands %d subBandSize %d ulTotBw %d",
643 cellCfg->puschSubBand.subbandStart,
644 cellCfg->puschSubBand.numSubbands, cellCfg->puschSubBand.size,
645 cellCfg->bwCfg.ulTotalBw);
649 if (((cellCfg->bwCfg.dlTotalBw < RGSCH_MIN_DL_BW) ||
650 (cellCfg->bwCfg.dlTotalBw > RGSCH_MAX_DL_BW)) ||
651 ((cellCfg->bwCfg.ulTotalBw < RGSCH_MIN_UL_BW) ||
652 (cellCfg->bwCfg.ulTotalBw > RGSCH_MAX_UL_BW)))
654 RLOG_ARG2(L_ERROR,DBG_CELLID,cellCfg->cellId, "Invalid Bandwidth configuration:"
655 " ul %d dl %d",cellCfg->bwCfg.ulTotalBw,
656 cellCfg->bwCfg.dlTotalBw);
659 if (cellCfg->phichCfg.ngEnum > RGR_NG_TWO)
661 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCfg->cellId, "Invalid PHICH Ng configuration %d",
662 (U8)cellCfg->phichCfg.ngEnum);
665 /* Validation for extended PHICH Duration */
666 if ((cellCfg->phichCfg.isDurExtend == TRUE) &&
667 (cellCfg->bwCfg.dlTotalBw <= 10) && (cellCfg->cfiCfg.cfi < 2))
669 RLOG_ARG2(L_ERROR,DBG_CELLID,cellCfg->cellId, "Invalid cfi value for"
670 "Extended PHICH duration cfi:%d dlBw:%d",
671 (U8)cellCfg->cfiCfg.cfi, cellCfg->bwCfg.dlTotalBw);
674 if ((cellCfg->phichCfg.isDurExtend == TRUE) &&
675 (cellCfg->bwCfg.dlTotalBw > 10) && (cellCfg->cfiCfg.cfi < 3))
677 RLOG_ARG2(L_ERROR,DBG_CELLID,cellCfg->cellId, "Invalid cfi value for"
678 "Extended PHICH duration cfi:%d dlBw:%d",
679 (U8)cellCfg->cfiCfg.cfi, cellCfg->bwCfg.dlTotalBw);
682 RLOG4(L_INFO,"CA_DBG:: PUCCH configuration:"
683 " N2_RB %d N1_PUCCH %d deltaShift %d cyclicShift %d",
684 cellCfg->pucchCfg.resourceSize,
685 cellCfg->pucchCfg.n1PucchAn,
686 cellCfg->pucchCfg.deltaShift,
687 cellCfg->pucchCfg.cyclicShift);
689 /* ccpu00138567- Removing validation check for resourceSize as 0.
690 * From the spec, n2RB value 0 is a valid config. */
691 if ((cellCfg->pucchCfg.resourceSize >= cellCfg->bwCfg.ulTotalBw/2) ||
692 (cellCfg->pucchCfg.n1PucchAn == 0) ||
693 (cellCfg->pucchCfg.deltaShift < RGSCH_PUCCH_MINVAL_DS) ||
694 (cellCfg->pucchCfg.deltaShift > RGSCH_PUCCH_MAXVAL_DS) ||
695 (cellCfg->pucchCfg.cyclicShift > RGSCH_PUCCH_MAXVAL_CS))
697 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCfg->cellId, "Invalid PUCCH configuration:"
698 " N2_RB %d N1_PUCCH %d deltaShift %d cyclicShift %d",
699 cellCfg->pucchCfg.resourceSize,
700 cellCfg->pucchCfg.n1PucchAn,
701 cellCfg->pucchCfg.deltaShift,
702 cellCfg->pucchCfg.cyclicShift);
705 if (cellCfg->srsCfg.isSrsCfgSetup && cellCfg->srsCfg.srsBwEnum > RGR_SRS_BWCFG_7)
707 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCfg->cellId, "Invalid SRS configuration: "
708 " srsBw %d", (U8)cellCfg->srsCfg.srsBwEnum);
712 if ((rgSCHCfgVldtRgrCellRACfg(inst, cellCfg)) != ROK)
714 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId, "Validation for Random access related"
719 if ((rgSCHCfgVldtRgrCellPwrCfg(inst, cellCfg, errInfo)) != ROK)
721 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId, "Validation for cell power "
726 /* Validate the common logical channel configuration */
727 if( (cellCfg->numCmnLcs < RGR_MIN_CMN_LC_PER_CELL)||
728 (cellCfg->numCmnLcs > RGR_MAX_CMN_LC_PER_CELL))
730 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCfg->cellId, "Invalid number(%d) of common logical"
731 "channels in cell config", cellCfg->numCmnLcs);
734 if ((rgSCHCfgVldtRgrCmnLcCfg(inst, cellCfg, errInfo)) != ROK)
736 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId, "Validation for common logical"
741 /* Added 0 as a valid value for number of TICKs RRM
742 * 0 implies no ticks i.e. shutting off the feature.*/
745 if ((rgSCHCfgVldtRgrCellSiCfg(inst, &(cellCfg->siCfg))) != ROK)
747 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId, "Validation for SI"
748 "configuration failed");
751 #endif /*RGR_SI_SCH */
753 /*ccpu00116923 - ADD - Srs Present support - Start*/
756 if(cellCfg->srsCfg.isSrsCfgSetup && cellCfg->srsCfg.srsSubFrameCfg > 13)
758 if(cellCfg->srsCfg.isSrsCfgSetup && cellCfg->srsCfg.srsSubFrameCfg > 14)
761 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId, "Invalid"
762 "Subframe configuration");
766 /*ccpu00116923 - ADD - Srs Present support - End*/
768 if ((cellCfg->bcchTxPwrOffset > 10000) ||
769 (cellCfg->pcchTxPwrOffset > 10000) ||
770 (cellCfg->rarTxPwrOffset > 10000) ||
771 (cellCfg->phichTxPwrOffset > 10000)
774 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,
775 "Invalid txPower offset ");
779 /* LTE_ADV_FLAG_REMOVED_START */
780 /* Checking Whether DSFR is enabled without enabling SFR */
781 if(((cellCfg->rgrLteAdvCfg.pres & RGR_DSFR) &&
782 (RGR_ENABLE == cellCfg->rgrLteAdvCfg.dsfrCfg.status)) &&
783 (!((cellCfg->rgrLteAdvCfg.pres & RGR_SFR) &&
784 (RGR_ENABLE == cellCfg->rgrLteAdvCfg.sfrCfg.status))))
786 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId, "DSFR is enbaled"
787 "Without enabling SFR");
791 if ((rgSCHCfgVldtRgrCellLteAdvCfg(inst, &(cellCfg->rgrLteAdvCfg),
792 cellCfg->bwCfg.dlTotalBw)) != ROK)
794 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId, "Validation for LTE Adv"
795 "configuration failed");
799 if ((rgSCHCfgVldtRgrCellLteLAACfg(inst, cellCfg)) != ROK)
801 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId, "Validation for LTE LAA"
802 "configuration failed");
806 /* LTE_ADV_FLAG_REMOVED_END */
807 if (cellCfg->msg4pAVal > RGRUE_DLPWRCNTRL_PA_DB3)
809 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCfg->cellId, "Invalid"
810 "msg4pAVal %u", cellCfg->msg4pAVal);
814 /* Validate RgrCellCsgParamCfg */
815 if(rgSchCb[inst].rgrSchedEnbCfg.accsMode == RGR_CELL_ACCS_HYBRID)
817 if((rgSCHCfgVldtRgrCellCsgParamCfg(inst,
818 &(cellCfg->csgParamCfg)) != ROK))
820 RGSCHDBGERR(inst, (rgSchPBuf(inst), "Validation failed for \n"
821 "Access CSG parameter failed\n"));
826 if (cellCfg->emtcEnable)
828 if(ROK != rgSCHCfgVldtRgrEmtcCellCfg(cellCfg))
830 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCfg->cellId,"Invalid EMTC cell Configuration %d for cell" ,cellCfg->cellId);
835 errInfo->errCause = RGSCHERR_NONE;
837 } /* rgSCHCfgVldtRgrCellCfg */
840 * @brief Validates the scheduler related configuration request from RRM to MAC.
844 * Function : rgSCHCfgVldtRgrSchCfg
847 * - Validate the scheduler related configuration request from RRC to MAC at CFG:
848 * validate the value range for the configured values.
849 * - If validated successfully,
854 * @param[in] Inst inst
855 * @param[out] RgSchedCfg *rgSchedCfg
861 PUBLIC S16 rgSCHCfgVldtRgrSchCfg
864 RgrSchedEnbCfg *rgSchedCfg
867 PUBLIC S16 rgSCHCfgVldtRgrSchCfg(inst, rgSchedCfg)
869 RgrSchedCfg *rgSchedCfg;
872 TRC2(rgSCHCfgVldtRgrSchCfg);
874 RGSCHDBGPRM(inst, (rgSchPBuf(inst), "rgSCHCfgVldtRgrSchCfg:Validating \
875 scheduler related Configuration"));
876 if (rgSchedCfg->ulSchdType > (RGSCH_NUM_SCHEDULERS - 1))
878 RGSCHDBGERR(inst, (rgSchPBuf(inst), "rgSCHCfgVldtRgrSchCfg:Invalid \
879 UL scheduler type %d \n", rgSchedCfg->ulSchdType));
882 if (rgSchedCfg->dlSchdType > (RGSCH_NUM_SCHEDULERS - 1))
884 RGSCHDBGERR(inst, (rgSchPBuf(inst), "rgSCHCfgVldtRgrSchCfg:Invalid \
885 DL scheduler type %d \n", rgSchedCfg->dlSchdType));
891 * @brief Validates the scheduler related configuration request from RRM to MAC.
895 * Function : rgSCHCfgVldtRgrCellSchCfg
898 * - Validate the scheduler related configuration request from RRC to MAC at CFG:
899 * validate the value range for the configured values.
900 * - If validated successfully,
901 * - Return ROK and pointer to the cell of UE.
905 * @param[in] Inst inst
906 * @param[out] RgSchCellCfg *cellCfg
912 PUBLIC S16 rgSCHCfgVldtRgrCellSchCfg
918 PUBLIC S16 rgSCHCfgVldtRgrCellSchCfg(inst, cellCfg)
923 TRC2(rgSCHCfgVldtRgrCellSchCfg);
925 #if RGSCH_NUM_DLFS_SCHEDULERS
926 if (cellCfg->dlfsSchdType > RGSCH_NUM_DLFS_SCHEDULERS - 1)
928 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCfg->cellId,"Invalid dlfs scheduler type %d for cell",
929 cellCfg->dlfsSchdType);
936 * @brief Validates the RACH related configuration request from RRM to MAC.
940 * Function : rgSCHCfgVldtRgrCellRACfg
943 * - Validate the RA configuration request from RRC to MAC at CFG:
944 * validate the value range for the configured values.
945 * - If validated successfully,
946 * - Return ROK and pointer to the cell of UE.
950 * @param[in] Inst inst
951 * @param[out] RgSchCellCfg *cellCfg
957 PUBLIC S16 rgSCHCfgVldtRgrCellRACfg
963 PUBLIC S16 rgSCHCfgVldtRgrCellRACfg(inst, cellCfg)
968 TRC2(rgSCHCfgVldtRgrCellRACfg);
972 if ((cellCfg->rachCfg.preambleFormat > RGSCH_MAX_TDD_RA_PREAMBLE_FMT) ||
974 if ((cellCfg->rachCfg.preambleFormat > RGSCH_MAX_RA_PREAMBLE_FMT) ||
976 (cellCfg->rachCfg.raWinSize < RGSCH_MIN_RA_WINSIZE) ||
977 (cellCfg->rachCfg.raWinSize > RGSCH_MAX_RA_WINSIZE) ||
978 (cellCfg->rachCfg.maxMsg3Tx < RGSCH_MIN_HQ_TX) ||
979 (cellCfg->rachCfg.numRaPreamble < RGSCH_MIN_NUM_RA_PREAMBLE) ||
980 (cellCfg->rachCfg.numRaPreamble > RGSCH_MAX_NUM_RA_PREAMBLE) ||
981 (cellCfg->rachCfg.sizeRaPreambleGrpA >
982 cellCfg->rachCfg.numRaPreamble) ||
983 (cellCfg->rachCfg.prachResource >
984 (cellCfg->bwCfg.ulTotalBw - RGSCH_NUM_RA_RB)))
986 RLOG_ARG3(L_ERROR,DBG_CELLID,cellCfg->cellId,"Invalid RACH configuration:"
987 "preamble Fmt %d raWinSize %d maxMsg3Tx %d",
988 cellCfg->rachCfg.preambleFormat, cellCfg->rachCfg.raWinSize,
989 cellCfg->rachCfg.maxMsg3Tx);
990 RLOG_ARG2(L_ERROR,DBG_CELLID,cellCfg->cellId,"Invalid numRaPreamble %d sizeRaPreambleGrpA %d",
991 cellCfg->rachCfg.numRaPreamble,
992 cellCfg->rachCfg.sizeRaPreambleGrpA);
996 /* verify that the ded Preambles cfgd for Pdcch Order
997 * do not collide with that of non-dedicated and validates against
998 * the configuration index and number of RACH
999 * ded-preambles. For non-zero ded preamble cfg,
1000 * the config index is expected to be != NA.*/
1001 if ((cellCfg->macPreambleSet.pres) &&
1002 ((cellCfg->macPreambleSet.start < cellCfg->rachCfg.numRaPreamble) ||
1003 (cellCfg->macPreambleSet.start >= RGSCH_MAX_NUM_RA_PREAMBLE) ||
1004 (cellCfg->macPreambleSet.size < 1) ||
1005 (cellCfg->macPreambleSet.size > RGSCH_MAX_NUM_RA_PREAMBLE-
1006 cellCfg->rachCfg.numRaPreamble) ||
1007 (cellCfg->rachCfg.raOccasion.sfnEnum == RGR_SFN_NA)))
1009 RLOG_ARG2(L_ERROR,DBG_CELLID,cellCfg->cellId,"Invalid RACH Preambleset conf:"
1010 "preambleSet Start %d preambleSet Size %d",
1011 cellCfg->macPreambleSet.start, cellCfg->macPreambleSet.size);
1015 if(cellCfg->rachCfg.contResTmr)
1019 idx = cellCfg->ulDlCfgIdx;
1023 /* maxMsg4TxDelay = (HARQ_RTT * MAX_MSG4_HARQ_RETX) +
1024 3 TTI (MAX L1+L2 processing delay at the UE) */
1025 U8 maxMsg4TxDelay = (cellCfg->dlHqCfg.maxMsg4HqTx-1) *
1026 rgSchCmnHarqRtt[idx] + 3;
1029 if(maxMsg4TxDelay >= cellCfg->rachCfg.contResTmr)
1031 RLOG_ARG2(L_WARNING,DBG_CELLID,cellCfg->cellId ,
1032 "Warining !: Contention Resolution timer not greater than the "
1033 "guard timer. Conte Res timer %d Guard timer %d",
1034 cellCfg->rachCfg.contResTmr,
1036 /* [ccpu00138532]-DEL- removed return fail here as it is ok if the
1037 max Msg4 Tx delay is more than the contension Resolution timer.
1038 In such case, the CRI CE will be scheduled immediately once
1044 /* ccpu00128575 ADD - If contention resolution timer is configured as 0,
1046 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,
1047 "Contention Resolution timer is configured as '0'");
1056 * @brief Validates the UE configuration request from RRM to MAC.
1060 * Function : rgSCHCfgVldtRgrUeCfg
1063 * - Validate the UE configuration request from RRC to MAC at CFG:
1064 * validate the value range for the configured values.
1065 * - If validated successfully,
1066 * - Return ROK and pointer to the cell of UE.
1070 * @param[in] Inst inst
1071 * @param[in] RgrUeCfg *ueCfg
1072 * @param[out] RgSchCellCb **cell
1073 * @param[out] RgSchErrInfo *errInfo
1079 PUBLIC S16 rgSCHCfgVldtRgrUeCfg
1084 RgSchErrInfo *errInfo
1087 PUBLIC S16 rgSCHCfgVldtRgrUeCfg(inst, ueCfg, cell, errInfo)
1091 RgSchErrInfo *errInfo;
1094 TRC2(rgSCHCfgVldtRgrUeCfg);
1096 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_UE_CFG;
1098 if (((*cell) == NULLP) ||
1099 ((*cell)->cellId != ueCfg->cellId))
1101 RLOG_ARG1(L_ERROR,DBG_CRNTI,ueCfg->crnti,"Cell does not exist %d",
1106 * Check configured preamble id not colliding with non dedicated or PDCCH
1107 * order preamble sets. When valid preamble id given check that C-RNTI given
1108 * in configuration is not amongst the C-RNTI'smanaged by scheduler */
1109 if ((rgSCHRamVldtUeCfg(*cell, ueCfg)) != ROK)
1111 RLOG_ARG1(L_ERROR,DBG_CRNTI,ueCfg->crnti,"CELLID:%d Preamble Id configuration"
1112 "failed ",ueCfg->cellId);
1115 /* Check if Ue already configured */
1116 if (rgSCHDbmGetUeCb(*cell, ueCfg->crnti) != NULLP)
1118 RLOG_ARG1(L_ERROR,DBG_CRNTI,ueCfg->crnti,"CELLID:%d UEID already exists",
1122 /* Validate Transmission UE modes */
1123 if ((ueCfg->txMode.pres == TRUE) && ((ueCfg->txMode.txModeEnum < RGR_UE_TM_1)
1124 || (ueCfg->txMode.txModeEnum > RGR_UE_TM_7)))
1126 RLOG_ARG2(L_ERROR,DBG_CRNTI,ueCfg->crnti,"CELLID:%d Invalid transmission mode for"
1127 " UE is %d", ueCfg->cellId,(U8)ueCfg->txMode.txModeEnum);
1131 /* Validate UE Category */
1132 if (ueCfg->ueCatEnum > CM_LTE_UE_CAT_8)
1134 RLOG_ARG2(L_ERROR,DBG_CRNTI,ueCfg->crnti,"CELLID:%d Invalid category for UE %d",
1135 ueCfg->cellId,(U8)ueCfg->ueCatEnum);
1139 /* Validate UE Access Stratum Release */
1140 if (ueCfg->accessStratumRls > RGR_REL_10)
1142 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst), "Invalid Access Stratum Release %u for UE\n",
1143 ueCfg->accessStratumRls));
1146 RGSCHDBGINFONEW(inst, (rgSchPBuf(inst), "Configured Access Stratum Release %u\n", \
1147 ueCfg->accessStratumRls));
1149 if ((*cell)->numTxAntPorts == 1)
1151 if ((ueCfg->txMode.pres == TRUE) &&
1152 (ueCfg->txMode.txModeEnum > RGR_UE_TM_1))
1154 RLOG_ARG2(L_ERROR,DBG_CRNTI,ueCfg->crnti,"CELLID:%d Invalid transmission mode for"
1155 " UE (%d) for the configured Cell Antenna Ports",ueCfg->cellId,
1156 (U8)ueCfg->txMode.txModeEnum);
1161 if ((rgSCHCfgVldtUeCqiModeCfg(*cell, &ueCfg->ueDlCqiCfg)) != ROK)
1163 RLOG_ARG1(L_ERROR,DBG_CRNTI,ueCfg->crnti, "CELLID:%d Invalid CQI Mode configuration",
1168 /* Validate Max Uplink HARQ transmission value */
1169 if (ueCfg->ueUlHqCfg.maxUlHqTx < RGSCH_MIN_HQ_TX)
1171 RLOG_ARG2(L_ERROR,DBG_CRNTI,ueCfg->crnti,"CELLID:%d Invalid Uplink HARQ config for "
1172 "UE %d",ueCfg->cellId,ueCfg->ueUlHqCfg.maxUlHqTx);
1176 if (rgSCHCfgVldtUePwrCfg(*cell, &ueCfg->ueUlPwrCfg) != ROK)
1178 RLOG_ARG1(L_ERROR,DBG_CRNTI,ueCfg->crnti,"CELLID:%d Invalid PUSCH Group power"
1179 " configuration",ueCfg->cellId);
1183 if (rgSCHCfgVldtUeMeasGapAckNakRepCfg(*cell, ueCfg) != ROK)
1185 RLOG_ARG1(L_ERROR,DBG_CRNTI,ueCfg->crnti,"CELLID:%d Invalid MeasGap/AckNackRep"
1186 " configuration",ueCfg->cellId);
1191 /* Validating SPS RNTI */
1192 if (((ueCfg->ueSpsCfg.spsRnti >= (*cell)->rntiDb.rntiStart) &&
1193 (ueCfg->ueSpsCfg.spsRnti<=((*cell)->rntiDb.rntiStart+(*cell)->rntiDb.maxRntis)))
1194 ||(ueCfg->ueSpsCfg.spsRnti == RGSCH_SI_RNTI)
1195 ||(ueCfg->ueSpsCfg.spsRnti == RGSCH_P_RNTI))
1197 RLOG_ARG1(L_ERROR,DBG_CRNTI,ueCfg->crnti,"CELLID:%d Invalid SPS RNTI "
1198 " in DL SPS Config",ueCfg->cellId);
1202 if (ueCfg->ueSpsCfg.dlSpsCfg.isDlSpsEnabled)
1204 if (rgSCHCfgVldtUeDlSpsCfg(*cell, &ueCfg->ueSpsCfg.dlSpsCfg) != ROK)
1206 RLOG_ARG1(L_ERROR,DBG_CRNTI,ueCfg->crnti,"CELLID:%d Invalid DL SPS configuration"
1207 " for the UE",ueCfg->cellId);
1213 /* Validated Periodic CQI/PMI, RI , SRS and SR related UeCfg */
1214 if ( ROK != rgSCHCfgVldtCqiSrSrsUeCfg(*cell, ueCfg, errInfo))
1216 RLOG_ARG1(L_ERROR,DBG_CRNTI,ueCfg->crnti,"CELLID:%d Invalid Periodic CQI/SR/SRS"
1217 "configuration",ueCfg->cellId);
1222 /* Validate DRX specific parameters */
1223 if ( ROK != rgSCHCfgVldtDrxUeCfg(*cell, &(ueCfg->ueDrxCfg)))
1225 RLOG_ARG1(L_ERROR,DBG_CRNTI,ueCfg->crnti,"CELLID:%d Invalid DRX configuration",
1230 /* ccpu00117452 - MOD - Changed macro name from
1231 RGR_RRM_DLPWR_CNTRL to RGR_CQI_REPT */
1233 if (ueCfg->ueCqiReptCfg.numColltdCqiRept > RGR_CQIRPTS_MAXN)
1235 RLOG_ARG2(L_ERROR,DBG_CRNTI,ueCfg->crnti,"CELLID:%d Invalid numColltdCqiRept,"
1236 "MAX supported %d",RGR_CQIRPTS_MAXN,ueCfg->cellId);
1239 #endif /* End of RGR_CQI_REPT */
1242 /*This is to validate the EMTC related configuration if a UE is an EMTC UE*/
1243 if(TRUE == ueCfg->emtcUeCfg.pres)
1245 if ( ROK != rgSCHCfgVldtEmtcUeCfg(*cell, &(ueCfg->emtcUeCfg)))
1247 RLOG_ARG2(L_ERROR,DBG_CRNTI,ueCfg->crnti,"CELLID:%d Invalid EMTC UE configurationfor crnti:%d",
1248 ueCfg->cellId, ueCfg->crnti);
1253 errInfo->errCause = RGSCHERR_NONE;
1255 } /* rgSCHCfgVldtRgrUeCfg */
1259 * @brief Validates the cell reconfiguration request from RRM to MAC.
1263 * Function : rgSCHCfgVldtRgrCellRecfg
1266 * - Retrieve the cell control block.
1268 * - Validate the range of reconfigured values recieved in
1269 * re-configuration request.
1270 * - If validated successfully,
1271 * - Return ROK and pointer to the cell.
1274 * - Else return RFAILED.
1276 * @param[in] Inst inst
1277 * @param[in] RgrCellRecfg *cellRecfg
1278 * @param[out] RgSchCellCb **cell
1279 * @param[out] RgSchErrInfo *errInfo
1285 PUBLIC S16 rgSCHCfgVldtRgrCellRecfg
1288 RgrCellRecfg *cellRecfg,
1290 RgSchErrInfo *errInfo
1293 PUBLIC S16 rgSCHCfgVldtRgrCellRecfg(inst, cellRecfg, cell, errInfo)
1295 RgrCellRecfg *cellRecfg;
1297 RgSchErrInfo *errInfo;
1300 TRC2(rgSCHCfgVldtRgrCellRecfg);
1303 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_CELL_RECFG;
1305 /* Fetch cell and validate cell Id with the cell control block*/
1306 if (((*cell) == NULLP) ||
1307 ((*cell)->cellId != cellRecfg->cellId))
1309 RLOG_ARG0(L_ERROR,DBG_CELLID,cellRecfg->cellId,"Cell control block does not exist");
1313 /* Validate recieved values */
1314 if ((cellRecfg->recfgTypes & RGR_CELL_DL_HARQ_RECFG) &&
1315 ((cellRecfg->dlHqRecfg.maxDlHqTx < RGSCH_MIN_HQ_TX) ||
1316 (cellRecfg->dlHqRecfg.maxMsg4HqTx < RGSCH_MIN_HQ_TX)))
1318 RLOG_ARG2(L_ERROR,DBG_CELLID,cellRecfg->cellId,"Invalid Downlink HARQ configuration:"
1319 " maxDlHqTx %d maxMsg4HqTx %d", cellRecfg->dlHqRecfg.maxDlHqTx,
1320 cellRecfg->dlHqRecfg.maxMsg4HqTx);
1323 if ((cellRecfg->recfgTypes & RGR_CELL_CFI_RECFG) &&
1324 ((cellRecfg->cfiRecfg.cfi < RGSCH_MIN_CFI_VAL) ||
1325 (cellRecfg->cfiRecfg.cfi > RGSCH_MAX_CFI_VAL)))
1327 RLOG_ARG1(L_ERROR,DBG_CELLID,cellRecfg->cellId,"Invalid CFI configuration %d",
1328 cellRecfg->cfiRecfg.cfi);
1331 if (cellRecfg->recfgTypes & RGR_CELL_PUCCH_RECFG)
1333 /* ccpu00138567- Removing validation check for resourceSize as 0.
1334 * From the spec, n2RB value 0 is a valid config. */
1335 if ((cellRecfg->pucchRecfg.n1PucchAn == 0) ||
1336 (cellRecfg->pucchRecfg.resourceSize >= (*cell)->bwCfg.ulTotalBw/2)||
1337 ((cellRecfg->pucchRecfg.deltaShift < RGSCH_PUCCH_MINVAL_DS) ||
1338 (cellRecfg->pucchRecfg.deltaShift > RGSCH_PUCCH_MAXVAL_DS)) ||
1339 (cellRecfg->pucchRecfg.cyclicShift > RGSCH_PUCCH_MAXVAL_CS))
1341 RLOG_ARG4(L_ERROR,DBG_CELLID,cellRecfg->cellId,"Invalid PUCCH configuration: "
1342 "N2_RB %d N1_PUCCH %d deltaShift %d cyclicShift %d",
1343 cellRecfg->pucchRecfg.resourceSize,
1344 cellRecfg->pucchRecfg.n1PucchAn,
1345 cellRecfg->pucchRecfg.deltaShift,
1346 cellRecfg->pucchRecfg.cyclicShift);
1350 if (cellRecfg->recfgTypes & RGR_CELL_SRS_RECFG)
1352 if (cellRecfg->srsRecfg.isSrsCfgSetup && cellRecfg->srsRecfg.srsBwEnum > RGR_SRS_BWCFG_7)
1354 RLOG_ARG1(L_ERROR,DBG_CELLID,cellRecfg->cellId,"Invalid SRS configuration: "
1355 "srsBw %d", (U8)cellRecfg->srsRecfg.srsBwEnum);
1359 /*ccpu00116923 - ADD - Srs Present support - Start*/
1362 if(cellRecfg->srsRecfg.isSrsCfgSetup && cellRecfg->srsRecfg.srsSubFrameCfg > 13)
1364 if(cellRecfg->srsRecfg.isSrsCfgSetup && cellRecfg->srsRecfg.srsSubFrameCfg > 14)
1367 RLOG_ARG0(L_ERROR,DBG_CELLID,cellRecfg->cellId,"Invalid Subframe configuration ");
1371 /*ccpu00116923 - ADD - Srs Present support - End*/
1373 if (cellRecfg->recfgTypes & RGR_CELL_RACH_RECFG)
1375 if ((cellRecfg->rachRecfg.preambleFormat > RGSCH_MAX_RA_PREAMBLE_FMT) ||
1376 ((cellRecfg->rachRecfg.raWinSize < RGSCH_MIN_RA_WINSIZE) ||
1377 (cellRecfg->rachRecfg.raWinSize > RGSCH_MAX_RA_WINSIZE)) ||
1378 (cellRecfg->rachRecfg.maxMsg3Tx < RGSCH_MIN_HQ_TX) ||
1379 ((cellRecfg->rachRecfg.numRaPreamble < RGSCH_MIN_NUM_RA_PREAMBLE)
1380 || (cellRecfg->rachRecfg.numRaPreamble > RGSCH_MAX_NUM_RA_PREAMBLE))
1381 || (cellRecfg->rachRecfg.sizeRaPreambleGrpA >
1382 cellRecfg->rachRecfg.numRaPreamble) ||
1383 (cellRecfg->rachRecfg.prachResource >
1384 (*cell)->bwCfg.ulTotalBw - RGSCH_NUM_RA_RB))
1386 RLOG_ARG3(L_ERROR,DBG_CELLID,cellRecfg->cellId,"Invalid RACH configuration:"
1387 " preamble Fmt %d raWinSize %d maxMsg3Tx %d",
1388 cellRecfg->rachRecfg.preambleFormat,
1389 cellRecfg->rachRecfg.raWinSize,
1390 cellRecfg->rachRecfg.maxMsg3Tx);
1391 RLOG_ARG2(L_ERROR,DBG_CELLID,cellRecfg->cellId,"Invalid RACH configuration:"
1392 "numRaPreamble %d sizeRaPreambleGrpA %d",
1393 cellRecfg->rachRecfg.numRaPreamble,
1394 cellRecfg->rachRecfg.sizeRaPreambleGrpA);
1400 if (cellRecfg->recfgTypes & RGR_CELL_SI_RECFG)
1402 if ((rgSCHCfgVldtRgrCellSiCfg(inst, &(cellRecfg->siReCfg))) != ROK)
1404 RLOG_ARG0(L_ERROR,DBG_CELLID,cellRecfg->cellId,"Validation for SI"
1405 "Re-configuration failed");
1409 #endif /*RGR_SI_SCH */
1411 /* LTE_ADV_FLAG_REMOVED_START */
1412 if (cellRecfg->recfgTypes & RGR_CELL_LTEA_FEATURE_RECFG)
1414 /* Checkin whether DSFR is enbaled without enabling SFR.
1415 * So we need to check if SFR is enabled along with DSFR
1416 * in the same reconfiguration or it is already enabled earlier*/
1417 if((cellRecfg->rgrLteAdvCfg.pres & RGR_DSFR) &&
1418 (RGR_ENABLE == cellRecfg->rgrLteAdvCfg.dsfrCfg.status))
1420 if(!(((cellRecfg->rgrLteAdvCfg.pres & RGR_SFR) &&
1421 (RGR_ENABLE == cellRecfg->rgrLteAdvCfg.sfrCfg.status)) ||
1422 ((*cell)->lteAdvCb.sfrCfg.status == RGR_ENABLE)))
1424 RLOG_ARG0(L_ERROR,DBG_CELLID,cellRecfg->cellId,"DSFR is enbaled"
1425 "Without enabling SFR");
1429 if ((rgSCHCfgVldtRgrCellLteAdvCfg(inst, &(cellRecfg->rgrLteAdvCfg),
1430 (*cell)->bwCfg.dlTotalBw)) != ROK)
1432 RLOG_ARG0(L_ERROR,DBG_CELLID,cellRecfg->cellId,"Validation for Lte Adv"
1433 "Re-configuration failed");
1437 /* LTE_ADV_FLAG_REMOVED_END */
1439 /* Validating minimum resource for non-CSG users */
1440 if (cellRecfg->recfgTypes & RGR_CELL_CSG_PARAM_RECFG)
1442 if (cellRecfg->csgParamCfg.minDlResNonCsg > 100)
1444 RLOG_ARG0(L_ERROR,DBG_CELLID,cellRecfg->cellId,"Invalid Configuration "
1445 "of minimum DL resources for NON-CSG");
1448 if (cellRecfg->csgParamCfg.minUlResNonCsg > 100)
1450 RLOG_ARG0(L_ERROR,DBG_CELLID,cellRecfg->cellId,"Invalid Configuration "
1451 "of minimum UL resources for NON-CSG");
1455 errInfo->errCause = RGSCHERR_NONE;
1457 } /* rgSCHCfgVldtRgrCellRecfg */
1461 * @brief Ue SCell configuration for scheduler. It is invoked during first time
1462 * Scell configuration. It is not for reconfiguration
1466 * Function : rgSCHSCellCfgUeCfg
1468 * This functions updates UE specific scheduler
1469 * information upon UE SCell first time Scell configuration
1471 * @param[in] RgSchCellCb *cell
1472 * @param[in] RgSchUeCb *ue
1473 * @param[int] RgrUeRecfg *ueRecfg
1474 * @param[out] RgSchErrInfo *err
1480 PUBLIC S16 rgSCHSCellCfgUeCfg
1484 RgrUeRecfg *ueRecfg,
1488 PUBLIC S16 rgSCHSCellCfgUeCfg(cell, ue, ueRecfg, err)
1491 RgrUeRecfg *ueRecfg;
1496 Inst inst = cell->instIdx;
1497 RgSchCellCb *secCellCb = NULLP;
1499 RgSchUeCellInfo *sCellInfo = NULLP;
1500 RgrUeSecCellCfg *sCellInfoCfg = NULLP;
1502 RgrUeAprdDlCqiCfg *aCqiCfg;
1503 RgrUePrdDlCqiCfg *pCqiCfg;
1506 TRC2(rgSCHSCellCfgUeCfg);
1508 RLOG0(L_INFO, "SCELL recfg received from APP \n");
1510 RGSCHDBGINFONEW(inst, (rgSchPBuf(inst),
1511 "--------------------------------------------------------------------\n"
1512 "UE SCell ReConfiguration at SCH: rnti (%u) cell(%u)\n"
1513 "--------------------------------------------------------------------\n",
1514 ue->ueId, cell->cellId));
1517 for(idx = 0; idx < ueRecfg->ueSCellCfgInfo.numSCells; idx++)
1519 /* Allocate the Ue control block */
1520 if (((rgSCHUtlAllocSBuf(inst, (Data **)&sCellInfo,
1521 sizeof(RgSchUeCellInfo))) != ROK))
1523 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst), "[%d]SCellIdx :Memomy allocation "
1524 "Failed while Adding SCell Information\n", idx));
1529 sCellInfoCfg = &ueRecfg->ueSCellCfgInfo.ueSCellDedCfg[idx];
1532 sCellInfo->sCellIdx = sCellInfoCfg->sCellIdx;
1533 sCellInfo->sCellId = sCellInfoCfg->sCellId;
1535 if(PRSNT_NODEF == sCellInfoCfg->sCellDeActTmr.pres)
1537 /* Configure implicit release */
1538 ue->sCellDeactTmrVal.val = sCellInfoCfg->sCellDeActTmr.val;
1539 ue->isScellExplicitDeAct = FALSE;
1540 ue->sCellDeactTmrVal.pres = PRSNT_NODEF;
1542 else if (rgSchCb[cell->instIdx].genCfg.isSCellActDeactAlgoEnable == TRUE)
1544 /* Configure explicit release */
1545 ue->sCellDeactTmrVal.val = RGSCH_SCELL_DEACT_TMR_INFINITY_VAL;
1546 ue->isScellExplicitDeAct = TRUE;
1547 ue->sCellDeactTmrVal.pres = PRSNT_NODEF;
1551 ue->sCellDeactTmrVal.val = 0;
1552 ue->isScellExplicitDeAct = FALSE;
1553 ue->sCellDeactTmrVal.pres = NOTPRSNT;
1556 sCellInfo->sCellState = RG_SCH_SCELL_INACTIVE;
1559 ue->cellInfo[(sCellInfoCfg->sCellIdx)] = sCellInfo;
1560 sCellidx = ((sCellInfo->sCellId -
1561 rgSchCb[cell->instIdx].genCfg.startCellId)&(CM_LTE_MAX_CELLS-1));
1562 ue->cellIdToCellIdxMap[sCellidx] = sCellInfo->sCellIdx;
1564 /* For for time one Scell got added, setting allocCmnUlPdcch flag to TRUE, So that
1565 we will allocate PDCCH from common search space and the csiRequest field in DCI0 will
1566 be one bit (spec 36.213 sec 7.2.1)*/
1568 if ( ue->numSCells == 0)
1570 ue->allocCmnUlPdcch = TRUE;
1575 printf("\n SCell added for ue %d numScells %d\n",ue->ueId,ue->numSCells);
1577 /* retrieve teh sec cell Cb */
1578 if((secCellCb = (RgSchCellCb *)rgSchUtlGetCellCb(inst, sCellInfo->sCellId)) == NULLP)
1580 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst), "SCell doesnt exists"));
1581 rgSCHSCellFreeBuf (inst,ue,ueRecfg,idx);
1585 if(TRUE == sCellInfoCfg->txMode.pres)
1587 sCellInfo->txMode = sCellInfoCfg->txMode;
1591 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst), "[%d]SCellIdx Tx mode not present ",idx));
1592 sCellInfoCfg->txMode.pres = TRUE;
1593 sCellInfoCfg->txMode.txModeEnum = RGR_UE_TM_1;
1595 sCellInfo->txMode = sCellInfoCfg->txMode;
1597 cmInitTimers (&sCellInfo->actDelayTmr, 1);
1598 cmInitTimers (&sCellInfo->deactTmr, 1);
1600 ue->f1bCsAVal += rgSCHUtlGetMaxTbSupp(sCellInfo->txMode.txModeEnum);
1603 if(TRUE == sCellInfoCfg->ueSCellDlCqiCfg.aprdCqiCfg.pres)
1605 sCellInfo->acqiCb.aCqiCfg.aprdModeEnum =
1606 sCellInfoCfg->ueSCellDlCqiCfg.aprdCqiCfg.aprdModeEnum;
1609 if(TRUE == sCellInfoCfg->uePdschDedCfg.uepACfg.pAPrsnt)
1611 sCellInfo->pA.pres = TRUE;
1612 sCellInfo->pA.val = sCellInfoCfg->uePdschDedCfg.uepACfg.pA;
1616 sCellInfo->pA.pres = FALSE;
1619 aCqiCfg = &sCellInfoCfg->ueSCellDlCqiCfg.aprdCqiCfg;
1620 RGSCHDBGPRM(cell->instIdx, (rgSchPBuf(cell->instIdx),
1621 "rgSCHCfgACqiUeCfg cellId =%d,Config Presence =%d for \
1622 Sec Cell Id = %d\n",
1623 cellCb->cellId, aCqiCfg->pres,sCellInfo->sCellId));
1625 /* if aperiodic cqi is present then only call the below function as it is
1629 if( ROK != rgSCHCfgACqiUeCfg(secCellCb,ue, &sCellInfo->acqiCb,
1630 sCellInfo->txMode.txModeEnum, aCqiCfg, ue->ueCatEnum))
1632 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst), "[%d]SCellIdx ACQI Cfg"
1633 "failed..n\n", idx));
1634 rgSCHSCellFreeBuf (inst,ue,ueRecfg,idx);
1638 /* Configuring PCQI */
1639 /* Scell needs to be added to the
1640 * pcqi list only after activation */
1641 pCqiCfg = &sCellInfoCfg->ueSCellDlCqiCfg.prdCqiCfg;
1643 if(ROK != rgSCHSCellPCqiCfg(cell,secCellCb,ue,pCqiCfg,
1644 ue->ueCatEnum,sCellInfoCfg->sCellIdx))
1646 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst), "[%d]SCellIdx PCQI Cfg failed..n\n", idx));
1647 rgSCHSCellFreeBuf (inst,ue,ueRecfg,idx);
1652 /* Configuring ACQI */
1654 /* Stroing the secCell for easy access */
1655 sCellInfo->cell = secCellCb;
1659 if (ROK != rgSCHLaaInitDlRbAllocCb(secCellCb,
1660 &sCellInfo->dlAllocCb))
1665 /* Initialize Harq entity */
1667 sCellInfo->hqEnt = rgSCHDhmHqEntInit(secCellCb);
1668 if (sCellInfo->hqEnt == NULLP)
1670 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst), "[%d]UEID:Hq Entity Initialization "
1671 "failed in config\n", ue->ueId));
1672 rgSCHSCellFreeBuf (inst,ue,ueRecfg,idx);
1676 rgSCHEmtcHqPAlloc(secCellCb, sCellInfo->hqEnt);
1678 rgSCHCmnDlInitHqEnt(secCellCb, sCellInfo->hqEnt);
1680 sCellInfo->hqEnt->ue = ue;
1681 /* Init SCell Specific Sched Spfc UE DL CB */
1682 if ((secCellCb->sc.apis->rgSCHRgrSCellUeCfg(secCellCb, ue, sCellInfoCfg, err)) != ROK)
1684 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst), "Spec Sched DL UE CFG FAILED\n"));
1685 rgSCHSCellFreeBuf (inst,ue,ueRecfg,idx);
1690 if((rgSCHUtlAllocUeANFdbkInfo(ue,sCellInfoCfg->sCellIdx)) != ROK)
1692 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst), "[%d]UEID:Memomy allocation "
1693 "Failed while UE related Ack Nack Information\n",
1695 rgSCHSCellFreeBuf (inst,ue,ueRecfg,idx);
1698 #endif /* LTE_TDD */
1701 sCellInfo->sCellLnk.node = (PTR)sCellInfo;
1702 cmLListAdd2Tail(&secCellCb->sCellUeLst, &sCellInfo->sCellLnk);
1705 /* Inserting UECB into SCELL DBM */
1706 rgSCHDbmInsUeCb(secCellCb, ue);
1709 #ifndef MAC_5GTF_UPDATE
1710 ue->ul.useExtBSRSizes = ueRecfg->ueSCellCfgInfo.useExtBSRSizes;
1712 ue->ul.useExtBSRSizes = TRUE;
1715 for (idx = 0; idx < RGSCH_ULCTRL_RECP_DIST; idx++)
1717 ue->ul.ctrlOnServCellIdx[idx] = 0xFF;
1719 /* Trigger SCell addition to primary MAC */
1722 } /* rgSCHSCellCfgUeCfg */
1725 * @brief UE SCell PUCCH reconfiguration for scheduler
1729 * Function : rgSCHSCellCfgUePucchReCfg
1731 * This functions updates UE specific scheduler
1732 * information upon UE SCell PUCCH reconfiguration
1734 * @param[in] RgSchCellCb *cell
1735 * @param[in] RgSchUeCb *ue
1736 * @param[int] RgrUeRecfg *ueRecfg
1737 * @param[out] RgSchErrInfo *err
1743 PUBLIC S16 rgSCHSCellCfgUePucchReCfg
1747 RgrUeRecfg *ueRecfg,
1751 PUBLIC S16 rgSCHSCellCfgUePucchReCfg(cell, ue, ueRecfg, err)
1754 RgrUeRecfg *ueRecfg;
1758 Inst inst = cell->instIdx;
1759 RgrUeSCellAckPucchCfg *sCellPucchRecfg = NULLP;
1762 TRC2(rgSCHSCellCfgUePucchReCfg);
1763 RGSCHDBGINFONEW(inst, (rgSchPBuf(inst),
1764 "--------------------------------------------------------------------\n"
1765 "UE SCell PUCCH ReConfiguration at SCH: rnti (%u) cell(%u)\n"
1766 "--------------------------------------------------------------------\n",
1767 ue->ueId, cell->cellId));
1770 sCellPucchRecfg = &ueRecfg->sCellAckN1ResCfg;
1771 /* Copy the UCI format type suported/configured for UE */
1772 ue->uciFrmtTyp = sCellPucchRecfg->pucchFormatType;
1774 if (ue->uciFrmtTyp == RG_SCH_UCI_FORMAT1B_CS)
1776 ue->n1PucchF1bResCb.cw1N1ResCount = sCellPucchRecfg->u.format1Bcs.sCellAckN1ResTb1Count;
1777 ue->n1PucchF1bResCb.cw2N1ResCount = sCellPucchRecfg->u.format1Bcs.sCellAckN1ResTb2Count;
1779 for(idx = 0; idx < sCellPucchRecfg->u.format1Bcs.sCellAckN1ResTb1Count; idx++)
1781 ue->n1PucchF1bResCb.cw1N1Res[idx].n1PucchIdx = sCellPucchRecfg->u.format1Bcs.sCellAckN1ResTb1[idx];
1784 for(idx = 0; idx < sCellPucchRecfg->u.format1Bcs.sCellAckN1ResTb2Count; idx++)
1786 ue->n1PucchF1bResCb.cw2N1Res[idx].n1PucchIdx = sCellPucchRecfg->u.format1Bcs.sCellAckN1ResTb2[idx];
1790 else if (ue->uciFrmtTyp == RG_SCH_UCI_FORMAT3)
1792 ue->n3PucchResCb.antP0N3ResCount = sCellPucchRecfg->u.format3.sCellAckN3ResAntP0Count;
1793 ue->n3PucchResCb.antP1N3ResCount = sCellPucchRecfg->u.format3.sCellAckN3ResAntP1Count;
1794 for (idx = 0;idx < ue->n3PucchResCb.antP0N3ResCount; idx++ )
1796 ue->n3PucchResCb.antP0N3Res[idx].n3PucchIdx
1797 = sCellPucchRecfg->u.format3.sCellAckN3ResAntP0[idx];
1798 ue->n3PucchResCb.antP0N3Res[idx].n3Lnk.node = NULLP;
1799 ue->n3PucchResCb.antP0N3Res[idx].sCellIdx = RGSCH_INVALID_CELL_IDX;
1801 for (idx = 0;idx < ue->n3PucchResCb.antP1N3ResCount; idx++ )
1803 ue->n3PucchResCb.antP1N3Res[idx].n3PucchIdx
1804 = sCellPucchRecfg->u.format3.sCellAckN3ResAntP1[idx];
1805 ue->n3PucchResCb.antP1N3Res[idx].n3Lnk.node = NULLP;
1806 ue->n3PucchResCb.antP1N3Res[idx].sCellIdx = RGSCH_INVALID_CELL_IDX;
1808 ue->simulAckNackCQIFormat3 = ueRecfg->simulAckNackCQIFormat3;
1813 RLOG1(L_ERROR,"Wrong PUCCH Format:%d configured for CA",ue->uciFrmtTyp);
1818 } /* rgSCHSCellCfgUePucchReCfg */
1820 * @brief Validates the UE SCell Reconfiguration request from APP to SCH.
1824 * Function : rgSCHCfgVldtRgrUeSCellRecfg
1827 * - Validate Number of SCells
1828 * - If validated successfully,
1829 * - Process Number of SCells
1832 * - Validate SCellIdx value,
1833 * - If validated successfully,
1834 * - Process Number of RgrUeSecCellCfg
1838 * @param[in] RgrUeRecfg *ueRecfg
1839 * @param[out] RgSchCellCb *cell
1840 * @param[out] RgSchUeCb *ue
1841 * @param[out] RgSchErrInfo *errInfo
1847 PUBLIC S16 rgSCHCfgVldtRgrUeSCellRecfg
1849 RgrUeRecfg *ueRecfg,
1852 RgSchErrInfo *errInfo
1855 PUBLIC S16 rgSCHCfgVldtRgrUeSCellRecfg(inst, ueRecfg, cell, ue, errInfo)
1856 RgrUeRecfg *ueRecfg;
1859 RgSchErrInfo *errInfo;
1862 RgrUeSecCellCfg *ueSCellDedCfg = NULLP;
1863 RgSchCellCb *sCell = NULLP;
1864 Inst inst = cell->instIdx;
1866 TRC2(rgSCHCfgVldtRgrUeSCellRecfg);
1868 RGSCHDBGPRM(inst, (rgSchPBuf(inst), "VALIDATE RGR UE SCELL RECONFIG: cellId %d "
1869 "oldUeId %d cell %p \n", ueRecfg->cellId, ueRecfg->oldCrnti));
1870 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_UE_SCELL_RECFG;
1872 if((ueRecfg->ueSCellCfgInfo.numSCells > RGR_MAX_SCELL_PER_UE) ||
1873 (ueRecfg->ueSCellCfgInfo.numSCells < 1))
1875 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst), "Invalid number of SCELL "
1876 " in SCELL Recfg\n"));
1880 for(U8 idx = 0; idx < ueRecfg->ueSCellCfgInfo.numSCells; idx++)
1882 ueSCellDedCfg = &ueRecfg->ueSCellCfgInfo.ueSCellDedCfg[idx];
1883 if(ROK != rgSchUtlVldtCellId(inst, ueSCellDedCfg->sCellId))
1885 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst), "SCellId is out of range"));
1888 /* Validate existence of sec cell */
1889 sCell = rgSchUtlGetCellCb(inst, ueSCellDedCfg->sCellId);
1892 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst), "SCell doesnt exists"));
1896 /* validate the range of serv cell index */
1897 if((ueSCellDedCfg->sCellIdx < 1) ||
1898 (ueSCellDedCfg->sCellIdx > RGR_MAX_SCELL_PER_UE))
1900 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst),"Invalid Serv Cell Idx %d\n",
1901 ueSCellDedCfg->sCellIdx));
1905 /* Is this sec cell alredy confiured */
1906 if(NULLP != ue->cellInfo[ueSCellDedCfg->sCellIdx])
1908 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst),"Secll with id %d already added\n",
1909 ueSCellDedCfg->sCellIdx));
1913 /* Validate CQI config params */
1914 if((rgSCHCfgVldtUeCqiModeCfg(sCell, &ueSCellDedCfg->ueSCellDlCqiCfg)) != ROK)
1916 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst), "Invalid CQI Mode "
1917 " configuration for Ue %d\n",ue->ueId));
1921 /* 1. Validate UE Aperiodic CQI related parameters */
1922 if( ROK != rgSCHCfgVldtRgrUeACqiCfg (sCell, ue->ueId,
1923 &ueSCellDedCfg->ueSCellDlCqiCfg.aprdCqiCfg, ueSCellDedCfg->txMode,
1926 RGSCHDBGERR(sCell->instIdx, (rgSchPBuf(sCell->instIdx),
1927 "rgSCHCfgVldtCqiSrSrsUeCfg: Invalid Aperiodic CQI configuration\n"));
1932 if( ROK != rgSCHCfgVldtRgrUePCqiCfg (sCell, ue->ueId,
1933 &ueSCellDedCfg->ueSCellDlCqiCfg.prdCqiCfg, ueRecfg->isHdFddEnbld,
1934 ueSCellDedCfg->txMode, errInfo ))
1936 if( ROK != rgSCHCfgVldtRgrUePCqiCfg (sCell, ue->ueId,
1937 &ueSCellDedCfg->ueSCellDlCqiCfg.prdCqiCfg,
1938 ueSCellDedCfg->txMode,
1942 RGSCHDBGERR(sCell->instIdx, (rgSchPBuf(sCell->instIdx),
1943 "rgSCHCfgVldtCqiSrSrsUeCfg: Invalid Periodic CQI configuration\n"));
1947 if((ueSCellDedCfg->txMode.txModeEnum < RGR_UE_TM_1) ||
1948 (ueSCellDedCfg->txMode.txModeEnum > RGR_UE_TM_9))
1950 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst), "SCELL Invalid transmission mode for"
1951 " UE %d\n", (U8)ueSCellDedCfg->txMode.txModeEnum));
1957 errInfo->errCause = RGSCHERR_NONE;
1958 RGSCHDBGINFO(inst, (rgSchPBuf(inst), "RGR Ue SCell Reconfig validation done: "
1959 "cellId %d oldUeId %d\n", ueRecfg->cellId, ue->ueId));
1961 } /* rgSCHCfgVldtRgrUeSCellRecfg */
1964 * @brief Ue SCell configuration roll back due to failure during configuration
1969 * Function : rgSCHSCellCfgUeCfgRollBack
1971 * This functions roll backs the configuration of successfully added Scell
1973 * @param[in] RgSchCellCb *cell
1974 * @param[in] RgSchUeCb *ue
1975 * @param[int] RgrUeRecfg *ueRecfg
1976 * @param[out] RgSchErrInfo *err
1982 PRIVATE S16 rgSCHSCellCfgUeCfgRollBack
1989 PRIVATE S16 rgSCHSCellCfgUeCfgRollBack(cell, ue, ueRecfg)
1992 RgrUeRecfg *ueRecfg;
1995 Inst inst = cell->instIdx;
1996 RgrUeSecCellCfg *sCellInfoCfg = NULLP;
1997 RgSchUeCellInfo *sCellInfo = NULLP;
1998 RgSchCmnCell *cellSch = NULLP;
2000 TRC2(rgSCHSCellCfgUeCfgRollBack);
2002 RGSCHDBGINFONEW(inst, (rgSchPBuf(inst),
2003 "--------------------------------------------------------------------\n"
2004 "UE SCell config roll back at SCH: rnti (%u) cell(%u)\n"
2005 "--------------------------------------------------------------------\n",
2006 ue->ueId, cell->cellId));
2008 /* Free all Added scell in this transaction */
2009 for(U8 idx = 0; idx < ueRecfg->ueSCellCfgInfo.numSCells; idx++)
2011 sCellInfoCfg = &ueRecfg->ueSCellCfgInfo.ueSCellDedCfg[idx];
2012 sCellInfo = ue->cellInfo[(sCellInfoCfg->sCellIdx)];
2014 /* if sCellInfo is not NULLP that means this Scell is added hence
2016 if (NULLP != sCellInfo)
2018 /* Clear Scheduler specific list for this UE from the
2019 * corresponding CELL */
2020 cellSch = RG_SCH_CMN_GET_CELL(sCellInfo->cell);
2021 cellSch->apisDl->rgSCHDlUeReset(sCellInfo->cell, sCellInfo->ue);
2023 /* Delete harq Entity of Scell*/
2024 rgSCHDhmDelHqEnt(cell, &(sCellInfo->hqEnt));
2026 rgSCHUtlFreeSBuf(inst, (Data**)&(sCellInfo),
2027 sizeof(RgSchUeCellInfo));
2029 ue->cellInfo[(sCellInfoCfg->sCellIdx)] = NULLP;
2032 if (ue->numSCells == 0)
2034 ue->allocCmnUlPdcch = TRUE;
2035 /* As there is no SCell left so DCI 0 size at UE specific search space
2036 * will be recalculated as the CSI is reduced to 1 bit */
2037 rgSCHUtlUpdUeDciSize(cell, ue, FALSE);
2044 #endif /* LTE_ADV */
2046 * @brief Validates the UE reconfiguration request from RRC to MAC.
2050 * Function : rgSCHCfgVldtRgrUeRecfg
2053 * - Retrieve the UE control block.
2055 * - Validate the range of reconfigured values recieved in
2056 * re-configuration request.
2057 * - If validated successfully,
2058 * - Return ROK and pointer to the cell and ue.
2061 * - Else return RFAILED.
2063 * @param[in] Inst inst
2064 * @param[in] RgrUeRecfg *ueRecfg
2065 * @param[out] RgSchCellCb **cell
2066 * @param[out] RgSchUeCb **ue
2067 * @param[out] RgSchErrInfo *errInfo
2073 PUBLIC S16 rgSCHCfgVldtRgrUeRecfg
2076 RgrUeRecfg *ueRecfg,
2079 RgSchErrInfo *errInfo
2082 PUBLIC S16 rgSCHCfgVldtRgrUeRecfg(inst, ueRecfg, cell, ue, errInfo)
2084 RgrUeRecfg *ueRecfg;
2087 RgSchErrInfo *errInfo;
2091 TRC2(rgSCHCfgVldtRgrUeRecfg);
2093 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_UE_RECFG;
2095 if (((*cell) == NULLP) ||
2096 ((*cell)->cellId != ueRecfg->cellId))
2098 RLOG_ARG1(L_ERROR,DBG_CELLID,ueRecfg->cellId,
2099 "Cell does not exist for OLD CRNTI:%d",ueRecfg->oldCrnti);
2103 /* Fetch the Old Ue */
2104 if ((*ue = rgSCHDbmGetUeCb(*cell, ueRecfg->oldCrnti)) == NULLP)
2106 RLOG_ARG1(L_ERROR,DBG_CELLID,ueRecfg->cellId,"OLD CRNTI:%d does not exist",
2112 if(RGR_UE_SCELL_ADD_RECFG & ueRecfg->ueRecfgTypes)
2114 S16 ret = rgSCHCfgVldtRgrUeSCellRecfg(ueRecfg,*cell, *ue, errInfo);
2117 RGSCHDBGERR(inst,(rgSchPBuf(inst), "Ue SCell Recfg Validation FAILED\n"));
2120 errInfo->errCause = RGSCHERR_NONE;
2125 if (ueRecfg->oldCrnti != ueRecfg->newCrnti)
2127 if (rgSCHDbmGetUeCb(*cell, ueRecfg->newCrnti) != NULLP)
2129 RLOG_ARG1(L_ERROR,DBG_CELLID,ueRecfg->cellId,"NEW CRNTI:%d already exists",
2135 if ((ueRecfg->ueRecfgTypes & RGR_UE_CSG_PARAM_RECFG) &&\
2136 ((*ue)->csgMmbrSta == ueRecfg->csgMmbrSta))
2138 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"UE ID [%d] invalid CSG Membership reconfig :%d ",
2139 ueRecfg->newCrnti, (U8)ueRecfg->csgMmbrSta);
2142 /* Validate values */
2143 if ((ueRecfg->ueRecfgTypes & RGR_UE_TXMODE_RECFG) &&
2144 (ueRecfg->txMode.pres == TRUE) &&
2145 ((ueRecfg->txMode.txModeEnum < RGR_UE_TM_1) ||
2146 (ueRecfg->txMode.txModeEnum > RGR_UE_TM_7)))
2148 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid transmission mode %d"
2149 "for NEW CRNTI:%d", (U8)ueRecfg->txMode.txModeEnum,ueRecfg->newCrnti);
2153 if ((ueRecfg->ueRecfgTypes & RGR_UE_PRD_DLCQI_RECFG) &&
2154 (((ueRecfg->prdDlCqiRecfg.k < 1) || (ueRecfg->prdDlCqiRecfg.k > 4)) ||
2155 ((ueRecfg->prdDlCqiRecfg.cqiPmiCfgIdx < 1) ||
2156 (ueRecfg->prdDlCqiRecfg.cqiPmiCfgIdx > 1024))))
2158 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid Periodic CQI INFO"
2159 "OLD CRNTI:%d NEW CRNTI:%d",(U8)ueRecfg->oldCrnti,ueRecfg->newCrnti);
2163 if ((ueRecfg->ueRecfgTypes & RGR_UE_ULHARQ_RECFG) &&
2164 (ueRecfg->ueUlHqRecfg.maxUlHqTx < RGSCH_MIN_HQ_TX))
2166 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid Uplink HARQ config %d"
2167 "for NEW CRNTI:%d", ueRecfg->ueUlHqRecfg.maxUlHqTx,ueRecfg->newCrnti);
2171 if ((ueRecfg->ueRecfgTypes & RGR_UE_PRD_DLCQI_RECFG) &&
2172 (ueRecfg->prdDlCqiRecfg.prdModeEnum > RGR_PRD_CQI_MOD21))
2174 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid periodic mode config for"
2175 " DL CQI %d NEW CRNTI:%d", (U8)ueRecfg->prdDlCqiRecfg.prdModeEnum,ueRecfg->newCrnti);
2179 if ((ueRecfg->ueRecfgTypes & RGR_UE_PCQI_RECFG) &&
2180 (ueRecfg->cqiCfg.cqiSetup.prdModeEnum > RGR_PRD_CQI_MOD21))
2182 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid periodic mode config for "
2183 "DL CQI %d for NEW CRNTI:%d",(U8)ueRecfg->cqiCfg.cqiSetup.prdModeEnum,ueRecfg->newCrnti);
2186 #endif /* TFU_UPGRADE */
2187 /* Validate UE Category */
2188 if (ueRecfg->ueCatEnum > CM_LTE_UE_CAT_8)
2190 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid category %d for NEW CRNTI:%d",
2191 (U8)ueRecfg->ueCatEnum,ueRecfg->newCrnti);
2195 /* Validate UE Access Stratum Release */
2196 if ((ueRecfg->ueRecfgTypes & RGR_UE_UE_ACCESS_STRATUM_REL_RECFG) && \
2197 (ueRecfg->accessStratumRls > RGR_REL_11))
2199 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst), "Invalid Access Stratum Release %u for UE\n",
2200 ueRecfg->accessStratumRls));
2203 RGSCHDBGINFONEW(inst, (rgSchPBuf(inst), "Configured Access Stratum Release %u\n", \
2204 ueRecfg->accessStratumRls));
2206 if ((ueRecfg->ueRecfgTypes & RGR_UE_APRD_DLCQI_RECFG) &&
2207 ((ueRecfg->aprdDlCqiRecfg.pres == TRUE) &&
2208 ((ueRecfg->aprdDlCqiRecfg.aprdModeEnum > RGR_APRD_CQI_MOD31) ||
2209 (*cell)->bwCfg.dlTotalBw <= 7)))
2211 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid aperiodic mode config for"
2212 " DL CQI %d for NEW CRNTI:%d", (U8)ueRecfg->aprdDlCqiRecfg.aprdModeEnum,ueRecfg->newCrnti);
2215 if ((ueRecfg->ueRecfgTypes & RGR_UE_ULPWR_RECFG) &&
2216 (rgSCHCfgVldtUePwrCfg(*cell, &ueRecfg->ueUlPwrRecfg) != ROK))
2218 RLOG_ARG1(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid PUSCH Group power"
2219 " Reconfiguration for NEW CRNTI:%d",ueRecfg->newCrnti);
2224 if ((ueRecfg->ueRecfgTypes & RGR_UE_ACKNACK_MEASGAP_RECFG) &&
2225 (rgSCHCfgVldtUeMeasGapAckNakRepRecfg(*cell, ueRecfg) != ROK))
2227 RLOG_ARG1(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid MeasGap/AckNackRep"
2228 " Reconfiguration for NEW CRNTI:%d",ueRecfg->newCrnti);
2232 if(rgSCHCfgVldtSpsReCfg(*cell, *ue, ueRecfg)!= ROK)
2234 RLOG_ARG1(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid SPS"
2235 " Reconfiguration for NEW CRNTI:%d",ueRecfg->newCrnti);
2240 /* Validated Periodic CQI/PMI, RI , SRS and SR related UeCfg */
2241 if ( ROK != rgSCHCfgVldtCqiSrSrsUeReCfg(*cell, *ue, ueRecfg, errInfo))
2243 RLOG_ARG1(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid ACQI, PCQI/SR/SRS "
2244 "Re-configuration for NEW CRNTI:%d",ueRecfg->newCrnti);
2248 if ((ueRecfg->ueRecfgTypes & RGR_UE_DRX_RECFG) &&
2249 (rgSCHCfgVldtDrxUeCfg(*cell, &(ueRecfg->ueDrxRecfg)) != ROK))
2251 RLOG_ARG1(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid drxParams"
2252 " Reconfiguration for NEW CRNTI:%d",ueRecfg->newCrnti);
2256 /* ccpu00117452 - MOD - Changed macro name from
2257 RGR_RRM_DLPWR_CNTRL to RGR_CQI_REPT */
2259 /* Validate DL Power Control Config parameters */
2260 if(rgSCHCfgVldtCqiReptReCfg(*cell, ueRecfg)!= ROK)
2262 RLOG_ARG1(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid DL Power Control"
2263 " Reconfiguration for NEW CRNTI:%d",ueRecfg->newCrnti);
2266 #endif /* End of RGR_CQI_REPT */
2267 errInfo->errCause = RGSCHERR_NONE;
2269 } /* rgSCHCfgVldtRgrUeRecfg */
2273 * @brief Validates the logical channel reconfiguration request from
2278 * Function : rgSCHCfgVldtRgrLchRecfg
2281 * - Retrieve the uplink and downlink logical channel control block.
2283 * - Validate the range of reconfigured values recieved in
2284 * re-configuration request.
2285 * - If validated successfully,
2286 * - Return ROK and pointer to the cell, UE and logical channel.
2289 * - Else return RFAILED.
2291 * @param[in] RgrLchRecfg *lcRecfg
2292 * @param[out] RgSchCellCb **cell
2293 * @param[out] RgSchUeCb **ue
2294 * @param[out] RgSchUlLcCb **ulLc
2295 * @param[out] RgSchDlLcCb **dlLc
2296 * @param[out] RgSchErrInfo *errInfo
2302 PUBLIC S16 rgSCHCfgVldtRgrLchRecfg
2305 RgrLchRecfg *lcRecfg,
2309 RgSchErrInfo *errInfo
2312 PUBLIC S16 rgSCHCfgVldtRgrLchRecfg(inst, lcRecfg, cell, ue, dlLc, errInfo)
2314 RgrLchRecfg *lcRecfg;
2318 RgSchErrInfo *errInfo;
2321 TRC2(rgSCHCfgVldtRgrLchRecfg);
2323 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_LC_RECFG;
2325 if (((*cell) == NULLP) ||
2326 ((*cell)->cellId != lcRecfg->cellId))
2328 RLOG_ARG2(L_ERROR,DBG_CELLID,lcRecfg->cellId,"Cell does not exist "
2329 "for CRNTI:%d LCID:%d",lcRecfg->crnti,lcRecfg->lcId);
2333 /* Fetch the Ue for dedicated channels */
2334 if ((*ue = rgSCHDbmGetUeCb(*cell, lcRecfg->crnti)) == NULLP)
2336 RLOG_ARG2(L_ERROR,DBG_CELLID,lcRecfg->cellId,"UEID does not exist"
2337 "dedicated logical channel for CRNTI:%d LCID:%d",lcRecfg->crnti,lcRecfg->lcId);
2341 if ((*dlLc = rgSCHDbmGetDlDedLcCb((*ue), lcRecfg->lcId)) == NULLP)
2343 RLOG_ARG2(L_ERROR,DBG_CELLID,lcRecfg->cellId,"Dedicated DL LC does not "
2344 "exist for CRNTI:%d LCID:%d",lcRecfg->crnti,lcRecfg->lcId);
2348 errInfo->errCause = RGSCHERR_NONE;
2350 } /* rgSCHCfgVldtRgrLchRecfg */
2353 * @brief Validates the UE Reset request from RRM to MAC.
2357 * Function : rgSCHCfgVldtRgrUeReset
2360 * - Retrieve the CELL control block
2361 * - If cell does not exist return RFAILED
2362 * - Retrieve UE Control block
2363 * - If UE does not exist return RFAILED
2366 * @param[in] Inst inst
2367 * @param[in] RgrRst *reset
2368 * @param[out] RgSchCellCb **cell
2369 * @param[out] RgSchUeCb **ue
2370 * @param[out] RgErrInfo *errInfo
2376 PUBLIC S16 rgSCHCfgVldtRgrUeReset
2382 RgSchErrInfo *errInfo
2385 PUBLIC S16 rgSCHCfgVldtRgrUeReset(inst, reset, cell, ue, errInfo)
2390 RgSchErrInfo *errInfo;
2393 TRC2(rgSCHCfgVldtRgrUeReset);
2396 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_UE_RESET;
2398 if ((cell == NULLP) || (cell->cellId != reset->cellId))
2400 RLOG_ARG1(L_ERROR,DBG_CELLID,reset->cellId,"CELL does not exist for CRNTI:%d",
2405 if ((*ue = rgSCHDbmGetUeCb(&(*cell), reset->crnti)) == NULLP)
2407 RLOG_ARG1(L_ERROR,DBG_CELLID,reset->cellId,"UE does not exist for CRNTI:%d",
2412 errInfo->errCause = RGSCHERR_NONE;
2415 } /* rgSCHCfgVldtRgrUeReset */
2419 * @brief Validates the logical channel reconfiguration request from
2424 * Function : rgSCHCfgVldtRgrLcgRecfg
2427 * - Retrieve the uplink and downlink logical channel control block.
2429 * - Validate the range of reconfigured values recieved in
2430 * re-configuration request.
2431 * - If validated successfully,
2432 * - Return ROK and pointer to the cell, UE and logical channel.
2435 * - Else return RFAILED.
2437 * @param[in] RgrLchRecfg *lcRecfg
2438 * @param[out] RgSchCellCb **cell
2439 * @param[out] RgSchUeCb **ue
2440 * @param[out] RgSchErrInfo *errInfo
2446 PUBLIC S16 rgSCHCfgVldtRgrLcgRecfg
2449 RgrLcgRecfg *lcgRecfg,
2452 RgSchErrInfo *errInfo
2455 PUBLIC S16 rgSCHCfgVldtRgrLcgRecfg(inst, lcgRecfg, cell, ue, errInfo)
2457 RgrLcgRecfg *lcgRecfg;
2460 RgSchErrInfo *errInfo;
2463 TRC2(rgSCHCfgVldtRgrLcgRecfg);
2465 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_LCG_RECFG;
2467 if (((cell) == NULLP) ||
2468 ((cell)->cellId != lcgRecfg->cellId))
2470 RLOG_ARG2(L_ERROR,DBG_CELLID,lcgRecfg->cellId,"Cell does not exist for"
2471 "CRNTI:%d LCGID:%d",lcgRecfg->crnti,lcgRecfg->ulRecfg.lcgId);
2475 /* Fetch the Ue for dedicated channels */
2476 if ((*ue = rgSCHDbmGetUeCb(&(*cell), lcgRecfg->crnti)) == NULLP)
2478 RLOG_ARG2(L_ERROR,DBG_CELLID,lcgRecfg->cellId,"UE does not exist for "
2479 "dedicated logical channel group CRNTI:%d LCGID:%d",
2480 lcgRecfg->crnti,lcgRecfg->ulRecfg.lcgId);
2483 if (lcgRecfg->ulRecfg.lcgId > (RGSCH_MAX_LCG_PER_UE - 1))
2485 RLOG_ARG2(L_ERROR,DBG_CELLID,lcgRecfg->cellId,"Invalid lcgId for uplink logical"
2486 "channel CRNTI:%d LCGID:%d",
2487 lcgRecfg->crnti,lcgRecfg->ulRecfg.lcgId);
2491 if ((lcgRecfg->ulRecfg.gbr != 0) && (lcgRecfg->ulRecfg.mbr < lcgRecfg->ulRecfg.gbr))
2493 RGSCHDBGINFO(inst, (rgSchPBuf(inst), "Dedicated Logical Group %d validation failed"
2494 " for ue %d for cell %d\n", lcgCfg->ulInfo.lcgId, lcgCfg->crnti, lcgCfg->cellId));
2497 errInfo->errCause = RGSCHERR_NONE;
2499 } /* rgSCHCfgVldtRgrLcgRecfg */
2505 * Function : rgSCHDynCfiCfg
2507 * @param[in] RgSchCellCb *cell
2508 * RgrCellCfg *cellCfg
2514 PRIVATE S16 rgSCHDynCfiCfg
2520 PRIVATE S16 rgSCHDynCfiCfg(cell, cellCfg)
2522 RgrCellCfg *cellCfg;
2527 U8 ulDlCfgIdx = cellCfg->ulDlCfgIdx;
2533 TRC2(rgSCHDynCfiCfg);
2535 cell->dynCfiCb.isDynCfiEnb = cellCfg->isDynCfiEnb;
2537 /* Initializing Failure Sample Period */
2538 cell->dynCfiCb.failSamplePrd = (RGSCH_CFI_TTI_MON_INTRVL *
2539 RGSCH_CFI_STEP_UP_TTI_PRCNTG)/100;
2540 /* Initializing Number of Failure Samples */
2541 cell->dynCfiCb.numFailSamples = (RGSCH_CFI_TTI_MON_INTRVL/
2542 cell->dynCfiCb.failSamplePrd);
2543 cell->dynCfiCb.maxCfi = RGSCH_MAX_CFI_VAL;
2544 /* Allocating memory for CCE failure average array based on
2545 * monitoring interval and CCE failure sample period */
2546 if((rgSCHUtlAllocSBuf(cell->instIdx, (Data**)&(cell->dynCfiCb.cceFailSamples),
2547 (cell->dynCfiCb.numFailSamples * sizeof(U16)))) != ROK)
2549 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Memory allocation FAILED for cell");
2553 /* Setting the Invalid value 0xFF to pdcchSfIdx, it will be assigned
2554 * a valid value during CFI swithing is done */
2555 cell->dynCfiCb.pdcchSfIdx = 0xFF;
2558 /* In case of config index 0, the mphich index can be upto 2
2559 * in other config index cases, it will always be set as 1*/
2562 maxMPhich = RG_SCH_MAX_MPHICH;
2566 maxMPhich = RG_SCH_MAX_MPHICH -1;
2568 /* Calculate the number of CCEs in the cell */
2569 for(cfi = 1; cfi < RG_SCH_CMN_MAX_CFI; cfi++)
2571 for(mphIdx = 0; mphIdx < maxMPhich; mphIdx++)
2573 cell->dynCfiCb.cfi2NCceTbl[mphIdx][cfi] =
2574 rgSCHUtlCalcNCce(cell->bwCfg.dlTotalBw,
2575 cell->phichCfg.ngEnum, cfi, mphIdx,
2576 cell->numTxAntPorts,
2577 cell->isCpDlExtend);
2581 /* Calculate the number of CCEs in the cell */
2582 for(cfi = 1; cfi < RG_SCH_CMN_MAX_CFI; cfi++)
2584 /* CFI Index starts from 1 so that there can be a direct mapping from
2585 actual CFI value to cfi Index. mPhich index will always be set
2587 cell->dynCfiCb.cfi2NCceTbl[0][cfi] =
2588 rgSCHUtlCalcNCce(cell->bwCfg.dlTotalBw, cell->phichCfg.ngEnum,
2589 cfi, cell->numTxAntPorts, cell->isCpDlExtend);
2592 /* Calculate the number of CCEs in the cell */
2593 if(cell->dynCfiCb.isDynCfiEnb == TRUE)
2595 /* In case if Dynamic CFI feature is enabled, default CFI
2596 * value 1 is used */
2597 cell->nCce = cell->dynCfiCb.cfi2NCceTbl[0][1];
2601 cell->nCce = cell->dynCfiCb.cfi2NCceTbl[0][cellCfg->cfiCfg.cfi];
2606 numDlSf = rgSchTddNumDlSubfrmTbl[ulDlCfgIdx][9] *
2607 (RGSCH_CFI_TTI_MON_INTRVL/10);
2608 cell->dynCfiCb.cfiStepUpTtiCnt =
2609 (RGSCH_CFI_STEP_UP_TTI_PRCNTG * numDlSf)/100;
2610 cell->dynCfiCb.cfiStepDownTtiCnt =
2611 (RGSCH_CFI_STEP_DOWN_TTI_PERCNTG * numDlSf)/100;
2613 cell->dynCfiCb.cfiStepUpTtiCnt = (RGSCH_CFI_STEP_UP_TTI_PRCNTG *
2614 RGSCH_CFI_TTI_MON_INTRVL)/100;
2615 cell->dynCfiCb.cfiStepDownTtiCnt = (RGSCH_CFI_STEP_DOWN_TTI_PERCNTG *
2616 RGSCH_CFI_TTI_MON_INTRVL)/100;
2623 * @brief Handler for the SCHED Enb configuration request from RRM to MAC.
2627 * Function : rgSCHCfgRgrSchedEnbCfg
2630 * - Invoke SCH with SCHEDULER control block to update
2631 * scheduler specific information.
2632 * - Update rgSch control block with the values recieved in the
2634 * - If successful, return ROK else RFAILED.
2636 * @param[in] RgSchCb *instCb
2637 * @param[in] SpId spId
2638 * @param[in] RgSchSchedEnbCfg *schedEnbCfg
2639 * @param[out] RgSchErrInfo *errInfo
2645 PUBLIC S16 rgSCHCfgRgrSchedEnbCfg
2649 RgrSchedEnbCfg *schedEnbCfg,
2650 RgSchErrInfo *errInfo
2653 PUBLIC S16 rgSCHCfgRgrSchedEnbCfg(inst, spId, schedEnbCfg, errInfo)
2656 RgrSchedEnbCfg *schedEnbCfg;
2657 RgSchErrInfo *errInfo;
2660 TRC2(rgSCHCfgRgrSchedEnbCfg);
2662 RGSCHDBGPRM(inst, (rgSchPBuf(inst), "APPLYING RGR SCH ENB CONFIG: \n"));
2663 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_ENB_CFG;
2665 rgSchCb[inst].rgrSchedEnbCfg = *schedEnbCfg;
2666 RGSCHDBGPRM(inst, (rgSchPBuf(inst),"\ndlSchdType %d ulSchdType %d dlTptCoeffi %d"
2667 "dlFairCoeffi %d ulTptCoeffi %d ulFairCoeffi %d\n",
2668 schedEnbCfg->dlSchdType, schedEnbCfg->ulSchdType, schedEnbCfg->dlSchInfo.dlPfs.tptCoeffi,
2669 schedEnbCfg->dlSchInfo.dlPfs.fairCoeffi, schedEnbCfg->ulSchInfo.ulPfs.tptCoeffi,
2670 schedEnbCfg->ulSchInfo.ulPfs.fairCoeffi));
2673 rgSchCb[inst].rgSchDynTdd.isDynTddEnbld = schedEnbCfg->isDynTddEnbld;
2676 if(RGR_SCH_TYPE_PFS == schedEnbCfg->dlSchdType)
2678 rgSCHEnbPfsDlCfg(inst, errInfo);
2681 errInfo->errCause = RGSCHERR_NONE;
2682 RGSCHDBGINFO(inst, (rgSchPBuf(inst), "RGR SCH ENBconfig done: \n"));
2684 } /* rgSCHCfgRgrSchedEnbCfg */
2688 * @brief Handler for the cell configuration of 5gtf.
2692 * Function : rgSCH5gtfCellCfg
2694 * @param[in] RgSchCellCb *cell
2695 * @param[in] RgSchCellCfg *cellCfg
2701 PUBLIC S16 rgSCH5gtfCellCfg
2707 PUBLIC S16 rgSCH5gtfCellCfg(cell, cellCfg)
2709 RgrCellCfg *cellCfg;
2714 TRC2(rgSCHCfgRgrCellCfg);
2716 for(idx = 0; idx < MAX_5GTF_GROUP; idx++)
2718 cell->cell5gtfCb.ueGrp5gConf[idx].beamBitMask = 0;
2721 for(idx = 0 ; idx < MAX_5GTF_SUBFRAME_INFO ; ++idx)
2723 cell->cell5gtfCb.dynConfig[idx] = cellCfg->Cell5gtfCfg.dynConfig[idx];
2725 cell->cell5gtfCb.numUes = cellCfg->Cell5gtfCfg.numUes;
2726 cell->cell5gtfCb.uePerGrpPerTti = cellCfg->Cell5gtfCfg.uePerGrp;
2727 cell->cell5gtfCb.ueGrpPerTti = cellCfg->Cell5gtfCfg.ueGrpPerTti;
2728 cell->cell5gtfCb.numCCs = cellCfg->Cell5gtfCfg.numOfCC;
2729 cell->cell5gtfCb.bwPerCC = cellCfg->Cell5gtfCfg.bwPerCC;
2730 printf("\ncell cfg at schd,numUes:%u,uepergrp:%u,uegrppertti:%u,numCC:%u,bwPerc:%u cfi %u\n",
2731 cell->cell5gtfCb.numUes,cell->cell5gtfCb.uePerGrpPerTti,cell->cell5gtfCb.ueGrpPerTti,
2732 cell->cell5gtfCb.numCCs,cell->cell5gtfCb.bwPerCC, cell->cell5gtfCb.cfi);
2737 #ifdef XEON_LMT_ITBS
2738 EXTERN U16 gWrMaxDlItbs;
2739 EXTERN U16 gWrMaxUlItbs;
2742 * @brief Handler for the cell configuration request from RRM to MAC.
2746 * Function : rgSCHCfgRgrCellCfg
2749 * - Invoke SCH with cell control block to update
2750 * scheduler specific information.
2751 * - Update cell control block with the values recieved in the
2753 * - Add to the active list of cells if cell becomes ACTIVE.
2754 * - If successful, return ROK else RFAILED.
2756 * @param[in] RgSchCb *instCb
2757 * @param[in] SpId spId
2758 * @param[in] RgSchCellCfg *cellCfg
2759 * @param[out] RgSchErrInfo *errInfo
2765 PUBLIC S16 rgSCHCfgRgrCellCfg
2769 RgrCellCfg *cellCfg,
2770 RgSchErrInfo *errInfo
2773 PUBLIC S16 rgSCHCfgRgrCellCfg(instCb, spId, cellCfg, errInfo)
2776 RgrCellCfg *cellCfg;
2777 RgSchErrInfo *errInfo;
2783 RgInfCellReg cellRegReq;
2784 RgSchCellCb *cell = NULLP;
2785 Inst inst = instCb->rgSchInit.inst;
2786 U32 Idx1 = (U8)((cellCfg->cellId - instCb->genCfg.startCellId)&(CM_LTE_MAX_CELLS-1));
2788 TRC2(rgSCHCfgRgrCellCfg);
2790 errInfo->errCause = RGSCHERR_CFG_RGR_CELL_CFG;
2792 cmMemset((U8*)&pst, (U8)0, sizeof(Pst));
2794 /* Allocate the scheduler's cell control block */
2795 if((ret = rgSCHUtlAllocSBuf(inst, (Data**)&cell, sizeof(RgSchCellCb)))
2798 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Memory allocation FAILED for cell");
2802 if(cellCfg->emtcEnable)
2804 if((ret = rgSCHEmtcCellAlloc(cell))
2807 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Memory allocation FAILED for emtc cell");
2812 if ((U8 *)cell == NULLP)
2814 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Memory allocation FAILED for cell");
2817 /* Initialize the lists of the cell */
2818 ret = rgSCHDbmInitCell(cell);
2821 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"DBM initialization FAILED for cell");
2822 rgSCHCfgFreeCellCb(cell);
2825 /* LTE_ADV_FLAG_REMOVED_START */
2826 if(cellCfg->rgrLteAdvCfg.pres & RGR_ABS)
2828 cell->lteAdvCb.absCfg =
2829 cellCfg->rgrLteAdvCfg.absCfg;
2830 cmMemset((U8*)cell->lteAdvCb.absLoadInfo, 0, sizeof(U32)*RGR_ABS_PATTERN_LEN);
2831 cell->lteAdvCb.absLoadTtiCnt = 0;
2834 if(cellCfg->rgrLteAdvCfg.pres & RGR_SFR)
2836 cell->lteAdvCb.sfrCfg =
2837 cellCfg->rgrLteAdvCfg.sfrCfg;
2839 if(cellCfg->rgrLteAdvCfg.pres & RGR_DSFR)
2841 cell->lteAdvCb.dsfrCfg =
2842 cellCfg->rgrLteAdvCfg.dsfrCfg;
2844 /* LTE_ADV_FLAG_REMOVED_END */
2847 cell->emtcEnable = cellCfg->emtcEnable;
2849 /* Initialize the cell */
2850 cell->cellId = cellCfg->cellId;
2851 cell->instIdx = inst;
2852 cell->macInst = cellCfg->macInst;
2853 cell->isCpUlExtend = cellCfg->isCpUlExtend;
2854 cell->isCpDlExtend = cellCfg->isCpDlExtend;
2856 cell->numTxAntPorts = rgSchCb[inst].rgrSchedEnbCfg.numTxAntPorts;
2857 if(cell->numTxAntPorts == 1)
2859 cell->numCellRSPerSf = RGSCH_NUM_CELL_RS_ONE_ANT_PORT;
2861 else if(cell->numTxAntPorts == 2)
2863 cell->numCellRSPerSf = RGSCH_NUM_CELL_RS_TWO_ANT_PORT;
2867 cell->numCellRSPerSf = RGSCH_NUM_CELL_RS_FOUR_ANT_PORT;
2869 cell->bwCfg = cellCfg->bwCfg;
2870 cell->pbchRbStart = ((((cell->bwCfg.dlTotalBw * 12)/2) - 36)/12); /* Ref section 6.6 in 36.211 */
2871 cell->pbchRbEnd = cell->pbchRbStart + 5;
2872 cell->pucchCfg = cellCfg->pucchCfg;
2873 cell->rachCfg = cellCfg->rachCfg;
2874 cell->siCfg = cellCfg->siCfg;
2875 cell->t300TmrVal = cellCfg->t300TmrVal;
2877 /*Initialize the SI CB in Cell CB */
2878 cmMemset((U8 *)&cell->siCb, 0, sizeof(RgSchSiCb));
2880 /*Fix: Added Guard Pool for RNTI which will contain RNTIs
2881 *for UEs deleted from Scheduler but not yet from MAC*/
2882 cmLListInit(&cell->rntiDb.rntiGuardPool);
2884 /* Initialize the inWindow to sync with scheduler time when ticks starts */
2886 cell->siCb.inWindow = (cellCfg->siCfg.siWinSize -
2887 (RG_SCH_CMN_DL_DELTA + RG_SCH_CMN_HARQ_INTERVAL));
2889 cell->siCb.inWindow = (cellCfg->siCfg.siWinSize -
2890 (RG_SCH_CMN_DL_DELTA));
2893 if(cell->siCb.inWindow < 0)
2895 cell->siCb.inWindow = 0;
2897 cell->macPreambleSet = cellCfg->macPreambleSet;
2898 cell->phichCfg = cellCfg->phichCfg;
2900 /* Initialize UL and DL CCCH logical channels */
2901 cell->ulCcchId = RGSCH_INVALID_LC_ID;
2902 cell->dlCcchId = RGSCH_INVALID_LC_ID;
2904 /* Update SRS configuration */
2905 cell->srsCfg.isSrsCfgPres = cellCfg->srsCfg.isSrsCfgSetup;
2906 if(cellCfg->srsCfg.isSrsCfgSetup)
2908 cell->srsCfg.srsCfgPrdEnum = cellCfg->srsCfg.srsCfgPrdEnum;
2909 cell->srsCfg.srsBwEnum = cellCfg->srsCfg.srsBwEnum;
2910 cell->srsCfg.srsTxOffst =
2911 rgSrsTxOffstTbl[cellCfg->srsCfg.srsSubFrameCfg];
2912 /*ccpu00116923 - ADD - Srs Present support */
2914 cell->srsCfg.srsSubFrameCfg = cellCfg->srsCfg.srsSubFrameCfg;
2918 /* Configure all the common logical channels for the cell */
2919 for(idx = 0; idx < cellCfg->numCmnLcs; idx++)
2921 /* This never returns failure and hence not checked for */
2922 rgSCHCfgRgrCmnLcCfg(cell, &(cellCfg->cmnLcCfg[idx]), errInfo);
2925 /* Invoke the MeasGap and ACK NACK Rep handler for cell cfg */
2927 /* Dynamic CFI cell configuration */
2928 ret = rgSCHDynCfiCfg(cell, cellCfg);
2931 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Rgr cell Config failed at "
2932 "Scheduler for cell");
2933 rgSCHCfgFreeCellCb(cell);
2936 /* Updating Auto TM Mode enable/diable flag */
2937 cell->isAutoCfgModeEnb = cellCfg->isAutoCfgModeEnb;
2939 if(cell->isAutoCfgModeEnb)
2941 RLOG0(L_INFO,"Auto Mode Cfg enabled durint cell cfg\n");
2944 /* CPU OvrLoad State Initialization */
2945 #ifdef XEON_LMT_ITBS
2946 cell->thresholds.maxDlItbs = gWrMaxDlItbs;
2947 cell->thresholds.maxUlItbs = gWrMaxUlItbs;
2948 RLOG2(L_INFO,"LIMIT DL and UL ITBS %d:%d \n",gWrMaxDlItbs,gWrMaxUlItbs);
2950 cell->thresholds.maxDlItbs = RG_SCH_DL_MAX_ITBS;
2951 cell->thresholds.maxUlItbs = RG_SCH_UL_MAX_ITBS;
2953 cell->measurements.dlTpt = 0;
2954 cell->measurements.ulTpt = 0;
2955 cell->measurements.dlBytesCnt = 0;
2956 cell->measurements.ulBytesCnt = 0;
2957 cell->cpuOvrLdCntrl.cpuOvrLdIns = 0; /* 0 - No command */
2958 cell->cpuOvrLdCntrl.dlNxtIndxDecNumUeTti = 0;
2959 cell->cpuOvrLdCntrl.ulNxtIndxDecNumUeTti = 0;
2960 for ( idx = 0; idx < 10; idx++ )
2962 cell->cpuOvrLdCntrl.maxUeNewTxPerTti[idx] = cellCfg->maxDlUeNewTxPerTti;
2963 cell->cpuOvrLdCntrl.maxUeNewRxPerTti[idx] = cellCfg->maxUlUeNewTxPerTti;
2966 /* Invoke scheduler to update scheduler specific information */
2967 ret = rgSCHUtlRgrCellCfg(cell, cellCfg, errInfo);
2970 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Rgr cell Config failed at "
2971 "Scheduler for cell ");
2972 rgSCHCfgFreeCellCb(cell);
2976 /* Invoke DHM to update DHM specific information */
2977 rgSCHDhmRgrCellCfg(cell, cellCfg, errInfo);
2980 /* Initialize RNTI DB */
2981 ret = rgSCHDbmRntiDbInit(cell, cellCfg->macRnti.startRnti,
2982 cellCfg->macRnti.size);
2985 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Rgr Cell Config failed at"
2986 " RNTI DB init for cell");
2987 rgSCHCfgFreeCellCb(cell);
2991 /* Update the cell with recieved configuration */
2992 cell->dlHqCfg = cellCfg->dlHqCfg;
2994 RLOG1(L_INFO,"Config DL HQTX = %d\n",cell->dlHqCfg.maxDlHqTx);
2996 cell->crntSfIdx = 0;
2997 /* Allocate the subframe allocation information */
2998 if((ret = rgSCHUtlGetSfAlloc(cell)) != ROK)
3000 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Memory allocation FAILED for "
3002 rgSCHCfgFreeCellCb(cell);
3005 /* Update RACH Related information
3006 * XXX: Below function yet to be written in RAM
3007 * To store the preambles given in the configuration for PDCCH order in the
3008 * scheduler cell control block. Initialize the PRACH Mask Index allocated
3009 * for these preambles to invalid values */
3011 cell->crntHqIdx = 0;
3012 /* Allocate the subframe allocation information */
3013 if((ret = rgSCHUtlGetRlsHqAlloc(cell)) != ROK)
3015 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Memory allocation FAILED for"
3017 rgSCHCfgFreeCellCb(cell);
3021 /* Associate a pair of upper and lower sapCbs with this cell */
3022 instCb->rgrSap[spId].cell = cell;
3023 instCb->tfuSap[spId].cell = cell;
3024 instCb->rgmSap[spId].cell = cell;
3025 cell->tfuSap = &(instCb->tfuSap[spId]);
3028 instCb->cells[Idx1] = cell;
3031 /* rg001.201: Added for sending TTI tick to RRM */
3032 #if (defined(RGR_RRM_TICK) || defined(RGR_CQI_REPT))
3033 /* Associate the RGR SAP as well utilized while sending TTI
3034 * Ticks to RGR User. */
3035 cell->rgrSap = &(instCb->rgrSap[spId]);
3037 cell->rgmSap = &(instCb->rgmSap[spId]);
3039 /* Store the periodicity configured */
3040 cell->rrmTtiIndPrd = cellCfg->rrmTtiIndPrd;
3044 cmLListInit(&cell->l2mList);
3047 if (rgSCHDrxCellCfg(cell,cellCfg) != ROK)
3049 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Drx Memory allocation FAILED for"
3051 rgSCHCfgFreeCellCb(cell);
3054 cell->overLoadBackOffEnab = FALSE;/* Disabling RachOverload by default */
3055 /* Updating CSG Parameters */
3056 cell->minDlResNonCsg = cellCfg->csgParamCfg.minDlResNonCsg;
3057 cell->minUlResNonCsg = cellCfg->csgParamCfg.minUlResNonCsg;
3059 /* Register the cell with MAC */
3060 rgSCHUtlGetPstToLyr(&pst, instCb, cell->macInst);
3061 cellRegReq.cellId = cell->cellId;
3062 cellRegReq.cellSapId = spId;
3064 cellRegReq.maxDlHqProcPerUe = rgSchTddDlNumHarqProcTbl[cellCfg->ulDlCfgIdx];
3066 cellRegReq.maxDlHqProcPerUe = RGSCH_MAX_DL_HQ_PROC;
3068 RgSchMacCellReg(&pst, &cellRegReq);
3071 cell->tenbStats = TSL2AllocCellStatsBlk(cell->cellId);
3072 cell->tenbStats->cellId = cell->cellId;
3075 rgSCHUtlCalcDciSizes(cell);
3078 /* Initilalization of the list of UE for which this cell is secondary cell*/
3079 cmLListInit(&cell->sCellUeLst);
3084 ret = rgSCHLaaSCellCbInit(cell, cellCfg);
3087 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Rgr Cell Config failed at"
3088 " Initializing the LAA Cell Control Cb");
3089 rgSCHCfgFreeCellCb(cell);
3092 cell->isPucchFormat3Sptd = cellCfg->isPucchFormat3Sptd;
3093 RLOG_ARG0(L_INFO,DBG_CELLID,cellCfg->cellId,"Format 3 is Enabled");
3094 printf ("\n Format 3 is Enabled for CELL:%d",cell->cellId);
3100 if(cell->emtcEnable)
3102 if (rgSCHCfgEmtcCellCfg(cell,&(cellCfg->emtcCellCfg)) != ROK)
3104 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"EMTC Config Failed"
3112 ret = rgSCH5gtfCellCfg(cell, cellCfg);
3115 RLOG_ARG0(L_ERROR, DBG_CELLID,cellCfg->cellId,"5GTF Rgr Cell Config failed");
3116 rgSCHCfgFreeCellCb(cell);
3120 errInfo->errCause = RGSCHERR_NONE;
3122 } /* rgSCHCfgRgrCellCfg */
3125 * @brief Handler for the UE configuration request from RRC to MAC.
3129 * Function : rgSCHCfgRgrUeCfg
3132 * - Allocate and create UE control block.
3133 * - Update UE control block with the values recieved in the
3135 * - Invoke RAM, SCH, UHM and DHM with created UE control block, to
3136 * update random access, scheduler, uplink harq and downlink harq
3137 * specific information respectively.
3138 * - If successful, add the control block to hash list of UEs for the cell
3139 * else Rollback and FAIL.
3141 * @param[in] RgSchCellCb *cell
3142 * @param[in] RgrUeCfg *ueCfg
3143 * @param[out] RgSchErrInfo *errInfo
3149 PUBLIC S16 rgSCHCfgRgrUeCfg
3153 RgSchErrInfo *errInfo
3156 PUBLIC S16 rgSCHCfgRgrUeCfg(cell, ueCfg, errInfo)
3159 RgSchErrInfo *errInfo;
3163 RgSchRaCb *raCb=NULLP;
3164 RgSchUeCb *ue = NULLP;
3165 Inst inst = cell->instIdx;
3167 RgSchDlHqEnt *hqEnt = NULLP;
3169 U8 ulDlCfgIdx = cell->ulDlCfgIdx;
3175 RgSchUePCqiCb *cqiCb = NULLP;
3177 TRC2(rgSCHCfgRgrUeCfg);
3180 errInfo->errCause = RGSCHERR_CFG_RGR_UE_CFG;
3181 /* RACHO : Check for raCb only if preamble Id not provded */
3182 #ifndef PRE_DEF_UE_CTX
3183 if (ueCfg->dedPreambleId.pres == NOTPRSNT)
3185 if ((raCb = rgSCHDbmGetRaCb(cell, ueCfg->crnti)) == NULLP)
3187 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,"No RaCb exists for"
3188 "CRNTI:%d ",ueCfg->crnti);
3194 /* Allocate the Ue control block */
3195 if (((rgSCHUtlAllocSBuf(inst, (Data **)&ue, sizeof(RgSchUeCb))) != ROK) ||
3196 ((U8 *)ue == NULLP))
3198 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId, "Memory allocation"
3199 " FAILED for CRNTI:%d", ueCfg->crnti);
3203 /* Inititialize Ue control block */
3204 ue->ueId = ueCfg->crnti;
3206 /*ccpu00117778- Initialize Transmission Indices upon UE CB creation */
3208 ue->lastRprdAckNackTime.sfn = cell->crntTime.sfn;
3209 ue->lastRprdAckNackTime.subframe = cell->crntTime.subframe;
3213 /* Allocate the Ue control block */
3214 if (((rgSCHUtlAllocSBuf(inst, (Data **)&(ue->cellInfo[RGSCH_PCELL_INDEX]),
3215 sizeof(RgSchUeCellInfo))) != ROK))
3218 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst), "[%lu]SCellIdx :Memomy allocation "
3219 "Failed while Adding SCell Information\n", idx));
3221 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst), "[%u]SCellIdx :Memomy allocation "
3222 "Failed while Adding SCell Information\n", idx));
3227 ue->cellIdToCellIdxMap[RG_SCH_CELLINDEX(cell)] = RGSCH_PCELL_INDEX;
3228 ue->cellInfo[RGSCH_PCELL_INDEX]->cell = cell;
3229 ue->cellInfo[RGSCH_PCELL_INDEX]->ue = ue;
3231 ue->cellInfo[RGSCH_PCELL_INDEX]->sCellState = RG_SCH_SCELL_ACTIVE;
3232 ue->cellInfo[RGSCH_PCELL_INDEX]->sCellIdx = RGSCH_PCELL_INDEX;
3233 ue->cellInfo[RGSCH_PCELL_INDEX]->sCellId = cell->cellId;
3235 if (ROK != rgSCHLaaInitDlRbAllocCb(cell,
3236 &ue->cellInfo[RGSCH_PCELL_INDEX]->dlAllocCb))
3242 cqiCb = RG_SCH_GET_UE_CELL_CQI_CB(ue,cell);
3243 cqiCb->nCqiTrIdx = RG_SCH_INVALID_IDX;
3244 cqiCb->nRiTrIdx = RG_SCH_INVALID_IDX;
3245 ue->srsCb.nSrsTrIdx = RG_SCH_INVALID_IDX;
3246 ue->srCb.nSrTrIdx = RG_SCH_INVALID_IDX;
3248 /* LTE_ADV_FLAG_REMOVED_START */
3249 /* While doing UE configuration for SFR at SCH, by default
3250 * CC UE power is configured as LOW */
3251 ue->lteAdvUeCb.isCCUePHigh = FALSE;
3252 /* LTE_ADV_FLAG_REMOVED_END */
3254 /* Initialize the lists of the UE */
3255 if((rgSCHDbmInitUe(ue)) != ROK)
3257 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,"DBM initialization "
3258 "failed for CRNTI:%d", ueCfg->crnti);
3264 if(TRUE == raCb->isEmtcRaCb)
3266 ue->isEmtcUe = TRUE;
3267 if (rgSCHUtlUpdUeEmtcInfo(cell, ueCfg, ue) != ROK)
3269 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,"EMTC UE Cfg"
3270 "failed for CRNTI:%d", ueCfg->crnti);
3277 /* Initialize scheduler related information for UE */
3278 if(rgSCHUtlRgrUeCfg(cell, ue, ueCfg, errInfo) != ROK)
3280 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,"Scheduler handling "
3281 "failed in config for CRNTI:%d", ueCfg->crnti);
3285 ret = rgSCHUhmHqEntInit(cell, ue);
3288 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,"UHM HARQ Ent Init "
3289 "Failed for CRNTI:%d", ueCfg->crnti);
3293 /* Initialize RAM related information for UE
3294 * RACHO: if preamble Id is present in ueCfg then raCb will be NULL
3295 * so rgSCHRamRgrUeCfg should take care of creating raCb */
3296 if ((ueCfg->dedPreambleId.pres == NOTPRSNT) && (NULLP != raCb) )
3298 if((rgSCHRamRgrUeCfg(cell, ue, raCb, errInfo)) != ROK)
3300 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,"Random access "
3301 "handling config failed for CRNTI:%d", ueCfg->crnti);
3307 RG_SCH_CMN_GET_UE_HQE(ue, cell) = rgSCHDhmHqEntInit(cell);
3308 hqEnt = RG_SCH_CMN_GET_UE_HQE(ue, cell);
3311 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,"Hq Entity Initialization "
3312 "failed in config for CRNTI:%d", ueCfg->crnti);
3316 rgSCHEmtcHqPAlloc(cell, hqEnt);
3319 /* Fix : syed Assign hqEnt to UE only if msg4 is done */
3321 rgSCHCmnDlInitHqEnt(cell, hqEnt);
3323 /* For Hand-In UE Request Aper CQI report
3325 if (ueCfg->ueDlCqiCfg.aprdCqiCfg.pres)
3327 /* Set APCQI for Pcell only*/
3328 ue->dl.reqForCqi = RG_SCH_APCQI_SERVING_CC;
3333 maxDlSubframes = rgSchTddNumDlSubfrmTbl[ulDlCfgIdx][RGSCH_NUM_SUB_FRAMES-1];
3334 maxSubframes = 2 * maxDlSubframes;
3335 ue->dl.numHqDlSfInfo = maxSubframes;
3336 rgSCHUtlAllocSBuf(cell->instIdx,
3337 (Data **)&ue->dl.dlSfHqInfo, sizeof(RgSchDlHqInfo) * (ue->dl.numHqDlSfInfo));
3340 ue->dl.numHqDlSfInfo = RGSCH_NUM_DL_SUBFRAMES;
3343 for (idx =0;idx < ue->dl.numHqDlSfInfo; idx++)
3345 cmLListInit(&ue->dl.dlSfHqInfo[idx].hqPLst);
3346 ue->dl.dlSfHqInfo[idx].dlSfUeLnk.node = NULLP;
3352 for (cellIdx = 0;cellIdx < MAX_5GTF_CELL ; cellIdx++)
3354 for (idx =0;idx < ue->dl.numHqDlSfInfo; idx++)
3356 cmLListInit(&ue->dl.dlSfHqInfo[cellIdx][idx].hqPLst);
3357 ue->dl.dlSfHqInfo[cellIdx][idx].dlSfUeLnk.node = NULLP;
3363 rgSCHLaaInitDlHqInfo(cell, ue);
3367 /* Initialize lcgIds to Invalid */
3368 for (lcgCnt = 0; lcgCnt < RGSCH_MAX_LCG_PER_UE; lcgCnt++)
3370 ue->ul.lcgArr[lcgCnt].lcgId = RGSCH_INVALID_LCG_ID;
3374 rgSCHCfgRgrUePhrMsg3(cell,raCb,ue,errInfo);
3375 /* Moved this code out of rgSCHCfgRgrUePhrMsg3()
3376 * as it was not the appropriate place to
3378 if (raCb->raState == RGSCH_RA_MSG4_DONE)
3380 RLOG_ARG1(L_DEBUG,DBG_CELLID,cell->cellId,
3381 "RNTI:%d RaCb deleted as Msg4 transmission is done",
3383 rgSCHRamDelRaCb(cell, raCb, FALSE);
3386 /* Initialize uplink HARQ related information for UE */
3387 rgSCHUhmRgrUeCfg(cell, ue, ueCfg);
3388 cmInitTimers(&ue->bsrTmr, 1);
3390 /* Added periodic BSR timer */
3391 cmInitTimers(&ue->bsrTmr, 1);
3393 /* Fix - Added proper configuration from U-ARM */
3394 if(ueCfg->ueBsrTmrCfg.isPrdBsrTmrPres == TRUE)
3396 ue->ul.bsrTmrCfg.isPrdBsrTmrPres = TRUE;
3397 ue->ul.bsrTmrCfg.prdBsrTmr = ueCfg->ueBsrTmrCfg.prdBsrTmr;
3398 ue->ul.bsrTmrCfg.retxBsrTmr = ueCfg->ueBsrTmrCfg.retxBsrTmr;
3402 /* Initialize downlink HARQ related information for UE */
3403 rgSCHDhmRgrUeCfg(cell, ue, ueCfg, errInfo);
3405 /* Initialize MeasureGap and Acknack Rep Information for UE */
3406 if((rgSCHMeasGapANRepUeCfg(cell, ue, ueCfg)) != ROK)
3408 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,"Measurement Gap and"
3409 " AckNack Rep failed in Config for CRNTI:%d", ueCfg->crnti);
3415 if((rgSCHUtlAllocUeANFdbkInfo(ue,RGSCH_PCELL_INDEX)) != ROK)
3417 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,"Memomy allocation "
3418 "Failed while UE related Ack Nack Information for CRNTI:%d",
3422 ue->dl.ackNackMode = ueCfg->ackNackModeEnum;
3423 #endif /* LTE_TDD */
3426 rgSCHDbmInsUeCb(cell, ue);
3429 /* Int ialize APeriodic CQI/PMI/RI Information for UE */
3431 RGSCHDBGPRM(cell->instIdx,(rgSchPBuf(cell->instIdx),
3432 "\n rgSCHCfgRgrUeCfg : CellID=%d UeId =%d AcqiCfg Pres =%d",
3433 cell->cellId, ue->ueId, ueCfg->ueDlCqiCfg.aprdCqiCfg.pres));
3435 /*Store Trigger Set Bit String to UE */
3437 ret = rgSCHCfgACqiUeCfg(cell,ue, (RG_SCH_CMN_GET_ACQICB(ue,cell)),ue->mimoInfo.txMode,
3438 &ueCfg->ueDlCqiCfg.aprdCqiCfg, ue->ueCatEnum);
3440 ue->cqiRiWritIdx = 0;
3441 ue->cqiRiReadIdx = 0;
3442 /* Initialize Periodic CQI/PMI, RI Information for UE */
3443 ret = rgSCHCfgPCqiUeCfg(cell, ue, &ueCfg->ueDlCqiCfg.prdCqiCfg,
3446 /* Initialize UL SRS Information for UE */
3447 ret = rgSCHCfgSrsUeCfg(cell, ue, &ueCfg->srsCfg);
3449 /* Initialize SR Information for UE */
3450 ret = rgSCHCfgSrUeCfg(cell, ue, &ueCfg->srCfg);
3454 if (rgSCHHdFddUeCfg(cell, ue, ueCfg->isHdFddEnbld) != ROK)
3456 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,
3457 "Could not do HD-FDD config for CRNTI:%d",ueCfg->crnti);
3461 #endif /* LTEMAC_HDFDD */
3462 /* ccpu00117452 - MOD - Changed macro name from
3463 RGR_RRM_DLPWR_CNTRL to RGR_CQI_REPT */
3465 ue->cqiReptCfgInfo.numColltdCqiRept =
3466 ueCfg->ueCqiReptCfg.numColltdCqiRept;
3467 #endif /* End of RGR_CQI_REPT */
3469 RG_SCH_CMN_GET_PA(ue,cell).pres = FALSE;
3470 if (RG_SCH_UE_CFG_ISPAPRSNT(ueCfg->uePdschDedCfg.uepACfg))
3472 RG_SCH_CMN_GET_PA(ue,cell).pres = TRUE;
3473 RG_SCH_CMN_GET_PA(ue,cell).val = ueCfg->uePdschDedCfg.uepACfg.pA;
3476 ue->isDrxEnabled = ueCfg->ueDrxCfg.isDrxEnabled;
3478 if ( ue->isDrxEnabled )
3480 if((rgSCHDrxUeCfg(cell,ue,ueCfg)) != ROK )
3482 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,"DRX configuration failed",
3488 /* LTE_ADV_FLAG_REMOVED_START */
3489 if ((cell->lteAdvCb.sfrCfg.status == RGR_ENABLE) || \
3490 (cell->lteAdvCb.absCfg.status == RGR_ENABLE))
3492 ue->lteAdvUeCb.rgrLteAdvUeCfg = ueCfg->ueLteAdvCfg;
3494 /* LTE_ADV_FLAG_REMOVED_END */
3497 ue->tenbStats = TSL2AllocUeStatsBlk(ue->ueId);
3498 ue->tenbStats->stats.rnti = ue->ueId;
3501 /*Update A Value for PCell TBs*/
3502 ue->f1bCsAVal = rgSCHUtlGetMaxTbSupp(ue->mimoInfo.txMode);
3503 RLOG_ARG1(L_ERROR,DBG_CELLID, ueCfg->cellId,
3504 "\n UeCfg A value is %d\n",ue->f1bCsAVal);
3506 errInfo->errCause = RGSCHERR_NONE;
3508 ue->accessStratumRls = ueCfg->accessStratumRls;
3509 if (ue->numSCells > 0)
3512 rgSCHUtlUpdUeDciSize(cell, ue, TRUE);
3516 /* 1 bit CSI Access Stratum Release Change */
3517 rgSCHUtlUpdUeDciSize(cell, ue, FALSE);
3525 rgSCHCfgFreeUeCb(cell, ue);
3528 } /* rgSCHCfgRgrUeCfg */
3531 * @brief Handler for PHR for MSG3.
3535 * Function : rgSCHCfgRgrUePhrMsg3
3538 * Handle PHR related config for MSG3
3540 * @param[in] RgSchCellCb *cell
3541 * @param[in] RgrUeCb *ueCb
3542 * @param[in] RgSchRaCb *raCb
3543 * @param[out] RgSchErrInfo *errInfo
3546 PRIVATE Void rgSCHCfgRgrUePhrMsg3
3551 RgSchErrInfo *errInfo
3554 PRIVATE Void rgSCHCfgRgrUePhrMsg3(cell, raCb, ue, errInfo)
3558 RgSchErrInfo *errInfo;
3562 TRC2(rgSCHCfgRgrUePhrMsg3);
3564 /* Record msg3 allocation in the UE */
3565 rgSCHUtlRecMsg3Alloc(cell, ue, raCb);
3567 /* If raCb received PHR, update scheduler */
3568 if(raCb->phr.pres == TRUE)
3570 ue->macCeRptTime = raCb->msg3AllocTime;
3571 rgSCHUtlUpdPhr(cell, ue, raCb->phr.val, errInfo);
3581 * Function : rgSCHDynCfiReCfg
3583 * @param[in] RgSchCellCb *cell
3590 PUBLIC Void rgSCHDynCfiReCfg
3596 PUBLIC Void rgSCHDynCfiReCfg(cell, isDynCfiEnb)
3602 RgSchCmnDlCell *cellSchDl = RG_SCH_CMN_GET_DL_CELL(cell);
3604 TRC2(rgSCHDynCfiReCfg);
3608 cell->dynCfiCb.ttiCnt = 0;
3609 cellSchDl->newCfi = cellSchDl->currCfi;
3613 /* Resetting the parameters*/
3614 cell->dynCfiCb.cceFailCnt = 0;
3615 cell->dynCfiCb.cceFailSum = 0;
3616 cell->dynCfiCb.prevCceFailIdx = 0;
3618 for(idx = 0; idx < cell->dynCfiCb.numFailSamples; idx++)
3620 cell->dynCfiCb.cceFailSamples[idx] = 0;
3623 cell->dynCfiCb.cceUsed = 0;
3624 cell->dynCfiCb.lowCceCnt = 0;
3625 cell->dynCfiCb.ttiCnt = 0;
3629 * @brief Handler for the cell reconfiguration request from RRM to MAC.
3633 * Function : rgSCHCfgRgrCellRecfg
3636 * - Invoke SCH with cell control block to update
3637 * scheduler specific information.
3638 * - Update cell control block with the values recieved in the
3640 * - If successful, return ROK else RFAILED.
3642 * @param[in] RgSchCellCb *cell
3643 * @param[in] RgrCellRecfg *cellRecfg
3644 * @param[out] RgSchErrInfo *errInfo
3650 PUBLIC S16 rgSCHCfgRgrCellRecfg
3653 RgrCellRecfg *cellRecfg,
3654 RgSchErrInfo *errInfo
3657 PUBLIC S16 rgSCHCfgRgrCellRecfg(cell, cellRecfg, errInfo)
3659 RgrCellRecfg *cellRecfg;
3660 RgSchErrInfo *errInfo;
3664 Inst inst = cell->instIdx;
3665 /* LTE_ADV_FLAG_REMOVED_START */
3667 U16 len; /* dsfr_pal_fixes ** 21-March-2013 ** SKS */
3668 /* LTE_ADV_FLAG_REMOVED_END */
3670 TRC2(rgSCHCfgRgrCellRecfg);
3673 errInfo->errCause = RGSCHERR_CFG_RGR_CELL_RECFG;
3675 /* Invoke scheduler to update scheduler specific information */
3676 ret = rgSCHUtlRgrCellRecfg(cell, cellRecfg, errInfo);
3679 RLOG_ARG0(L_ERROR,DBG_CELLID,cellRecfg->cellId, "RGR Cell re-configuration failed "
3684 /* Invoke DHM to update DHM specific information */
3685 rgSCHDhmRgrCellRecfg(cell, cellRecfg, errInfo);
3687 /* PUCCH Reconfiguration */
3688 if (cellRecfg->recfgTypes & RGR_CELL_PUCCH_RECFG)
3690 cell->pucchCfg = cellRecfg->pucchRecfg;
3693 /* SRS Reconfiguration */
3694 if (cellRecfg->recfgTypes & RGR_CELL_SRS_RECFG)
3696 cell->srsCfg.isSrsCfgPres = cellRecfg->srsRecfg.isSrsCfgSetup;
3697 if(cellRecfg->srsRecfg.isSrsCfgSetup)
3699 cell->srsCfg.srsCfgPrdEnum = cellRecfg->srsRecfg.srsCfgPrdEnum;
3700 cell->srsCfg.srsBwEnum = cellRecfg->srsRecfg.srsBwEnum;
3701 cell->srsCfg.srsTxOffst =
3702 rgSrsTxOffstTbl[cellRecfg->srsRecfg.srsSubFrameCfg];
3703 /*ccpu00116923 - ADD - Srs Present support */
3705 cell->srsCfg.srsSubFrameCfg = cellRecfg->srsRecfg.srsSubFrameCfg;
3710 /* RACH Reconfiguration */
3711 if (cellRecfg->recfgTypes & RGR_CELL_RACH_RECFG)
3713 cell->rachCfg = cellRecfg->rachRecfg;
3716 /* ccpu00132256:MOD: Moved this assignment from Validation to here.*/
3717 if (cellRecfg->recfgTypes & RGR_CELL_TMRS_RECFG)
3719 cell->t300TmrVal = cellRecfg->t300TmrVal;
3722 /* SI Reconfiguration */
3723 if (cellRecfg->recfgTypes & RGR_CELL_SI_RECFG)
3725 /*Set the specified SI configuration. */
3726 cell->siCb.newSiCfg = cellRecfg->siReCfg;
3727 /* Set the Bit mask for SI re-configuration */
3728 cell->siCb.siBitMask |= RGSCH_SI_SICFG_UPD;
3730 if(cell->emtcEnable)
3732 rgSchEmtcUpdSiCfg(cell, cellRecfg);
3736 #endif /*RGR_SI_SCH */
3738 /* Overload RACH Control changes */
3739 if (cellRecfg->recfgTypes & RGR_CELL_CNTRL_CMD_RECFG)
3741 if (cellRecfg->cntrlCmdCfg.cmdType == RGR_CNTRL_CMD_RACH_OVRLD)
3743 cell->overLoadBackOffEnab = cellRecfg->cntrlCmdCfg.cmdDesc.rachOvrLd.backOffEnb;
3744 cell->overLoadBackOffval = cellRecfg->cntrlCmdCfg.cmdDesc.rachOvrLd.backOffVal;
3746 else if (cellRecfg->cntrlCmdCfg.cmdType == RGR_CNTRL_CMD_CPU_OVRLD)
3748 if( ROK != rgSCHUtlResetCpuOvrLdState(cell, cellRecfg->cntrlCmdCfg.cmdDesc.\
3749 cpuOvrLd.instruction))
3751 RLOG_ARG1(L_ERROR,DBG_CELLID, cellRecfg->cellId,
3752 "Invalid CPU OvrLd Ins %d for cell",
3753 cellRecfg->cntrlCmdCfg.cmdDesc.cpuOvrLd.instruction);
3759 /* LTE_ADV_FLAG_REMOVED_START */
3760 if (cellRecfg->recfgTypes & RGR_CELL_LTEA_FEATURE_RECFG)
3762 if(cellRecfg->rgrLteAdvCfg.pres & RGR_ABS)
3764 cell->lteAdvCb.absCfg =
3765 cellRecfg->rgrLteAdvCfg.absCfg;
3767 if(cellRecfg->rgrLteAdvCfg.pres & RGR_SFR)
3769 cmMemcpy((U8 *)&cell->lteAdvCb.sfrCfg, (U8 *)&cellRecfg->rgrLteAdvCfg.sfrCfg,
3770 sizeof(RgrSfrConfig));
3771 /* dsfr_pal_fixes ** 21-March-2013 ** SKS */
3772 if (cellRecfg->rgrLteAdvCfg.sfrCfg.status == RGR_ENABLE)
3774 for(i = 0; i < RGSCH_NUM_DL_SUBFRAMES; i++)
3776 /*initialise the pools of CC and CE*/
3777 if(rgSchSFRTotalPoolInit(cell, cell->subFrms[i]))
3785 for(i = 0; i < RGSCH_NUM_DL_SUBFRAMES; i++)
3787 /*initialise the pools of CC and CE*/
3788 rgSchSFRTotalPoolFree(&cell->subFrms[i]->sfrTotalPoolInfo, cell);
3791 if (cell->lteAdvCb.dsfrCfg.status == RGR_ENABLE)
3793 /* releasing rntp info val from each subframe */
3794 for(i = 0; i < RGSCH_NUM_DL_SUBFRAMES; i++)
3796 rgSchDSFRRntpInfoFree(&cell->subFrms[i]->rntpInfo, cell, cell->bwCfg.dlTotalBw);
3799 /* releasing RNTP Aggregation Info from CellCb*/
3800 rgSchDSFRRntpInfoFree(&cell->rntpAggrInfo, cell, cell->bwCfg.dlTotalBw);
3802 cell->lteAdvCb.dsfrCfg.status = RGR_DISABLE;
3806 /* dsfr_pal_fixes ** 21-March-2013 ** SKS ** Start */
3807 if(cellRecfg->rgrLteAdvCfg.pres & RGR_DSFR)
3809 cell->lteAdvCb.dsfrCfg =
3810 cellRecfg->rgrLteAdvCfg.dsfrCfg;
3811 if (cell->lteAdvCb.dsfrCfg.status == RGR_ENABLE)
3813 for(i = 0; i < RGSCH_NUM_DL_SUBFRAMES; i++)
3815 /*initialise the pools of CC and CE*/
3816 if(rgSchDSFRRntpInfoInit(&cell->subFrms[i]->rntpInfo,cell,cell->bwCfg.dlTotalBw))
3821 /*Calculating the length of RNTP array based on Dl Bandwidth */
3822 len = (U16)((cell->bwCfg.dlTotalBw % 8 == 0) ? (cell->bwCfg.dlTotalBw/8) : (cell->bwCfg.dlTotalBw/8 + 1)); /* KW fix for LTE_ADV */
3823 if(cell->rntpAggrInfo.pres == NOTPRSNT)
3825 if((rgSCHUtlAllocSBuf(inst, (Data**)&(cell->rntpAggrInfo.val),
3826 (len * sizeof(U8)))) != ROK)
3828 RLOG_ARG0(L_ERROR,DBG_CELLID,cellRecfg->cellId,
3829 "Memory allocation FAILED for RNTP Alloc");
3832 cell->rntpAggrInfo.pres = PRSNT_NODEF;
3833 cell->rntpAggrInfo.len = len;
3836 /* in case if DSFR is disabled, need to free RNTP pattern val*/
3839 /* releasing rntp info val from each subframe */
3840 for(i = 0; i < RGSCH_NUM_DL_SUBFRAMES; i++)
3842 rgSchDSFRRntpInfoFree(&cell->subFrms[i]->rntpInfo, cell, cell->bwCfg.dlTotalBw);
3845 /* releasing RNTP Aggregation Info from CellCb*/
3846 rgSchDSFRRntpInfoFree(&cell->rntpAggrInfo, cell, cell->bwCfg.dlTotalBw);
3849 /* dsfr_pal_fixes ** 21-March-2013 ** SKS ** End */
3851 /* LTE_ADV_FLAG_REMOVED_END */
3853 /* Dynamic CFI cell Reconfiguration */
3854 if(cellRecfg->recfgTypes & RGR_CELL_DYN_CFI_RECFG)
3856 if(cell->dynCfiCb.isDynCfiEnb != cellRecfg->isDynCfiEnb)
3858 if(cell->dynCfiCb.switchOvrInProgress)
3860 cell->dynCfiCb.dynCfiRecfgPend = TRUE;
3864 cell->dynCfiCb.isDynCfiEnb = cellRecfg->isDynCfiEnb;
3865 rgSCHDynCfiReCfg(cell, cellRecfg->isDynCfiEnb);
3870 /* To hanlde the case where reconfiguration comes for disabling
3871 * and then enabling before switchover period expires */
3872 cell->dynCfiCb.dynCfiRecfgPend = FALSE;
3875 /* Dynamic config of AUTO chnage flag */
3876 if(cellRecfg->recfgTypes & RGR_CELL_AUTO_CFG_MODE_RECFG)
3878 if(cell->isAutoCfgModeEnb != cellRecfg->isAutoCfgModeEnb)
3880 cell->isAutoCfgModeEnb = cellRecfg->isAutoCfgModeEnb;
3884 if(cell->isAutoCfgModeEnb)
3886 RLOG0(L_INFO,"Auto Mode Cfg enabled durint cell recfg\n");
3890 if (cellRecfg->recfgTypes & RGR_CELL_CSG_PARAM_RECFG)
3892 cell->minDlResNonCsg = cellRecfg->csgParamCfg.minDlResNonCsg;
3893 cell->minUlResNonCsg = cellRecfg->csgParamCfg.minUlResNonCsg;
3896 errInfo->errCause = RGSCHERR_NONE;
3898 } /* rgSCHCfgRgrCellRecfg */
3901 * @brief Handler for the UE reconfiguration request from RRC to MAC.
3905 * Function : rgSCHCfgRgrUeRecfgRntiChg
3908 * - If rnti changes,
3909 * - Invoke RAM for UE reconfiguration.
3910 * - Delete old UE from the list.
3911 * - Update the new rnti and re-insert the UE in the list.
3912 * - If successful, return ROK else RFAILED.
3914 * @param[in] RgSchCellCb *cell
3915 * @param[in] RgSchUeCb *ue
3916 * @param[in] RgrUeRecfg *ueRecfg
3917 * @param[out] RgSchErrInfo *errInfo
3923 PRIVATE S16 rgSCHCfgRgrUeRecfgRntiChg
3927 RgrUeRecfg *ueRecfg,
3928 RgSchErrInfo *errInfo
3931 PRIVATE S16 rgSCHCfgRgrUeRecfgRntiChg(cell, ue, ueRecfg, errInfo)
3934 RgrUeRecfg *ueRecfg;
3935 RgSchErrInfo *errInfo;
3944 RgSchDlHqEnt **hqEnt = &(RG_SCH_CMN_GET_UE_HQE(ue, cell));
3947 TRC2(rgSCHCfgRgrUeRecfgRntiChg);
3949 /* Handle CRNTI change in reconfiguration */
3950 if (ueRecfg->oldCrnti != ueRecfg->newCrnti)
3952 RgSchRntiLnk *oldRntiLnk=NULLP;
3953 CmLteRnti oldRnti = 0;
3954 if ((raCb = rgSCHDbmGetRaCb(cell, ueRecfg->newCrnti)) == NULLP)
3956 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"UEID:No RaCb exists while"
3957 "Reconfig for OLD CRNTI:%d NEW CRNTI:%d",ueRecfg->oldCrnti,ueRecfg->newCrnti);
3961 /* rntiLnk does not exist for a HandIn UE. Hence this check. */
3964 oldRntiLnk = ue->rntiLnk;
3968 /* Fix : syed HO UE does not have a valid ue->rntiLnk */
3972 RLOG2(L_INFO,"UE ID CHNG OLD %d new %d",ueRecfg->oldCrnti, ueRecfg->newCrnti);
3974 /* Fix : syed Deleting Old DL HqEnt. It would be assigned after
3975 * reest RACH(msg4) is completed. */
3976 rgSCHDhmDelHqEnt(cell, hqEnt);
3978 /* Initialize RAM related information for UE */
3979 ret = rgSCHRamRgrUeCfg(cell, ue, raCb, errInfo);
3982 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"RAM Handling for UE Reconfig failed"
3983 "for OLD CRNTI:%d NEW CRNTI:%d",ueRecfg->oldCrnti,ueRecfg->newCrnti);
3986 /* Delete Ue from the ue list */
3987 rgSCHDbmDelUeCb(cell, ue);
3992 for ( sCellIdx = 1; sCellIdx < CM_LTE_MAX_CELLS; sCellIdx++)
3994 if(ue->cellInfo[sCellIdx] != NULLP)
3996 rgSCHDbmDelUeCb(ue->cellInfo[sCellIdx]->cell, ue);
4002 /* Inititialize Ue control block */
4003 ue->ueId = ueRecfg->newCrnti;
4004 RLOG_ARG2(L_DEBUG,DBG_CELLID,cell->cellId,
4005 "Changing RNTI from %d to %d",
4011 rgSCHUtlUpdEmtcY(ue);
4015 /* Fix ccpu00122631: PCell_Reest: Updating new Rnti in all the cells
4018 for(idx = 0; idx < CM_LTE_MAX_CELLS; idx++)
4020 if(ue->cellInfo[idx])
4022 ue->cellInfo[idx]->dlAllocCb.rnti = ueRecfg->newCrnti;
4026 rgSCHUtlRecMsg3Alloc(cell, ue, raCb);
4028 /* If raCb received PHR, update scheduler */
4029 if(raCb->phr.pres == TRUE)
4031 ue->macCeRptTime = raCb->msg3AllocTime;
4032 rgSCHUtlUpdPhr(cell, ue, raCb->phr.val, errInfo);
4035 #ifdef RGR_V2 /* Acc Fix */
4036 if(TRUE == ue->isDrxEnabled)
4038 ueRecfg->ueDrxRecfg.isDrxEnabled = TRUE;
4039 ret = rgSCHDrxUeReCfg(cell,ue,ueRecfg);
4043 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"UE DRX re-est failed"
4044 "for OLD CRNTI:%d NEW CRNTI:%d",ueRecfg->oldCrnti,ueRecfg->newCrnti);
4048 #endif /* Acc Fix */
4050 /* Re-insert updated Ue */
4051 rgSCHDbmInsUeCb(cell, ue);
4056 for ( sCellIdx = 1; sCellIdx < CM_LTE_MAX_CELLS; sCellIdx++)
4058 if(ue->cellInfo[sCellIdx] != NULLP)
4060 rgSCHDbmInsUeCb(ue->cellInfo[sCellIdx]->cell, ue);
4068 ue->tenbStats->stats.rnti = ue->ueId;
4071 /* Fix : syed If MSG4 is done, since corresponding ueCb
4072 * is ready, the raCb should be cleared immediately.
4073 * Otherwise it would remain in the cell until timed out
4074 * and till then the hq Feedbacks will be assumed to be
4076 if (raCb->raState == RGSCH_RA_MSG4_DONE)
4078 RLOG_ARG1(L_DEBUG,DBG_CELLID,ueRecfg->cellId,
4079 "RNTI:%d with RaCb deleted as Msg4 transmission is done",
4081 rgSCHRamDelRaCb(cell, raCb, FALSE);
4083 /* Fix : syed moving the UL CQI initialization to UERESET */
4085 /* Release Older rnti */
4088 /* This is the rare case in which back to back reestablishment is
4089 * happening and previous re-est was not done completely (MSG4 was
4090 * not done) for an UE, and again re-est is triggered for the same
4091 * UE. We are deleting the old RA CB for the previous re-est which
4092 * still exist due to MSG4 not transmitted successfully */
4093 if ((oldRaCb = rgSCHDbmGetRaCb(cell, oldRntiLnk->rnti)) != NULLP)
4095 rgSCHRamDelRaCb(cell, oldRaCb, FALSE);
4098 rgSCHUtlRlsRnti(cell, oldRntiLnk, TRUE, ueRecfg->newCrnti);
4102 /* Fix : syed HO UE does not have a valid ue->rntiLnk */
4103 /* Just indicate to MAC, no need to release at SCH */
4104 RLOG_ARG2(L_DEBUG,DBG_CELLID,cell->cellId,
4105 "HO OldRnti:%d RLS and NewRnti:%d CHNG IND TO MAC",
4106 oldRnti, ueRecfg->newCrnti);
4107 rgSCHUtlIndRntiRls2Mac(cell, oldRnti, TRUE, ueRecfg->newCrnti);
4113 * @brief Handler for the UE reconfiguration request from RRC to MAC.
4117 * Function : rgSCHCfgRgrUeRecfg
4120 * - If rnti changes,
4121 * - Invoke RAM for UE reconfiguration.
4122 * - Delete old UE from the list.
4123 * - Update the new rnti and re-insert the UE in the list.
4124 * - Update the UE control block with the reconfigured values.
4125 * - Invoke SCH, UHM and DHM with updated UE control block to
4126 * update scheduler, uplink HARQ and downlink HARQ specific
4128 * - If successful, return ROK else RFAILED.
4130 * @param[in] RgSchCellCb *cell
4131 * @param[in] RgSchUeCb *ue
4132 * @param[in] RgrUeRecfg *ueRecfg
4133 * @param[out] RgSchErrInfo *errInfo
4139 PUBLIC S16 rgSCHCfgRgrUeRecfg
4143 RgrUeRecfg *ueRecfg,
4144 RgSchErrInfo *errInfo
4147 PUBLIC S16 rgSCHCfgRgrUeRecfg(cell, ue, ueRecfg, errInfo)
4150 RgrUeRecfg *ueRecfg;
4151 RgSchErrInfo *errInfo;
4156 Bool dciChange = TRUE;
4159 TRC2(rgSCHCfgRgrUeRecfg);
4161 errInfo->errCause = RGSCHERR_CFG_RGR_UE_RECFG;
4164 if (ue->numSCells > 0)
4168 if ((ueRecfg->ueRecfgTypes & RGR_UE_UE_ACCESS_STRATUM_REL_RECFG) && \
4169 (ue->accessStratumRls != ueRecfg->accessStratumRls))
4171 ue->accessStratumRls = ueRecfg->accessStratumRls;
4175 /* if SCELL_RECFG is present , no other
4176 * type will be present. Process Scell addition
4179 if (ueRecfg->ueRecfgTypes & RGR_UE_SCELL_ADD_RECFG)
4181 ret = rgSCHSCellCfgUeCfg(cell, ue, ueRecfg, errInfo);
4184 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_UE_SCELL_RECFG;
4185 /*FH: SCell config failed for a scell index hence revert all successful
4186 * Scell config and send negative confirmation to APP*/
4187 rgSCHSCellCfgUeCfgRollBack(cell, ue, ueRecfg);
4191 if (dciChange == TRUE)
4193 if (ue->numSCells > 0)
4196 rgSCHUtlUpdUeDciSize(cell, ue, TRUE);
4200 /* 1 bit CSI Access Stratum Release Change */
4201 rgSCHUtlUpdUeDciSize(cell, ue, FALSE);
4204 if (ueRecfg->ueRecfgTypes & RGR_UE_SCELL_PUCCH_RECFG)
4206 ret = rgSCHSCellCfgUePucchReCfg(cell, ue, ueRecfg, errInfo);
4209 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_UE_SCELL_PUCCH_RECFG;
4214 if ((ueRecfg->ueRecfgTypes & RGR_UE_UE_ACCESS_STRATUM_REL_RECFG) && \
4215 (ue->accessStratumRls != ueRecfg->accessStratumRls))
4217 ue->accessStratumRls = ueRecfg->accessStratumRls;
4218 rgSCHUtlUpdUeDciSize(cell, ue, FALSE);
4220 #endif /* LTE_ADV */
4222 if (ueRecfg->ueRecfgTypes)
4224 /* Update scheduler related information for UE */
4225 ret = rgSCHUtlRgrUeRecfg(cell, ue, ueRecfg, errInfo);
4228 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,
4229 "Scheduler handling while reconfig failed"
4230 "for OLD CRNTI:%d NEW CRNTI:%d",ueRecfg->oldCrnti,ueRecfg->newCrnti);
4234 /* Update uplink HARQ related information for UE */
4235 rgSCHUhmRgrUeRecfg(cell, ue, ueRecfg);
4237 /* Update TA related information for UE */
4238 if (ueRecfg->ueRecfgTypes & RGR_UE_TATMR_RECFG)
4240 rgSCHCfgUeTaRecfg(cell, ue, ueRecfg, errInfo);
4243 /*Update Measurement Gap and AckNack Details */
4244 /* After merging from 2.2 */
4245 if (ueRecfg->ueRecfgTypes & RGR_UE_ACKNACK_MEASGAP_RECFG)
4247 ret = rgSCHMeasGapANRepUeRecfg(cell, ue, ueRecfg);
4250 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Measurement Gap and"
4251 "AckNack Rep Recfg failed for OLD CRNTI:%d NEW CRNTI:%d",
4252 ueRecfg->oldCrnti,ueRecfg->newCrnti);
4256 if (ueRecfg->ueRecfgTypes & RGR_UE_BSRTMR_RECFG)
4258 cmInitTimers(&ue->bsrTmr, 1);
4259 ue->ul.bsrTmrCfg = ueRecfg->ueBsrTmrRecfg;
4260 if ((ue->ul.bsrTmrCfg.isPrdBsrTmrPres) &&
4261 (ue->ul.bsrTmrCfg.prdBsrTmr == 0xFFFF))
4263 ue->ul.bsrTmrCfg.isPrdBsrTmrPres = FALSE;
4268 if (RFAILED == rgSCHCfgRgrUeRecfgRntiChg (cell, ue, ueRecfg, errInfo))
4270 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"RNTI change "
4271 "failed for OLD CRNTI:%d NEW CRNTI:%d",
4272 ueRecfg->oldCrnti,ueRecfg->newCrnti);
4277 /* Re-Initialize Aperiodic CQI Information for UE*/
4278 if ( ueRecfg->ueRecfgTypes & RGR_UE_APRD_DLCQI_RECFG )
4280 ret = rgSCHCfgAcqiUeReCfg(cell, ue, &ueRecfg->aprdDlCqiRecfg,
4283 /* Re-Initialize Periodic CQI/PMI, RI Information for UE */
4284 if ( ueRecfg->ueRecfgTypes & RGR_UE_PCQI_RECFG)
4286 ret = rgSCHCfgPCqiUeReCfg(cell, ue, &ueRecfg->cqiCfg,
4289 /* Re-Initialize UL SRS Information for UE */
4290 if ( ueRecfg->ueRecfgTypes & RGR_UE_SRS_RECFG)
4292 ret = rgSCHCfgSrsUeReCfg(cell, ue, &ueRecfg->srsCfg);
4294 /* Re-Initialize SR Information for UE */
4295 if ( ueRecfg->ueRecfgTypes & RGR_UE_SR_RECFG)
4297 ret = rgSCHCfgSrUeReCfg(cell, ue, &ueRecfg->srCfg);
4302 if(ueRecfg->isHdFddEnbld)
4304 ret = rgSCHHdFddUeCfg(cell, ue, ueRecfg->isHdFddEnbld);
4307 errInfo->errCause = RGSCHERR_HDFDD_SPSCFGRD;
4311 #endif /* LTEMAC_HDFDD */
4313 if ( ueRecfg->ueRecfgTypes & RGR_UE_DRX_RECFG)
4315 ret = rgSCHDrxUeReCfg(cell,ue,ueRecfg);
4319 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"UE DRX reconfig failed"
4320 "failed for OLD CRNTI:%d NEW CRNTI:%d",
4321 ueRecfg->oldCrnti,ueRecfg->newCrnti);
4326 /* ccpu00117452 - MOD - Changed macro name from
4327 RGR_RRM_DLPWR_CNTRL to RGR_CQI_REPT */
4329 /* CQI Reporting (N) Re-configuration */
4330 if(ueRecfg->ueRecfgTypes & RGR_UE_CQIREPT_RECFG)
4332 ret = rgSCHCfgUeCqiReptReCfg(cell, ue, ueRecfg);
4335 errInfo->errCause = RGSCHERR_CQIREPT;
4339 #endif /* End of RGR_CQI_REPT */
4341 /* pA Re-configuration */
4342 if((ueRecfg->ueRecfgTypes & RGR_UE_PA_RECFG) &&
4343 RG_SCH_UE_CFG_ISPAPRSNT(ueRecfg->uePdschDedCfg.uepACfg))
4345 RG_SCH_CMN_GET_PA(ue,cell).pres = TRUE;
4346 RG_SCH_CMN_GET_PA(ue,cell).val = ueRecfg->uePdschDedCfg.uepACfg.pA;
4350 /* LTE_ADV_FLAG_REMOVED_START */
4351 if(ueRecfg->ueRecfgTypes & RGR_UE_LTEA_RECFG)
4353 if(ueRecfg->ueLteAdvCfg.pres & RGR_ABS)
4355 ue->lteAdvUeCb.rgrLteAdvUeCfg.isAbsUe = ueRecfg->ueLteAdvCfg.isAbsUe;
4358 if(ueRecfg->ueLteAdvCfg.pres & RGR_SFR)
4360 ue->lteAdvUeCb.rgrLteAdvUeCfg.isUeCellEdge = ueRecfg->ueLteAdvCfg.isUeCellEdge;
4363 /* LTE_ADV_FLAG_REMOVED_END */
4365 if(ueRecfg->ueRecfgTypes & RGR_UE_EMTC_DPLXMODE_RECFG)
4367 rgSCHEmtcHdFddUeCfg (cell, ue,
4368 ueRecfg->emtcUeRecfg.isHdFddEnbld);
4370 if(ueRecfg->ueRecfgTypes & RGR_UE_EMTC_PO_TRIGGER)
4372 rgSCHEmtcPOTrigger(cell, ue);
4375 errInfo->errCause = RGSCHERR_NONE;
4378 } /* rgSCHCfgRgrUeRecfg */
4382 * @brief Handler for the logical channel reconfiguration request from
4387 * Function : rgSCHCfgRgrLchRecfg
4390 * - Invoke scheduler to update scheduler specific information.
4391 * - Update the dedicated logical channel Cb with the reconfigured
4393 * - If successful, return ROK else RFAILED.
4395 * @param[in] RgUlCellCb *cell
4396 * @param[in] RgUlUeCb *ue
4397 * @param[in] RgSchUlLcCb *ulLc
4398 * @param[in] RgSchDlLcCb *dlLc
4399 * @param[in] RgrLchRecfg *lcRecfg
4400 * @param[out] RgSchErrInfo *errInfo
4406 PUBLIC S16 rgSCHCfgRgrLchRecfg
4411 RgrLchRecfg *lcRecfg,
4412 RgSchErrInfo *errInfo
4415 PUBLIC S16 rgSCHCfgRgrLchRecfg(cell, ue, dlLc, lcRecfg, errInfo)
4419 RgrLchRecfg *lcRecfg;
4420 RgSchErrInfo *errInfo;
4425 TRC2(rgSCHCfgRgrLchRecfg);
4427 errInfo->errCause = RGSCHERR_CFG_RGR_LC_RECFG;
4428 /* Invoke Scheduler to update the new configuration */
4429 ret = rgSCHUtlRgrLcRecfg(cell, ue, dlLc, lcRecfg, errInfo);
4432 RLOG_ARG2(L_ERROR,DBG_CELLID,lcRecfg->cellId,"Scheduler handling for LC Recfg"
4433 " failed for CRNTI:%d LCID:%d",lcRecfg->crnti,lcRecfg->lcId);
4437 errInfo->errCause = RGSCHERR_NONE;
4439 } /* rgSCHCfgRgrLchRecfg */
4441 * @brief Handler for the logical channel reconfiguration request from
4446 * Function : rgSCHCfgRgrLcgRecfg
4449 * - Invoke scheduler to update scheduler specific information.
4450 * - Update the dedicated logical channel Cb with the re-configured
4452 * - If successful, return ROK else RFAILED.
4454 * @param[in] RgUlCellCb *cell
4455 * @param[in] RgUlUeCb *ue
4456 * @param[in] RgrLcgRecfg *lcgRecfg
4457 * @param[out] RgSchErrInfo *errInfo
4463 PUBLIC S16 rgSCHCfgRgrLcgRecfg
4467 RgrLcgRecfg *lcgRecfg,
4468 RgSchErrInfo *errInfo
4471 PUBLIC S16 rgSCHCfgRgrLcgRecfg(cell, ue, lcgRecfg, errInfo)
4474 RgrLcgRecfg *lcgRecfg;
4475 RgSchErrInfo *errInfo;
4480 TRC2(rgSCHCfgRgrLcgRecfg);
4482 errInfo->errCause = RGSCHERR_CFG_RGR_LCG_RECFG;
4484 /*Added for handling LCG ReConfig if the LCG was deleted */
4485 ue->ul.lcgArr[lcgRecfg->ulRecfg.lcgId].lcgId = lcgRecfg->ulRecfg.lcgId;
4487 /* Invoke Scheduler to update the new configuration */
4488 ret = rgSCHUtlRgrLcgRecfg(cell, ue, lcgRecfg, errInfo);
4491 RLOG_ARG2(L_ERROR,DBG_CELLID,lcgRecfg->cellId,"Scheduler handling for LCG Recfg"
4492 " failed for CRNTI:%d LCGID:%d",lcgRecfg->crnti,lcgRecfg->ulRecfg.lcgId);
4496 errInfo->errCause = RGSCHERR_NONE;
4498 } /* rgSCHCfgRgrLcgRecfg */
4501 * @brief Handler for the UE Reset request from RRM to MAC.
4505 * Function : rgSCHCfgRgrUeReset
4508 * - Call Measument Gap Module and Ack/Nack Module for resetting UE.
4509 * - Call Common Schduler UE rest API which inturn will call scheduler
4510 * specific UE Reset APis to reset UE.
4512 * @param[in] RgSchCellCb *cell
4513 * @param[in] RgSchUeCb *ue
4514 * @param[in] RgrRst *reset
4515 * @param[out] RgSchErrInfo *errInfo
4521 PUBLIC S16 rgSCHCfgRgrUeReset
4526 RgSchErrInfo *errInfo
4529 PUBLIC S16 rgSCHCfgRgrUeReset(cell, ue, reset, errInfo)
4533 RgSchErrInfo *errInfo;
4539 TRC2(rgSCHCfgRgrUeReset);
4542 errInfo->errCause = RGSCHERR_CFG_RGR_UE_RESET;
4544 /* Setting BO of Each Logical Channel of the UE to 0 */
4545 for (idx = 0; idx < RGSCH_MAX_LC_PER_UE; idx++)
4547 if(ue->dl.lcCb[idx] != NULLP)
4548 ue->dl.lcCb[idx]->bo = 0;
4551 /* Reset the totalBo */
4553 /* Call DRX module to stop all DRX timers */
4555 if(ue->drxCb != NULLP)
4557 (Void)rgSCHDrxUeDel(cell,ue);
4560 /* ccpu00140894- Stop TXMode transiition timer if it is running*/
4561 if (ue->txModeTransTmr.tmrEvnt != TMR_NONE)
4563 rgSCHTmrStopTmr(cell, RG_SCH_TMR_TXMODE_TRNSTN, ue);
4564 ue->txModeTransCmplt =TRUE;
4567 /* ccpu00133470- Meas Gap should be released during RRC re-establishment */
4568 rgSCHMeasGapANRepUeDel(cell, ue, FALSE);
4570 /* Call Common scheduler which in turn will call specific scheduler for UE
4572 rgSCHUtlUeReset(cell, ue);
4574 /*PCell which is at idx 0 is always active. Adding a line after the loop
4575 *setting RGSCH_PCELL_INDEX to SCELL ACTIVE*/
4576 ue->cellInfo[RGSCH_PCELL_INDEX]->sCellState = RG_SCH_SCELL_ACTIVE;
4579 /* In case of back to back reestablishments, when this UE's
4580 * previous ReEst is still in progress and has got RESET
4581 * as part of new ReEst */
4582 if((raCb = rgSCHDbmGetRaCb(cell, ue->ueId)) != NULLP)
4584 rgSCHRamDelRaCb(cell, raCb, FALSE);
4586 /* Fix : syed set UE inactive in DL until UE is reinitialization completed */
4587 ue->dl.dlInactvMask |= RG_HQENT_INACTIVE;
4588 ue->ul.ulInactvMask |= RG_HQENT_INACTIVE;
4589 /* [ccpu00127141] Resetting TA related parameters */
4590 ue->dl.taCb.ta = RGSCH_NO_TA_RQD;
4591 ue->dl.taCb.state = RGSCH_TA_IDLE;
4593 /*[ccpu00121813]-ADD-Initializing outstanding TA value */
4594 ue->dl.taCb.outStndngTa = FALSE;
4595 ue->dl.taCb.outStndngTaval = RGSCH_NO_TA_RQD;
4597 if (ue->dl.taCb.cfgTaTmr)
4599 rgSCHTmrStartTmr (cell, ue, RG_SCH_TMR_TA, ue->dl.taCb.cfgTaTmr);
4603 /* Resetting the Tx mode change factor on UE reset */
4604 ue->mimoInfo.txModUpChgFactor = 0;
4605 ue->mimoInfo.txModDownChgFactor = 0;
4608 errInfo->errCause = RGSCHERR_NONE;
4610 } /* rgSCHCfgRgrUeReset */
4613 * @brief Handler for the cell delete request from RRM to MAC.
4617 * Function : rgSCHCfgRgrCellDel
4620 * - Fetch the cell control block.
4621 * - Remove the cell control block from the hash list of cells.
4622 * - Free the cell control block.
4623 * - If successful, return ROK else return RFAILED.
4625 * @param[in] RgSchCellCb *cell
4626 * @param[in] RgrDel *cellDelInfo
4627 * @param[out] RgSchErrInfo *errInfo
4633 PUBLIC S16 rgSCHCfgRgrCellDel
4636 RgrDel *cellDelInfo,
4637 RgSchErrInfo *errInfo
4640 PUBLIC S16 rgSCHCfgRgrCellDel(cell, cellDelInfo, errInfo)
4642 RgrDel *cellDelInfo;
4643 RgSchErrInfo *errInfo;
4646 TRC2(rgSCHCfgRgrCellDel);
4649 errInfo->errCause = RGSCHERR_CFG_RGR_CELL_DEL;
4651 if (cell->cellId != cellDelInfo->u.cellDel.cellId)
4653 RLOG_ARG0(L_ERROR,DBG_CELLID,cellDelInfo->u.cellDel.cellId,
4654 "Cell does not exist");
4658 /* Free the active cell */
4659 rgSCHCfgFreeCellCb(cell);
4661 errInfo->errCause = RGSCHERR_NONE;
4663 } /* rgSCHCfgRgrCellDel */
4667 * @brief Handler for the UE delete request from RRM to MAC.
4671 * Function : rgSCHCfgRgrUeDel
4674 * - Fetch the UE control block.
4675 * - Remove the UE control block from the hash list of UEs for the cell.
4676 * - Free the UE control block.
4677 * - If successful, return ROK else return RFAILED.
4679 * @param[in] RgSchCellCb *cell
4680 * @param[in] RgrDel *ueDelInfo
4681 * @param[out] RgSchErrInfo *errInfo
4687 PUBLIC S16 rgSCHCfgRgrUeDel
4691 RgSchErrInfo *errInfo
4694 PUBLIC S16 rgSCHCfgRgrUeDel(cell, ueDelInfo, errInfo)
4697 RgSchErrInfo *errInfo;
4703 Inst inst = cell->instIdx;
4704 RgSchCellCb *secCellCb = NULLP;
4707 TRC2(rgSCHCfgRgrUeDel);
4708 errInfo->errCause = RGSCHERR_CFG_RGR_UE_DEL;
4710 if (cell->cellId != ueDelInfo->u.ueDel.cellId)
4712 RLOG_ARG1(L_ERROR,DBG_CELLID,ueDelInfo->u.ueDel.cellId,
4713 "Cell does not exist CRNTI:%d",
4714 ueDelInfo->u.ueDel.crnti);
4717 if ((ue = rgSCHDbmGetUeCb(cell, ueDelInfo->u.ueDel.crnti)) == NULLP)
4719 if((raCb = rgSCHDbmGetRaCb(cell, ueDelInfo->u.ueDel.crnti)) == NULLP)
4721 RLOG_ARG1(L_ERROR,DBG_CELLID,ueDelInfo->u.ueDel.cellId,
4722 "RaCb does not exist for CRNTI:%d",ueDelInfo->u.ueDel.crnti);
4727 /* This happens in case of Msg4 rejection */
4735 if(ueDelInfo->u.ueScellRel.ueDelTypes & RGR_UE_SCELL_DEL_RECFG)
4737 for(U8 idx = 0; idx < ueDelInfo->u.ueScellRel.ueSCellRelCfgInfo.numSCells; idx++)
4739 if(NULLP != (secCellCb = (RgSchCellCb *)rgSchUtlGetCellCb(inst, \
4740 ueDelInfo->u.ueScellRel.ueSCellRelCfgInfo.ueSCellRelDedCfg[idx].sCellId)))
4742 rgSCHUtlSndUeSCellDel2Mac(secCellCb, ue->ueId);
4743 rgSCHSCellDelUeSCell(cell,ue,ueDelInfo->u.ueScellRel.ueSCellRelCfgInfo.ueSCellRelDedCfg[idx].sCellIdx);
4745 if ( ue->numSCells == 0)
4747 ue->allocCmnUlPdcch = TRUE;
4751 if (ue->numSCells == 0)
4753 /* As there is no SCell left so DCI 0 size at UE specific search space
4754 * will be recalculated as the CSI is reduced to 1 bit */
4755 rgSCHUtlUpdUeDciSize(cell, ue, FALSE);
4761 /* Delete Ue from the UE list of CELL*/
4762 rgSCHDbmDelUeCb(cell, ue);
4765 rgSCHDbmDelL2MUe(cell, ue);
4768 /* Call MeasGap and AckNakRep processing module */
4769 rgSCHMeasGapANRepUeDel(cell, ue, TRUE);
4771 /* ccpu00140894- Stop TXMode transiition timer if it is running*/
4772 if (ue->txModeTransTmr.tmrEvnt != TMR_NONE)
4774 rgSCHTmrStopTmr(cell, RG_SCH_TMR_TXMODE_TRNSTN, ue);
4777 /* Call DRX module to remove UEs from various
4781 if(ue->drxCb != NULLP)
4783 (Void)rgSCHDrxUeDel(cell,ue);
4786 /*Fix: If RA CB exists, delete it*/
4787 if((raCb = rgSCHDbmGetRaCb(cell, ueDelInfo->u.ueDel.crnti)) != NULLP)
4789 /* Fix : syed RNTI was getting released twice, once by racb del
4790 * and subsequently by ueDel. Let it get released by ueDel alone */
4791 rgSCHRamDelRaCb(cell, raCb, FALSE);
4796 rgSCHEmtcUeDel(cell, ue);
4800 rgSCHCfgFreeUeCb(cell, ue);
4802 errInfo->errCause = RGSCHERR_NONE;
4807 } /* rgSCHCfgRgrUeDel */
4811 * @brief Handler for the logical channel delete request from
4816 * Function : rgSCHCfgRgrLcDel
4819 * - Fetch the logical channel control block.
4820 * - Free the logical channel control block.
4821 * - If successful, return ROK else return RFAILED.
4823 * @param[in] RgrDel *lcDelInfo
4824 * @param[out] RgSchErrInfo *errInfo
4830 PUBLIC S16 rgSCHCfgRgrLcDel
4834 RgSchErrInfo *errInfo
4837 PUBLIC S16 rgSCHCfgRgrLcDel(cell, lcDelInfo, errInfo)
4840 RgSchErrInfo *errInfo;
4851 TRC2(rgSCHCfgRgrLcDel);
4853 errInfo->errCause = RGSCHERR_CFG_RGR_LC_DEL;
4855 /* Fetch the Active cell */
4856 if (cell->cellId != lcDelInfo->u.lchDel.cellId)
4858 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId, "Cell does not exist %d",
4859 lcDelInfo->u.lchDel.cellId);
4864 if ((ue = rgSCHDbmGetUeCb(cell, lcDelInfo->u.lchDel.crnti)) == NULLP)
4866 RLOG_ARG2(L_ERROR,DBG_CELLID,lcDelInfo->u.lchDel.cellId,
4867 "UE does not exist for CRNTI:%d LCID:%d",
4868 lcDelInfo->u.lchDel.crnti,lcDelInfo->u.lchDel.lcId);
4871 if (lcDelInfo->u.lchDel.lcgId > 3)
4873 RLOG_ARG3(L_ERROR,DBG_CELLID,lcDelInfo->u.lchDel.cellId,
4874 "[%d]UEID:For LC %d, LCGid %d is invalid",
4875 lcDelInfo->u.lchDel.crnti,lcDelInfo->u.lchDel.lcId,
4876 lcDelInfo->u.lchDel.lcgId);
4879 if ((dlLc = rgSCHDbmGetDlDedLcCb(ue, lcDelInfo->u.lchDel.lcId))
4882 RLOG_ARG2(L_ERROR,DBG_CELLID,lcDelInfo->u.lchDel.cellId,
4883 "LC does not exist for CRNTI:%d LCID:%d",
4884 lcDelInfo->u.lchDel.crnti, lcDelInfo->u.lchDel.lcId);
4887 rgSCHUtlRgrLcDel(cell, ue, lcDelInfo->u.lchDel.lcId,lcDelInfo->u.lchDel.lcgId);
4889 /* Reduce any pending bo from this LC(if any)
4890 * from the UE's total BO */
4893 if(ue->totalBo >= dlLc->bo)
4895 ue->totalBo -= dlLc->bo;
4899 ue->totalBo = 0; /* this scenario should not occur */
4902 rgSCHDbmDelDlDedLcCb(ue, dlLc);
4903 rgSCHCfgFreeDlDedLcCb(cell, ue, dlLc);
4906 lcId = lcDelInfo->u.lchDel.lcId;
4907 if (TRUE == ue->ul.lcCb[lcId -1].isValid)
4909 ulLc = &(ue->ul.lcCb[lcId -1]);
4910 ue->ul.lcCb[lcId -1].isValid = FALSE;
4912 if((ulLc->qciCb->ulUeCount) &&
4913 (ue->ulActiveLCs & (1 << (ulLc->qciCb->qci -1))))
4915 ulLc->qciCb->ulUeCount--;
4916 ue->ulActiveLCs &= ~(1 << (ulLc->qciCb->qci -1));
4918 /* Shifting LCs in LCG Array because of LC deletion */
4919 for (idx = ulLc->lcgArrIdx +1; idx < ulLc->lcg->numLch;
4922 ulLc->lcg->lcArray[idx -1] =
4923 ulLc->lcg->lcArray[idx];
4924 ulLc->lcg->lcArray[idx -1]->lcgArrIdx = idx -1;
4926 ulLc->lcg->numLch--;
4927 ulLc->lcg->lcArray[idx -1] = NULLP;
4929 #endif /* LTE_L2_MEAS */
4932 errInfo->errCause = RGSCHERR_NONE;
4934 } /* rgSCHCfgRgrLcDel */
4939 * @brief Handler for the logical channel delete request from
4944 * Function : rgSCHCfgRgrLcgDel
4947 * - Fetch the logical channel control block.
4948 * - Free the logical channel control block.
4949 * - If successful, return ROK else return RFAILED.
4951 * @param[in] RgrDel *lcDelInfo
4952 * @param[out] RgSchErrInfo *errInfo
4958 PUBLIC S16 rgSCHCfgRgrLcgDel
4962 RgSchErrInfo *errInfo
4965 PUBLIC S16 rgSCHCfgRgrLcgDel(cell, lcDelInfo, errInfo)
4968 RgSchErrInfo *errInfo;
4971 RgSchUeCb *ue = NULLP;
4977 TRC2(rgSCHCfgRgrLcgDel);
4980 lcgId = lcDelInfo->u.lcgDel.lcgId;
4982 errInfo->errCause = RGSCHERR_CFG_RGR_LCG_DEL;
4984 /* Fetch the Active cell */
4985 if (cell->cellId != lcDelInfo->u.lcgDel.cellId)
4987 RLOG_ARG2(L_ERROR,DBG_CELLID,lcDelInfo->u.lchDel.cellId,
4988 "CELL does not exist for CRNTI:%d LCGID:%d",
4989 lcDelInfo->u.lchDel.crnti,lcDelInfo->u.lchDel.lcId);
4994 if ((ue = rgSCHDbmGetUeCb(cell, lcDelInfo->u.lcgDel.crnti)) == NULLP)
4996 RLOG_ARG2(L_ERROR,DBG_CELLID,lcDelInfo->u.lchDel.cellId,
4997 "UE does not exist for CRNTI:%d LCGID:%d",
4998 lcDelInfo->u.lchDel.crnti,lcDelInfo->u.lchDel.lcId);
5002 /* set lcgId in UEs lcg cntrl blk to invalid */
5003 rgSCHUtlRgrLcgDel(cell, ue, lcgId);
5004 ue->ul.lcgArr[lcgId].lcgId = RGSCH_INVALID_LCG_ID;
5007 /* Since LCs are being deleted, if any of them are contributing
5008 to Active UE count for a QCI, decrease the count */
5009 for (lcCount =0; (lcCount < RGSCH_MAX_LC_PER_UE) &&
5010 (lcCount < ue->ul.lcgArr[lcgId].numLch) ; lcCount++)
5012 if (ue->ul.lcgArr[lcgId].lcArray[lcCount])
5014 if((ue->ul.lcgArr[lcgId].
5015 lcArray[lcCount]->qciCb->ulUeCount) &&
5017 (1 << ((ue->ul.lcgArr[lcgId].
5018 lcArray[lcCount])->qciCb->qci -1))))
5021 ue->ul.lcgArr[lcgId].
5022 lcArray[lcCount]->qciCb->ulUeCount--;
5023 ue->ulActiveLCs &= ~(1 <<
5024 (ue->ul.lcgArr[lcgId].
5025 lcArray[lcCount]->qciCb->qci -1));
5031 errInfo->errCause = RGSCHERR_NONE;
5033 } /* rgSCHCfgRgrLcgDel */
5037 /***********************************************************
5039 * Func : rgSCHCfgVldtRgrLcCfg
5042 * Desc : Validates dedicated logical channel configuration recieved from RRM.
5052 **********************************************************/
5054 PUBLIC S16 rgSCHCfgVldtRgrLcCfg
5060 RgSchErrInfo *errInfo
5063 PUBLIC S16 rgSCHCfgVldtRgrLcCfg(inst, lcCfg, cell, ue, errInfo)
5068 RgSchErrInfo *errInfo;
5071 TRC2(rgSCHCfgVldtRgrLcCfg);
5074 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_DED_LC_CFG;
5076 if (((*cell) == NULLP) ||
5077 ((*cell)->cellId != lcCfg->cellId))
5079 RLOG_ARG2(L_ERROR,DBG_CELLID,lcCfg->cellId,"Cell does not existi for "
5080 "CRNTI:%d LCID:%d",lcCfg->crnti, lcCfg->lcId);
5085 if ((*ue = rgSCHDbmGetUeCb(*cell, lcCfg->crnti)) == NULLP)
5087 RLOG_ARG2(L_ERROR,DBG_CELLID,lcCfg->cellId,"UE does not exist for dedicated"
5088 " logical channel CRNTI:%d LCID:%d", lcCfg->crnti, lcCfg->lcId);
5092 /* Validate logical channel Id */
5093 if ((lcCfg->lcId < RGSCH_DEDLC_MIN_LCID)
5094 ||(lcCfg->lcId > RGSCH_DEDLC_MAX_LCID))
5096 RLOG_ARG2(L_ERROR,DBG_CELLID,lcCfg->cellId,"Invalid logical channel Id:%d"
5097 "for CRNTI:%d",lcCfg->lcId,lcCfg->crnti);
5101 if (lcCfg->lcType != CM_LTE_LCH_DTCH && lcCfg->lcType != CM_LTE_LCH_DCCH)
5103 RLOG_ARG3(L_ERROR,DBG_CELLID,lcCfg->cellId,"Invalid logical channel Type %d"
5104 "CRNTI:%d LCID:%d",lcCfg->lcType,lcCfg->crnti, lcCfg->lcId);
5109 } /* rgSCHCfgVldtRgrLcCfg */
5111 /***********************************************************
5113 * Func : rgSCHCfgVldtRgrLcgCfg
5116 * Desc : Validates dedicated logical channel group configuration recieved from RRM.
5126 **********************************************************/
5128 PUBLIC S16 rgSCHCfgVldtRgrLcgCfg
5134 RgSchErrInfo *errInfo
5137 PUBLIC S16 rgSCHCfgVldtRgrLcgCfg(inst, lcgCfg, cell, ue, errInfo)
5142 RgSchErrInfo *errInfo;
5145 TRC2(rgSCHCfgVldtRgrLcgCfg);
5148 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_DED_LCG_CFG;
5150 if (((*cell) == NULLP) ||
5151 ((*cell)->cellId != lcgCfg->cellId))
5153 RLOG_ARG2(L_ERROR,DBG_CELLID,lcgCfg->cellId,"Cell does not exist for"
5154 "CRNTI:%d LCGID:%d",lcgCfg->crnti,lcgCfg->ulInfo.lcgId);
5159 if ((*ue = rgSCHDbmGetUeCb(*cell, lcgCfg->crnti)) == NULLP)
5161 RLOG_ARG2(L_ERROR,DBG_CELLID,lcgCfg->cellId,"UE does not exist for "
5162 "dedicated logical channel CRNTI:%d LCGID:%d", lcgCfg->crnti, lcgCfg->ulInfo.lcgId);
5166 if ((lcgCfg->ulInfo.gbr != 0) && (lcgCfg->ulInfo.mbr < lcgCfg->ulInfo.gbr))
5172 } /* rgSCHCfgVldtRgrLcgCfg */
5175 /***********************************************************
5177 * Func : rgSCHCfgVldtRgrCellPwrCfg
5179 * Desc : Validates cell power configuration.
5189 **********************************************************/
5191 PRIVATE S16 rgSCHCfgVldtRgrCellPwrCfg
5194 RgrCellCfg *cellCfg,
5195 RgSchErrInfo *errInfo
5198 PRIVATE S16 rgSCHCfgVldtRgrCellPwrCfg(inst, cellCfg, errInfo)
5200 RgrCellCfg *cellCfg;
5201 RgSchErrInfo *errInfo;
5208 TRC2(rgSCHCfgVldtRgrCellPwrCfg);
5210 /* This function does nothing now, placeholder for
5211 * subsequent power config validations that may be needed */
5215 } /* rgSCHCfgVldtRgrCellPwrCfg */
5218 /***********************************************************
5220 * Func : rgSCHCfgVldtRgrCmnLcCfg
5223 * Desc : Validates common logical channel configuration recieved from RRM.
5225 * @param[in] Inst inst
5226 * @param[in] RgrCellCfg *cellCfg
5227 * @param[out] RgSchErrInfo *errInfo
5236 **********************************************************/
5238 PRIVATE S16 rgSCHCfgVldtRgrCmnLcCfg
5241 RgrCellCfg *cellCfg,
5242 RgSchErrInfo *errInfo
5245 PRIVATE S16 rgSCHCfgVldtRgrCmnLcCfg(inst, cellCfg, errInfo)
5247 RgrCellCfg *cellCfg;
5248 RgSchErrInfo *errInfo;
5252 RgrCmnLchCfg *lcCfg;
5257 TRC2(rgSCHCfgVldtRgrCmnLcCfg);
5259 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_CMN_LC_CFG;
5261 for (idx = 0; idx < cellCfg->numCmnLcs; idx++)
5263 lcCfg = &(cellCfg->cmnLcCfg[idx]);
5264 /* Validate downlink info */
5265 if (lcCfg->dir & RGR_DIR_TX)
5267 if (lcCfg->lcType == CM_LTE_LCH_BCCH)
5269 if (lcCfg->dlTrchType == CM_LTE_TRCH_DL_SCH)
5273 bitMask |= RGSCH_BCCH_DLSCH_CFG1;
5280 (cellCfg->siCfg.siWinSize == 1) ||
5281 (cellCfg->siCfg.siWinSize == 2) ||
5282 (cellCfg->siCfg.siWinSize == 5) ||
5283 (cellCfg->siCfg.siWinSize == 10) ||
5284 (cellCfg->siCfg.siWinSize == 15) ||
5285 (cellCfg->siCfg.siWinSize == 20) ||
5286 (cellCfg->siCfg.siWinSize == 40)) &&
5287 (cellCfg->siCfg.retxCnt>0)
5290 bitMask |= RGSCH_BCCH_DLSCH_CFG2;
5294 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,
5295 "Invalid si config for cell");
5300 else if (lcCfg->dlTrchType == CM_LTE_TRCH_BCH)
5302 bitMask |= RGSCH_BCCH_BCH_CFG;
5306 RLOG_ARG1(L_ERROR,DBG_CELLID, cellCfg->cellId,
5307 "Invalid transport channel %d for cell", lcCfg->dlTrchType);
5311 else if (lcCfg->lcType == CM_LTE_LCH_PCCH)
5313 bitMask |= RGSCH_PCCH_CFG;
5315 else if (lcCfg->lcType == CM_LTE_LCH_CCCH)
5317 bitMask |= RGSCH_DL_CCCH_CFG;
5322 /* Validate uplink info */
5323 if (lcCfg->dir & RGR_DIR_RX)
5326 if (lcCfg->lcType != CM_LTE_LCH_CCCH)
5328 RLOG_ARG1(L_ERROR,DBG_CELLID, cellCfg->cellId,"Invalid UL common lcType %d "
5329 "for cell", lcCfg->lcType);
5334 bitMask |= RGSCH_UL_CCCH_CFG;
5339 /* Invalid direction */
5342 RLOG_ARG1(L_ERROR,DBG_CELLID, cellCfg->cellId,"Invalid Direction %d",
5347 if (bitMask != RGSCH_CELL_ACTIVE_CFG)
5349 RLOG_ARG0(L_ERROR,DBG_CELLID, cellCfg->cellId,
5350 "Invalid Common channel config for cell");
5355 } /* rgSCHCfgVldtRgrCmnLcCfg */
5358 /***********************************************************
5360 * Func : rgSCHCfgVldtUeCqiModeCfg
5363 * Desc : Validates UE CQI modes Configuration recieved from RRC.
5373 **********************************************************/
5375 PRIVATE S16 rgSCHCfgVldtUeCqiModeCfg
5378 RgrUeDlCqiCfg *ueDlCqiCfg
5381 PRIVATE S16 rgSCHCfgVldtUeCqiModeCfg(cell, ueDlCqiCfg)
5383 RgrUeDlCqiCfg *ueDlCqiCfg;
5387 TRC2(rgSCHCfgVldtUeCqiModeCfg)
5390 if((ueDlCqiCfg->prdCqiCfg.cqiPmiCfgIdx < 1) ||
5391 (ueDlCqiCfg->prdCqiCfg.cqiPmiCfgIdx > 1024))
5393 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,
5394 "Invalid Periodic CQI Info");
5398 /* Validate UE Aperiodic CQI mode */
5399 if ((ueDlCqiCfg->aprdCqiCfg.pres == TRUE) &&
5400 ((ueDlCqiCfg->aprdCqiCfg.aprdModeEnum > RGR_APRD_CQI_MOD31) ||
5401 (cell->bwCfg.dlTotalBw <= 7)))
5403 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,
5404 "Invalid Aperiodic mode config for DL CQI",
5405 ueDlCqiCfg->aprdCqiCfg.aprdModeEnum);
5409 /* Validate UE Periodic CQI mode */
5410 if (ueDlCqiCfg->prdCqiCfg.prdModeEnum > RGR_PRD_CQI_MOD21)
5412 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,
5413 "Invalid periodic mode config for DL CQI",
5414 ueDlCqiCfg->prdCqiCfg.prdModeEnum);
5417 /* Validate K value in periodic CQI Config */
5418 if(((ueDlCqiCfg->prdCqiCfg.prdModeEnum == RGR_PRD_CQI_MOD20) ||
5419 (ueDlCqiCfg->prdCqiCfg.prdModeEnum == RGR_PRD_CQI_MOD21)) &&
5420 ((ueDlCqiCfg->prdCqiCfg.k < 1)||
5421 (ueDlCqiCfg->prdCqiCfg.k > 4)))
5423 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,
5424 "Invalid K for Subband CQI reporting");
5428 if ((ueDlCqiCfg->prdCqiCfg.type == 1) &&
5429 (ueDlCqiCfg->prdCqiCfg.cqiSetup.prdModeEnum > RGR_PRD_CQI_MOD21))
5431 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,
5432 "Invalid periodic mode config for DL CQI",
5433 ueDlCqiCfg->prdCqiCfg.cqiSetup.prdModeEnum);
5442 /***********************************************************
5444 * Func : rgSCHCfgVldtUeMeasGapAckNakRepCfg
5447 * Desc : Validates UE Measurement Gap and Ack Nack Repetition Configuration recieved from RRC.
5457 **********************************************************/
5459 PRIVATE S16 rgSCHCfgVldtUeMeasGapAckNakRepCfg
5465 PRIVATE S16 rgSCHCfgVldtUeMeasGapAckNakRepCfg(cell, ueCfg)
5471 TRC2(rgSCHCfgVldtUeMeasGapAckNakRepCfg)
5474 if ((ueCfg->ackNackModeEnum == RGR_TDD_ACKNACK_MODE_MULT) &&
5475 (ueCfg->ueAckNackCfg.isAckNackEnabled == TRUE))
5477 RLOG_ARG2(L_ERROR,DBG_CELLID,ueCfg->cellId,"TDD ACK NACK Multiplexing Mode"
5478 "is not allowed when Ack/Nack is Enabled: %d CRNTI:%d",
5479 ueCfg->ueAckNackCfg.ackNackRepFactor,ueCfg->crnti);
5482 #endif /* LTE_TDD */
5483 /* Validate AckNackRep Factor */
5484 if((ueCfg->ueAckNackCfg.isAckNackEnabled == FALSE) &&
5485 (!ueCfg->ueMesGapCfg.isMesGapEnabled))
5490 if(ueCfg->ueAckNackCfg.isAckNackEnabled)
5492 if ( (ueCfg->ueAckNackCfg.ackNackRepFactor < RGR_ACKNACK_REPFACT_N2)
5493 || (ueCfg->ueAckNackCfg.ackNackRepFactor > RGR_ACKNACK_REPFACT_N6))
5495 RLOG_ARG2(L_ERROR,DBG_CELLID,ueCfg->cellId, "Invalid ACK NACK REP Factor:%d CRNTI:%d",
5496 ueCfg->ueAckNackCfg.ackNackRepFactor,ueCfg->crnti);
5500 if(ueCfg->ueMesGapCfg.isMesGapEnabled)
5502 switch(ueCfg->ueMesGapCfg.gapPrd)
5504 case RG_MEAS_GAPPRD_40:
5505 if(ueCfg->ueMesGapCfg.gapOffst >= RG_MEAS_GAPPRD_40)
5507 RLOG_ARG2(L_ERROR,DBG_CELLID,ueCfg->cellId,"Invalid GAP Offset:%d CRNTI:%d",
5508 ueCfg->ueMesGapCfg.gapOffst,ueCfg->crnti);
5512 case RG_MEAS_GAPPRD_80:
5513 if(ueCfg->ueMesGapCfg.gapOffst >= RG_MEAS_GAPPRD_80)
5515 RLOG_ARG2(L_ERROR,DBG_CELLID,ueCfg->cellId,"Invalid GAP Offset:%d CRNTI:%d",
5516 ueCfg->ueMesGapCfg.gapOffst,ueCfg->crnti);
5522 RLOG_ARG2(L_ERROR,DBG_CELLID,ueCfg->cellId,"Invalid GAP Periodicity Settings:%d"
5523 "CRNTI:%d", ueCfg->ueMesGapCfg.gapPrd,ueCfg->crnti);
5530 } /* rgSCHCfgVldtUeMeasGapAckNakRepCfg*/
5533 /***********************************************************
5535 * Func : rgSCHCfgVldtUeMeasGapAckNakRepRecfg
5538 * Desc : Validates UE Measurement Gap and Ack Nack Repetition Configuration recieved from RRC.
5548 **********************************************************/
5550 PRIVATE S16 rgSCHCfgVldtUeMeasGapAckNakRepRecfg
5556 PRIVATE S16 rgSCHCfgVldtUeMeasGapAckNakRepRecfg(cell, ueRecfg)
5558 RgrUeRecfg *ueRecfg;
5562 TRC2(rgSCHCfgVldtUeMeasGapAckNakRepRecfg)
5563 if((ueRecfg->ueAckNackRecfg.isAckNackEnabled == FALSE) &&
5564 (!ueRecfg->ueMeasGapRecfg.isMesGapEnabled))
5569 if(ueRecfg->ueAckNackRecfg.isAckNackEnabled )
5571 /* Validate AckNackRep Factor */
5572 if ( (ueRecfg->ueAckNackRecfg.ackNackRepFactor < RGR_ACKNACK_REPFACT_N2)
5573 || (ueRecfg->ueAckNackRecfg.ackNackRepFactor > RGR_ACKNACK_REPFACT_N6))
5575 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid ACK NACK REP Factor:%d"
5576 "NEW CRNTI:%d",ueRecfg->ueAckNackRecfg.ackNackRepFactor,ueRecfg->newCrnti);
5580 if(ueRecfg->ueMeasGapRecfg.isMesGapEnabled)
5582 switch(ueRecfg->ueMeasGapRecfg.gapPrd)
5584 case RG_MEAS_GAPPRD_40:
5585 if(ueRecfg->ueMeasGapRecfg.gapOffst >= RG_MEAS_GAPPRD_40)
5587 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid GAP Offset:%d"
5588 "NEW CRNTI:%d",ueRecfg->ueMeasGapRecfg.gapOffst,ueRecfg->newCrnti);
5592 case RG_MEAS_GAPPRD_80:
5593 if(ueRecfg->ueMeasGapRecfg.gapOffst >= RG_MEAS_GAPPRD_80)
5595 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid GAP Offset:%d"
5596 "NEW CRNTI:%d",ueRecfg->ueMeasGapRecfg.gapOffst,ueRecfg->newCrnti);
5602 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid GAP Periodicity Settings:%d"
5603 "NEW CRNTI:%d",ueRecfg->ueMeasGapRecfg.gapPrd,ueRecfg->newCrnti);
5610 } /* rgSCHCfgVldtUeMeasGapAckNakRepRecfg*/
5613 /***********************************************************
5615 * Func : rgSCHCfgVldtUeDlSpsCfg
5618 * Desc : Validates UE's DL SPS configuration recieved from RRC.
5628 **********************************************************/
5630 PRIVATE S16 rgSCHCfgVldtUeDlSpsCfg
5633 RgrUeSpsDlCfg *dlSpsCfg
5636 PRIVATE S16 rgSCHCfgVldtUeDlSpsCfg(cell, dlSpsCfg)
5638 RgrUeSpsDlCfg *dlSpsCfg;
5644 TRC2(rgSCHCfgVldtUeDlSpsCfg);
5646 /* peridicity validation done in SPS module */
5647 if ((dlSpsCfg->numPucchVal > RG_SCH_MAX_NUM_N1PUCCH_PER_UE) ||
5648 (dlSpsCfg->numPucchVal == 0))
5650 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid number of n1Pucch values"
5651 " in DL SPS Config");
5655 for (idx = 0; idx < dlSpsCfg->numPucchVal; ++idx)
5657 if (dlSpsCfg->n1PucchVal[idx] > RG_SCH_MAX_N1PUCCH_VAL)
5660 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid N1Pucch value"
5661 " in DL SPS Config %u", dlSpsCfg->n1PucchVal[idx]);
5663 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid N1Pucch value"
5664 " in DL SPS Config %lu", dlSpsCfg->n1PucchVal[idx]);
5669 /* SPS_TODO: check will change for TDD */
5670 if ((dlSpsCfg->numSpsHqProc == 0) ||
5671 (dlSpsCfg->numSpsHqProc > RGSCH_MAX_DL_HQ_PROC))
5673 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid number of SPS HARQ procs"
5674 " in DL SPS Config");
5679 } /* rgSCHCfgVldtDlSpsCfg */
5680 #endif /* LTEMAC_SPS */
5682 /***********************************************************
5684 * Func : rgSCHCfgVldtUePwrCfg
5687 * Desc : Validates UE Group power configuration recieved from RRC.
5697 **********************************************************/
5699 PRIVATE S16 rgSCHCfgVldtUePwrCfg
5702 RgrUeUlPwrCfg *pwrCfg
5705 PRIVATE S16 rgSCHCfgVldtUePwrCfg(cell, pwrCfg)
5707 RgrUeUlPwrCfg *pwrCfg;
5711 TRC2(rgSCHCfgVldtUePwrCfg);
5713 /* Group power control works only in accumulated mode */
5714 if (!pwrCfg->isAccumulated)
5717 if (pwrCfg->uePuschPwr.pres)
5719 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Accumulation configutation"
5720 " not in sync with group power configuration");
5725 if (rgSCHCfgVldtUeGrpPwrCfg(cell, &pwrCfg->uePuschPwr) != ROK)
5727 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid PUSCH Group power"
5731 if (rgSCHCfgVldtUeGrpPwrCfg(cell, &pwrCfg->uePucchPwr) != ROK)
5733 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid PUSCH Group power"
5739 } /* rgSCHCfgVldtUePwrCfg */
5741 /***********************************************************
5743 * Func : rgSCHCfgVldtUeGrpPwrCfg
5746 * Desc : Validates UE Group power configuration recieved from RRC.
5756 **********************************************************/
5758 PRIVATE S16 rgSCHCfgVldtUeGrpPwrCfg
5761 RgrUeGrpPwrCfg *grpPwrCfg
5764 PRIVATE S16 rgSCHCfgVldtUeGrpPwrCfg(cell, grpPwrCfg)
5766 RgrUeGrpPwrCfg *grpPwrCfg;
5770 TRC2(rgSCHCfgVldtUeGrpPwrCfg);
5772 if ((grpPwrCfg->pres) &&
5773 (((grpPwrCfg->tpcRnti > cell->rntiDb.rntiStart) &&
5774 ((grpPwrCfg->tpcRnti <
5775 (cell->rntiDb.rntiStart + cell->rntiDb.maxRntis))))))
5777 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid Uplink Group power "
5783 } /* rgSCHCfgVldtUeGrpPwrCfg */
5786 /***********************************************************
5788 * Func : rgSCHCfgVldtSpsReCfg
5791 * Desc : Validates UE SPS and other SPS dependent
5792 * configuration recieved from RRC.
5802 **********************************************************/
5804 PRIVATE S16 rgSCHCfgVldtSpsReCfg
5811 PRIVATE S16 rgSCHCfgVldtSpsReCfg(cell, ue, ueRecfg)
5814 RgrUeRecfg *ueRecfg;
5818 TRC2(rgSCHCfgVldtSpsReCfg);
5819 if ((ueRecfg->ueRecfgTypes & RGR_UE_DLSPS_RECFG) &&
5820 (ueRecfg->ueSpsRecfg.dlSpsCfg.isDlSpsEnabled))
5822 /* Validating SPS RNTI */
5823 if (((ueRecfg->ueSpsRecfg.spsRnti >= cell->rntiDb.rntiStart) &&
5824 (ueRecfg->ueSpsRecfg.spsRnti<=
5825 (cell->rntiDb.rntiStart+cell->rntiDb.maxRntis)))||
5826 (ueRecfg->ueSpsRecfg.spsRnti == RGSCH_SI_RNTI) ||
5827 (ueRecfg->ueSpsRecfg.spsRnti == RGSCH_P_RNTI))
5829 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid SPS RNTI "
5830 " in DL SPS Recfg OLD CRNTI:%d NEW CCRNTI:%d",
5831 ueRecfg->oldCrnti,ueRecfg->newCrnti);
5834 if (rgSCHCfgVldtUeDlSpsCfg(cell, &ueRecfg->ueSpsRecfg.dlSpsCfg) != ROK)
5836 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid DL SPS configuration"
5837 " for the OLD CRNTI:%d NEW CRNTI:%d",
5838 ueRecfg->oldCrnti,ueRecfg->newCrnti);
5844 if(ueRecfg->ueSpsRecfg.dlSpsCfg.isDlSpsEnabled)
5846 if (ueRecfg->ueRecfgTypes & RGR_UE_DRX_RECFG)
5848 /* ccpu00117035 - MOD - changed instIdx to inst */
5849 /* ccpu00117035 - MOD - changed ueID to oldCrnti*/
5850 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,
5851 " DRX reconfig not supported DL SPS enabled for OLD CRNTI:%d NEW CRNTI:%d",
5852 ueRecfg->oldCrnti,ueRecfg->newCrnti);
5857 /* ccpu00117627 - ADD - SPS recfg validation against HDFDD */
5859 if(ueRecfg->ueSpsRecfg.dlSpsCfg.isDlSpsEnabled)
5861 if(ue->hdFddEnbld == TRUE)
5863 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,
5864 "DL SPS is not supported for HDFDD enabled for OLD CRNTI:%d NEW CRNTI:%d",
5865 ueRecfg->oldCrnti,ueRecfg->newCrnti);
5869 if(ueRecfg->ueSpsRecfg.ulSpsCfg.isUlSpsEnabled)
5871 if(ue->hdFddEnbld == TRUE)
5873 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,
5874 "UL SPS is not supported for HDFDD enabled for OLD CRNTI:%d NEW CRNTI:%d",
5875 ueRecfg->oldCrnti,ueRecfg->newCrnti);
5882 } /*rgSCHCfgVldtSpsReCfg*/
5885 #if ((defined (RGR_CQI_REPT)) && (defined (RGR_V2)))
5886 /***********************************************************
5888 * Func : rgSCHCfgVldtCqiReptReCfg
5891 * Desc : Validates UE CQI report for DL Power control
5892 * configuration recieved from RRC.
5902 **********************************************************/
5904 PRIVATE S16 rgSCHCfgVldtCqiReptReCfg
5910 PRIVATE S16 rgSCHCfgVldtCqiReptReCfg(cell, ueRecfg)
5912 RgrUeRecfg *ueRecfg;
5916 TRC2(rgSCHCfgVldtCqiReptReCfg);
5917 /* Validate DL Power Control Config parameters */
5918 if (ueRecfg->ueCqiReptCfg.numColltdCqiRept > RGR_CQIRPTS_MAXN)
5920 RLOG_ARG3(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalide numColltdCqiRept,"
5921 "MAX supported %d for OLD CRNTI:%d NEW CRNTI:%d",RGR_CQIRPTS_MAXN,
5922 ueRecfg->oldCrnti,ueRecfg->newCrnti);
5927 } /*rgSCHCfgVldtCqiReptReCfg*/
5930 /***********************************************************
5932 * Func : rgSCHCfgRgrLcChfg
5935 * Desc : Handles dedicated logical channel configuration
5936 * recieved from RRC.
5946 **********************************************************/
5948 PUBLIC S16 rgSCHCfgRgrLchCfg
5953 RgSchErrInfo *errInfo
5956 PUBLIC S16 rgSCHCfgRgrLchCfg(cell, ue, lcCfg, errInfo)
5960 RgSchErrInfo *errInfo;
5964 RgSchDlLcCb *dlLc = NULLP;
5965 Inst inst = cell->instIdx;
5970 TRC2(rgSCHCfgRgrLchCfg);
5972 errInfo->errCause = RGSCHERR_CFG_RGR_DED_LC_CFG;
5974 /* Allocate the downlink logical channel control block */
5975 if((ret = rgSCHUtlAllocSBuf(inst, (Data**)&dlLc,
5976 sizeof(RgSchDlLcCb))) != ROK)
5978 RLOG_ARG2(L_ERROR,DBG_CELLID,lcCfg->cellId,"Memory allocation FAILED for "
5979 "Downlink LCId:%d CRNTI:%d", lcCfg->lcId,lcCfg->crnti);
5982 if ((U8 *)dlLc == NULLP)
5984 RLOG_ARG2(L_ERROR,DBG_CELLID,lcCfg->cellId,"Memory allocation FAILED for "
5985 "Downlink LCID:%d CRNTI:%d", lcCfg->lcId,lcCfg->crnti);
5988 dlLc->lcId = lcCfg->lcId;
5990 rgSCHLaaLcCfg(cell, dlLc, lcCfg);
5993 rgSCHDbmInsDlDedLcCb(ue, dlLc);
5995 ret = rgSCHUtlRgrLcCfg(cell, ue, dlLc, lcCfg, errInfo);
6002 rgSCHDbmDelDlDedLcCb(ue, dlLc);
6003 rgSCHCfgFreeDlDedLcCb(cell, ue, dlLc);
6006 RLOG_ARG3(L_ERROR,DBG_CELLID,cell->cellId,"Dedicated logical channel "
6007 "configuration failed at SCH:UEID:%d LCID:%d CRNTI:%d",
6008 ue->ueId, lcCfg->lcId,lcCfg->crnti);
6012 RGSCH_ARRAY_BOUND_CHECK(inst, ue->ul.lcCb, (lcCfg->lcId -1));
6013 if ( !lcCfg->lcId ||
6014 (TRUE == ue->ul.lcCb[lcCfg->lcId -1].isValid))
6019 rgSCHDbmDelDlDedLcCb(ue, dlLc);
6020 rgSCHCfgFreeDlDedLcCb(cell, ue, dlLc);
6023 RLOG_ARG3(L_ERROR,DBG_CELLID,cell->cellId,"Dedicated logical channel "
6024 "configuration failed at SCH: UL LC CB already existing"
6025 " UEID:%d LCID:%d CRNTI:%d",
6026 ue->ueId, lcCfg->lcId,lcCfg->crnti);
6030 /* Create UL LC context to maintain LCG to LC mapping and
6031 LC and QCI mapping, this is for L2 Counters :UL ACTIVE UE
6033 ue->ul.lcCb[lcCfg->lcId -1].isValid = TRUE;
6034 ulLc = &(ue->ul.lcCb[lcCfg->lcId -1]);
6036 ulLc->lcId = lcCfg->lcId;
6037 ulLc->qciCb = &(cell->qciArray[lcCfg->dlInfo.dlQos.qci]);
6038 ulLc->qciCb->qci = lcCfg->dlInfo.dlQos.qci;
6039 ue->ul.lcgArr[lcCfg->lcgId].lcArray[ue->ul.lcgArr[lcCfg->lcgId].numLch] = ulLc;
6040 ulLc->lcg = &ue->ul.lcgArr[lcCfg->lcgId];
6041 ulLc->lcgArrIdx = ue->ul.lcgArr[lcCfg->lcgId].numLch;
6042 ue->ul.lcgArr[lcCfg->lcgId].numLch++;
6044 dlLc->qciCb = &(cell->qciArray[lcCfg->dlInfo.dlQos.qci]);
6045 dlLc->qciCb->qci = lcCfg->dlInfo.dlQos.qci;
6046 if(lcCfg->lcType == CM_LTE_LCH_DTCH)
6048 rgSchAddToL2Meas(cell,dlLc); /*LTE_L2_MEAS_PHASE2*/
6050 #endif /* LTE_L2_MEAS */
6053 } /* rgSCHCfgRgrLchCfg */
6055 /***********************************************************
6057 * Func : rgSCHCfgRgrLcgCfg
6060 * Desc : Handles dedicated logical channel group configuration
6061 * recieved from RRM.
6071 **********************************************************/
6073 PUBLIC S16 rgSCHCfgRgrLcgCfg
6078 RgSchErrInfo *errInfo
6081 PUBLIC S16 rgSCHCfgRgrLcgCfg(cell, ue, lcgCfg, errInfo)
6085 RgSchErrInfo *errInfo;
6091 //#ifdef LTE_L2_MEAS
6095 TRC2(rgSCHCfgRgrLcgCfg);
6097 errInfo->errCause = RGSCHERR_CFG_RGR_DED_LCG_CFG;
6099 ue->ul.lcgArr[lcgCfg->ulInfo.lcgId].lcgId = lcgCfg->ulInfo.lcgId;
6101 ret = rgSCHUtlRgrLcgCfg(cell, ue, lcgCfg, errInfo);
6104 RLOG_ARG3(L_ERROR,DBG_CELLID,cell->cellId,"Dedicated logical channel "
6105 "configuration failed at SCH: UEID:%d LCGID:%d CRNTI:%d",
6106 ue->ueId, lcgCfg->ulInfo.lcgId,lcgCfg->crnti);
6107 /* Roll back lcgCfg */
6108 ue->ul.lcgArr[lcgCfg->ulInfo.lcgId].lcgId = RGSCH_INVALID_LCG_ID;
6109 rgSCHUtlRgrLcgDel(cell, ue, lcgCfg->ulInfo.lcgId);
6113 //#ifdef LTE_L2_MEAS
6114 /* Copy all info of UL LCH in cfg to ulLcgCb */
6115 for (idx = 0; idx < lcgCfg->ulInfo.numLch; idx++)
6117 /* Allocate the uplink logical channel control block */
6118 if((ret = rgSCHUtlAllocSBuf(cell->instIdx, (Data**)&ulLc,
6119 sizeof(RgSchUlLcCb))) != ROK)
6121 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId, "Memory allocation FAILED for ");
6124 if ((U8 *)ulLc == NULLP)
6126 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId, "Memory allocation FAILED for ");
6129 /* Create UL LC context to maintain LCG to LC mapping and
6130 LC and QCI mapping, this is for L2 Counters :UL ACTIVE UE
6132 ulLc->lcId = lcgCfg->ulInfo.lchUlCfg[idx].lcId;
6133 ulLc->qciCb = &(cell->qciArray[lcgCfg->ulInfo.lchUlCfg[idx].qci]);
6134 ulLc->qciCb->qci = lcgCfg->ulInfo.lchUlCfg[idx].qci;
6135 ue->ul.lcgArr[lcgCfg->ulInfo.lcgId].lcArray[idx] = ulLc;
6137 ue->ul.lcCb[ulLc->lcId -1] = ulLc;
6138 ulLc->lcg = &ue->ul.lcgArr[lcgCfg->ulInfo.lcgId];
6139 ulLc->lcgArrIdx = idx;
6141 ue->ul.lcgArr[lcgCfg->ulInfo.lcgId].numLch = lcgCfg->ulInfo.numLch;
6142 #endif /* LTE_L2_MEAS */
6145 } /* rgSCHCfgRgrLcgCfg */
6149 /***********************************************************
6151 * Func : rgSCHCfgRgrCmnLcCfg
6154 * Desc : Handles dedicated logical channel configuration
6155 * recieved from RRC.
6165 **********************************************************/
6167 PRIVATE S16 rgSCHCfgRgrCmnLcCfg
6170 RgrCmnLchCfg *lcCfg,
6171 RgSchErrInfo *errInfo
6174 PRIVATE S16 rgSCHCfgRgrCmnLcCfg(cell, lcCfg, errInfo)
6176 RgrCmnLchCfg *lcCfg;
6177 RgSchErrInfo *errInfo;
6180 RgSchClcDlLcCb cmnLcCb;
6181 TRC2(rgSCHCfgRgrCmnLcCfg);
6183 errInfo->errCause = RGSCHERR_CFG_RGR_CMN_LC_CFG;
6185 cmMemset((U8 *)&cmnLcCb, 0, sizeof(cmnLcCb));
6187 /* Handle configuration for CCCH/BCCH/PCCH */
6188 if (lcCfg->lcType == CM_LTE_LCH_CCCH)
6190 /* UL and DL CCCH configuration */
6191 if (lcCfg->dir & RGR_DIR_TX)
6193 cell->dlCcchId = lcCfg->lcId;
6196 if (lcCfg->dir & RGR_DIR_RX)
6198 cell->ulCcchId = lcCfg->lcId;
6203 cmnLcCb.lcId = lcCfg->lcId;
6204 rgSCHDbmInitCmnLcBoLst(&cmnLcCb);
6205 if (lcCfg->lcType == CM_LTE_LCH_BCCH)
6207 /* BCCH on BCH and DLSCH configuration */
6208 if (lcCfg->dlTrchType == CM_LTE_TRCH_DL_SCH)
6210 rgSCHDbmInsBcchOnDlsch(cell, &cmnLcCb);
6214 rgSCHDbmInsBcchOnBch(cell, &cmnLcCb);
6217 else /* PCCH configuration */
6219 rgSCHDbmInsPcch(cell, &cmnLcCb);
6224 } /* rgSCHCfgRgrCmnLcCfg */
6228 /***********************************************************
6230 * Func : rgSCHCfgFreeDlDedLcCb
6234 * - Processing Steps:
6235 * - Frees downlink dedicated logical channel control block.
6243 **********************************************************/
6245 PRIVATE Void rgSCHCfgFreeDlDedLcCb
6252 PRIVATE Void rgSCHCfgFreeDlDedLcCb(cell, ue, dlLc)
6258 Inst inst = cell->instIdx;
6259 TRC2(rgSCHCfgFreeDlDedLcCb);
6261 rgSCHUtlFreeDlLc(cell, ue, dlLc);
6263 /* De-allocate the Cb */
6264 /* ccpu00117052 - MOD - Passing double pointer
6265 for proper NULLP assignment*/
6266 rgSCHUtlFreeSBuf(inst, (Data **)&dlLc, sizeof(*dlLc));
6269 /* Stack Crash problem for TRACE5 changes. Added the return below */
6272 } /* rgSCHCfgFreeDlDedLcCb */
6275 /***********************************************************
6277 * Func : rgSCHCfgFreeDlCmnLcCb
6281 * - Processing Steps:
6282 * - Frees downlink common logical channel control block.
6290 **********************************************************/
6292 PRIVATE Void rgSCHCfgFreeDlCmnLcCb
6294 RgSchClcDlLcCb *cmnDlLc
6297 PRIVATE Void rgSCHCfgFreeDlCmnLcCb(cmnDlLc)
6298 RgSchClcDlLcCb *cmnDlLc;
6301 TRC2(rgSCHCfgFreeDlCmnLcCb);
6303 cmMemset((U8*)cmnDlLc, 0, sizeof(*cmnDlLc));
6304 cmnDlLc->lcId = RGSCH_INVALID_LC_ID;
6306 } /* rgSCHCfgFreeDlCmnLcCb */
6309 /***********************************************************
6311 * Func : rgSCHCfgFreeCellCb
6315 * - Processing Steps:
6316 * - Frees scheduler cell control block.
6324 **********************************************************/
6326 PUBLIC Void rgSCHCfgFreeCellCb
6331 PUBLIC Void rgSCHCfgFreeCellCb(cell)
6335 Inst inst = cell->instIdx;
6338 RgSchWarningSiInfo *warningSi;
6339 RgSchWarningSiPdu *warningSiPdu;
6342 TRC2(rgSCHCfgFreeCellCb);
6343 /* ccpu00132385- SI Warning PDUs which are not processed need to be deleted */
6344 /* Search for used index in WarningSi */
6345 for(idx = 0; idx < RGR_MAX_NUM_WARNING_SI; idx++)
6347 if(cell->siCb.warningSi[idx].siId == 0)
6349 cell->siCb.siCtx.siId = cell->siCb.warningSi[idx].siId;
6350 warningSi = (RgSchWarningSiInfo *) cell->siCb.
6351 siArray[cell->siCb.siCtx.siId-1].si;
6352 if(warningSi != NULLP)
6354 /* ccpu00136659: CMAS ETWS design change */
6355 while (CM_LLIST_FIRST_NODE(&warningSi->warningSiMsg.segLstCp, node))
6357 warningSiPdu = (RgSchWarningSiPdu *)node->node;
6358 pdu = warningSiPdu->pdu;
6359 /* ccpu00136659: CMAS ETWS design change */
6360 cmLListDelFrm(&warningSi->warningSiMsg.segLstCp, node);
6361 RGSCH_FREE_MSG(pdu);
6363 cell->siCb.siArray[cell->siCb.siCtx.siId-1].si = NULLP;
6366 /* Free lists of the cell */
6367 rgSCHCfgFreeUeLst(cell);
6369 rgSCHCfgFreeSpsUeLst(cell);
6370 #endif /* LTEMAC_SPS */
6372 if ( TRUE == cell->emtcEnable )
6374 rgSCHEmtcCellDel(cell);
6377 rgSCHRamFreeCell(cell);
6379 rgSCHDbmRntiDbDeInit(cell);
6380 /* Deallocate the subframe allocation information */
6381 rgSCHUtlPutSfAlloc(cell);
6382 rgSCHUtlFreeCell(cell);
6384 rgSCHCfgFreeRgrCfgLst(cell);
6385 rgSCHCfgFreeCmnLcLst(cell);
6387 rgSCHUtlPutRlsHqAlloc(cell);
6390 rgSCHDbmDeInitUeTfuPendLst(cell);
6391 #endif /* LTE_TDD */
6394 rgSCHUtlPutSiInfo(cell);
6395 #endif/*RGR_SI_SCH*/
6397 (Void)rgSCHDrxCellDel(cell);
6399 rgSCHUtlFreeSBuf(inst, (Data**)&(cell->dynCfiCb.cceFailSamples),
6400 (cell->dynCfiCb.numFailSamples * sizeof(U16)));
6403 TSL2DeallocCellStatsBlk(cell->cellId);
6407 /* LAA_SCELL: Trigger the De-Init function for the LAA Module */
6408 rgSCHLaaSCellCbDeInit(cell);
6412 if(cell->emtcEnable)
6414 rgSCHEmtcCellFree(cell);
6417 /* De-allocate the Cell */
6418 /* ccpu00117052 - MOD - Passing double pointer
6419 for proper NULLP assignment*/
6420 rgSCHUtlFreeSBuf(inst, (Data **)&cell, sizeof(*cell));
6424 /* Stack Crash problem for TRACE5 changes. Added the return below */
6427 } /* rgSCHCfgFreeCellCb */
6430 /***********************************************************
6432 * Func : rgSCHCfgFreeUeCb
6436 * - Processing Steps:
6437 * - Frees UE control block.
6445 **********************************************************/
6447 PRIVATE Void rgSCHCfgFreeUeCb
6453 PRIVATE Void rgSCHCfgFreeUeCb(cell, ue)
6458 RgSchCmnUlUe *ueUl = RG_SCH_CMN_GET_UL_UE(ue, cell);
6459 RgUeUlHqCb *ulHqEnt;
6461 Inst inst = cell->instIdx;
6464 TRC2(rgSCHCfgFreeUeCb);
6466 /* Free all logical channel info per UE */
6467 while((dlLc = rgSCHDbmGetNextDlDedLcCb(ue, NULLP)) != NULLP)
6469 rgSCHDbmDelDlDedLcCb(ue, dlLc);
6470 rgSCHCfgFreeDlDedLcCb(cell, ue, dlLc);
6472 for (lcCnt =0; lcCnt<RGSCH_MAX_LC_PER_UE; lcCnt++)
6474 if(ue->ul.lcCb[lcCnt].isValid == TRUE)
6476 lcgId = ue->ul.lcCb[lcCnt].lcg->lcgId;
6479 rgSCHUtlRgrLcDel(cell, ue, ue->ul.lcCb[lcCnt].lcId,lcgId);
6480 ue->ul.lcCb[lcCnt].isValid = FALSE;
6485 ulHqEnt = &(ueUl->hqEnt);
6486 /* Free Scheduler specific information per UE */
6487 rgSCHUtlFreeUe(cell, ue);
6489 /* Free Uplink HARQ specific information per UE */
6490 rgSCHUhmFreeUe(cell, ulHqEnt);
6492 if ( ue->drxCb != NULLP)
6495 /* ccpu00117052 - MOD - Passing double pointer
6496 for proper NULLP assignment*/
6497 rgSCHUtlFreeSBuf(cell->instIdx,
6498 (Data**)(&(ue->drxCb)),
6499 sizeof(RgSchDrxUeCb));
6502 ue->drxCb = (RgSchDrxUeCb *)NULLP;
6503 /* Free Downlink HARQ specific information per UE */
6505 /* Release the RNTI */
6508 rgSCHUtlRlsRnti(cell, ue->rntiLnk, FALSE, 0);
6512 /* Fix : syed HO UE does not have a valid ue->rntiLnk */
6513 /* Just indicate to MAC, no need to release at SCH */
6514 rgSCHUtlIndRntiRls2Mac(cell, ue->ueId, FALSE, 0);
6516 /* rg009.201. Added changes of TFU_UPGRADE */
6518 rgSCHCfgPCqiSrsSrUeDel(cell,ue);
6521 rgSCHHdFddUeDel(cell, ue);
6526 TSL2DeallocUeStatsBlk(ue->ueId, ue->tenbStats);
6530 /* CA TODO Some handling needed while SCell Delete*/
6532 /* Delete the UE from the PCell secCellActCeLst*/
6533 rgSCHSCellRmvFrmActLst(cell, ue);
6534 rgSCHSCellDelUe(cell,ue);
6538 rgSCHLaaDeInitDlRbAllocCb(cell, &ue->cellInfo[RGSCH_PCELL_INDEX]->dlAllocCb);
6541 rgSCHUtlFreeSBuf(inst, (Data **)&ue->cellInfo[0], sizeof(RgSchUeCellInfo));
6542 /* De-allocate the Ue */
6543 /* ccpu00117052 - MOD - Passing double pointer
6544 for proper NULLP assignment*/
6548 rgSCHEmtcUeInfoFree(cell, ue);
6551 rgSCHUtlFreeSBuf(inst, (Data **)&ue, sizeof(*ue));
6553 /* Stack Crash problem for TRACE5 changes. Added the return below */
6556 } /* rgSCHCfgFreeUeCb */
6558 /***********************************************************
6560 * Func : rgSCHCfgFreeRgrCfgLst
6564 * - Processing Steps:
6565 * - Frees configuration lists in cell control block.
6573 **********************************************************/
6575 PRIVATE Void rgSCHCfgFreeRgrCfgLst
6580 PRIVATE Void rgSCHCfgFreeRgrCfgLst(cell)
6584 RgSchCfgElem *rgCfgElem;
6585 Inst inst = cell->instIdx;
6587 TRC2(rgSCHCfgFreeRgrCfgLst);
6589 /* Free CURRENT RGR cfg list */
6590 while ((rgCfgElem = rgSCHDbmGetNextCrntRgrCfgElem(cell, NULLP)) != NULLP)
6592 rgSCHDbmDelCrntRgrCfgElem(cell, rgCfgElem);
6593 /* ccpu00117052 - MOD - Passing double pointer
6594 for proper NULLP assignment*/
6595 rgSCHUtlFreeSBuf(inst, (Data **)&rgCfgElem, sizeof(*rgCfgElem));
6598 /* Free PENDING RGR cfg list */
6599 while ((rgCfgElem = rgSCHDbmGetNextPndngRgrCfgElem(cell, NULLP)) != NULLP)
6601 rgSCHDbmDelPndngRgrCfgElem(cell, rgCfgElem);
6602 /* ccpu00117052 - MOD - Passing double pointer
6603 for proper NULLP assignment*/
6604 rgSCHUtlFreeSBuf(inst, (Data **)&rgCfgElem, sizeof(*rgCfgElem));
6608 /* Stack Crash problem for TRACE5 changes. Added the return below */
6611 } /* rgSCHCfgFreeRgrCfgLst */
6614 /***********************************************************
6616 * Func : rgSCHCfgFreeCmnLcLst
6620 * - Processing Steps:
6621 * - Frees common logical channels in cell control block.
6629 **********************************************************/
6631 PRIVATE Void rgSCHCfgFreeCmnLcLst
6636 PRIVATE Void rgSCHCfgFreeCmnLcLst(cell)
6640 RgSchClcDlLcCb *dlCmnLc;
6642 TRC2(rgSCHCfgFreeCmnLcLst);
6644 if ((dlCmnLc = rgSCHDbmGetBcchOnBch(cell)) != NULLP)
6646 rgSCHCfgFreeDlCmnLcCb(dlCmnLc);
6648 if ((dlCmnLc = rgSCHDbmGetFirstBcchOnDlsch(cell)) != NULLP)
6650 rgSCHCfgFreeDlCmnLcCb(dlCmnLc);
6652 if ((dlCmnLc = rgSCHDbmGetSecondBcchOnDlsch(cell)) != NULLP)
6654 rgSCHCfgFreeDlCmnLcCb(dlCmnLc);
6656 if ((dlCmnLc = rgSCHDbmGetPcch(cell)) != NULLP)
6658 rgSCHCfgFreeDlCmnLcCb(dlCmnLc);
6662 /* Stack Crash problem for TRACE5 changes. Added the return below */
6665 } /* rgSCHCfgFreeCmnLcLst */
6668 /***********************************************************
6670 * Func : rgSCHCfgFreeUeLst
6674 * - Processing Steps:
6675 * - Frees UE list in cell control block.
6683 **********************************************************/
6685 PRIVATE Void rgSCHCfgFreeUeLst
6690 PRIVATE Void rgSCHCfgFreeUeLst(cell)
6696 RgSchUeCellInfo *sCellInfo;
6699 TRC2(rgSCHCfgFreeUeLst);
6701 /* Free Ues in the list */
6702 while ((ue = rgSCHDbmGetNextUeCb(cell, NULLP)) != NULLP)
6704 rgSCHDbmDelUeCb(cell, ue);
6707 if(ue->cell != cell)
6713 /* Call MeasGap and AckNakRep processing module */
6714 rgSCHMeasGapANRepUeDel(cell, ue, TRUE);
6716 rgSCHCfgFreeUeCb(cell, ue);
6719 /* De-initialize the Ue list */
6720 rgSCHDbmDeInitUeCbLst(cell);
6724 node = cell->sCellUeLst.first;
6727 sCellInfo = (RgSchUeCellInfo *)node->node;
6729 rgSCHSCellDelUeSCell(sCellInfo->ue->cell, sCellInfo->ue, sCellInfo->sCellIdx);
6733 /* Stack Crash problem for TRACE5 changes. Added the return below */
6736 } /* rgSCHCfgFreeUeLst */
6739 /***********************************************************
6741 * Func : rgSCHCfgFreeSpsUeLst
6745 * - Processing Steps:
6746 * - Frees Sps UE list in cell control block.
6754 **********************************************************/
6756 PRIVATE Void rgSCHCfgFreeSpsUeLst
6761 PRIVATE Void rgSCHCfgFreeSpsUeLst(cell)
6767 TRC2(rgSCHCfgFreeSpsUeLst);
6769 /* Free Ues in the list */
6770 while ((ue = rgSCHDbmGetNextSpsUeCb(cell, NULLP)))
6772 rgSCHDbmDelSpsUeCb(cell, ue);
6775 /* De-initialize the Ue list */
6776 rgSCHDbmDeInitSpsUeCbLst(cell);
6778 } /* rgSCHCfgFreeSpsUeLst */
6780 #endif /* LTEMAC_SPS */
6783 /***********************************************************
6785 * Func : rgSCHCfgVldtRgrCellSiCfg
6787 * Desc : Validates SI Configuration for SI
6797 **********************************************************/
6799 PRIVATE S16 rgSCHCfgVldtRgrCellSiCfg
6805 PRIVATE S16 rgSCHCfgVldtRgrCellSiCfg(inst, siCfg)
6810 U8 idx; /* idx for iteration */
6814 TRC2(rgSCHCfgVldtRgrCellSiCfg);
6818 /* Check that retxCnt value should be <= value of siWinSize.
6819 This validation is only applicable for FDD mode. */
6820 if(siCfg->retxCnt > siCfg->siWinSize)
6822 RLOG0(L_ERROR,"retxCnt is greater than siWinSize, validation failed");
6827 /* Validate that a valid value for numSi has been specified */
6828 if(siCfg->numSi > RGR_MAX_NUM_SI)
6830 RLOG0(L_ERROR,"Validation for numSi in SI CFG failed");
6834 /* MinPeriodicity will have the least configured periodicity
6835 * Hence initializing with Max periodicity */
6836 siCfg->minPeriodicity = RGR_SI_PERD_512;
6838 /*Validate the value of periodicity specified for SIs */
6839 for(idx = 0;idx < siCfg->numSi;idx++)
6841 siCfg->minPeriodicity = RGSCH_MIN(siCfg->minPeriodicity,
6842 siCfg->siPeriodicity[idx]);
6843 /* Set the siPeriodicity as a multiple of 80 subframes */
6844 switch(siCfg->siPeriodicity[idx])
6847 case RGR_SI_PERD_16:
6848 case RGR_SI_PERD_32:
6849 case RGR_SI_PERD_64:
6850 case RGR_SI_PERD_128:
6851 case RGR_SI_PERD_256:
6852 case RGR_SI_PERD_512:
6856 RLOG0(L_ERROR,"Validation for SI Periodicity in SI-CFG failed");
6862 } /* rgSCHCfgVldtRgrCellSiCfg */
6864 /* LTE_ADV_FLAG_REMOVED_START */
6865 /***********************************************************
6867 * Func : rgSCHCfgVldtRgrCellLtrAdvCfg
6869 * Desc : Validates Lte Adv Configuration
6879 **********************************************************/
6881 PRIVATE S16 rgSCHCfgVldtRgrCellLteAdvCfg
6884 RgrLteAdvancedCellConfig *lteAdvCfg,
6888 PRIVATE S16 rgSCHCfgVldtRgrCellLteAdvCfg(inst, lteAdvCfg, dlTotalBw)
6890 RgrLteAdvancedCellConfig *lteAdvCfg;
6894 U8 temp[RGR_ABS_PATTERN_LEN];
6898 TRC2(rgSCHCfgVldtRgrCellLteAdvCfg);
6901 if((lteAdvCfg->pres & RGR_SFR) && (RGR_ENABLE == lteAdvCfg->sfrCfg.status))
6903 if(lteAdvCfg->sfrCfg.cellEdgeRbRange.startRb > lteAdvCfg->sfrCfg.cellEdgeRbRange.endRb)
6905 RLOG0(L_ERROR,"Invalid configuration of cell edge bandwidth for SFR feature");
6909 if(lteAdvCfg->sfrCfg.cellEdgeRbRange.endRb >= dlTotalBw)
6911 RLOG0(L_ERROR,"Invalid configuration of cell edge end RB for SFR feature");
6916 if(lteAdvCfg->sfrCfg.pwrThreshold.pLow >= lteAdvCfg->sfrCfg.pwrThreshold.pHigh)
6918 RLOG0(L_ERROR,"Invalid configuration of power threshold for SFR feature");
6924 if((lteAdvCfg->pres & RGR_ABS) && (RGR_ENABLE == lteAdvCfg->absCfg.status))
6926 if((RGR_ABS_MUTE != lteAdvCfg->absCfg.absPatternType) &&
6927 (RGR_ABS_TRANSMIT != lteAdvCfg->absCfg.absPatternType))
6929 RLOG0(L_ERROR,"Invalid configuration of ABS pattern type");
6933 cmMemcpy(temp, (U8 *) lteAdvCfg->absCfg.absPattern,RGR_ABS_PATTERN_LEN);
6935 /* Added validation for ABS pattern len */
6936 for(idx = 0; idx < RGR_ABS_PATTERN_LEN; idx++)
6938 if((temp[idx] != 1) && (temp[idx] != 0))
6940 RLOG0(L_ERROR,"Invalid configuration of ABS pattern type");
6948 /* LTE_ADV_FLAG_REMOVED_END */
6951 /***********************************************************
6953 * Func : rgSCHCfgVldtRgrCellCsgParamCfg
6955 * Desc : Validates CSG Parameter Configuration
6965 **********************************************************/
6967 PRIVATE S16 rgSCHCfgVldtRgrCellCsgParamCfg
6970 RgrCellCsgParamCfg *csgParam
6973 PRIVATE S16 rgSCHCfgVldtRgrCellCsgParamCfg(inst, csgParam)
6975 RgrCellCsgParamCfg *csgParam;
6979 TRC2(rgSCHCfgVldtRgrCellCsgParamCfg);
6981 RGSCHDBGPRM(inst, (rgSchPBuf(inst), "Validating CSG Parameters \n"));
6983 if(csgParam->minDlResNonCsg > 100)
6985 RLOG0(L_ERROR,"Invalid Configuration of minimum DL resources "
6989 if(csgParam->minUlResNonCsg > 100)
6991 RLOG0(L_ERROR,"Invalid Configuration of minimum UL resources "
6999 * @brief Validates the SI configuration request from RRM to MAC.
7003 * Function : rgSCHCfgVldtRgrSiCfg
7006 * - Validate the range of configured values recieved in
7007 * configuration request.
7008 * - If validated successfully,
7012 * - Else return RFAILED.
7013 * @param[in] Inst inst
7014 * @param[in] RgrCellCfg *siCfg
7015 * @param[out] RgSchCellCb *cell
7016 * @param[out] RgSchErrInfo *errInfo
7022 PUBLIC S16 rgSCHCfgVldtRgrSiCfg
7025 RgrSiCfgReqInfo *siCfg,
7027 RgSchErrInfo *errInfo
7030 PUBLIC S16 rgSCHCfgVldtRgrSiCfg(inst, siCfg, cell, errInfo)
7032 RgrSiCfgReqInfo *siCfg;
7034 RgSchErrInfo *errInfo;
7040 TRC2(rgSCHCfgVldtRgrSiCfg);
7043 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_SI_CFG;
7045 /*Validate the cfgType parameter */
7046 switch(siCfg->cfgType)
7050 numSi = (cell->siCb.siBitMask & RGSCH_SI_SICFG_UPD) ?
7051 cell->siCb.newSiCfg.numSi : cell->siCfg.numSi;
7052 if((siCfg->siId < RGSCH_SI_SIID_LOWER_LMT) ||
7053 (siCfg->siId > numSi))
7055 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId, "Invalid SI Id value"
7059 errInfo->errCause = RGSCHERR_NONE;
7062 case RGR_SI_CFG_TYPE_MIB: /* SI CFG Type MIB */
7063 case RGR_SI_CFG_TYPE_SIB1: /* SI CFG TYPE SIB1 */
7064 case RGR_SI_CFG_TYPE_SIB1_PWS: /* SI CFG TYPE SIB1_PWS */
7065 case RGR_SI_CFG_TYPE_SIB8_CDMA: /* SI CFG TYPE SIB 8 CDMA */
7067 case RGR_SI_CFG_EMTC_TYPE_SIB1_BR:
7068 case RGR_SI_CFG_EMTC_TYPE_SIB1_BR_PER:
7072 case RGR_SI_CFG_TYPE_SI: /* SI CFG TYPE SI */
7073 /*Check that value of SI should be less than equal
7074 to configured numSi parameter value */
7075 /* Added siId validation for lower limit */
7076 numSi = (cell->siCb.siBitMask & RGSCH_SI_SICFG_UPD) ?
7077 cell->siCb.newSiCfg.numSi : cell->siCfg.numSi;
7078 if((siCfg->siId < RGSCH_SI_SIID_LOWER_LMT) ||
7079 (siCfg->siId > numSi))
7081 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId, "Invalid SI Id value"
7086 if(siCfg->siId > ((cell->siCfg.minPeriodicity * 10)/cell->siCfg.siWinSize))
7088 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId, "SiId can not be scheduled ");
7094 case RGR_SI_CFG_EMTC_TYPE_SI:
7095 case RGR_SI_CFG_EMTC_TYPE_SI_PER:
7096 if(ROK != rgEmtcvalidateSiCfg(siCfg,cell))
7103 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId, "Invalid cfgType "
7108 /*Validate the specified pdu */
7109 if(NULLP == siCfg->pdu)
7111 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId, "Invalid NULLP pdu "
7116 /*Check if PDU is of 0 length*/
7117 SFndLenMsg(siCfg->pdu, &msgLen);
7120 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId, "Invalid pdu "
7125 errInfo->errCause = RGSCHERR_NONE;
7129 } /* rgSCHCfgVldtRgrSiCfg */
7130 #endif /*RGR_SI_SCH*/
7132 /* LTE_ADV_FLAG_REMOVED_START */
7134 * @brief Validates the RNTP INF request from RRM to MAC.
7138 * Function : rgSCHCfgVldtRgrLoadInf
7141 * - Validate the range of configured values recieved in
7143 * - If validated successfully,
7147 * - Else return RFAILED.
7148 * @param[in] Inst inst
7149 * @param[in] RgrLoadInfReqInfo *loadInfReq
7150 * @param[out] RgSchCellCb *cell
7151 * @param[out] RgSchErrInfo *errInfo
7157 PUBLIC S16 rgSCHCfgVldtRgrLoadInf
7160 RgrLoadInfReqInfo *loadInfReq,
7162 RgSchErrInfo *errInfo
7165 PUBLIC S16 rgSCHCfgVldtRgrLoadInf(inst, loadInfReq, cell, errInfo)
7167 RgrLoadInfReqInfo *loadInfReq;
7169 RgSchErrInfo *errInfo;
7173 TRC2(rgSCHCfgVldtRgrLoadInf);
7176 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_LOAD_INF;
7178 /* Validate if the CC startRb which we have received from DSFR lies in CE sub-band of the receiving eNB */
7179 if((loadInfReq->rgrCcPHighStartRb >= cell->lteAdvCb.sfrCfg.cellEdgeRbRange.startRb) &&
7180 (loadInfReq->rgrCcPHighStartRb <= cell->lteAdvCb.sfrCfg.cellEdgeRbRange.endRb))
7182 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid rgrCcPHighStartRb received specified");
7186 /* Validate if the CC endRb which we have received from DSFR lies in CE sub-band of the receiving eNB */
7187 if((loadInfReq->rgrCcPHighEndRb >= cell->lteAdvCb.sfrCfg.cellEdgeRbRange.startRb) &&
7188 (loadInfReq->rgrCcPHighEndRb <= cell->lteAdvCb.sfrCfg.cellEdgeRbRange.endRb))
7190 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId, "Invalid rgrCcPHighEndRb received specified");
7194 errInfo->errCause = RGSCHERR_NONE;
7198 } /* rgSCHCfgVldtRgrLoadInf */
7199 /* LTE_ADV_FLAG_REMOVED_END */
7203 /********************************************************************
7204 * UE ACQI, PCQI, RI, SRS and SR Re/Configuration Validation Functions *
7206 *********************************************************************/
7209 * @brief Validates the Tx Mode and PUSCH Mode configuration.
7213 * Function : rgSCHCfgVldtRgrTxmodePuschMode
7216 * - Validate whether the configured PUSCH Mode and the
7217 * Configured Tx Mode are in the right combination
7218 * - If validated successfully,
7223 * @param[in] RgSchCellCb *cellCb
7224 * @param[in] RgrTxMode txMde
7225 * @param[in] RgrAprdCqiMode puschMode
7226 * @param[out] RgSchErrInfo *errInfo
7232 PUBLIC S16 rgSCHCfgVldtRgrTxmodePuschMode
7234 RgSchCellCb *cellCb,
7236 RgrAprdCqiMode puschMode,
7237 RgSchErrInfo *errInfo
7240 PUBLIC S16 rgSCHCfgVldtRgrTxmodePuschMode(cellCb, txMde, puschMode,errInfo)
7241 RgSchCellCb *cellCb;
7243 RgrAprdCqiMode puschMode;
7244 RgSchErrInfo *errInfo;
7247 TRC2(rgSCHCfgVldtRgrTxmodePuschMode);
7250 if (txMde == RGR_UE_TM_1 || txMde == RGR_UE_TM_2 ||
7251 txMde == RGR_UE_TM_3 || txMde == RGR_UE_TM_7)
7253 if (puschMode == RGR_APRD_CQI_MOD12 ||
7254 puschMode == RGR_APRD_CQI_MOD22 ||
7255 puschMode == RGR_APRD_CQI_MOD31)
7261 if (txMde == RGR_UE_TM_4 || txMde == RGR_UE_TM_6)
7263 if (puschMode == RGR_APRD_CQI_MOD20 ||
7264 puschMode == RGR_APRD_CQI_MOD30)
7270 if (txMde == RGR_UE_TM_5 )
7272 if (puschMode != RGR_APRD_CQI_MOD31)
7278 /* TOODO:: Tm8 and TM9 validation has to
7279 * be changed as mentioned inthe commented
7281 /* TM8 and TM9 supports all modes
7282 * Mode 1-2, 2-2, 3-1 if pmi/ri reporting enabled
7283 * 2-0,3-0 of pmi/ri reporitng isdisabled *
7284 * if pmi/ri is enabled
7285 * Mode 1-2, 2-2, 3-1 if with pmi/ri and csi-rs ports > 1
7286 * 2-0,3-0 of pmi/ri reporitng isdisabled and csi-rs ports == 1*/
7290 }/*rgSCHCfgVldtRgrTxmodePuschMode ends*/
7293 * @brief Validates the UE ACQI configuration request from RRM to MAC.
7297 * Function : rgSCHCfgVldtRgrUeACqiCfg
7300 * - Validate the UE configuration request from RRC to MAC at CFG:
7301 * validate the ACQI Configuration
7302 * - If validated successfully,
7307 * @param[in] RgSchCellCb *cellCb,
7308 * @param[in] CmLteRnti crnti,
7309 * @param[in] RgrUeAprdDlCqiCfg *acqiCfg,
7310 * @param[in] RgrUeTxModeCfg txMode,
7311 * @param[out] RgSchErrInfo *errInfo
7318 PUBLIC S16 rgSCHCfgVldtRgrUeACqiCfg
7320 RgSchCellCb *cellCb,
7322 RgrUeAprdDlCqiCfg *acqiCfg,
7323 RgrUeTxModeCfg txMode,
7324 RgSchErrInfo *errInfo
7327 PUBLIC S16 rgSCHCfgVldtRgrUeACqiCfg(cellCb, crnti, acqiCfg,txMode, errInfo)
7328 RgSchCellCb *cellCb;
7330 RgrUeAprdDlCqiCfg *acqiCfg;
7331 RgrUeTxModeCfg txMode;
7332 RgSchErrInfo *errInfo;
7336 RgrAprdCqiMode puschMode;
7337 TRC2(rgSCHCfgVldtRgrUeACqiCfg);
7342 if(txMode.pres == TRUE)
7344 txMde = txMode.txModeEnum;
7345 puschMode = acqiCfg->aprdModeEnum;
7346 if ( ROK != rgSCHCfgVldtRgrTxmodePuschMode(cellCb, txMde,
7347 puschMode, errInfo))
7349 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
7350 "Invalid Aperiodic CQI configuration CRNTI:%d",crnti);
7359 * @brief Validates the Tx Mode and PUCCH Mode configuration.
7363 * Function : rgSCHCfgVldtRgrTxmodePucchMode
7366 * - Validate whether the configured PUCCH Mode and the
7367 * Configured Tx Mode are in the right combination
7368 * - If validated successfully,
7373 * @param[in] RgSchCellCb *cellCb
7374 * @param[in] RgrTxMode txMde
7375 * @param[in] RgrPrdCqiMode pucchMode
7376 * @param[out] RgSchErrInfo *errInfo
7382 PUBLIC S16 rgSCHCfgVldtRgrTxmodePucchMode
7384 RgSchCellCb *cellCb,
7386 RgrPrdCqiMode pucchMode,
7387 RgSchErrInfo *errInfo
7390 PUBLIC S16 rgSCHCfgVldtRgrTxmodePucchMode(cellCb, txMde, pucchMode,errInfo)
7391 RgSchCellCb *cellCb;
7393 RgrPrdCqiMode pucchMode;
7394 RgSchErrInfo *errInfo;
7397 TRC2(rgSCHCfgVldtRgrTxmodePucchMode);
7400 if (pucchMode == RGR_PRD_CQI_MOD10 || pucchMode == RGR_PRD_CQI_MOD20 )
7402 if (txMde ==RGR_UE_TM_4 || txMde ==RGR_UE_TM_5 || txMde ==RGR_UE_TM_6)
7407 else if (pucchMode == RGR_PRD_CQI_MOD11 || pucchMode == RGR_PRD_CQI_MOD21)
7409 if (txMde ==RGR_UE_TM_1 || txMde ==RGR_UE_TM_2 || txMde ==RGR_UE_TM_3 \
7410 || txMde ==RGR_UE_TM_7)
7415 /* TODO:: Tm8 and TM9 validation needs to be added */
7420 * @brief Validates the UE Periodic CQI, PMI, RI, re/configuration request from RRM to MAC.
7424 * Function : rgSCHCfgVldtRgrUePCqiCfg
7427 * - Validate the UE configuration request from RRC to MAC at CFG:
7428 * validate the value range for Periodic CQI, PMI, RI values.
7429 * - If validated successfully,
7434 * @param[in] RgSchCellCb *cellCb,
7435 * @param[in] CmLteRnti crnti,
7436 * @param[in] RgrUePrdDlCqiCfg *cqiCfg,
7437 * @param[in] RgrUeTxModeCfg txMode,
7438 * @param[out] RgSchErrInfo *errInfo
7445 PUBLIC S16 rgSCHCfgVldtRgrUePCqiCfg
7447 RgSchCellCb *cellCb,
7449 RgrUePrdDlCqiCfg *cqiCfg,
7451 RgrUeTxModeCfg txMode,
7452 RgSchErrInfo *errInfo
7455 PUBLIC S16 rgSCHCfgVldtRgrUePCqiCfg(cellCb, crnti, cqiCfg, hdFdd,
7457 RgSchCellCb *cellCb;
7459 RgrUePrdDlCqiCfg *cqiCfg;
7461 RgrUeTxModeCfg txMode;
7462 RgSchErrInfo *errInfo;
7466 PUBLIC S16 rgSCHCfgVldtRgrUePCqiCfg
7468 RgSchCellCb *cellCb,
7470 RgrUePrdDlCqiCfg *cqiCfg,
7471 RgrUeTxModeCfg txMode,
7472 RgSchErrInfo *errInfo
7475 PUBLIC S16 rgSCHCfgVldtRgrUePCqiCfg(cellCb, crnti, cqiCfg, txMode, errInfo)
7476 RgSchCellCb *cellCb;
7478 RgrUePrdDlCqiCfg *cqiCfg;
7479 RgrUeTxModeCfg txMode;
7480 RgSchErrInfo *errInfo;
7485 RgrPrdCqiMode pucchMode;
7487 TRC2(rgSCHCfgVldtRgrUePCqiCfg);
7489 txMde = RGR_UE_TM_1;
7490 pucchMode = RGR_PRD_CQI_MOD20;
7491 if ( RGR_SCH_PCQI_SETUP == cqiCfg->type )
7493 /*1. Validate for Tx Mode and PUCCH Mode combination*/
7494 if(txMode.pres == TRUE)
7496 txMde = txMode.txModeEnum;
7497 pucchMode = cqiCfg->cqiSetup.prdModeEnum;
7498 if ( ROK != rgSCHCfgVldtRgrTxmodePucchMode(cellCb, txMde,
7499 pucchMode, errInfo))
7501 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
7502 "Invalid Tx Mode-PUCCH Mode combination CRNTI:%d",crnti);
7507 /*2. Validate for PCQI Reporting Type and PUCCH Mode combination*/
7508 if((cqiCfg->cqiSetup.cqiRepType==1) &&
7509 ((pucchMode == RGR_PRD_CQI_MOD20) ||
7510 (pucchMode == RGR_PRD_CQI_MOD21)))
7512 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
7513 "Invalid Reporting Type-PUCCH Mode combination CRNTI:%d",crnti);
7517 if((cqiCfg->cqiSetup.cqiRepType==2) &&
7518 ((pucchMode == RGR_PRD_CQI_MOD10) ||
7519 (pucchMode == RGR_PRD_CQI_MOD11)))
7521 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
7522 "Invalid Reporting Type-PUCCH Mode combination CRNTI:%d",crnti);
7526 /*3. Validate CQI/PMI and RI Configuration related parameter values */
7527 /*TODO- To be compared with configured n2Pucch Index*/
7528 if (cqiCfg->cqiSetup.cqiPResIdx > RG_SCH_PUCCH_RES_MAX_SUPP )
7530 RLOG_ARG3(L_ERROR,DBG_CELLID,cellCb->cellId,
7531 "Not Supported or Invalid CQI-PUCCH resourceIndex=%d Cfg Val=%d CRNTI:%d",
7532 RG_SCH_PUCCH_RES_MAX_SUPP, cqiCfg->type,crnti);
7539 if((cqiCfg->cqiSetup.cqiPCfgIdx > RG_SCH_ICQI_MAX_SUPP)||
7540 (cqiCfg->cqiSetup.cqiPCfgIdx < 7) ||
7541 (cqiCfg->cqiSetup.cqiPCfgIdx == 317))
7543 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7544 "Not Supported or Invalid Cfg CQI Min Index Sup =%d"
7545 "Max Index Sup=%d Cfg Val=%d CRNTI:%d", RG_SCH_ICQI_MIN_SUPP,
7546 RG_SCH_ICQI_MAX_SUPP, cqiCfg->type,crnti);
7552 if((cqiCfg->cqiSetup.cqiPCfgIdx > RG_SCH_ICQI_MAX_SUPP)||
7553 (cqiCfg->cqiSetup.cqiPCfgIdx == 317))
7555 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7556 "Not Supported or Invalid Cfg CQI Min Index Sup =%d "
7557 "Max Index Sup=%d Cfg Val=%d CRNTI:%d", RG_SCH_ICQI_MIN_SUPP,
7558 RG_SCH_ICQI_MAX_SUPP, cqiCfg->type,crnti);
7563 if((cqiCfg->cqiSetup.cqiPCfgIdx > RG_SCH_ICQI_MAX_SUPP)||
7564 (cqiCfg->cqiSetup.cqiPCfgIdx == 317))
7566 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7567 "Not Supported or Invalid Cfg CQI Min Index Sup =%d"
7568 "Max Index Sup=%d Cfg Val=%d CRNTI;%d", RG_SCH_ICQI_MIN_SUPP,
7569 RG_SCH_ICQI_MAX_SUPP, cqiCfg->type,crnti);
7574 if((cqiCfg->cqiSetup.cqiRepType < RGR_UE_PCQI_WB_REP) ||
7575 (cqiCfg->cqiSetup.cqiRepType > RGR_UE_PCQI_SB_REP))
7577 RLOG_ARG2(L_ERROR,DBG_CELLID,cellCb->cellId,
7578 "Invalid Cfg CQI Report"
7579 "ModeCfg Val=%d CRNTI:%d", cqiCfg->type,crnti);
7583 if((cqiCfg->cqiSetup.cqiRepType == RGR_UE_PCQI_SB_REP) &&
7584 ((cqiCfg->cqiSetup.k < RG_SCH_CQI_K_MIN) ||
7585 (cqiCfg->cqiSetup.k > RG_SCH_CQI_K_MAX)))
7587 RLOG_ARG2(L_ERROR,DBG_CELLID,cellCb->cellId,
7588 "Invalid CQI Cfg K Cfg Val=%d CRNTI:%d", cqiCfg->type,crnti);
7592 if((cqiCfg->cqiSetup.cqiRepType == RGR_UE_PCQI_SB_REP) &&
7593 (cellCb->bwCfg.dlTotalBw <= 7))
7595 RLOG_ARG2(L_ERROR,DBG_CELLID,cellCb->cellId,
7596 "Invalid Periodic CQI mode Cfg for dlTotalBw (%d) for CRNTI:%d",
7597 cellCb->bwCfg.dlTotalBw, crnti);
7602 if (cqiCfg->cqiSetup.cqiPCfgIdx == RG_SCH_ICQI_RESV_FDD )
7604 RLOG_ARG2(L_ERROR,DBG_CELLID,cellCb->cellId,
7605 "Reserved value Cfg =%d CRNTI:%d",
7606 cqiCfg->cqiSetup.cqiPResIdx,crnti);
7611 /* 4. Check RI Configuration values */
7612 if(cqiCfg->cqiSetup.riEna == TRUE)
7614 if(txMode.pres == TRUE)
7616 if((txMde != RGR_UE_TM_3)
7617 && (txMde != RGR_UE_TM_4)
7618 && (txMde != RGR_UE_TM_8)
7620 && (txMde != RGR_UE_TM_9)
7624 RLOG_ARG2(L_ERROR,DBG_CELLID,cellCb->cellId,
7625 "Invalid Transmission Mode =%d CRNTI:%d",
7631 if(cqiCfg->cqiSetup.riCfgIdx > RG_SCH_IRI_MAX_SUPP)
7633 RLOG_ARG2(L_ERROR,DBG_CELLID,cellCb->cellId,
7634 "Invalid Index RI value Cfg =%d CRNTI:%d",
7635 cqiCfg->cqiSetup.riCfgIdx,crnti);
7646 * @brief Validates the UE SRS Re/Configuation request from RRM to MAC.
7650 * Function : rgSCHCfgVldtRgrUeUlSrsCfg
7653 * - Validate the UE configuration request from RRC to MAC at CFG:
7654 * validate the value range for SRS values.
7655 * - If validated successfully,
7660 * @param[in] RgSchCellCb *cellCb,
7661 * @param[in] CmLteRnti crnti,
7662 * @param[in] RgrUeUlSrsCfg *srsCfg,
7663 * @param[out] RgSchErrInfo *errInfo
7670 PUBLIC S16 rgSCHCfgVldtRgrUeUlSrsCfg
7672 RgSchCellCb *cellCb,
7674 RgrUeUlSrsCfg *srsCfg,
7676 RgSchErrInfo *errInfo
7679 PUBLIC S16 rgSCHCfgVldtRgrUeUlSrsCfg(cellCb, crnti, srsCfg, hdFdd, errInfo)
7680 RgSchCellCb *cellCb;
7682 RgrUeUlSrsCfg *srsCfg;
7684 RgSchErrInfo *errInfo;
7688 PUBLIC S16 rgSCHCfgVldtRgrUeUlSrsCfg
7690 RgSchCellCb *cellCb,
7692 RgrUeUlSrsCfg *srsCfg,
7693 RgSchErrInfo *errInfo
7696 PUBLIC S16 rgSCHCfgVldtRgrUeUlSrsCfg(cellCb, crnti, srsCfg, errInfo)
7697 RgSchCellCb *cellCb;
7699 RgrUeUlSrsCfg *srsCfg;
7700 RgSchErrInfo *errInfo;
7708 TRC2(rgSCHCfgVldtRgrUeUlSrsCfg);
7711 if ( RGR_SCH_SRS_SETUP == srsCfg->type )
7714 /*ccpu00130768 - ADD - if cell specific SRS is not configured*/
7715 if(cellCb->srsCfg.isSrsCfgPres == FALSE)
7717 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
7718 "Cell specific SRS is not configured CRNTI:%d",crnti);
7722 /* 1. Validate SRS Configuration related parameter values */
7723 /* 1.1 iSRS should be 0-636; Ref: 36.213. Table 8.2-1 */
7727 if ( (srsCfg->srsSetup.srsCfgIdx < 7) ||
7728 (srsCfg->srsSetup.srsCfgIdx > RG_SCH_ISRS_MAX_SUPP) )
7730 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7731 "Not Supported or Invalid Cfg "
7732 "SRS Min Index Sup =%d Max Index Sup=%d Cfg Val=%d CRNTI:%d",
7733 RG_SCH_ISRS_MIN_SUPP, RG_SCH_ISRS_MAX_SUPP,
7734 srsCfg->srsSetup.srsCfgIdx,crnti);
7740 if ( srsCfg->srsSetup.srsCfgIdx > RG_SCH_ISRS_MAX_SUPP )
7742 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7743 "Not Supported or Invalid Cfg"
7744 "SRS Min Index Sup =%d Max Index Sup=%d Cfg Val=%d CRNTI:%d",
7745 RG_SCH_ISRS_MIN_SUPP, RG_SCH_ISRS_MAX_SUPP,
7746 srsCfg->srsSetup.srsCfgIdx,crnti);
7752 if ( srsCfg->srsSetup.srsCfgIdx > RG_SCH_ISRS_MAX_SUPP )
7754 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7755 "Not Supported or Invalid Cfg"
7756 "SRS Min Index Sup =%d Max Index Sup=%d Cfg Val=%d CRNTI:%d",
7757 RG_SCH_ISRS_MIN_SUPP, RG_SCH_ISRS_MAX_SUPP,
7758 srsCfg->srsSetup.srsCfgIdx,crnti);
7763 /* Compute SRS Offset and Periodicity */
7764 rgSCHUtlGetCfgPerOff( RG_SCH_TDD_SRS_TBL,
7765 srsCfg->srsSetup.srsCfgIdx,
7766 &srsPeri, &srsOffset);
7768 rgSCHUtlGetCfgPerOff( RG_SCH_FDD_SRS_TBL,
7769 srsCfg->srsSetup.srsCfgIdx,
7770 &srsPeri, &srsOffset);
7772 srsSubframe = srsOffset%RGSCH_NUM_SUB_FRAMES;
7774 if(rgSchTddCellSpSrsSubfrmTbl[cellCb->srsCfg.srsSubFrameCfg][srsSubframe] == FALSE) {
7776 if(rgSchFddCellSpSrsSubfrmTbl[cellCb->srsCfg.srsSubFrameCfg][srsSubframe] == FALSE) {
7778 RLOG_ARG2(L_ERROR,DBG_CELLID,cellCb->cellId,
7779 "UE specific SRS is not occuring in Cell specific SRS subframe"
7780 "srs Cfg Idx =%d CRNTI:%d",
7781 srsCfg->srsSetup.srsCfgIdx,crnti);
7786 if ( srsCfg->srsSetup.fDomPosi > RG_SCH_SRS_FREQDOM_POS_MAX )
7788 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7789 "Not Supported or Invalid Cfg"
7790 "SRS Min Freq Domain Position =%d"
7791 "Max Freq Domain Position =%d Cfg Val=%d CRNTI:%d",
7792 RG_SCH_SRS_FREQDOM_POS_MIN, RG_SCH_SRS_FREQDOM_POS_MAX,
7793 srsCfg->srsSetup.srsCfgIdx,crnti);
7797 if ( srsCfg->srsSetup.txComb > RG_SCH_SRS_TXCOMB_MAX )
7799 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7800 "Not Supported or Invalid Cfg"
7801 "SRS Min TX Comb =%d Max TX Comb =%d Cfg Val=%d CRNTI:%d",
7802 RG_SCH_SRS_TXCOMB_MIN, RG_SCH_SRS_TXCOMB_MAX,
7803 srsCfg->srsSetup.srsCfgIdx,crnti);
7811 * @brief Validates the UE SR Re/configuration request from RRM to MAC.
7815 * Function : rgSCHCfgVldtRgrUeSrCfg
7818 * - Validate the UE re/configuration request from RRC to MAC at CFG:
7819 * validate the value range for SR values.
7820 * - If validated successfully,
7825 * @param[in] RgSchCellCb *cellCb,
7826 * @param[in] CmLteRnti crnti,
7827 * @param[in] RgrUeSrCfg *srCfg,
7828 * @param[out] RgSchErrInfo *errInfo
7835 PUBLIC S16 rgSCHCfgVldtRgrUeSrCfg
7837 RgSchCellCb *cellCb,
7841 RgSchErrInfo *errInfo
7844 PUBLIC S16 rgSCHCfgVldtRgrUeSrCfg(cellCb, crnti, srCfg, hdFdd, errInfo)
7845 RgSchCellCb *cellCb;
7849 RgSchErrInfo *errInfo;
7853 PUBLIC S16 rgSCHCfgVldtRgrUeSrCfg
7855 RgSchCellCb *cellCb,
7858 RgSchErrInfo *errInfo
7861 PUBLIC S16 rgSCHCfgVldtRgrUeSrCfg(cellCb, crnti, srCfg, errInfo)
7862 RgSchCellCb *cellCb;
7865 RgSchErrInfo *errInfo;
7870 TRC2(rgSCHCfgVldtRgrUeSrCfg);
7874 if ( RGR_SCH_SR_SETUP == srCfg->type )
7876 /* 1. Validate SR Configuration related parameter values */
7880 if (( srCfg->srSetup.srResIdx > RG_SCH_SR_RES_IDX ) ||
7881 ( srCfg->srSetup.srCfgIdx < 5 ) ||
7882 ( srCfg->srSetup.srCfgIdx > RG_SCH_ISR_MAX_SUPP ))
7884 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7885 "Invalid SR Index Cfg =%d"
7886 "Max Supp=%d,Min Supp=%d CRNTI:%d", srCfg->srSetup.srCfgIdx,
7887 RG_SCH_ISR_MAX_SUPP, RG_SCH_ISR_MIN_SUPP,crnti);
7894 if (( srCfg->srSetup.srResIdx > RG_SCH_SR_RES_IDX ) ||
7895 ( srCfg->srSetup.srCfgIdx > RG_SCH_ISR_MAX_SUPP ))
7897 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7898 "Invalid SR Index Cfg =%d"
7899 "Max Supp=%d,Min Supp=%d CRNTI:%d", srCfg->srSetup.srCfgIdx,
7900 RG_SCH_ISR_MAX_SUPP, RG_SCH_ISR_MIN_SUPP,crnti);
7906 if (( srCfg->srSetup.srResIdx > RG_SCH_SR_RES_IDX ) ||
7907 ( srCfg->srSetup.srCfgIdx > RG_SCH_ISR_MAX_SUPP ))
7909 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7910 "Invalid SR Index Cfg =%d"
7911 "Max Supp=%d,Min Supp=%d CRNTI:%d", srCfg->srSetup.srCfgIdx,
7912 RG_SCH_ISR_MAX_SUPP, RG_SCH_ISR_MIN_SUPP,crnti);
7923 * @brief Validates the UE Aperiodic & Periodic CQI, PMI, RI, SRS and SR Configuration
7924 * request from RRM to MAC.
7928 * Function :rgSCHCfgVldtCqiSrSrsUeCfg
7931 * - Validate the UE configuration request from RRC to MAC at CFG:
7932 * validate the value range for Aperiodic & Periodic CQI, PMI, RI , SRS and SR values.
7933 * - If validated successfully,
7938 * @param[in] RgSchCellCb *cellCb
7939 * @param[in] RgrUeCfg *ueCfg
7940 * @param[out] RgSchErrInfo *errInfo
7946 PRIVATE S16 rgSCHCfgVldtCqiSrSrsUeCfg
7948 RgSchCellCb *cellCb,
7950 RgSchErrInfo *errInfo
7953 PRIVATE S16 rgSCHCfgVldtCqiSrSrsUeCfg(cellCb, ueCfg, errInfo)
7954 RgSchCellCb *cellCb;
7956 RgSchErrInfo *errInfo;
7960 TRC2(rgSCHCfgVldtCqiSrSrsUeCfg);
7963 /* 1. Validate UE Aperiodic CQI related parameters */
7964 if ( ROK != rgSCHCfgVldtRgrUeACqiCfg (cellCb, ueCfg->crnti,
7965 &ueCfg->ueDlCqiCfg.aprdCqiCfg, ueCfg->txMode, errInfo ))
7967 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
7968 "Invalid Aperiodic CQI configuration CRNTI:%d",ueCfg->crnti);
7972 /* 1. Validate UE Periodic CQI/PMI, SRS and SR related parameters */
7974 if ( ROK != rgSCHCfgVldtRgrUePCqiCfg (cellCb, ueCfg->crnti,
7975 &ueCfg->ueDlCqiCfg.prdCqiCfg, ueCfg->isHdFddEnbld,
7976 ueCfg->txMode, errInfo ))
7978 if ( ROK != rgSCHCfgVldtRgrUePCqiCfg (cellCb, ueCfg->crnti,
7979 &ueCfg->ueDlCqiCfg.prdCqiCfg, ueCfg->txMode, errInfo ))
7982 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
7983 "Invalid Periodic CQI configuration CRNTI:%d",ueCfg->crnti);
7987 /* 2. Validate SRS Configuration related parameter values */
7989 if ( ROK != rgSCHCfgVldtRgrUeUlSrsCfg(cellCb, ueCfg->crnti, &ueCfg->srsCfg,
7990 ueCfg->isHdFddEnbld, errInfo ))
7992 if ( ROK != rgSCHCfgVldtRgrUeUlSrsCfg(cellCb, ueCfg->crnti,
7993 &ueCfg->srsCfg, errInfo ))
7996 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
7997 "Invalid SRS configuration CRNTI:%d",ueCfg->crnti);
8001 /* 3. Validate SR Configuration related parameter values */
8003 if ( ROK != rgSCHCfgVldtRgrUeSrCfg (cellCb, ueCfg->crnti, &ueCfg->srCfg,
8004 ueCfg->isHdFddEnbld, errInfo))
8006 if ( ROK != rgSCHCfgVldtRgrUeSrCfg (cellCb, ueCfg->crnti,
8007 &ueCfg->srCfg, errInfo))
8010 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
8011 "Invalid SR configuration CRNTI:%d",ueCfg->crnti);
8021 /*****************************************************************
8022 * UE PCQI, RI, SRS and SR Re Configuration Validation Functions *
8024 ******************************************************************/
8026 * @brief Validates the UE Periodic CQI, PMI, RI, SRS and SR
8027 * Re-configuration request from RRM to MAC.
8031 * Function : rgSCHCfgVldtCqiSrSrsUeReCfg
8034 * - Validate the UE Re configuration request from RRC to MAC at CFG:
8035 * validate the value range for Periodic CQI, PMI, RI, SRS and SR values.
8036 * - If validated successfully,
8041 * @param[in] RgSchCellCb *cellCb
8042 * @param[in] RgSchUeCb *ueCb
8043 * @param[in] RgrUeCfg *ueCfg
8044 * @param[out] RgSchErrInfo *errInfo
8050 PRIVATE S16 rgSCHCfgVldtCqiSrSrsUeReCfg
8052 RgSchCellCb *cellCb,
8054 RgrUeRecfg *ueReCfg,
8055 RgSchErrInfo *errInfo
8058 PRIVATE S16 rgSCHCfgVldtCqiSrSrsUeReCfg(cellCb, ueCb, ueReCfg, errInfo)
8059 RgSchCellCb *cellCb;
8061 RgrUeRecfg *ueReCfg;
8062 RgSchErrInfo *errInfo;
8065 RgrUeTxModeCfg txMode;
8066 TRC3(rgSCHCfgVldtCqiSrSrsUeReCfg);
8069 txMode.tmTrnstnState = RGR_TXMODE_RECFG_CMPLT;
8070 if ((ueReCfg->ueRecfgTypes & RGR_UE_TXMODE_RECFG) &&
8071 (ueReCfg->txMode.pres == TRUE))
8073 txMode.txModeEnum = ueReCfg->txMode.txModeEnum;
8077 txMode.txModeEnum = ueCb->mimoInfo.txMode;
8080 /* 1. Validate UE CQI/PMI, SRS and SR related parameters */
8082 if ( ueReCfg->ueRecfgTypes & RGR_UE_APRD_DLCQI_RECFG )
8084 if ( ROK != rgSCHCfgVldtRgrUeACqiCfg (cellCb, ueReCfg->oldCrnti,
8085 &ueReCfg->aprdDlCqiRecfg, txMode, errInfo ))
8087 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
8088 "Invalid Aperiodic CQI configuration OLD CRNTI:%d",ueReCfg->oldCrnti);
8094 /* 2. Validate UE CQI/PMI, SRS and SR related parameters */
8096 if ( ueReCfg->ueRecfgTypes & RGR_UE_PCQI_RECFG )
8099 if ( ROK != rgSCHCfgVldtRgrUePCqiCfg (cellCb, ueReCfg->oldCrnti,
8100 &ueReCfg->cqiCfg, ueReCfg->isHdFddEnbld, txMode, errInfo ))
8102 if ( ROK != rgSCHCfgVldtRgrUePCqiCfg (cellCb, ueReCfg->oldCrnti,
8103 &ueReCfg->cqiCfg, txMode, errInfo ))
8107 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
8108 "Invalid Periodic CQI configuration OLD CRNTI:%d",ueReCfg->oldCrnti);
8113 if(ueReCfg->ueRecfgTypes & RGR_UE_SRS_RECFG )
8116 if ( ROK != rgSCHCfgVldtRgrUeUlSrsCfg(cellCb, ueReCfg->oldCrnti,
8117 &ueReCfg->srsCfg, ueReCfg->isHdFddEnbld, errInfo ))
8119 if ( ROK != rgSCHCfgVldtRgrUeUlSrsCfg(cellCb, ueReCfg->oldCrnti,
8120 &ueReCfg->srsCfg, errInfo ))
8123 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
8124 "Invalid SRS configuration OLD CRNTI:%d",ueReCfg->oldCrnti);
8130 if ( ueReCfg->ueRecfgTypes & RGR_UE_SR_RECFG )
8133 if ( ROK != rgSCHCfgVldtRgrUeSrCfg (cellCb, ueReCfg->oldCrnti,
8134 &ueReCfg->srCfg, ueReCfg->isHdFddEnbld, errInfo))
8136 if ( ROK != rgSCHCfgVldtRgrUeSrCfg (cellCb, ueReCfg->oldCrnti,
8137 &ueReCfg->srCfg, errInfo))
8140 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
8141 "Invalid SR configuration OLD CRNTI:%d",ueReCfg->oldCrnti);
8150 /*****************************************************************
8151 * UE ACQI, PCQI, RI, SRS SR Configuration Functions *
8153 ******************************************************************/
8155 * @brief Handles Aperiodic CQI , PMI, RI configuration for a UE.
8159 * Function : rgSCHCfgACqiUeCfg
8161 * Invoking Module Processing:
8162 * - This shall be invoked by SCH_GOM at UE configuration. It
8163 * shall do the validations for the spec-defined values.
8169 * @param[in] RgSchCellCb *cell
8170 * @param[in] RgrTxMode txMode
8171 * @param[in] RgrUeAprdDlCqiCfg *aCqiCfg
8172 * @param[in] CmLteUeCategory ueCat
8178 PUBLIC S16 rgSCHCfgACqiUeCfg
8180 RgSchCellCb *cellCb,
8182 RgSchUeACqiCb *acqiCb,
8184 RgrUeAprdDlCqiCfg *aCqiCfg,
8185 CmLteUeCategory ueCat
8188 PUBLIC S16 rgSCHCfgACqiUeCfg(cellCb,ue,acqiCb ueTxMode, aCqiCfg, ueCat)
8189 RgSchCellCb *cellCb;
8191 RgSchUeACqiCb *acqiCb;
8193 RgrUeAprdDlCqiCfg *aCqiCfg;
8194 CmLteUeCategory ueCat;
8197 U8 M; /*Num of Subbands -- Applicable only for Mode 2-0 and 2-2*/
8198 U8 k; /*SubBand Size (RB) --
8199 Holds different values depending on Mode*/
8200 U8 cqiPmiSzR1; /*CQIPMI Size for Rank =1*/
8201 U8 cqiPmiSzRn1; /*CQIPMI Size for Rank > 1*/
8203 TRC3(rgSCHCfgACqiUeCfg);
8208 acqiCb->aCqiCfg.pres = aCqiCfg->pres;
8209 acqiCb->aCqiCfg.aprdModeEnum = aCqiCfg->aprdModeEnum;
8214 /*Store Trigger Set Bit String to UE */
8215 RgSchUeCellInfo *pCellInfo = RG_SCH_CMN_GET_PCELL_INFO(ue);
8216 pCellInfo->acqiCb.aCqiCfg.triggerSet1 = aCqiCfg->triggerSet1;
8217 pCellInfo->acqiCb.aCqiCfg.triggerSet2 = aCqiCfg->triggerSet2;
8221 switch(aCqiCfg->aprdModeEnum)
8223 case RGR_APRD_CQI_MOD12:
8224 case RGR_APRD_CQI_MOD30:
8225 case RGR_APRD_CQI_MOD31:
8226 RG_SCH_GET_CQI_K_VAL(cellCb->bwCfg.dlTotalBw, k);
8227 acqiCb->N = RGSCH_CEIL(cellCb->bwCfg.dlTotalBw, k);
8231 case RGR_APRD_CQI_MOD20:
8232 case RGR_APRD_CQI_MOD22:
8233 RG_SCH_GET_SBCQI_M_K_VAL(cellCb->bwCfg.dlTotalBw, M, k);
8234 acqiCb->N = RGSCH_CEIL(cellCb->bwCfg.dlTotalBw, k);
8237 acqiCb->L = RgSCHUeAcqi2022LBitWidth[M-1][acqiCb->N-1];
8243 if((ueTxMode == RGR_UE_TM_3) ||
8244 (ueTxMode == RGR_UE_TM_4))
8246 if(cellCb->numTxAntPorts ==2)
8248 acqiCb->riNumBits = 1;
8250 else if(cellCb->numTxAntPorts ==4)
8252 if(ueCat == CM_LTE_UE_CAT_8)
8254 acqiCb->riNumBits = 3;
8256 else if(ueCat >= CM_LTE_UE_CAT_5)
8258 acqiCb->riNumBits = 2;
8262 acqiCb->riNumBits = 1;
8266 rgSCHCfgUtlFetchAcqiBitSz(acqiCb, cellCb->numTxAntPorts,
8267 &cqiPmiSzR1, &cqiPmiSzRn1);
8268 acqiCb->cqiPmiSzR1 = cqiPmiSzR1;
8269 acqiCb->cqiPmiSzRn1 = cqiPmiSzRn1;
8271 acqiCb->cqiReqField = TRUE;
8273 rgSchCmnSetCqiReqField(RG_SCH_CMN_GET_SCELL_INFO(ue, cellCb),ue,&acqiCb->cqiReqField);
8280 * @brief Handles Periodic CQI , PMI, RI configuration for a UE.
8284 * Function : rgSCHCfgPCqiUeCfg
8286 * Invoking Module Processing:
8287 * - This shall be invoked by SCH_GOM at UE configuration. It shall do the
8288 * validations for the spec-defined values.
8291 * - For UE-specific Periodic CQI related configuration,
8292 * - If Periodic CQI/PMI is configured,
8293 * - Update UE with the configured values.
8294 - Compute and Update next occurance of CQI/PMI or RI Tranmission instance.
8295 - Update the CQI offset and CQI perodicity information
8296 - Add Ue to cell's list
8299 * - For UE-specific Periodic RI related configuration,
8300 * - If Periodic RI is configured,
8301 * - Update UE with the configured values.
8302 - Compute and Update next occurance of RI Tranmission instance.
8303 - Update the RI offset and RI perodicity information
8308 * @param[in] RgSchCellCb *cell
8309 * @param[in] RgSchUeCb *ue
8310 * @param[in] RgrUePrdDlCqiCfg *cqiCfg
8311 * @param[in] CmLteUeCategory ueCat
8317 PUBLIC S16 rgSCHCfgPCqiUeCfg
8319 RgSchCellCb *cellCb,
8321 RgrUePrdDlCqiCfg *cqiCfg,
8322 CmLteUeCategory ueCat
8325 PUBLIC S16 rgSCHCfgPCqiUeCfg(cellCb, ueCb, cqiCfg, ueCat)
8326 RgSchCellCb *cellCb;
8328 RgrUePrdDlCqiCfg *cqiCfg;
8329 CmLteUeCategory ueCat;
8332 CmLteTimingInfo timingInfo;
8335 U8 j; /*Bandwidth Parts*/
8338 RgSchUePCqiCb *cqiCb = NULLP;
8339 TRC3(rgSCHCfgPCqiUeCfg);
8341 crntTime = (cellCb->crntTime.sfn * RGSCH_NUM_SUB_FRAMES_5G)+
8342 (cellCb->crntTime.subframe);
8343 cqiCb = RG_SCH_GET_UE_CELL_CQI_CB(ueCb,cellCb);
8344 cqiCb->servCellInfo = ueCb->cellInfo[0];
8345 /* Periodic CQI is setup */
8346 if (cqiCfg->type == RGR_SCH_PCQI_SETUP)
8348 for(loop = 0; loop < MAX_CQI_RI_RPT_BUFF;loop++)
8350 ueCb->rawCqiBitW[loop].type = TFU_RECP_REQ_INVLD; /* setting invalid type*/
8352 /* 1. Copy the Received CQI Cfg parameters to ueCb */
8353 cmMemcpy((U8 *)&cqiCb->cqiCfg, (U8 *)cqiCfg,
8354 sizeof(RgrUePrdDlCqiCfg));
8356 /* 2. Compute Periodic CQI Periodicity and subframe offset */
8358 rgSCHUtlGetCfgPerOff(RG_SCH_FDD_PCQI_TBL, cqiCfg->cqiSetup.cqiPCfgIdx,
8359 &cqiCb->cqiPeri, &cqiCb->cqiOffset);
8361 rgSCHUtlGetCfgPerOff( RG_SCH_TDD_PCQI_TBL,
8362 cqiCfg->cqiSetup.cqiPCfgIdx,
8363 &cqiCb->cqiPeri, &cqiCb->cqiOffset);
8365 RLOG_ARG3(L_DEBUG,DBG_CELLID,cellCb->cellId,
8366 "rgSCHCfgPCqiUeCfg(): UEID:%d CQI Peri=%d, CQI Offset=%d",
8372 cqiTrInstTime = ((cqiCb->cqiPeri+crntTime) - cqiCb->cqiOffset)
8374 cqiCb->nCqiTrIdx = (crntTime +
8375 (cqiCb->cqiPeri - cqiTrInstTime));
8376 /* Introduced timing delta for reception req
8378 if(cqiCb->nCqiTrIdx <= (crntTime + TFU_RECPREQ_DLDELTA))
8380 cqiCb->nCqiTrIdx = cqiCb->nCqiTrIdx + cqiCb->cqiPeri;
8383 /* To handle the SFN wrap around case */
8384 cqiCb->nCqiTrIdx = cqiCb->nCqiTrIdx % (RGSCH_MAX_SFN * RGSCH_NUM_SUB_FRAMES_5G);
8386 timingInfo.sfn = cqiCb->nCqiTrIdx/RGSCH_NUM_SUB_FRAMES_5G;
8387 timingInfo.subframe = cqiCb->nCqiTrIdx % RGSCH_NUM_SUB_FRAMES_5G;
8389 cqiCb->nCqiTrIdx = cqiCb->nCqiTrIdx
8390 %RG_SCH_PCQI_SRS_SR_TRINS_SIZE;
8393 /*CQI Repetition configuration*/
8396 rgSchfillPucchCqiRepNumCountemtc(cqiCb, ueCb);
8400 if(RGR_UE_PCQI_SB_REP == cqiCfg->cqiSetup.cqiRepType)
8402 U8 k; /*SubBand Size (RB) */
8403 RG_SCH_GET_CQI_J_VAL(cellCb->bwCfg.dlTotalBw, j);
8404 RG_SCH_GET_CQI_K_VAL(cellCb->bwCfg.dlTotalBw, k);
8405 cqiCb->J = j; /*Number of Bandwidth Parts*/
8406 /*h: reporting instances required for a complete CQI/PMI report */
8407 /*j:Number of bandwidth parts; k: Subband Size*/
8408 cqiCb->h = (cqiCb->cqiCfg.cqiSetup.k *j )+1;
8409 /* ccpu00140905- L-size is coming as 3 for 100Rbs where it should be 2*/
8410 temp = RGSCH_CEIL(cellCb->bwCfg.dlTotalBw, (j*k));
8411 cqiCb->label = (temp & (temp-1)) ?
8412 (1+ rgSCHUtlLog32bitNbase2(temp)) : rgSCHUtlLog32bitNbase2(temp);
8414 rgSCHTomUtlPcqiSbCalcBpIdx(timingInfo,ueCb, cqiCb);
8419 cqiCb->prioLvl = RG_SCH_CQI_PRIO_LVL_1;
8423 /* Place the UE in cellCb->tIUeLstCp */
8424 cqiCb->cqiLstEnt.node=(PTR) cqiCb;
8426 cqiCb->isCqiIgnoByCollsn = FALSE;
8427 cqiCb->isRiIgnoByCollsn = FALSE;
8431 cmLListAdd2Tail(&cellCb->pCqiSrsSrLst[cqiCb->nCqiTrIdx].cqiLst,
8435 /* 4. Rank Indicator Cfg handler */
8436 rgSCHCfgRiUeCfg(cellCb, ueCb, cqiCfg, ueCat);
8440 cqiCb->cqiCfg.type = RGR_SCH_PCQI_REL;
8441 if(cqiCb->nCqiTrIdx != RG_SCH_INVALID_IDX)
8443 cmLListDelFrm(&cellCb->pCqiSrsSrLst[cqiCb->nCqiTrIdx].cqiLst,\
8446 if(cqiCb->nRiTrIdx != RG_SCH_INVALID_IDX)
8448 cmLListDelFrm(&cellCb->pCqiSrsSrLst[cqiCb->nRiTrIdx].riLst, \
8450 RG_SCH_RECORD(&cqiCb->histElem,RGSCH_ACTION_DEL,
8451 &cellCb->pCqiSrsSrLst[cqiCb->nRiTrIdx].riLst);
8453 cqiCb->nCqiTrIdx = RG_SCH_INVALID_IDX;
8454 cqiCb->nRiTrIdx = RG_SCH_INVALID_IDX;
8455 cqiCb->riDist = RG_SCH_INVALID_IDX;
8457 ueCb->nPCqiCb = cqiCb;
8458 ueCb->nPRiCb = cqiCb;
8463 * @brief Handles Periodic RI configuration for a UE.
8467 * Function : rgSCHCfgRiUeCfg
8469 * Invoking Module Processing:
8470 * - This shall be invoked by SCH_GOM at UE configuration. It shall do the
8471 * validations for the spec-defined values.
8474 * - For UE-specific Periodic RI related configuration,
8475 * - If Periodic RI is configured,
8476 * - Update UE with the configured values.
8477 - Compute and Update next occurance of RI Tranmission instance.
8478 - Update the RI offset and RI perodicity information
8482 * @param[in] RgSchCellCb *cell
8483 * @param[in] RgSchUeCb *ue
8484 * @param[in] RgrUePrdDlCqiCfg *cqiCfg
8485 * @param[in] CmLteUeCategory ueCat
8491 PUBLIC S16 rgSCHCfgRiUeCfg
8493 RgSchCellCb *cellCb,
8495 RgrUePrdDlCqiCfg *cqiCfg,
8496 CmLteUeCategory ueCat
8499 PUBLIC S16 rgSCHCfgRiUeCfg(cellCb, ueCb, cqiCfg, ueCat)
8500 RgSchCellCb *cellCb;
8502 RgrUePrdDlCqiCfg *cqiCfg;
8503 CmLteUeCategory ueCat;
8508 U8 j; /*Bandwidth parts. Valid for Modes 2-0, 2-1*/
8511 RgSchUePCqiCb *cqiCb = NULLP;
8513 TRC3(rgSCHCfgRiUeCfg);
8517 crntTime = (cellCb->crntTime.sfn * RGSCH_NUM_SUB_FRAMES_5G)
8518 +(cellCb->crntTime.subframe);
8519 cqiCb = RG_SCH_GET_UE_CELL_CQI_CB(ueCb,cellCb);
8520 /* 1. Rank Indicator is enabled */
8521 if(cqiCfg->cqiSetup.riEna)
8524 rgSCHUtlGetCfgPerOff(RG_SCH_RI_TBL,
8525 cqiCfg->cqiSetup.riCfgIdx,
8526 &cqiCb->riPeri, &cqiCb->riOffset);
8528 RLOG_ARG3(L_DEBUG,DBG_CELLID,cellCb->cellId,
8529 "rgSCHCfgRiUeCfg(): RI Peri=%d, RI Offset=%d UEID:%d",
8530 cqiCb->riPeri, cqiCb->riOffset,ueCb->ueId);
8532 cqiCb->perRiVal = 1;
8533 cqiCb->invalidateCqi = FALSE;
8535 if(RGR_UE_PCQI_WB_REP == cqiCfg->cqiSetup.cqiRepType)
8538 1. wideband RI reporting is configured
8540 (10*sfn+floor(subframe)-Noffsetcqi-NoffsetRI )Mod(NCqiperiod
8543 periodicity = cqiCb->cqiPeri * cqiCb->riPeri;
8548 * Where Widesband and Subband RI reporting is configured
8549 * (Mode 2-0 or 2-1 )
8550 * (10*sfn+floor(subframe)-Noffsetcqi-NoffsetRI )
8551 * Mod(H. NCqiperiod *MriPeriod )=0
8552 * where H= J * K +1; J=Number of bandwidth parts(BW/subsize).
8553 * K is RGR interf input
8556 RG_SCH_GET_CQI_J_VAL(cellCb->bwCfg.dlTotalBw, j);
8557 cqiCb->h = (cqiCb->cqiCfg.cqiSetup.k *j )+1;
8558 periodicity = cqiCb->h * cqiCb->cqiPeri *
8562 /* In case of SFN wraparound, the SB CQI reporting cycle breaks
8563 * and RI->WB CQI->SBCQI.. should resume. RI is repositioned
8564 * accordingly. WBCQI handling is naturally accomplished */
8565 if (periodicity >= RGSCH_MAX_SUBFRM_5G)
8567 periodicity = cqiCb->cqiOffset - cqiCb->riOffset +
8568 RGSCH_MAX_SUBFRM_5G - (crntTime);
8569 tempIdx = crntTime + periodicity;
8570 printf("CHECK_SID - periodicity %d tempIdx %d\n", periodicity, tempIdx);
8574 if ((crntTime + TFU_RECPREQ_DLDELTA + periodicity) >
8575 (RGSCH_MAX_SUBFRM_5G - 1))
8577 riTrInsTime = (periodicity - cqiCb->cqiOffset + cqiCb->riOffset) % periodicity;
8578 tempIdx = RGSCH_MAX_SUBFRM_5G + (periodicity - riTrInsTime);
8582 riTrInsTime = ((periodicity +crntTime )- \
8583 cqiCb->cqiOffset + cqiCb->riOffset)\
8585 tempIdx = (crntTime + (periodicity -riTrInsTime));
8588 if (tempIdx <= (crntTime + TFU_RECPREQ_DLDELTA))
8590 tempIdx = tempIdx + periodicity;
8592 cqiCb->nRiTrIdx = tempIdx
8593 % RG_SCH_PCQI_SRS_SR_TRINS_SIZE;
8594 if(periodicity >= RG_SCH_PCQI_SRS_SR_TRINS_SIZE)
8596 cqiCb->riDist = rgSCHUtlFindDist((U16)(crntTime + TFU_RECPREQ_DLDELTA),
8603 if(ueCb->mimoInfo.txMode == RGR_UE_TM_3
8604 || ueCb->mimoInfo.txMode == RGR_UE_TM_4)
8606 if (cellCb->numTxAntPorts ==2)
8608 cqiCb->riNumBits = 1;
8610 else if(cellCb->numTxAntPorts ==4)
8612 if(ueCat == CM_LTE_UE_CAT_8)
8614 cqiCb->riNumBits = 3;
8616 else if(ueCat >= CM_LTE_UE_CAT_5)
8618 cqiCb->riNumBits = 2;
8622 cqiCb->riNumBits = 1;
8626 /* Place the UE in cellCb->tIUeLstCp */
8627 cqiCb->riLstEnt.node=(PTR) cqiCb;
8629 cmLListAdd2Tail(&cellCb->pCqiSrsSrLst[cqiCb->nRiTrIdx].riLst,
8631 RG_SCH_RECORD(&cqiCb->histElem,RGSCH_ACTION_ADD,
8632 &cellCb->pCqiSrsSrLst[cqiCb->nRiTrIdx].riLst);
8638 cqiCb->nRiTrIdx = RG_SCH_INVALID_IDX;
8639 cqiCb->riDist = RG_SCH_INVALID_IDX;
8646 /* @brief Handles SRS configuration for a UE.
8650 * Function : rgSCHCfgSrsUeCfg
8652 * Invoking Module Processing:
8653 * - This shall be invoked by SCH_GOM at UE configuration. It shall do the
8654 * validations for the spec-defined values.
8657 * - For UE-specific SRS related configuration,
8658 * - If SRS is configured,
8659 * - Update UE with the configured values.
8660 - Compute and Update next occurance of SRS Tranmission instance.
8661 - Update the SRS offset and SRS perodicity information
8662 - Add Ue to cell's srs list
8664 * - next occurance transmission instance of SRS = RG_SCH_INVALID_IDX
8668 * @param[in] RgSchCellCb *cell
8669 * @param[in] RgSchUeCb *ue
8670 * @param[in] RgrUeUlSrsCfg *srsCfg
8677 PUBLIC S16 rgSCHCfgSrsUeCfg
8679 RgSchCellCb *cellCb,
8681 RgrUeUlSrsCfg *srsCfg
8684 PUBLIC S16 rgSCHCfgSrsUeCfg(cellCb, ueCb, srsCfg)
8685 RgSchCellCb *cellCb;
8687 RgrUeUlSrsCfg *srsCfg;
8694 TRC3(rgSCHCfgSrsUeCfg);
8697 crntTime = (cellCb->crntTime.sfn * RGSCH_NUM_SUB_FRAMES_5G)
8698 +(cellCb->crntTime.subframe);
8700 if(RGR_SCH_SRS_SETUP == srsCfg->type)
8702 /* 1. Copy the Received Cfg parameters to local cb */
8703 cmMemcpy((U8 *)&ueCb->srsCb.srsCfg, (U8 *)srsCfg, sizeof(RgrUeUlSrsCfg));
8706 /* 2. Compute SRS Offset and Periodicity */
8707 rgSCHUtlGetCfgPerOff( RG_SCH_FDD_SRS_TBL,
8708 srsCfg->srsSetup.srsCfgIdx,
8709 &ueCb->srsCb.peri, &ueCb->srsCb.offset);
8711 rgSCHUtlGetCfgPerOff( RG_SCH_TDD_SRS_TBL,
8712 srsCfg->srsSetup.srsCfgIdx,
8713 &ueCb->srsCb.peri, &ueCb->srsCb.offset);
8716 RLOG_ARG3(L_DEBUG,DBG_CELLID,cellCb->cellId,
8717 "rgSCHCfgSrsUeCfg(): SRS Peri=%d, SRS Offset=%d UEID:%d",
8718 ueCb->srsCb.peri,ueCb->srsCb.offset,ueCb->ueId);
8720 /* 3. Compute next Tranmission index for SRS */
8721 /* Referenence: 36.213 Section:8.2
8722 i. SRS transmission instances for TDD with period > 2 and for FDD are
8723 ((10*sfn +Ksrs-suframeoffset))/mod(periodicity))
8725 TDD: Ksrs Table 8.2-3:
8726 ii.The SRS transmission instances for TDD (periodicity == 2)
8727 (Ksrs-Toffset)mod(5)==0. Note: This is not supported now
8730 srsTrInsTime = ((ueCb->srsCb.peri+crntTime) - ueCb->srsCb.offset)
8732 tempIdx = (crntTime + (ueCb->srsCb.peri - srsTrInsTime));
8734 if (tempIdx <= (crntTime + TFU_DELTA))
8736 if (tempIdx <= (crntTime + TFU_RECPREQ_DLDELTA))
8739 tempIdx = tempIdx + ueCb->srsCb.peri;
8741 ueCb->srsCb.nSrsTrIdx =(U16) (tempIdx
8742 % RG_SCH_PCQI_SRS_SR_TRINS_SIZE);
8743 if(ueCb->srsCb.peri >= RG_SCH_PCQI_SRS_SR_TRINS_SIZE)
8746 ueCb->srsCb.srsDist = rgSCHUtlFindDist((U8)(crntTime+TFU_DELTA),
8749 ueCb->srsCb.srsDist = rgSCHUtlFindDist((U8)(crntTime + TFU_RECPREQ_DLDELTA),
8755 ueCb->srsCb.srsDist = 0;
8758 /*UE Tx Antenna Selection - START*/
8759 if(ueCb->ul.ulTxAntSel.pres == TRUE )
8761 /*for both partial and full sounding bandwidth,
8762 and when frequency hopping is disabled */
8763 ueCb->srsCb.selectedAnt = (crntTime/ueCb->srsCb.peri)%2;
8767 /* TS 36.213 specifies that if Tx Antenna Selection is
8768 disabled/not supported then its Port 0*/
8769 ueCb->srsCb.selectedAnt=0;
8771 ueCb->validTxAnt = ueCb->srsCb.selectedAnt;
8772 /*UE Tx Antenna Selection - ENDS*/
8774 ueCb->srsCb.srsLstEnt.node=(PTR)ueCb;
8775 cmLListAdd2Tail(&cellCb->pCqiSrsSrLst[ueCb->srsCb.nSrsTrIdx].srsLst,
8776 &ueCb->srsCb.srsLstEnt);
8782 /* SRS Release / Not configured */
8783 ueCb->srsCb.srsCfg.type = RGR_SCH_SRS_REL;
8784 if(ueCb->srsCb.nSrsTrIdx != RG_SCH_INVALID_IDX)
8786 cmLListDelFrm(&cellCb->pCqiSrsSrLst[ueCb->srsCb.nSrsTrIdx].srsLst,
8787 &ueCb->srsCb.srsLstEnt);
8789 ueCb->srsCb.nSrsTrIdx = RG_SCH_INVALID_IDX;
8790 ueCb->srsCb.srsLstEnt.node =(PTR) NULLP;
8797 /* * @brief Handles SR configuration for a UE.
8801 * Function : rgSCHCfgSrUeCfg
8803 * Invoking Module Processing:
8804 * - This shall be invoked by SCH_GOM at UE configuration. It shall do the
8805 * validations for the spec-defined values.
8807 * - If SR is configured,
8808 * - Update UE with the configured values.
8809 - Compute and Update next occurance of SR Tranmission instance.
8810 - Update the SR offset and SR perodicity information
8811 - Add Ue to cell->tIUeLstCp[n]
8813 * - next occurance transmission instance of SR = RG_INVALID_SR_ID
8818 * @param[in] RgSchCellCb *cell
8819 * @param[in] RgSchUeCb *ue
8820 * @param[in] RgrUeSrCfg *srCfg
8827 PUBLIC S16 rgSCHCfgSrUeCfg
8829 RgSchCellCb *cellCb,
8834 PUBLIC S16 rgSCHCfgSrUeCfg(cellCb, ueCb, srCfg)
8835 RgSchCellCb *cellCb;
8843 TRC3(rgSCHCfgSrUeCfg);
8846 crntTime = (cellCb->crntTime.sfn * RGSCH_NUM_SUB_FRAMES_5G)
8847 +(cellCb->crntTime.subframe);
8848 if(srCfg->type == RGR_SCH_SR_SETUP)
8850 /* 1. Copy the Received Cfg parameters to local cb */
8851 cmMemcpy((U8 *)&ueCb->srCb.srCfg, (U8 *)srCfg, sizeof(RgrUeSrCfg));
8854 /* 2. Compute SR periodicity and offset */
8855 rgSCHUtlGetCfgPerOff( RG_SCH_SR_TBL,
8856 srCfg->srSetup.srCfgIdx,
8857 &ueCb->srCb.peri, &ueCb->srCb.offset);
8859 RLOG_ARG4(L_DEBUG,DBG_CELLID,cellCb->cellId ,
8860 "SR Config: idx(%u), period (%u) offset (%u) UEID:%d",
8861 srCfg->srSetup.srCfgIdx,
8868 rgSchfillPucchSrRepNumCountemtc(ueCb);
8871 /* 3. Compute Next Transmission Instance */
8873 srTrInsTime = ((ueCb->srCb.peri+crntTime) - ueCb->srCb.offset)
8875 ueCb->srCb.nSrTrIdx = (crntTime + (ueCb->srCb.peri- srTrInsTime));
8877 if (ueCb->srCb.nSrTrIdx <= (crntTime + TFU_DELTA))
8879 if (ueCb->srCb.nSrTrIdx <= (crntTime + TFU_RECPREQ_DLDELTA))
8882 ueCb->srCb.nSrTrIdx = ueCb->srCb.nSrTrIdx + ueCb->srCb.peri;
8884 ueCb->srCb.nSrTrIdx = ueCb->srCb.nSrTrIdx
8885 % RG_SCH_PCQI_SRS_SR_TRINS_SIZE;
8886 ueCb->srCb.srLstEnt.node= (PTR) ueCb;
8888 /* 4. Place UE in Cell SR Tranmisison Instance List */
8889 cmLListAdd2Tail(&cellCb->pCqiSrsSrLst[ueCb->srCb.nSrTrIdx].srLst,
8890 &ueCb->srCb.srLstEnt);
8894 ueCb->srCb.srCfg.type = RGR_SCH_SR_REL;
8896 if(ueCb->srCb.nSrTrIdx != RG_SCH_INVALID_IDX)
8898 cmLListDelFrm(&cellCb->pCqiSrsSrLst[ueCb->srCb.nSrTrIdx].srLst,
8899 &ueCb->srCb.srLstEnt);
8901 ueCb->srCb.nSrTrIdx = RG_SCH_INVALID_IDX;
8902 ueCb->srCb.srLstEnt.node = (PTR)NULLP;
8909 /*****************************************************************
8910 * UE PCQI, RI, SRS and SR Re Configuration Functions *
8912 ******************************************************************/
8915 /* * @brief Handles Periodic CQI, PMI, RI Re-configuration for a UE.
8919 * Function : rgSCHCfgPCqiUeReCfg
8921 * Invoking Module Processing:
8922 * - This shall be invoked by SCH_GOM at UE Re configuration. It shall do the
8923 * validations for the spec-defined values.
8926 * - For UE-specific Periodic CQI related configuration,
8927 * - If Periodic CQI/PMI is re configured(first time enabled),
8928 * - Update UE with the configured values.
8929 * - Compute and Update next occurance of CQI/PMI or RI Tranmission
8931 * - Update the CQI offset and CQI perodicity information
8932 * - Add Ue to cell's list
8933 * - If Periodic CQI/PMI is re configured(modify),
8934 * - Update UE with the configured values.
8935 * - Del Ue from cell->tIUeLstCp list
8936 * - Compute and Update next occurance of CQI/PMI or RI Tranmission
8938 * - Update the CQI offset and CQI perodicity information
8939 * - Add Ue to cell's list
8940 * - If Periodic CQI/PMI is re configured(disabled),
8941 * - Update UE with the configured values.
8942 * - Del Ue from cell's list
8943 * - Update next occurance of CQI/PMI or RI Tranmission instance.
8944 * - next occurance of CQI/PMI = RG_INVALID_CQIPMI_ID
8946 * - For UE-specific Periodic RI related configuration,
8947 * - If Periodic RI is configured(first time enabled),
8948 * - Update UE with the configured values.
8949 * - Compute and Update next occurance of RI Tranmission instance.
8950 * - Update the RI offset and RI perodicity information
8951 * - If Periodic RI is configured(modify),
8952 * - Update UE with the configured values.
8953 * - Compute and Update next occurance of RI Tranmission instance.
8954 * - Update the RI offset and RI perodicity information
8956 * - next occurance of RI = RG_INVALID_CQIPMI_ID
8960 * @param[in] RgSchCellCb *cell
8961 * @param[in] RgSchUeCb *ue
8962 * @param[in] RgrUeCfg *ueCfg
8969 PUBLIC S16 rgSCHCfgPCqiUeReCfg
8971 RgSchCellCb *cellCb,
8973 RgrUePrdDlCqiCfg *cqiCfg,
8974 CmLteUeCategory ueCat
8977 PUBLIC S16 rgSCHCfgPCqiUeReCfg(cellCb, ueCb, cqiCfg, ueCat)
8978 RgSchCellCb *cellCb;
8980 RgrUePrdDlCqiCfg *cqiCfg;
8981 CmLteUeCategory ueCat;
8985 RgSchUePCqiCb *cqiCb = NULLP;
8986 TRC3(rgSCHCfgPCqiUeReCfg);
8988 cqiCb = RG_SCH_GET_UE_CELL_CQI_CB(ueCb,cellCb);
8989 /* Fix: ccpu00124008 Fix for incorrect check causing missed CQI reception instance */
8990 if((cqiCfg->type == RGR_SCH_PCQI_SETUP) &&
8991 (cqiCb->cqiCfg.type != RGR_SCH_PCQI_SETUP))
8993 /* 1. cqi is in Release (Disable) state, Recfg is allowing Setup (Enable)
8995 rgSCHCfgPCqiUeCfg(cellCb, ueCb, cqiCfg, ueCat);
8998 else if((cqiCfg->type == RGR_SCH_PCQI_SETUP) &&
8999 (cqiCb->cqiCfg.type == RGR_SCH_PCQI_SETUP ))
9003 2. Present is SETUP(Enable) state, Recfg is modifying SETUP(Enable)
9005 2.1 Delete UE from the cqiList
9006 2.2 Set next occurance Transmission instace to "INVALID"
9007 2.3 Compute Next occurance Transmission instace
9008 2.4 Placed ue in Transmission instance list.
9010 if(cqiCb->nCqiTrIdx != RG_SCH_INVALID_IDX )
9011 cmLListDelFrm(&cellCb->pCqiSrsSrLst[cqiCb->nCqiTrIdx].cqiLst,
9014 if(cqiCb->nRiTrIdx != RG_SCH_INVALID_IDX )
9016 cmLListDelFrm(&cellCb->pCqiSrsSrLst[cqiCb->nRiTrIdx].riLst,
9018 RG_SCH_RECORD(&cqiCb->histElem,RGSCH_ACTION_DEL,
9019 &cellCb->pCqiSrsSrLst[cqiCb->nRiTrIdx].riLst);
9023 cqiCb->cqiLstEnt.next = NULLP;
9024 cqiCb->cqiLstEnt.prev = NULLP;
9025 cqiCb->nCqiTrIdx = RG_SCH_INVALID_IDX;
9026 cqiCb->nRiTrIdx = RG_SCH_INVALID_IDX;
9027 cqiCb->riDist = RG_SCH_INVALID_IDX;
9029 rgSCHCfgPCqiUeCfg(cellCb, ueCb, cqiCfg, ueCat);
9033 /* Present is SETUP(Enable) state, Recfg is Release(Disable) */
9034 rgSCHCfgPCqiUeCfg(cellCb, ueCb, cqiCfg, ueCat);
9037 /* ccpu00140578:: */
9038 cqiCb->riRecpPrcsd = FALSE;
9043 /* * @brief Handles SRS Re-configuration for a UE.
9047 * Function : rgSCHCfgSrsUeReCfg
9049 * Invoking Module Processing:
9050 * - This shall be invoked by SCH_GOM at UE Re configuration. It shall do the
9051 * validations for the spec-defined values.
9054 * - For UE-specific SRS related re configuration,
9055 * - If SRS is configured modified(First time Enabled),
9056 * - Update UE with the configured values.
9057 * - Compute and Update next occurance of SRS Tranmission instance.
9058 * - Update the SRS offset and SRS perodicity information
9059 * - Add Ue to cell's list
9060 * - If SRS is configured modified(Changed offset or index ),
9061 * - Delete UE from cell->tIUeLstCp[n] if present
9062 * - Update UE with the configured values.
9063 * - Compute and Update next occurance of SRS Tranmission instance.
9064 * - Update the SRS offset and SRS perodicity information
9065 * - Add Ue to cell's list
9066 * - If SRS is configured modified(disabled),
9067 * - Delete UE from cell->tIUeLstCp[n] if present
9068 * - Update next occurance of SRS Tranmission instance to "INVALID".
9069 * - Update the SRS offset and SRS perodicity information "INVALID"
9075 * @param[in] RgSchCellCb *cell
9076 * @param[in] RgSchUeCb *ue
9077 * @param[in] RgrUeUlSrsCfg *srsCfg
9084 PUBLIC S16 rgSCHCfgSrsUeReCfg
9086 RgSchCellCb *cellCb,
9088 RgrUeUlSrsCfg *srsCfg
9091 PUBLIC S16 rgSCHCfgSrsUeReCfg(cellCb, ueCb, srsCfg)
9092 RgSchCellCb *cellCb;
9094 RgrUeUlSrsCfg *srsCfg;
9098 TRC3(rgSCHCfgSrsUeReCfg);
9102 if(( RGR_SCH_SRS_SETUP == srsCfg->type) ||
9103 ( RGR_SCH_SRS_SETUP != ueCb->srsCb.srsCfg.type ))
9105 /* 1. Present is Release(Disable) state, Recfg is allowing
9107 rgSCHCfgSrsUeCfg(cellCb, ueCb, srsCfg);
9109 else if (( RGR_SCH_SRS_SETUP == srsCfg->type ) &&
9110 ( RGR_SCH_SRS_SETUP == ueCb->srsCb.srsCfg.type))
9113 /* 2. Present is SETUP(Eanble) state, Recfg is modifying SETUP(Enable)
9115 2.1 Delete UE from the cqiList
9116 2.2 Set next occurance Transmission instance to "INVALID"
9117 2.3 Compute Next occurance Transmission instance
9118 2.4 Placed ue in Transmission instance list.
9120 if (ueCb->srsCb.nSrsTrIdx != RG_SCH_INVALID_IDX)
9122 cmLListDelFrm(&cellCb->pCqiSrsSrLst[ueCb->srsCb.nSrsTrIdx].srsLst,
9123 &ueCb->srsCb.srsLstEnt);
9124 ueCb->srsCb.nSrsTrIdx = RG_SCH_INVALID_IDX;
9127 rgSCHCfgSrsUeCfg(cellCb, ueCb, srsCfg);
9131 /* 3. Present is SETUP(Enable) state, Recfg is Release(Disable)*/
9132 rgSCHCfgSrsUeCfg(cellCb, ueCb, srsCfg);
9134 /* ccpu00140578:: */
9135 ueCb->srsCb.srsRecpPrcsd = FALSE;
9140 /* @brief Handles SR Re-configuration for a UE.
9144 * Function : rgSCHCfgSrUeReCfg
9146 * Invoking Module Processing:
9147 * - This shall be invoked by SCH_GOM at UE Re configuration.
9148 * It shall do the validations for the spec-defined values.
9151 * - For UE-specific SR related re configuration,
9152 * - If SR is configured modified(First time Enabled),
9153 * - Update UE with the configured values.
9154 * - Compute and Update next occurance of SR Tranmission instance.
9155 * - Update the SR offset and SR perodicity information
9156 * - Add Ue to cell->tIUeLstCp[n]
9157 * - If SR is configured modified(Changed offset or index ),
9158 * - Delete UE from cell->tIUeLstCp[n] if present
9159 * - Update UE with the configured values.
9160 * - Compute and Update next occurance of SR Tranmission instance.
9161 * - Update the SR offset and SR perodicity information
9162 * - Add Ue to cell->tIUeLstCp[n]
9163 * - If SR is configured modified(disabled),
9164 * - Delete UE from cell->tIUeLstCp[n] if present
9165 * - Update next occurance of SR Tranmission instance to "INVALID".
9166 * - Update the SR offset and SR perodicity information "INVALID"
9174 * @param[in] RgSchCellCb *cell
9175 * @param[in] RgSchUeCb *ue
9176 * @param[in] RgrUeCfg *ueCfg
9183 PUBLIC S16 rgSCHCfgSrUeReCfg
9185 RgSchCellCb *cellCb,
9190 PUBLIC S16 rgSCHCfgSrUeReCfg(cellCb, ueCb, srCfg)
9191 RgSchCellCb *cellCb;
9196 TRC3(rgSCHCfgSrUeReCfg);
9199 /* Fix : syed Incorrect check for SR RECFG */
9200 if((srCfg->type == RGR_SCH_SR_SETUP) &&
9201 (ueCb->srCb.srCfg.type != RGR_SCH_SR_SETUP))
9204 1. Present is Release(Disable) state, Recfg is allowing SETUP(Enable)
9206 rgSCHCfgSrUeCfg(cellCb, ueCb, srCfg);
9208 else if((srCfg->type == RGR_SCH_SR_SETUP) &&
9209 (ueCb->srCb.srCfg.type == RGR_SCH_SR_SETUP))
9212 /* 2. Present is SETUP(Eanble) state, Recfg is modifying SETUP(Enable)
9214 2.1 Delete UE from the cqiList
9215 2.2 Compute Next occurance Transmission instace
9217 if(ueCb->srCb.nSrTrIdx != RG_SCH_INVALID_IDX )
9219 cmLListDelFrm(&cellCb->pCqiSrsSrLst[ueCb->srCb.nSrTrIdx].srLst,
9220 &ueCb->srCb.srLstEnt);
9221 ueCb->srCb.nSrTrIdx = RG_SCH_INVALID_IDX;
9223 rgSCHCfgSrUeCfg(cellCb, ueCb, srCfg);
9228 /* 3. Present is SETUP(Enable) state, Recfg is Release(Disable) */
9229 rgSCHCfgSrUeCfg(cellCb, ueCb, srCfg);
9235 /* @brief Handles ACQI Re-configuration for a UE.
9239 * Function : rgSCHCfgAcqiUeReCfg
9241 * Invoking Module Processing:
9242 * - This shall be invoked by SCH_GOM at UE Re configuration.
9243 * It shall do the validations for the spec-defined values.
9246 * - For UE-specific ACQI related re configuration,
9247 * - Check if the ACQI Mode has been changed from the
9248 * existing Configuration.
9249 * - If the configuration has been changed,
9250 * - Call Aperiodic Config function to change the config
9257 * @param[in] RgSchCellCb *cell
9258 * @param[in] RgSchUeCb *ue
9259 * @param[in] RgrUeAprdDlCqiCfg *acqiCfg
9266 PUBLIC S16 rgSCHCfgAcqiUeReCfg
9268 RgSchCellCb *cellCb,
9270 RgrUeAprdDlCqiCfg *acqiCfg,
9271 CmLteUeCategory ueCat
9274 PUBLIC S16 rgSCHCfgAcqiUeReCfg(cellCb, ueCb, acqiCfg, ueCat)
9275 RgSchCellCb *cellCb;
9277 RgrUeAprdDlCqiCfg *acqiCfg;
9278 CmLteUeCategory ueCat;
9281 TRC3(rgSCHCfgAcqiUeReCfg);
9283 RETVALUE(rgSCHCfgACqiUeCfg(cellCb,ueCb,(RG_SCH_CMN_GET_ACQICB(ueCb,cellCb))
9284 ,ueCb->mimoInfo.txMode, acqiCfg, ueCat));
9288 /*****************************************************************
9289 * UE PCQI, RI, SRS and SR Configuration Delete *
9291 *****************************************************************/
9293 /* @brief Free Periodic CQI/PMI/RI, SRS and SR transmission instance
9294 * related data structures of this UE from CellCb
9298 * Function : rgSCHCfgPCqiSrsSrUeDel
9300 * Invoking Module Processing:
9301 * - This shall be invoked by SCH_GOM at Ue deletion.
9304 * - For SRS Transmission Instance
9305 * - if (srsTxInst!= RG_INVALID)
9306 * - Remove from the cellCb->tIUeLstCp[srsTxInst*3+2]
9309 * - For SR Transmission Instance
9310 * - if (srTxInst!= RG_INVALID)
9311 * - Remove from the cellCb->tIUeLstCp[srTxInst*3+1]
9314 * - For Periodic CQI/PMI RI Transmission Instance
9315 * - if (pCqiTxInst!= RG_INVALID)
9316 * - Remove from the cellCb->tIUeLstCp[srTxInst*3+0]
9320 * @param[in] RgSchCellCb *cell
9321 * @param[in] RgSchUeCb *ue
9327 PUBLIC S16 rgSCHCfgPCqiSrsSrUeDel
9329 RgSchCellCb *cellCb,
9333 PUBLIC S16 rgSCHCfgPCqiSrsSrUeDel(cellCb, ueCb)
9334 RgSchCellCb *cellCb;
9342 RgSchUePCqiCb *cqiRiCb = NULLP;
9343 TRC3(rgSCHCfgPCqiSrsSrUeDel);
9345 cqiRiCb = RG_SCH_GET_UE_CELL_CQI_CB(ueCb,cellCb);
9349 /* Delete SRS Transmission Instance */
9350 if (ueCb->srsCb.nSrsTrIdx != RG_SCH_INVALID_IDX)
9352 cmLListDelFrm(&cellCb->pCqiSrsSrLst[ueCb->srsCb.nSrsTrIdx].srsLst,
9353 &ueCb->srsCb.srsLstEnt);
9354 ueCb->srsCb.nSrsTrIdx = RG_SCH_INVALID_IDX;
9357 /* Delete SR Transmission Instance */
9358 if (ueCb->srCb.nSrTrIdx != RG_SCH_INVALID_IDX)
9360 cmLListDelFrm(&cellCb->pCqiSrsSrLst[ueCb->srCb.nSrTrIdx].srLst,
9361 &ueCb->srCb.srLstEnt);
9362 ueCb->srCb.nSrTrIdx = RG_SCH_INVALID_IDX;
9365 /* Delete Periodic CQI/PMI Transmission Instance */
9366 if (cqiRiCb->nCqiTrIdx != RG_SCH_INVALID_IDX)
9368 cmLListDelFrm(&cellCb->pCqiSrsSrLst[cqiRiCb->nCqiTrIdx].cqiLst,
9369 &cqiRiCb->cqiLstEnt);
9370 cqiRiCb->nCqiTrIdx = RG_SCH_INVALID_IDX;
9372 /* Delete Periodic RI Transmission Instance */
9374 if (cqiRiCb->nRiTrIdx != RG_SCH_INVALID_IDX)
9376 cmLListDelFrm(&cellCb->pCqiSrsSrLst[cqiRiCb->nRiTrIdx].riLst,
9377 &cqiRiCb->riLstEnt);
9378 RG_SCH_RECORD(&cqiRiCb->histElem,RGSCH_ACTION_DEL,
9379 &cellCb->pCqiSrsSrLst[cqiRiCb->nRiTrIdx].riLst);
9380 cqiRiCb->nRiTrIdx = RG_SCH_INVALID_IDX;
9385 for (cellIdx =1; cellIdx <= RG_SCH_MAX_SCELL; cellIdx++)
9387 /* If a serving cell is configured */
9388 if(ueCb->cellInfo[cellIdx] != NULLP)
9390 /* If the serving cell is in ACTIVE state and
9391 If it is not the same serving cell as cqiRiCb for which
9392 collision is being checked */
9393 cqiRiCb = &ueCb->cellInfo[cellIdx]->cqiCb;
9394 /* Delete Periodic CQI/PMI Transmission Instance */
9395 if (cqiRiCb->nCqiTrIdx != RG_SCH_INVALID_IDX)
9397 cmLListDelFrm(&cellCb->pCqiSrsSrLst[cqiRiCb->nCqiTrIdx].cqiLst,
9398 &cqiRiCb->cqiLstEnt);
9399 cqiRiCb->nCqiTrIdx = RG_SCH_INVALID_IDX;
9401 /* Delete Periodic RI Transmission Instance */
9403 if (cqiRiCb->nRiTrIdx != RG_SCH_INVALID_IDX)
9405 cmLListDelFrm(&cellCb->pCqiSrsSrLst[cqiRiCb->nRiTrIdx].riLst,
9406 &cqiRiCb->riLstEnt);
9407 RG_SCH_RECORD(&cqiRiCb->histElem,RGSCH_ACTION_DEL,
9408 &cellCb->pCqiSrsSrLst[cqiRiCb->nRiTrIdx].riLst);
9409 cqiRiCb->nRiTrIdx = RG_SCH_INVALID_IDX;
9413 /* If all of the num of configured scells are checked then break */
9414 if (sCellCnt == ueCb->numSCells)
9426 /* @brief Search the cfgIdx in given table and retrive periodicity & offset
9429 * Function : rgSCHUtlGetCfgPerOff
9431 * Invoking Module Processing:
9432 * - This shall be invoked by Cfg Module
9435 * binary search for given entry in table
9436 * find the periodicty, offset for a given config index from the table
9438 * @param[in] RgSchPerTbl tbl
9439 * @param[in] U16 cfgIdx
9440 * @param[out] U16 *peri
9441 * @param[out] U16 *offset
9448 PUBLIC S16 rgSCHUtlGetCfgPerOff
9456 PUBLIC S16 rgSCHUtlGetCfgPerOff ( tbl, cfgIdx, peri, offset)
9466 CONSTANT RgSchUePCqiSrsSrCfgIdxTbl* table;
9467 TRC3(rgSCHUtlGetCfgPerOff);
9469 /* Added the function instead of the MACRO to get the
9470 * periodicity table */
9471 table = rgSCHCfgUtlGetPcqiSrsSrRiTbl ( tbl,&min,&max );
9474 if (( cfgIdx >= table[mid].min) &&
9475 ( cfgIdx <= table[mid].max))
9477 *peri = table[mid].peri;
9478 *offset = cfgIdx - table[mid].offset;
9482 if ( cfgIdx > table[mid].min)
9491 }while( min <= max );
9497 /***********************************************************
9499 * Func : rgSCHCfgUtlFetchAcqiBitSz
9502 * Desc : Fetch the CQI/PMI bits for a UE based on the mode and store them
9512 **********************************************************/
9514 PRIVATE Void rgSCHCfgUtlFetchAcqiBitSz
9516 RgSchUeACqiCb *acqiCb,
9522 PRIVATE Void rgSCHCfgUtlFetchAcqiBitSz(acqiCb, numTxAnt, cqiPmiSzR1, cqiPmiSzRn1)
9523 RgSchUeACqiCb *acqiCb;
9533 TRC3(rgSCHCfgUtlFetchAcqiBitSz);
9535 confRepMode = acqiCb->aCqiCfg.aprdModeEnum;
9538 case RGR_APRD_CQI_MOD12:
9542 *cqiPmiSzR1 = 4 + 2*acqiCb->N;
9543 *cqiPmiSzRn1 = 8+ acqiCb->N;
9545 else if(numTxAnt == 4)
9547 *cqiPmiSzR1 = 4 + 4*acqiCb->N;
9548 *cqiPmiSzRn1 = 8 + 4*acqiCb->N;
9553 case RGR_APRD_CQI_MOD20:
9555 *cqiPmiSzR1 = 6 + acqiCb->L;
9556 *cqiPmiSzRn1 = 6 + acqiCb->L;
9560 case RGR_APRD_CQI_MOD22:
9564 *cqiPmiSzR1 = 10 + acqiCb->L;
9565 *cqiPmiSzRn1 = 14 + acqiCb->L;
9567 else if(numTxAnt == 4)
9569 *cqiPmiSzR1 = 14 + acqiCb->L;
9570 *cqiPmiSzRn1 = 20 + acqiCb->L;
9575 case RGR_APRD_CQI_MOD30:
9577 *cqiPmiSzR1 = 4 + 2*acqiCb->N;
9578 *cqiPmiSzRn1 = 4 + 2*acqiCb->N;
9582 case RGR_APRD_CQI_MOD31:
9586 *cqiPmiSzR1 = 6 + 2*acqiCb->N;
9587 *cqiPmiSzRn1 = 9 + 4*acqiCb->N;
9589 else if(numTxAnt == 4)
9591 *cqiPmiSzR1 = 8 + 2*acqiCb->N;
9592 *cqiPmiSzRn1 = 12 + 4*acqiCb->N;
9601 /* Added the function rgSCHCfgUtlGetPcqiCrsSrRiTbl to be used
9602 * instead of the MACRO RG_SCH_GET_PERIODICITY_TBL */
9603 /***********************************************************
9605 * Func : rgSCHCfgUtlGetPcqiCrsSrRiTbl
9608 * Desc : Get the Srs Cqi Crs Ri Table
9617 **********************************************************/
9620 PRIVATE CONSTANT RgSchUePCqiSrsSrCfgIdxTbl * rgSCHCfgUtlGetPcqiSrsSrRiTbl
9622 RgSchPerTbl tblType,
9627 PRIVATE CONSTANT RgSchUePCqiSrsSrCfgIdxTbl * rgSCHCfgUtlGetPcqiSrsSrRiTbl(tblType, min, max)
9628 RgSchPerTbl tblType;
9633 CONSTANT RgSchUePCqiSrsSrCfgIdxTbl * table;
9634 TRC3(rgSCHCfgUtlGetPcqiCrsSrRiTbl);
9639 case RG_SCH_FDD_PCQI_TBL:
9641 table = rgSchUePCqiCfgIdxFddTbl;
9643 * max=RG_SCH_CQIPMI_CFGIDX_MAX_FDD;
9646 case RG_SCH_TDD_PCQI_TBL:
9648 table = rgSchUeCqiPmiCfgIdxTddTbl;
9650 * max=RG_SCH_CQIPMI_CFGIDX_MAX_TDD;
9655 table = rgSchUeRiCfgIdxTbl;
9657 * max=RG_SCH_RI_CFGIDX_MAX;
9660 case RG_SCH_FDD_SRS_TBL:
9662 table = rgSchUeSrsCfgIdxFddTbl;
9664 * max=RG_SCH_SRS_ISRS_INDX_MAX_FDD;
9667 case RG_SCH_TDD_SRS_TBL:
9669 table = rgSchUeSrsCfgIdxTddTbl;
9671 * max=RG_SCH_SRS_ISRS_INDX_MAX_TDD;
9676 table = rgSchUeSrCfgIdxTbl;
9678 * max=RG_SCH_ISR_INDX_MAX;
9683 table = (CONSTANT RgSchUePCqiSrsSrCfgIdxTbl *) 0;
9693 #endif /* TFU_UPGRADE */
9695 /***********************************************************
9697 * Func : rgSCHCfgVldtDrxUeCfg
9700 * Desc : Validates UE DRX Timers Configuration recieved from RRC.
9710 **********************************************************/
9712 PRIVATE S16 rgSCHCfgVldtDrxUeCfg
9715 RgrUeDrxCfg *ueDrxCfg
9718 PRIVATE S16 rgSCHCfgVldtDrxUeCfg(cell, ueDrxCfg)
9720 RgrUeDrxCfg *ueDrxCfg;
9723 TRC2(rgSCHCfgVldtDrxUeCfg)
9726 if (ueDrxCfg->isDrxEnabled == FALSE)
9732 if ( ueDrxCfg->cqiMask.pres )
9734 if ( ueDrxCfg->cqiMask.val != RGR_DRX_SETUP )
9737 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid cqiMask configuration (%d)",
9738 ueDrxCfg->cqiMask.val);
9740 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid cqiMask configuration(%ld)",
9741 ueDrxCfg->cqiMask.val);
9746 #endif /*LTEMAC_R9*/
9748 if(ueDrxCfg->isEmtcUe)
9750 if(ueDrxCfg->drxOnDurTmrR13Pres)
9752 if ( rgSCHEmtcCfgVldtDrxOnDurCfg(ueDrxCfg->drxOnDurTmr) != ROK )
9754 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid onDurTimer configuration(%d)",
9755 ueDrxCfg->drxOnDurTmr);
9761 if (rgSCHCfgVldtDrxOnDurCfg(ueDrxCfg->drxOnDurTmr) != ROK )
9763 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid onDurTimer configuration(%d) for EMTC",
9764 ueDrxCfg->drxOnDurTmr);
9773 if ( rgSCHCfgVldtDrxOnDurCfg(ueDrxCfg->drxOnDurTmr) != ROK )
9775 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid onDurTimer configuration(%d) for EMTC",
9776 ueDrxCfg->drxOnDurTmr);
9781 if ( rgSCHCfgVldtDrxInActvCfg(ueDrxCfg->drxInactvTmr) != ROK )
9783 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid Inactivity configuration(%d)",
9784 ueDrxCfg->drxInactvTmr);
9788 if(ueDrxCfg->isEmtcUe)
9790 if(ueDrxCfg->drxRetxTmrR13Pres)
9792 if ( rgSCHEmtcCfgVldtDrxReTxCfg(ueDrxCfg->drxRetxTmr) != ROK )
9794 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid DrxReTX configuration(%d) for EMTC",
9795 ueDrxCfg->drxRetxTmr);
9801 if (rgSCHCfgVldtDrxReTxCfg(ueDrxCfg->drxRetxTmr) != ROK )
9803 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid DrxReTX configuration(%d)",
9804 ueDrxCfg->drxRetxTmr);
9813 if ( rgSCHCfgVldtDrxReTxCfg(ueDrxCfg->drxRetxTmr) != ROK )
9815 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid DrxReTX configuration(%d)",
9816 ueDrxCfg->drxRetxTmr);
9821 if(ueDrxCfg->isEmtcUe)
9823 if ( rgSCHEmtcCfgVldtDrxUlReTxCfg(ueDrxCfg->emtcDrxUlRetxTmr) != ROK )
9825 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid DrxReTX configuration(%d) for EMTC",
9826 ueDrxCfg->drxRetxTmr);
9833 if ( rgSCHCfgVldtDrxLngCycCfg(ueDrxCfg->drxLongCycleOffst) != ROK )
9835 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid LongCycle configuration");
9839 if ( ueDrxCfg->drxLongCycleOffst.longDrxCycle < ueDrxCfg->drxOnDurTmr )
9841 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid combination of Long DRX Cycle "
9842 " and onDuration timer values");
9847 if( rgSCHCfgVldtTddDrxCycCfg(cell, ueDrxCfg->drxLongCycleOffst.longDrxCycle,
9848 ueDrxCfg->drxOnDurTmr, ueDrxCfg->drxLongCycleOffst.drxStartOffst) != ROK)
9850 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid combination of Long DRX Cycle "
9851 " and onDuration timer values");
9856 if( TRUE == ueDrxCfg->drxShortDrx.pres )
9858 if ( ueDrxCfg->drxShortDrx.shortDrxCycle < ueDrxCfg->drxOnDurTmr )
9860 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid combination of short DRX "
9861 "Cycle and onDuration timer values");
9865 if ( (ueDrxCfg->drxLongCycleOffst.longDrxCycle %
9866 ueDrxCfg->drxShortDrx.shortDrxCycle) != 0)
9868 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId," Long DRX cycle is not multiple of "
9873 if ( rgSCHCfgVldtDrxShrtCycCfg(ueDrxCfg->drxShortDrx) != ROK )
9875 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid Short Cycle configuration");
9880 if( rgSCHCfgVldtTddDrxCycCfg(cell, ueDrxCfg->drxShortDrx.shortDrxCycle,
9881 ueDrxCfg->drxOnDurTmr,
9882 ueDrxCfg->drxLongCycleOffst.drxStartOffst %
9883 ueDrxCfg->drxShortDrx.shortDrxCycle) != ROK)
9885 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid combination of Long DRX Cycle "
9886 " and onDuration timer values");
9893 }/*rgSCHCfgVldtDrxUeCfg*/
9895 /***********************************************************
9897 * Func : rgSCHCfgVldtDrxOnDurCfg
9900 * Desc : Validates UE DRX On Duration configuration
9901 * recieved from RRC.
9911 **********************************************************/
9913 PRIVATE S16 rgSCHCfgVldtDrxOnDurCfg
9918 PRIVATE S16 rgSCHCfgVldtDrxOnDurCfg(onDurTmr)
9922 TRC2(rgSCHCfgVldtDrxOnDurCfg)
9926 case RGR_DRX_PRD_1PSF:
9927 case RGR_DRX_PRD_2PSF:
9928 case RGR_DRX_PRD_3PSF:
9929 case RGR_DRX_PRD_4PSF:
9930 case RGR_DRX_PRD_5PSF:
9931 case RGR_DRX_PRD_6PSF:
9932 case RGR_DRX_PRD_8PSF:
9933 case RGR_DRX_PRD_10PSF:
9934 case RGR_DRX_PRD_20PSF:
9935 case RGR_DRX_PRD_30PSF:
9936 case RGR_DRX_PRD_40PSF:
9937 case RGR_DRX_PRD_50PSF:
9938 case RGR_DRX_PRD_60PSF:
9939 case RGR_DRX_PRD_80PSF:
9940 case RGR_DRX_PRD_100PSF:
9941 case RGR_DRX_PRD_200PSF:
9948 }/*switch(onDurTmr)*/
9951 }/*rgSCHCfgVldtOnDurCfg*/
9953 /***********************************************************
9955 * Func : rgSCHCfgVldtDrxInActvCfg
9958 * Desc : Validates UE DRX InActivity configuration
9959 * recieved from RRC.
9969 **********************************************************/
9971 PRIVATE S16 rgSCHCfgVldtDrxInActvCfg
9976 PRIVATE S16 rgSCHCfgVldtDrxInActvCfg(inActvTmr)
9980 TRC2(rgSCHCfgVldtDrxInActvCfg)
9982 switch ( inActvTmr )
9984 case RGR_DRX_PRD_1PSF:
9985 case RGR_DRX_PRD_2PSF:
9986 case RGR_DRX_PRD_3PSF:
9987 case RGR_DRX_PRD_4PSF:
9988 case RGR_DRX_PRD_5PSF:
9989 case RGR_DRX_PRD_6PSF:
9990 case RGR_DRX_PRD_8PSF:
9991 case RGR_DRX_PRD_10PSF:
9992 case RGR_DRX_PRD_20PSF:
9993 case RGR_DRX_PRD_30PSF:
9994 case RGR_DRX_PRD_40PSF:
9995 case RGR_DRX_PRD_50PSF:
9996 case RGR_DRX_PRD_60PSF:
9997 case RGR_DRX_PRD_80PSF:
9998 case RGR_DRX_PRD_100PSF:
9999 case RGR_DRX_PRD_200PSF:
10000 case RGR_DRX_PRD_300PSF:
10001 case RGR_DRX_PRD_500PSF:
10002 case RGR_DRX_PRD_750PSF:
10003 case RGR_DRX_PRD_1280PSF:
10004 case RGR_DRX_PRD_1920PSF:
10005 case RGR_DRX_PRD_2560PSF:
10012 }/*switch(InactvTmr)*/
10015 }/*rgSCHCfgVldtDrxInActvCfg*/
10017 /***********************************************************
10019 * Func : rgSCHCfgVldtDrxReTxCfg
10022 * Desc : Validates DRX ReTx timer configuration
10023 * recieved from RRC.
10033 **********************************************************/
10035 PRIVATE S16 rgSCHCfgVldtDrxReTxCfg
10040 PRIVATE S16 rgSCHCfgVldtDrxReTxCfg(reTxTmr)
10044 TRC2(rgSCHCfgVldtDrxReTxCfg)
10048 case RGR_DRX_PRD_1PSF:
10049 case RGR_DRX_PRD_2PSF:
10050 case RGR_DRX_PRD_4PSF:
10051 case RGR_DRX_PRD_6PSF:
10052 case RGR_DRX_PRD_8PSF:
10053 case RGR_DRX_PRD_16PSF:
10054 case RGR_DRX_PRD_24PSF:
10055 case RGR_DRX_PRD_33PSF:
10062 }/*switch(drxRetxTmr)*/
10065 }/*rgSCHCfgVldtDrxReTxCfg*/
10067 /***********************************************************
10069 * Func : rgSCHCfgVldtDrxShrtCycCfg
10072 * Desc : Validates DRX Short Cycle timer configuration
10073 * recieved from RRC.
10084 **********************************************************/
10086 PRIVATE S16 rgSCHCfgVldtDrxLngCycCfg
10088 RgrDrxLongCycleOffst lngCycleOffst
10091 PRIVATE S16 rgSCHCfgVldtDrxLngCycCfg(lngCycleOffst)
10092 RgrDrxLongCycleOffst lngCycleOffst;
10095 TRC2(rgSCHCfgVldtDrxLngCycCfg)
10097 if ( rgSCHCfgVldtDrxLngCyclTmrs(lngCycleOffst.longDrxCycle) != ROK )
10102 if ( lngCycleOffst.drxStartOffst >= lngCycleOffst.longDrxCycle )
10108 }/*rgSCHCfgVldtDrxLngCycCfg*/
10110 /***********************************************************
10112 * Func : rgSCHCfgVldtDrxLngCyclTmrs
10115 * Desc : Validates DRX Long Cycle timer values
10116 * recieved from RRC.
10127 **********************************************************/
10129 PRIVATE S16 rgSCHCfgVldtDrxLngCyclTmrs
10134 PRIVATE S16 rgSCHCfgVldtDrxLngCyclTmrs(val)
10138 TRC2(rgSCHCfgVldtDrxLngCyclTmrs)
10142 case RGR_DRX_PRD_10SF:
10143 case RGR_DRX_PRD_20SF:
10144 case RGR_DRX_PRD_32SF:
10145 case RGR_DRX_PRD_40SF:
10146 case RGR_DRX_PRD_64SF:
10147 case RGR_DRX_PRD_80SF:
10148 case RGR_DRX_PRD_128SF:
10149 case RGR_DRX_PRD_160SF:
10150 case RGR_DRX_PRD_256SF:
10151 case RGR_DRX_PRD_320SF:
10152 case RGR_DRX_PRD_512SF:
10153 case RGR_DRX_PRD_640SF:
10154 case RGR_DRX_PRD_1024SF:
10155 case RGR_DRX_PRD_1280SF:
10156 case RGR_DRX_PRD_2048SF:
10157 case RGR_DRX_PRD_2560SF:
10164 }/*switch(longDrxCycle)*/
10167 }/*rgSCHCfgVldtDrxLngCyclTmrs*/
10169 /***********************************************************
10171 * Func : rgSCHCfgVldtDrxShrtCycCfg
10174 * Desc : Validates DRX Short Cycle timer configuration
10175 * recieved from RRC.
10186 **********************************************************/
10188 PRIVATE S16 rgSCHCfgVldtDrxShrtCycCfg
10190 RgrDrxShortDrx shrtCycCfg
10193 PRIVATE S16 rgSCHCfgVldtDrxShrtCycCfg(shrtCycCfg)
10194 RgrDrxShortDrx shrtCycCfg;
10197 TRC2(rgSCHCfgVldtDrxShrtCycCfg)
10199 switch(shrtCycCfg.shortDrxCycle)
10201 case RGR_DRX_PRD_2SF:
10202 case RGR_DRX_PRD_5SF:
10203 case RGR_DRX_PRD_8SF:
10204 case RGR_DRX_PRD_10SF:
10205 case RGR_DRX_PRD_16SF:
10206 case RGR_DRX_PRD_20SF:
10207 case RGR_DRX_PRD_32SF:
10208 case RGR_DRX_PRD_40SF:
10209 case RGR_DRX_PRD_64SF:
10210 case RGR_DRX_PRD_80SF:
10211 case RGR_DRX_PRD_128SF:
10212 case RGR_DRX_PRD_160SF:
10213 case RGR_DRX_PRD_256SF:
10214 case RGR_DRX_PRD_320SF:
10215 case RGR_DRX_PRD_640SF:
10223 }/*switch(shortDrxCycle)*/
10225 if ( (shrtCycCfg.drxShortCycleTmr < RGR_DRX_SHRTCYCLE_MIN) ||
10226 (shrtCycCfg.drxShortCycleTmr > RGR_DRX_SHRTCYCLE_MAX)
10236 * @brief Handler for TA related UE Reconfiguration.
10240 * Function : rgSCHCfgUeTaRecfg
10242 * This function shall fetch the TA timer related information into the
10243 * respective ueCb from the UE configuration as provided by the
10246 * @param[in] RgSchCellCb *cell
10247 * @param[in] RgSchUeCb *ueCb
10248 * @param[in] RgrUeCfg *ueCfg
10249 * @param[out] RgSchErrInfo *errInfo
10255 PRIVATE Void rgSCHCfgUeTaRecfg
10263 PRIVATE Void rgSCHCfgUeTaRecfg(cell, ueCb, ueCfg, err)
10270 TRC2(rgSCHCfgUeTaRecfg)
10274 /* Update the TA related information */
10276 if (ueCfg->ueTaTmrRecfg.pres)
10278 /* Configuring taTmr with 30 deficit, to enable eNodeB sending
10279 * TA command before the expiry of TA at UE. Also considering for
10280 * possible retx for this TA command */
10281 /* [ccpu00121813]-ADD-Added chk if tatmr val > 30 */
10282 if(ueCfg->ueTaTmrRecfg.taTmr > 30)
10284 ueCb->dl.taCb.cfgTaTmr = ueCfg->ueTaTmrRecfg.taTmr - 30;
10286 /* If TA Timer is running. Stop it and then start it*/
10287 if (ueCb->taTmr.tmrEvnt != TMR_NONE)
10289 rgSCHTmrStopTmr(cell, ueCb->taTmr.tmrEvnt, ueCb);
10290 rgSCHTmrStartTmr(cell, ueCb, RG_SCH_TMR_TA, ueCb->dl.taCb.cfgTaTmr);
10294 rgSCHTmrStartTmr(cell, ueCb, RG_SCH_TMR_TA, ueCb->dl.taCb.cfgTaTmr);
10298 } /* rgSCHCfgUeTaRecfg */
10300 /* ccpu00117452 - MOD - Changed macro name from
10301 RGR_RRM_DLPWR_CNTRL to RGR_CQI_REPT */
10302 #if ((defined (RGR_CQI_REPT)) && (defined (RGR_V2)))
10303 /***********************************************************
10305 * Func : rgSCHCfgUeCqiReptReCfg
10308 * Desc : Reconfiguration of PUSH N CQI Reporting
10310 * Ret : RFAILED in case of failure
10317 **********************************************************/
10319 PRIVATE S16 rgSCHCfgUeCqiReptReCfg
10323 RgrUeRecfg *ueRecfg
10326 PRIVATE S16 rgSCHCfgUeCqiReptReCfg(cell, ue, ueRecfg)
10329 RgrUeRecfg *ueRecfg;
10333 TRC3(rgSCHCfgUeCqiReptReCfg)
10335 /* Check has it been disabled */
10336 if(ueRecfg->ueCqiReptCfg.numColltdCqiRept)
10338 /* Check if we need to send CQI reports collagted so far and send if so */
10339 if(ue->schCqiInfo.cqiCount >=
10340 ueRecfg->ueCqiReptCfg.numColltdCqiRept)
10342 RgrStaIndInfo *staInfo;
10343 /* if yes, Send StaInd to RRM */
10344 retVal = rgSCHUtlAllocSBuf (cell->instIdx,(Data**)&staInfo,
10345 sizeof(RgrStaIndInfo));
10348 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,
10349 "Could not allocate memory for sending StaInd OLD CRNTI:%d",ueRecfg->oldCrnti);
10353 /* Fill StaInd for sending collated N CQI rpeort */
10354 rgSCHUtlFillSndStaInd(cell, ue, staInfo,
10355 ueRecfg->ueCqiReptCfg.numColltdCqiRept);
10360 ue->schCqiInfo.cqiCount = 0;
10363 ue->cqiReptCfgInfo.numColltdCqiRept =
10364 ueRecfg->ueCqiReptCfg.numColltdCqiRept;
10366 } /* End of rgSCHCfgUeCqiReptReCfg */
10367 #endif /* End of RGR_CQI_REPT */
10368 /*This function Added Ue in ongoing L2 Meas*/
10369 /*LTE_L2_MEAS_PHASE2*/
10371 PRIVATE S16 rgSchAddToL2Meas(RgSchCellCb *cellCb,RgSchDlLcCb *dlLc)
10375 RgSchL2MeasCb *measCb = NULLP;
10376 lnk = cellCb->l2mList.first;
10378 while(lnk != NULLP)
10380 /* Get the MeasCb : RgSchL2MeasCb */
10381 measCb = (RgSchL2MeasCb *)lnk->node;
10382 if (measCb->measReq.measType & LRG_L2MEAS_AVG_PRB_PER_QCI_DL)
10384 for(idx = 0;idx < measCb->measReq.avgPrbQciDl.numQci;idx++)
10386 if(measCb->measReq.avgPrbQciDl.qci[idx] == dlLc->qciCb->qci)
10388 break; /*exit from for loop*/
10391 if(idx == measCb->measReq.avgPrbQciDl.numQci)
10393 measCb->measReq.avgPrbQciDl.qci[measCb->measReq.avgPrbQciDl.numQci++] = dlLc->qciCb->qci;
10397 }/*End of while loop*/
10404 * @brief UE SCell Buffer Free
10408 * Function : rgSCHSCellFreeBuf
10410 * This functions will free allocated memory
10411 * for UE secondart cellCB
10414 * @param[in] Inst inst
10415 * @param[in] RgSchUeCb *ue
10416 * @param[int] RgrUeRecfg *ueRecfg
10417 * @param[out] U8 idx
10421 PUBLIC Void rgSCHSCellFreeBuf
10425 RgrUeRecfg *ueRecfg,
10429 PUBLIC Void rgSCHSCellFreeBuf(inst ,ue, ueRecfg, idx)
10432 RgrUeRecfg *ueRecfg;
10436 RgSchUeCellInfo *sCellInfo = NULLP;
10437 RgrUeSecCellCfg *sCellInfoRecfg = NULLP;
10439 TRC2(rgSCHSCellFreeBuf);
10441 for(U8 i = 0; i <= idx; i++)
10443 sCellInfoRecfg = &ueRecfg->ueSCellCfgInfo.ueSCellDedCfg[i];
10444 sCellInfo = ue->cellInfo[(sCellInfoRecfg->sCellIdx)];
10446 if (NULLP != sCellInfo)
10448 rgSCHUtlFreeSBuf(inst, (Data**)&(sCellInfo),
10449 sizeof(RgSchUeCellInfo));
10450 ue->cellInfo[(sCellInfoRecfg->sCellIdx)] = NULLP;
10457 /**********************************************************************
10460 **********************************************************************/