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 >= RGSCH_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;
2675 if(RGR_SCH_TYPE_PFS == schedEnbCfg->dlSchdType)
2677 rgSCHEnbPfsDlCfg(inst, errInfo);
2680 errInfo->errCause = RGSCHERR_NONE;
2681 RGSCHDBGINFO(inst, (rgSchPBuf(inst), "RGR SCH ENBconfig done: \n"));
2683 } /* rgSCHCfgRgrSchedEnbCfg */
2687 * @brief Handler for the cell configuration of 5gtf.
2691 * Function : rgSCH5gtfCellCfg
2693 * @param[in] RgSchCellCb *cell
2694 * @param[in] RgSchCellCfg *cellCfg
2700 PUBLIC S16 rgSCH5gtfCellCfg
2706 PUBLIC S16 rgSCH5gtfCellCfg(cell, cellCfg)
2708 RgrCellCfg *cellCfg;
2713 TRC2(rgSCHCfgRgrCellCfg);
2715 for(idx = 0; idx < MAX_5GTF_GROUP; idx++)
2717 cell->cell5gtfCb.ueGrp5gConf[idx].beamBitMask = 0;
2720 for(idx = 0 ; idx < MAX_5GTF_SUBFRAME_INFO ; ++idx)
2722 cell->cell5gtfCb.dynConfig[idx] = cellCfg->Cell5gtfCfg.dynConfig[idx];
2724 cell->cell5gtfCb.numUes = cellCfg->Cell5gtfCfg.numUes;
2725 cell->cell5gtfCb.uePerGrpPerTti = cellCfg->Cell5gtfCfg.uePerGrp;
2726 cell->cell5gtfCb.ueGrpPerTti = cellCfg->Cell5gtfCfg.ueGrpPerTti;
2727 cell->cell5gtfCb.numCCs = cellCfg->Cell5gtfCfg.numOfCC;
2728 cell->cell5gtfCb.bwPerCC = cellCfg->Cell5gtfCfg.bwPerCC;
2729 printf("\ncell cfg at schd,numUes:%u,uepergrp:%u,uegrppertti:%u,numCC:%u,bwPerc:%u cfi %u\n",
2730 cell->cell5gtfCb.numUes,cell->cell5gtfCb.uePerGrpPerTti,cell->cell5gtfCb.ueGrpPerTti,
2731 cell->cell5gtfCb.numCCs,cell->cell5gtfCb.bwPerCC, cell->cell5gtfCb.cfi);
2736 #ifdef XEON_LMT_ITBS
2737 EXTERN U16 gWrMaxDlItbs;
2738 EXTERN U16 gWrMaxUlItbs;
2741 * @brief Handler for the cell configuration request from RRM to MAC.
2745 * Function : rgSCHCfgRgrCellCfg
2748 * - Invoke SCH with cell control block to update
2749 * scheduler specific information.
2750 * - Update cell control block with the values recieved in the
2752 * - Add to the active list of cells if cell becomes ACTIVE.
2753 * - If successful, return ROK else RFAILED.
2755 * @param[in] RgSchCb *instCb
2756 * @param[in] SpId spId
2757 * @param[in] RgSchCellCfg *cellCfg
2758 * @param[out] RgSchErrInfo *errInfo
2764 PUBLIC S16 rgSCHCfgRgrCellCfg
2768 RgrCellCfg *cellCfg,
2769 RgSchErrInfo *errInfo
2772 PUBLIC S16 rgSCHCfgRgrCellCfg(instCb, spId, cellCfg, errInfo)
2775 RgrCellCfg *cellCfg;
2776 RgSchErrInfo *errInfo;
2782 RgInfCellReg cellRegReq;
2783 RgSchCellCb *cell = NULLP;
2784 Inst inst = instCb->rgSchInit.inst;
2785 U32 Idx1 = (U8)((cellCfg->cellId - instCb->genCfg.startCellId)&(CM_LTE_MAX_CELLS-1));
2787 TRC2(rgSCHCfgRgrCellCfg);
2789 errInfo->errCause = RGSCHERR_CFG_RGR_CELL_CFG;
2791 cmMemset((U8*)&pst, (U8)0, sizeof(Pst));
2793 /* Allocate the scheduler's cell control block */
2794 if((ret = rgSCHUtlAllocSBuf(inst, (Data**)&cell, sizeof(RgSchCellCb)))
2797 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Memory allocation FAILED for cell");
2801 if(cellCfg->emtcEnable)
2803 if((ret = rgSCHEmtcCellAlloc(cell))
2806 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Memory allocation FAILED for emtc cell");
2811 if ((U8 *)cell == NULLP)
2813 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Memory allocation FAILED for cell");
2816 /* Initialize the lists of the cell */
2817 ret = rgSCHDbmInitCell(cell);
2820 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"DBM initialization FAILED for cell");
2821 rgSCHCfgFreeCellCb(cell);
2824 /* LTE_ADV_FLAG_REMOVED_START */
2825 if(cellCfg->rgrLteAdvCfg.pres & RGR_ABS)
2827 cell->lteAdvCb.absCfg =
2828 cellCfg->rgrLteAdvCfg.absCfg;
2829 cmMemset((U8*)cell->lteAdvCb.absLoadInfo, 0, sizeof(U32)*RGR_ABS_PATTERN_LEN);
2830 cell->lteAdvCb.absLoadTtiCnt = 0;
2833 if(cellCfg->rgrLteAdvCfg.pres & RGR_SFR)
2835 cell->lteAdvCb.sfrCfg =
2836 cellCfg->rgrLteAdvCfg.sfrCfg;
2838 if(cellCfg->rgrLteAdvCfg.pres & RGR_DSFR)
2840 cell->lteAdvCb.dsfrCfg =
2841 cellCfg->rgrLteAdvCfg.dsfrCfg;
2843 /* LTE_ADV_FLAG_REMOVED_END */
2846 cell->emtcEnable = cellCfg->emtcEnable;
2848 /* Initialize the cell */
2849 cell->cellId = cellCfg->cellId;
2850 cell->instIdx = inst;
2851 cell->macInst = cellCfg->macInst;
2852 cell->isCpUlExtend = cellCfg->isCpUlExtend;
2853 cell->isCpDlExtend = cellCfg->isCpDlExtend;
2855 cell->numTxAntPorts = rgSchCb[inst].rgrSchedEnbCfg.numTxAntPorts;
2856 if(cell->numTxAntPorts == 1)
2858 cell->numCellRSPerSf = RGSCH_NUM_CELL_RS_ONE_ANT_PORT;
2860 else if(cell->numTxAntPorts == 2)
2862 cell->numCellRSPerSf = RGSCH_NUM_CELL_RS_TWO_ANT_PORT;
2866 cell->numCellRSPerSf = RGSCH_NUM_CELL_RS_FOUR_ANT_PORT;
2868 cell->bwCfg = cellCfg->bwCfg;
2869 cell->pbchRbStart = ((((cell->bwCfg.dlTotalBw * 12)/2) - 36)/12); /* Ref section 6.6 in 36.211 */
2870 cell->pbchRbEnd = cell->pbchRbStart + 5;
2871 cell->pucchCfg = cellCfg->pucchCfg;
2872 cell->rachCfg = cellCfg->rachCfg;
2873 cell->siCfg = cellCfg->siCfg;
2874 cell->t300TmrVal = cellCfg->t300TmrVal;
2876 /*Initialize the SI CB in Cell CB */
2877 cmMemset((U8 *)&cell->siCb, 0, sizeof(RgSchSiCb));
2879 /*Fix: Added Guard Pool for RNTI which will contain RNTIs
2880 *for UEs deleted from Scheduler but not yet from MAC*/
2881 cmLListInit(&cell->rntiDb.rntiGuardPool);
2883 /* Initialize the inWindow to sync with scheduler time when ticks starts */
2885 cell->siCb.inWindow = (cellCfg->siCfg.siWinSize -
2886 (RG_SCH_CMN_DL_DELTA + RG_SCH_CMN_HARQ_INTERVAL));
2888 cell->siCb.inWindow = (cellCfg->siCfg.siWinSize -
2889 (RG_SCH_CMN_DL_DELTA));
2892 if(cell->siCb.inWindow < 0)
2894 cell->siCb.inWindow = 0;
2896 cell->macPreambleSet = cellCfg->macPreambleSet;
2897 cell->phichCfg = cellCfg->phichCfg;
2899 /* Initialize UL and DL CCCH logical channels */
2900 cell->ulCcchId = RGSCH_INVALID_LC_ID;
2901 cell->dlCcchId = RGSCH_INVALID_LC_ID;
2903 /* Update SRS configuration */
2904 cell->srsCfg.isSrsCfgPres = cellCfg->srsCfg.isSrsCfgSetup;
2905 if(cellCfg->srsCfg.isSrsCfgSetup)
2907 cell->srsCfg.srsCfgPrdEnum = cellCfg->srsCfg.srsCfgPrdEnum;
2908 cell->srsCfg.srsBwEnum = cellCfg->srsCfg.srsBwEnum;
2909 cell->srsCfg.srsTxOffst =
2910 rgSrsTxOffstTbl[cellCfg->srsCfg.srsSubFrameCfg];
2911 /*ccpu00116923 - ADD - Srs Present support */
2913 cell->srsCfg.srsSubFrameCfg = cellCfg->srsCfg.srsSubFrameCfg;
2917 /* Configure all the common logical channels for the cell */
2918 for(idx = 0; idx < cellCfg->numCmnLcs; idx++)
2920 /* This never returns failure and hence not checked for */
2921 rgSCHCfgRgrCmnLcCfg(cell, &(cellCfg->cmnLcCfg[idx]), errInfo);
2924 /* Invoke the MeasGap and ACK NACK Rep handler for cell cfg */
2926 /* Dynamic CFI cell configuration */
2927 ret = rgSCHDynCfiCfg(cell, cellCfg);
2930 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Rgr cell Config failed at "
2931 "Scheduler for cell");
2932 rgSCHCfgFreeCellCb(cell);
2935 /* Updating Auto TM Mode enable/diable flag */
2936 cell->isAutoCfgModeEnb = cellCfg->isAutoCfgModeEnb;
2938 if(cell->isAutoCfgModeEnb)
2940 RLOG0(L_INFO,"Auto Mode Cfg enabled durint cell cfg\n");
2943 /* CPU OvrLoad State Initialization */
2944 #ifdef XEON_LMT_ITBS
2945 cell->thresholds.maxDlItbs = gWrMaxDlItbs;
2946 cell->thresholds.maxUlItbs = gWrMaxUlItbs;
2947 RLOG2(L_INFO,"LIMIT DL and UL ITBS %d:%d \n",gWrMaxDlItbs,gWrMaxUlItbs);
2949 cell->thresholds.maxDlItbs = RG_SCH_DL_MAX_ITBS;
2950 cell->thresholds.maxUlItbs = RG_SCH_UL_MAX_ITBS;
2952 cell->measurements.dlTpt = 0;
2953 cell->measurements.ulTpt = 0;
2954 cell->measurements.dlBytesCnt = 0;
2955 cell->measurements.ulBytesCnt = 0;
2956 cell->cpuOvrLdCntrl.cpuOvrLdIns = 0; /* 0 - No command */
2957 cell->cpuOvrLdCntrl.dlNxtIndxDecNumUeTti = 0;
2958 cell->cpuOvrLdCntrl.ulNxtIndxDecNumUeTti = 0;
2959 for ( idx = 0; idx < 10; idx++ )
2961 cell->cpuOvrLdCntrl.maxUeNewTxPerTti[idx] = cellCfg->maxDlUeNewTxPerTti;
2962 cell->cpuOvrLdCntrl.maxUeNewRxPerTti[idx] = cellCfg->maxUlUeNewTxPerTti;
2965 /* Invoke scheduler to update scheduler specific information */
2966 ret = rgSCHUtlRgrCellCfg(cell, cellCfg, errInfo);
2969 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Rgr cell Config failed at "
2970 "Scheduler for cell ");
2971 rgSCHCfgFreeCellCb(cell);
2975 /* Invoke DHM to update DHM specific information */
2976 rgSCHDhmRgrCellCfg(cell, cellCfg, errInfo);
2979 /* Initialize RNTI DB */
2980 ret = rgSCHDbmRntiDbInit(cell, cellCfg->macRnti.startRnti,
2981 cellCfg->macRnti.size);
2984 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Rgr Cell Config failed at"
2985 " RNTI DB init for cell");
2986 rgSCHCfgFreeCellCb(cell);
2990 /* Update the cell with recieved configuration */
2991 cell->dlHqCfg = cellCfg->dlHqCfg;
2993 RLOG1(L_INFO,"Config DL HQTX = %d\n",cell->dlHqCfg.maxDlHqTx);
2995 cell->crntSfIdx = 0;
2996 /* Allocate the subframe allocation information */
2997 if((ret = rgSCHUtlGetSfAlloc(cell)) != ROK)
2999 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Memory allocation FAILED for "
3001 rgSCHCfgFreeCellCb(cell);
3004 /* Update RACH Related information
3005 * XXX: Below function yet to be written in RAM
3006 * To store the preambles given in the configuration for PDCCH order in the
3007 * scheduler cell control block. Initialize the PRACH Mask Index allocated
3008 * for these preambles to invalid values */
3010 cell->crntHqIdx = 0;
3011 /* Allocate the subframe allocation information */
3012 if((ret = rgSCHUtlGetRlsHqAlloc(cell)) != ROK)
3014 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Memory allocation FAILED for"
3016 rgSCHCfgFreeCellCb(cell);
3020 /* Associate a pair of upper and lower sapCbs with this cell */
3021 instCb->rgrSap[spId].cell = cell;
3022 instCb->tfuSap[spId].cell = cell;
3023 instCb->rgmSap[spId].cell = cell;
3024 cell->tfuSap = &(instCb->tfuSap[spId]);
3027 instCb->cells[Idx1] = cell;
3030 /* rg001.201: Added for sending TTI tick to RRM */
3031 #if (defined(RGR_RRM_TICK) || defined(RGR_CQI_REPT))
3032 /* Associate the RGR SAP as well utilized while sending TTI
3033 * Ticks to RGR User. */
3034 cell->rgrSap = &(instCb->rgrSap[spId]);
3036 cell->rgmSap = &(instCb->rgmSap[spId]);
3038 /* Store the periodicity configured */
3039 cell->rrmTtiIndPrd = cellCfg->rrmTtiIndPrd;
3043 cmLListInit(&cell->l2mList);
3046 if (rgSCHDrxCellCfg(cell,cellCfg) != ROK)
3048 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Drx Memory allocation FAILED for"
3050 rgSCHCfgFreeCellCb(cell);
3053 cell->overLoadBackOffEnab = FALSE;/* Disabling RachOverload by default */
3054 /* Updating CSG Parameters */
3055 cell->minDlResNonCsg = cellCfg->csgParamCfg.minDlResNonCsg;
3056 cell->minUlResNonCsg = cellCfg->csgParamCfg.minUlResNonCsg;
3058 /* Register the cell with MAC */
3059 rgSCHUtlGetPstToLyr(&pst, instCb, cell->macInst);
3060 cellRegReq.cellId = cell->cellId;
3061 cellRegReq.cellSapId = spId;
3063 cellRegReq.maxDlHqProcPerUe = rgSchTddDlNumHarqProcTbl[cellCfg->ulDlCfgIdx];
3065 cellRegReq.maxDlHqProcPerUe = RGSCH_MAX_DL_HQ_PROC;
3067 RgSchMacCellReg(&pst, &cellRegReq);
3070 cell->tenbStats = TSL2AllocCellStatsBlk(cell->cellId);
3071 cell->tenbStats->cellId = cell->cellId;
3074 rgSCHUtlCalcDciSizes(cell);
3077 /* Initilalization of the list of UE for which this cell is secondary cell*/
3078 cmLListInit(&cell->sCellUeLst);
3083 ret = rgSCHLaaSCellCbInit(cell, cellCfg);
3086 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"Rgr Cell Config failed at"
3087 " Initializing the LAA Cell Control Cb");
3088 rgSCHCfgFreeCellCb(cell);
3091 cell->isPucchFormat3Sptd = cellCfg->isPucchFormat3Sptd;
3092 RLOG_ARG0(L_INFO,DBG_CELLID,cellCfg->cellId,"Format 3 is Enabled");
3093 printf ("\n Format 3 is Enabled for CELL:%d",cell->cellId);
3099 if(cell->emtcEnable)
3101 if (rgSCHCfgEmtcCellCfg(cell,&(cellCfg->emtcCellCfg)) != ROK)
3103 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,"EMTC Config Failed"
3111 ret = rgSCH5gtfCellCfg(cell, cellCfg);
3114 RLOG_ARG0(L_ERROR, DBG_CELLID,cellCfg->cellId,"5GTF Rgr Cell Config failed");
3115 rgSCHCfgFreeCellCb(cell);
3119 errInfo->errCause = RGSCHERR_NONE;
3121 } /* rgSCHCfgRgrCellCfg */
3124 * @brief Handler for the UE configuration request from RRC to MAC.
3128 * Function : rgSCHCfgRgrUeCfg
3131 * - Allocate and create UE control block.
3132 * - Update UE control block with the values recieved in the
3134 * - Invoke RAM, SCH, UHM and DHM with created UE control block, to
3135 * update random access, scheduler, uplink harq and downlink harq
3136 * specific information respectively.
3137 * - If successful, add the control block to hash list of UEs for the cell
3138 * else Rollback and FAIL.
3140 * @param[in] RgSchCellCb *cell
3141 * @param[in] RgrUeCfg *ueCfg
3142 * @param[out] RgSchErrInfo *errInfo
3148 PUBLIC S16 rgSCHCfgRgrUeCfg
3152 RgSchErrInfo *errInfo
3155 PUBLIC S16 rgSCHCfgRgrUeCfg(cell, ueCfg, errInfo)
3158 RgSchErrInfo *errInfo;
3162 RgSchRaCb *raCb=NULLP;
3163 RgSchUeCb *ue = NULLP;
3164 Inst inst = cell->instIdx;
3166 RgSchDlHqEnt *hqEnt = NULLP;
3168 U8 ulDlCfgIdx = cell->ulDlCfgIdx;
3174 RgSchUePCqiCb *cqiCb = NULLP;
3176 TRC2(rgSCHCfgRgrUeCfg);
3179 errInfo->errCause = RGSCHERR_CFG_RGR_UE_CFG;
3180 /* RACHO : Check for raCb only if preamble Id not provded */
3181 #ifndef PRE_DEF_UE_CTX
3182 if (ueCfg->dedPreambleId.pres == NOTPRSNT)
3184 if ((raCb = rgSCHDbmGetRaCb(cell, ueCfg->crnti)) == NULLP)
3186 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,"No RaCb exists for"
3187 "CRNTI:%d ",ueCfg->crnti);
3193 /* Allocate the Ue control block */
3194 if (((rgSCHUtlAllocSBuf(inst, (Data **)&ue, sizeof(RgSchUeCb))) != ROK) ||
3195 ((U8 *)ue == NULLP))
3197 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId, "Memory allocation"
3198 " FAILED for CRNTI:%d", ueCfg->crnti);
3202 /* Inititialize Ue control block */
3203 ue->ueId = ueCfg->crnti;
3205 /*ccpu00117778- Initialize Transmission Indices upon UE CB creation */
3207 ue->lastRprdAckNackTime.sfn = cell->crntTime.sfn;
3208 ue->lastRprdAckNackTime.subframe = cell->crntTime.subframe;
3212 /* Allocate the Ue control block */
3213 if (((rgSCHUtlAllocSBuf(inst, (Data **)&(ue->cellInfo[RGSCH_PCELL_INDEX]),
3214 sizeof(RgSchUeCellInfo))) != ROK))
3217 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst), "[%lu]SCellIdx :Memomy allocation "
3218 "Failed while Adding SCell Information\n", idx));
3220 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst), "[%u]SCellIdx :Memomy allocation "
3221 "Failed while Adding SCell Information\n", idx));
3226 ue->cellIdToCellIdxMap[RG_SCH_CELLINDEX(cell)] = RGSCH_PCELL_INDEX;
3227 ue->cellInfo[RGSCH_PCELL_INDEX]->cell = cell;
3228 ue->cellInfo[RGSCH_PCELL_INDEX]->ue = ue;
3230 ue->cellInfo[RGSCH_PCELL_INDEX]->sCellState = RG_SCH_SCELL_ACTIVE;
3231 ue->cellInfo[RGSCH_PCELL_INDEX]->sCellIdx = RGSCH_PCELL_INDEX;
3232 ue->cellInfo[RGSCH_PCELL_INDEX]->sCellId = cell->cellId;
3234 if (ROK != rgSCHLaaInitDlRbAllocCb(cell,
3235 &ue->cellInfo[RGSCH_PCELL_INDEX]->dlAllocCb))
3241 cqiCb = RG_SCH_GET_UE_CELL_CQI_CB(ue,cell);
3242 cqiCb->nCqiTrIdx = RG_SCH_INVALID_IDX;
3243 cqiCb->nRiTrIdx = RG_SCH_INVALID_IDX;
3244 ue->srsCb.nSrsTrIdx = RG_SCH_INVALID_IDX;
3245 ue->srCb.nSrTrIdx = RG_SCH_INVALID_IDX;
3247 /* LTE_ADV_FLAG_REMOVED_START */
3248 /* While doing UE configuration for SFR at SCH, by default
3249 * CC UE power is configured as LOW */
3250 ue->lteAdvUeCb.isCCUePHigh = FALSE;
3251 /* LTE_ADV_FLAG_REMOVED_END */
3253 /* Initialize the lists of the UE */
3254 if((rgSCHDbmInitUe(ue)) != ROK)
3256 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,"DBM initialization "
3257 "failed for CRNTI:%d", ueCfg->crnti);
3263 if(TRUE == raCb->isEmtcRaCb)
3265 ue->isEmtcUe = TRUE;
3266 if (rgSCHUtlUpdUeEmtcInfo(cell, ueCfg, ue) != ROK)
3268 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,"EMTC UE Cfg"
3269 "failed for CRNTI:%d", ueCfg->crnti);
3276 /* Initialize scheduler related information for UE */
3277 if(rgSCHUtlRgrUeCfg(cell, ue, ueCfg, errInfo) != ROK)
3279 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,"Scheduler handling "
3280 "failed in config for CRNTI:%d", ueCfg->crnti);
3284 ret = rgSCHUhmHqEntInit(cell, ue);
3287 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,"UHM HARQ Ent Init "
3288 "Failed for CRNTI:%d", ueCfg->crnti);
3292 /* Initialize RAM related information for UE
3293 * RACHO: if preamble Id is present in ueCfg then raCb will be NULL
3294 * so rgSCHRamRgrUeCfg should take care of creating raCb */
3295 if ((ueCfg->dedPreambleId.pres == NOTPRSNT) && (NULLP != raCb) )
3297 if((rgSCHRamRgrUeCfg(cell, ue, raCb, errInfo)) != ROK)
3299 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,"Random access "
3300 "handling config failed for CRNTI:%d", ueCfg->crnti);
3306 RG_SCH_CMN_GET_UE_HQE(ue, cell) = rgSCHDhmHqEntInit(cell);
3307 hqEnt = RG_SCH_CMN_GET_UE_HQE(ue, cell);
3310 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,"Hq Entity Initialization "
3311 "failed in config for CRNTI:%d", ueCfg->crnti);
3315 rgSCHEmtcHqPAlloc(cell, hqEnt);
3318 /* Fix : syed Assign hqEnt to UE only if msg4 is done */
3320 rgSCHCmnDlInitHqEnt(cell, hqEnt);
3322 /* For Hand-In UE Request Aper CQI report
3324 if (ueCfg->ueDlCqiCfg.aprdCqiCfg.pres)
3326 /* Set APCQI for Pcell only*/
3327 ue->dl.reqForCqi = RG_SCH_APCQI_SERVING_CC;
3332 maxDlSubframes = rgSchTddNumDlSubfrmTbl[ulDlCfgIdx][RGSCH_NUM_SUB_FRAMES-1];
3333 maxSubframes = 2 * maxDlSubframes;
3334 ue->dl.numHqDlSfInfo = maxSubframes;
3335 rgSCHUtlAllocSBuf(cell->instIdx,
3336 (Data **)&ue->dl.dlSfHqInfo, sizeof(RgSchDlHqInfo) * (ue->dl.numHqDlSfInfo));
3339 ue->dl.numHqDlSfInfo = RGSCH_NUM_DL_SUBFRAMES;
3342 for (idx =0;idx < ue->dl.numHqDlSfInfo; idx++)
3344 cmLListInit(&ue->dl.dlSfHqInfo[idx].hqPLst);
3345 ue->dl.dlSfHqInfo[idx].dlSfUeLnk.node = NULLP;
3351 for (cellIdx = 0;cellIdx < MAX_5GTF_CELL ; cellIdx++)
3353 for (idx =0;idx < ue->dl.numHqDlSfInfo; idx++)
3355 cmLListInit(&ue->dl.dlSfHqInfo[cellIdx][idx].hqPLst);
3356 ue->dl.dlSfHqInfo[cellIdx][idx].dlSfUeLnk.node = NULLP;
3362 rgSCHLaaInitDlHqInfo(cell, ue);
3366 /* Initialize lcgIds to Invalid */
3367 for (lcgCnt = 0; lcgCnt < RGSCH_MAX_LCG_PER_UE; lcgCnt++)
3369 ue->ul.lcgArr[lcgCnt].lcgId = RGSCH_INVALID_LCG_ID;
3373 rgSCHCfgRgrUePhrMsg3(cell,raCb,ue,errInfo);
3374 /* Moved this code out of rgSCHCfgRgrUePhrMsg3()
3375 * as it was not the appropriate place to
3377 if (raCb->raState == RGSCH_RA_MSG4_DONE)
3379 RLOG_ARG1(L_DEBUG,DBG_CELLID,cell->cellId,
3380 "RNTI:%d RaCb deleted as Msg4 transmission is done",
3382 rgSCHRamDelRaCb(cell, raCb, FALSE);
3385 /* Initialize uplink HARQ related information for UE */
3386 rgSCHUhmRgrUeCfg(cell, ue, ueCfg);
3387 cmInitTimers(&ue->bsrTmr, 1);
3389 /* Added periodic BSR timer */
3390 cmInitTimers(&ue->bsrTmr, 1);
3392 /* Fix - Added proper configuration from U-ARM */
3393 if(ueCfg->ueBsrTmrCfg.isPrdBsrTmrPres == TRUE)
3395 ue->ul.bsrTmrCfg.isPrdBsrTmrPres = TRUE;
3396 ue->ul.bsrTmrCfg.prdBsrTmr = ueCfg->ueBsrTmrCfg.prdBsrTmr;
3397 ue->ul.bsrTmrCfg.retxBsrTmr = ueCfg->ueBsrTmrCfg.retxBsrTmr;
3401 /* Initialize downlink HARQ related information for UE */
3402 rgSCHDhmRgrUeCfg(cell, ue, ueCfg, errInfo);
3404 /* Initialize MeasureGap and Acknack Rep Information for UE */
3405 if((rgSCHMeasGapANRepUeCfg(cell, ue, ueCfg)) != ROK)
3407 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,"Measurement Gap and"
3408 " AckNack Rep failed in Config for CRNTI:%d", ueCfg->crnti);
3414 if((rgSCHUtlAllocUeANFdbkInfo(ue,RGSCH_PCELL_INDEX)) != ROK)
3416 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,"Memomy allocation "
3417 "Failed while UE related Ack Nack Information for CRNTI:%d",
3421 ue->dl.ackNackMode = ueCfg->ackNackModeEnum;
3422 #endif /* LTE_TDD */
3425 rgSCHDbmInsUeCb(cell, ue);
3428 /* Int ialize APeriodic CQI/PMI/RI Information for UE */
3430 RGSCHDBGPRM(cell->instIdx,(rgSchPBuf(cell->instIdx),
3431 "\n rgSCHCfgRgrUeCfg : CellID=%d UeId =%d AcqiCfg Pres =%d",
3432 cell->cellId, ue->ueId, ueCfg->ueDlCqiCfg.aprdCqiCfg.pres));
3434 /*Store Trigger Set Bit String to UE */
3436 ret = rgSCHCfgACqiUeCfg(cell,ue, (RG_SCH_CMN_GET_ACQICB(ue,cell)),ue->mimoInfo.txMode,
3437 &ueCfg->ueDlCqiCfg.aprdCqiCfg, ue->ueCatEnum);
3439 ue->cqiRiWritIdx = 0;
3440 ue->cqiRiReadIdx = 0;
3441 /* Initialize Periodic CQI/PMI, RI Information for UE */
3442 ret = rgSCHCfgPCqiUeCfg(cell, ue, &ueCfg->ueDlCqiCfg.prdCqiCfg,
3445 /* Initialize UL SRS Information for UE */
3446 ret = rgSCHCfgSrsUeCfg(cell, ue, &ueCfg->srsCfg);
3448 /* Initialize SR Information for UE */
3449 ret = rgSCHCfgSrUeCfg(cell, ue, &ueCfg->srCfg);
3453 if (rgSCHHdFddUeCfg(cell, ue, ueCfg->isHdFddEnbld) != ROK)
3455 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,
3456 "Could not do HD-FDD config for CRNTI:%d",ueCfg->crnti);
3460 #endif /* LTEMAC_HDFDD */
3461 /* ccpu00117452 - MOD - Changed macro name from
3462 RGR_RRM_DLPWR_CNTRL to RGR_CQI_REPT */
3464 ue->cqiReptCfgInfo.numColltdCqiRept =
3465 ueCfg->ueCqiReptCfg.numColltdCqiRept;
3466 #endif /* End of RGR_CQI_REPT */
3468 RG_SCH_CMN_GET_PA(ue,cell).pres = FALSE;
3469 if (RG_SCH_UE_CFG_ISPAPRSNT(ueCfg->uePdschDedCfg.uepACfg))
3471 RG_SCH_CMN_GET_PA(ue,cell).pres = TRUE;
3472 RG_SCH_CMN_GET_PA(ue,cell).val = ueCfg->uePdschDedCfg.uepACfg.pA;
3475 ue->isDrxEnabled = ueCfg->ueDrxCfg.isDrxEnabled;
3477 if ( ue->isDrxEnabled )
3479 if((rgSCHDrxUeCfg(cell,ue,ueCfg)) != ROK )
3481 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCfg->cellId,"DRX configuration failed",
3487 /* LTE_ADV_FLAG_REMOVED_START */
3488 if ((cell->lteAdvCb.sfrCfg.status == RGR_ENABLE) || \
3489 (cell->lteAdvCb.absCfg.status == RGR_ENABLE))
3491 ue->lteAdvUeCb.rgrLteAdvUeCfg = ueCfg->ueLteAdvCfg;
3493 /* LTE_ADV_FLAG_REMOVED_END */
3496 ue->tenbStats = TSL2AllocUeStatsBlk(ue->ueId);
3497 ue->tenbStats->stats.rnti = ue->ueId;
3500 /*Update A Value for PCell TBs*/
3501 ue->f1bCsAVal = rgSCHUtlGetMaxTbSupp(ue->mimoInfo.txMode);
3502 RLOG_ARG1(L_ERROR,DBG_CELLID, ueCfg->cellId,
3503 "\n UeCfg A value is %d\n",ue->f1bCsAVal);
3505 errInfo->errCause = RGSCHERR_NONE;
3507 ue->accessStratumRls = ueCfg->accessStratumRls;
3508 if (ue->numSCells > 0)
3511 rgSCHUtlUpdUeDciSize(cell, ue, TRUE);
3515 /* 1 bit CSI Access Stratum Release Change */
3516 rgSCHUtlUpdUeDciSize(cell, ue, FALSE);
3524 rgSCHCfgFreeUeCb(cell, ue);
3527 } /* rgSCHCfgRgrUeCfg */
3530 * @brief Handler for PHR for MSG3.
3534 * Function : rgSCHCfgRgrUePhrMsg3
3537 * Handle PHR related config for MSG3
3539 * @param[in] RgSchCellCb *cell
3540 * @param[in] RgrUeCb *ueCb
3541 * @param[in] RgSchRaCb *raCb
3542 * @param[out] RgSchErrInfo *errInfo
3545 PRIVATE Void rgSCHCfgRgrUePhrMsg3
3550 RgSchErrInfo *errInfo
3553 PRIVATE Void rgSCHCfgRgrUePhrMsg3(cell, raCb, ue, errInfo)
3557 RgSchErrInfo *errInfo;
3561 TRC2(rgSCHCfgRgrUePhrMsg3);
3563 /* Record msg3 allocation in the UE */
3564 rgSCHUtlRecMsg3Alloc(cell, ue, raCb);
3566 /* If raCb received PHR, update scheduler */
3567 if(raCb->phr.pres == TRUE)
3569 ue->macCeRptTime = raCb->msg3AllocTime;
3570 rgSCHUtlUpdPhr(cell, ue, raCb->phr.val, errInfo);
3580 * Function : rgSCHDynCfiReCfg
3582 * @param[in] RgSchCellCb *cell
3589 PUBLIC Void rgSCHDynCfiReCfg
3595 PUBLIC Void rgSCHDynCfiReCfg(cell, isDynCfiEnb)
3601 RgSchCmnDlCell *cellSchDl = RG_SCH_CMN_GET_DL_CELL(cell);
3603 TRC2(rgSCHDynCfiReCfg);
3607 cell->dynCfiCb.ttiCnt = 0;
3608 cellSchDl->newCfi = cellSchDl->currCfi;
3612 /* Resetting the parameters*/
3613 cell->dynCfiCb.cceFailCnt = 0;
3614 cell->dynCfiCb.cceFailSum = 0;
3615 cell->dynCfiCb.prevCceFailIdx = 0;
3617 for(idx = 0; idx < cell->dynCfiCb.numFailSamples; idx++)
3619 cell->dynCfiCb.cceFailSamples[idx] = 0;
3622 cell->dynCfiCb.cceUsed = 0;
3623 cell->dynCfiCb.lowCceCnt = 0;
3624 cell->dynCfiCb.ttiCnt = 0;
3628 * @brief Handler for the cell reconfiguration request from RRM to MAC.
3632 * Function : rgSCHCfgRgrCellRecfg
3635 * - Invoke SCH with cell control block to update
3636 * scheduler specific information.
3637 * - Update cell control block with the values recieved in the
3639 * - If successful, return ROK else RFAILED.
3641 * @param[in] RgSchCellCb *cell
3642 * @param[in] RgrCellRecfg *cellRecfg
3643 * @param[out] RgSchErrInfo *errInfo
3649 PUBLIC S16 rgSCHCfgRgrCellRecfg
3652 RgrCellRecfg *cellRecfg,
3653 RgSchErrInfo *errInfo
3656 PUBLIC S16 rgSCHCfgRgrCellRecfg(cell, cellRecfg, errInfo)
3658 RgrCellRecfg *cellRecfg;
3659 RgSchErrInfo *errInfo;
3663 Inst inst = cell->instIdx;
3664 /* LTE_ADV_FLAG_REMOVED_START */
3666 U16 len; /* dsfr_pal_fixes ** 21-March-2013 ** SKS */
3667 /* LTE_ADV_FLAG_REMOVED_END */
3669 TRC2(rgSCHCfgRgrCellRecfg);
3672 errInfo->errCause = RGSCHERR_CFG_RGR_CELL_RECFG;
3674 /* Invoke scheduler to update scheduler specific information */
3675 ret = rgSCHUtlRgrCellRecfg(cell, cellRecfg, errInfo);
3678 RLOG_ARG0(L_ERROR,DBG_CELLID,cellRecfg->cellId, "RGR Cell re-configuration failed "
3683 /* Invoke DHM to update DHM specific information */
3684 rgSCHDhmRgrCellRecfg(cell, cellRecfg, errInfo);
3686 /* PUCCH Reconfiguration */
3687 if (cellRecfg->recfgTypes & RGR_CELL_PUCCH_RECFG)
3689 cell->pucchCfg = cellRecfg->pucchRecfg;
3692 /* SRS Reconfiguration */
3693 if (cellRecfg->recfgTypes & RGR_CELL_SRS_RECFG)
3695 cell->srsCfg.isSrsCfgPres = cellRecfg->srsRecfg.isSrsCfgSetup;
3696 if(cellRecfg->srsRecfg.isSrsCfgSetup)
3698 cell->srsCfg.srsCfgPrdEnum = cellRecfg->srsRecfg.srsCfgPrdEnum;
3699 cell->srsCfg.srsBwEnum = cellRecfg->srsRecfg.srsBwEnum;
3700 cell->srsCfg.srsTxOffst =
3701 rgSrsTxOffstTbl[cellRecfg->srsRecfg.srsSubFrameCfg];
3702 /*ccpu00116923 - ADD - Srs Present support */
3704 cell->srsCfg.srsSubFrameCfg = cellRecfg->srsRecfg.srsSubFrameCfg;
3709 /* RACH Reconfiguration */
3710 if (cellRecfg->recfgTypes & RGR_CELL_RACH_RECFG)
3712 cell->rachCfg = cellRecfg->rachRecfg;
3715 /* ccpu00132256:MOD: Moved this assignment from Validation to here.*/
3716 if (cellRecfg->recfgTypes & RGR_CELL_TMRS_RECFG)
3718 cell->t300TmrVal = cellRecfg->t300TmrVal;
3721 /* SI Reconfiguration */
3722 if (cellRecfg->recfgTypes & RGR_CELL_SI_RECFG)
3724 /*Set the specified SI configuration. */
3725 cell->siCb.newSiCfg = cellRecfg->siReCfg;
3726 /* Set the Bit mask for SI re-configuration */
3727 cell->siCb.siBitMask |= RGSCH_SI_SICFG_UPD;
3729 if(cell->emtcEnable)
3731 rgSchEmtcUpdSiCfg(cell, cellRecfg);
3735 #endif /*RGR_SI_SCH */
3737 /* Overload RACH Control changes */
3738 if (cellRecfg->recfgTypes & RGR_CELL_CNTRL_CMD_RECFG)
3740 if (cellRecfg->cntrlCmdCfg.cmdType == RGR_CNTRL_CMD_RACH_OVRLD)
3742 cell->overLoadBackOffEnab = cellRecfg->cntrlCmdCfg.cmdDesc.rachOvrLd.backOffEnb;
3743 cell->overLoadBackOffval = cellRecfg->cntrlCmdCfg.cmdDesc.rachOvrLd.backOffVal;
3745 else if (cellRecfg->cntrlCmdCfg.cmdType == RGR_CNTRL_CMD_CPU_OVRLD)
3747 if( ROK != rgSCHUtlResetCpuOvrLdState(cell, cellRecfg->cntrlCmdCfg.cmdDesc.\
3748 cpuOvrLd.instruction))
3750 RLOG_ARG1(L_ERROR,DBG_CELLID, cellRecfg->cellId,
3751 "Invalid CPU OvrLd Ins %d for cell",
3752 cellRecfg->cntrlCmdCfg.cmdDesc.cpuOvrLd.instruction);
3758 /* LTE_ADV_FLAG_REMOVED_START */
3759 if (cellRecfg->recfgTypes & RGR_CELL_LTEA_FEATURE_RECFG)
3761 if(cellRecfg->rgrLteAdvCfg.pres & RGR_ABS)
3763 cell->lteAdvCb.absCfg =
3764 cellRecfg->rgrLteAdvCfg.absCfg;
3766 if(cellRecfg->rgrLteAdvCfg.pres & RGR_SFR)
3768 cmMemcpy((U8 *)&cell->lteAdvCb.sfrCfg, (U8 *)&cellRecfg->rgrLteAdvCfg.sfrCfg,
3769 sizeof(RgrSfrConfig));
3770 /* dsfr_pal_fixes ** 21-March-2013 ** SKS */
3771 if (cellRecfg->rgrLteAdvCfg.sfrCfg.status == RGR_ENABLE)
3773 for(i = 0; i < RGSCH_NUM_DL_SUBFRAMES; i++)
3775 /*initialise the pools of CC and CE*/
3776 if(rgSchSFRTotalPoolInit(cell, cell->subFrms[i]))
3784 for(i = 0; i < RGSCH_NUM_DL_SUBFRAMES; i++)
3786 /*initialise the pools of CC and CE*/
3787 rgSchSFRTotalPoolFree(&cell->subFrms[i]->sfrTotalPoolInfo, cell);
3790 if (cell->lteAdvCb.dsfrCfg.status == RGR_ENABLE)
3792 /* releasing rntp info val from each subframe */
3793 for(i = 0; i < RGSCH_NUM_DL_SUBFRAMES; i++)
3795 rgSchDSFRRntpInfoFree(&cell->subFrms[i]->rntpInfo, cell, cell->bwCfg.dlTotalBw);
3798 /* releasing RNTP Aggregation Info from CellCb*/
3799 rgSchDSFRRntpInfoFree(&cell->rntpAggrInfo, cell, cell->bwCfg.dlTotalBw);
3801 cell->lteAdvCb.dsfrCfg.status = RGR_DISABLE;
3805 /* dsfr_pal_fixes ** 21-March-2013 ** SKS ** Start */
3806 if(cellRecfg->rgrLteAdvCfg.pres & RGR_DSFR)
3808 cell->lteAdvCb.dsfrCfg =
3809 cellRecfg->rgrLteAdvCfg.dsfrCfg;
3810 if (cell->lteAdvCb.dsfrCfg.status == RGR_ENABLE)
3812 for(i = 0; i < RGSCH_NUM_DL_SUBFRAMES; i++)
3814 /*initialise the pools of CC and CE*/
3815 if(rgSchDSFRRntpInfoInit(&cell->subFrms[i]->rntpInfo,cell,cell->bwCfg.dlTotalBw))
3820 /*Calculating the length of RNTP array based on Dl Bandwidth */
3821 len = (U16)((cell->bwCfg.dlTotalBw % 8 == 0) ? (cell->bwCfg.dlTotalBw/8) : (cell->bwCfg.dlTotalBw/8 + 1)); /* KW fix for LTE_ADV */
3822 if(cell->rntpAggrInfo.pres == NOTPRSNT)
3824 if((rgSCHUtlAllocSBuf(inst, (Data**)&(cell->rntpAggrInfo.val),
3825 (len * sizeof(U8)))) != ROK)
3827 RLOG_ARG0(L_ERROR,DBG_CELLID,cellRecfg->cellId,
3828 "Memory allocation FAILED for RNTP Alloc");
3831 cell->rntpAggrInfo.pres = PRSNT_NODEF;
3832 cell->rntpAggrInfo.len = len;
3835 /* in case if DSFR is disabled, need to free RNTP pattern val*/
3838 /* releasing rntp info val from each subframe */
3839 for(i = 0; i < RGSCH_NUM_DL_SUBFRAMES; i++)
3841 rgSchDSFRRntpInfoFree(&cell->subFrms[i]->rntpInfo, cell, cell->bwCfg.dlTotalBw);
3844 /* releasing RNTP Aggregation Info from CellCb*/
3845 rgSchDSFRRntpInfoFree(&cell->rntpAggrInfo, cell, cell->bwCfg.dlTotalBw);
3848 /* dsfr_pal_fixes ** 21-March-2013 ** SKS ** End */
3850 /* LTE_ADV_FLAG_REMOVED_END */
3852 /* Dynamic CFI cell Reconfiguration */
3853 if(cellRecfg->recfgTypes & RGR_CELL_DYN_CFI_RECFG)
3855 if(cell->dynCfiCb.isDynCfiEnb != cellRecfg->isDynCfiEnb)
3857 if(cell->dynCfiCb.switchOvrInProgress)
3859 cell->dynCfiCb.dynCfiRecfgPend = TRUE;
3863 cell->dynCfiCb.isDynCfiEnb = cellRecfg->isDynCfiEnb;
3864 rgSCHDynCfiReCfg(cell, cellRecfg->isDynCfiEnb);
3869 /* To hanlde the case where reconfiguration comes for disabling
3870 * and then enabling before switchover period expires */
3871 cell->dynCfiCb.dynCfiRecfgPend = FALSE;
3874 /* Dynamic config of AUTO chnage flag */
3875 if(cellRecfg->recfgTypes & RGR_CELL_AUTO_CFG_MODE_RECFG)
3877 if(cell->isAutoCfgModeEnb != cellRecfg->isAutoCfgModeEnb)
3879 cell->isAutoCfgModeEnb = cellRecfg->isAutoCfgModeEnb;
3883 if(cell->isAutoCfgModeEnb)
3885 RLOG0(L_INFO,"Auto Mode Cfg enabled durint cell recfg\n");
3889 if (cellRecfg->recfgTypes & RGR_CELL_CSG_PARAM_RECFG)
3891 cell->minDlResNonCsg = cellRecfg->csgParamCfg.minDlResNonCsg;
3892 cell->minUlResNonCsg = cellRecfg->csgParamCfg.minUlResNonCsg;
3895 errInfo->errCause = RGSCHERR_NONE;
3897 } /* rgSCHCfgRgrCellRecfg */
3900 * @brief Handler for the UE reconfiguration request from RRC to MAC.
3904 * Function : rgSCHCfgRgrUeRecfgRntiChg
3907 * - If rnti changes,
3908 * - Invoke RAM for UE reconfiguration.
3909 * - Delete old UE from the list.
3910 * - Update the new rnti and re-insert the UE in the list.
3911 * - If successful, return ROK else RFAILED.
3913 * @param[in] RgSchCellCb *cell
3914 * @param[in] RgSchUeCb *ue
3915 * @param[in] RgrUeRecfg *ueRecfg
3916 * @param[out] RgSchErrInfo *errInfo
3922 PRIVATE S16 rgSCHCfgRgrUeRecfgRntiChg
3926 RgrUeRecfg *ueRecfg,
3927 RgSchErrInfo *errInfo
3930 PRIVATE S16 rgSCHCfgRgrUeRecfgRntiChg(cell, ue, ueRecfg, errInfo)
3933 RgrUeRecfg *ueRecfg;
3934 RgSchErrInfo *errInfo;
3943 RgSchDlHqEnt **hqEnt = &(RG_SCH_CMN_GET_UE_HQE(ue, cell));
3946 TRC2(rgSCHCfgRgrUeRecfgRntiChg);
3948 /* Handle CRNTI change in reconfiguration */
3949 if (ueRecfg->oldCrnti != ueRecfg->newCrnti)
3951 RgSchRntiLnk *oldRntiLnk=NULLP;
3952 CmLteRnti oldRnti = 0;
3953 if ((raCb = rgSCHDbmGetRaCb(cell, ueRecfg->newCrnti)) == NULLP)
3955 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"UEID:No RaCb exists while"
3956 "Reconfig for OLD CRNTI:%d NEW CRNTI:%d",ueRecfg->oldCrnti,ueRecfg->newCrnti);
3960 /* rntiLnk does not exist for a HandIn UE. Hence this check. */
3963 oldRntiLnk = ue->rntiLnk;
3967 /* Fix : syed HO UE does not have a valid ue->rntiLnk */
3971 RLOG2(L_INFO,"UE ID CHNG OLD %d new %d",ueRecfg->oldCrnti, ueRecfg->newCrnti);
3973 /* Fix : syed Deleting Old DL HqEnt. It would be assigned after
3974 * reest RACH(msg4) is completed. */
3975 rgSCHDhmDelHqEnt(cell, hqEnt);
3977 /* Initialize RAM related information for UE */
3978 ret = rgSCHRamRgrUeCfg(cell, ue, raCb, errInfo);
3981 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"RAM Handling for UE Reconfig failed"
3982 "for OLD CRNTI:%d NEW CRNTI:%d",ueRecfg->oldCrnti,ueRecfg->newCrnti);
3985 /* Delete Ue from the ue list */
3986 rgSCHDbmDelUeCb(cell, ue);
3991 for ( sCellIdx = 1; sCellIdx < CM_LTE_MAX_CELLS; sCellIdx++)
3993 if(ue->cellInfo[sCellIdx] != NULLP)
3995 rgSCHDbmDelUeCb(ue->cellInfo[sCellIdx]->cell, ue);
4001 /* Inititialize Ue control block */
4002 ue->ueId = ueRecfg->newCrnti;
4003 RLOG_ARG2(L_DEBUG,DBG_CELLID,cell->cellId,
4004 "Changing RNTI from %d to %d",
4010 rgSCHUtlUpdEmtcY(ue);
4014 /* Fix ccpu00122631: PCell_Reest: Updating new Rnti in all the cells
4017 for(idx = 0; idx < CM_LTE_MAX_CELLS; idx++)
4019 if(ue->cellInfo[idx])
4021 ue->cellInfo[idx]->dlAllocCb.rnti = ueRecfg->newCrnti;
4025 rgSCHUtlRecMsg3Alloc(cell, ue, raCb);
4027 /* If raCb received PHR, update scheduler */
4028 if(raCb->phr.pres == TRUE)
4030 ue->macCeRptTime = raCb->msg3AllocTime;
4031 rgSCHUtlUpdPhr(cell, ue, raCb->phr.val, errInfo);
4034 #ifdef RGR_V2 /* Acc Fix */
4035 if(TRUE == ue->isDrxEnabled)
4037 ueRecfg->ueDrxRecfg.isDrxEnabled = TRUE;
4038 ret = rgSCHDrxUeReCfg(cell,ue,ueRecfg);
4042 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"UE DRX re-est failed"
4043 "for OLD CRNTI:%d NEW CRNTI:%d",ueRecfg->oldCrnti,ueRecfg->newCrnti);
4047 #endif /* Acc Fix */
4049 /* Re-insert updated Ue */
4050 rgSCHDbmInsUeCb(cell, ue);
4055 for ( sCellIdx = 1; sCellIdx < CM_LTE_MAX_CELLS; sCellIdx++)
4057 if(ue->cellInfo[sCellIdx] != NULLP)
4059 rgSCHDbmInsUeCb(ue->cellInfo[sCellIdx]->cell, ue);
4067 ue->tenbStats->stats.rnti = ue->ueId;
4070 /* Fix : syed If MSG4 is done, since corresponding ueCb
4071 * is ready, the raCb should be cleared immediately.
4072 * Otherwise it would remain in the cell until timed out
4073 * and till then the hq Feedbacks will be assumed to be
4075 if (raCb->raState == RGSCH_RA_MSG4_DONE)
4077 RLOG_ARG1(L_DEBUG,DBG_CELLID,ueRecfg->cellId,
4078 "RNTI:%d with RaCb deleted as Msg4 transmission is done",
4080 rgSCHRamDelRaCb(cell, raCb, FALSE);
4082 /* Fix : syed moving the UL CQI initialization to UERESET */
4084 /* Release Older rnti */
4087 /* This is the rare case in which back to back reestablishment is
4088 * happening and previous re-est was not done completely (MSG4 was
4089 * not done) for an UE, and again re-est is triggered for the same
4090 * UE. We are deleting the old RA CB for the previous re-est which
4091 * still exist due to MSG4 not transmitted successfully */
4092 if ((oldRaCb = rgSCHDbmGetRaCb(cell, oldRntiLnk->rnti)) != NULLP)
4094 rgSCHRamDelRaCb(cell, oldRaCb, FALSE);
4097 rgSCHUtlRlsRnti(cell, oldRntiLnk, TRUE, ueRecfg->newCrnti);
4101 /* Fix : syed HO UE does not have a valid ue->rntiLnk */
4102 /* Just indicate to MAC, no need to release at SCH */
4103 RLOG_ARG2(L_DEBUG,DBG_CELLID,cell->cellId,
4104 "HO OldRnti:%d RLS and NewRnti:%d CHNG IND TO MAC",
4105 oldRnti, ueRecfg->newCrnti);
4106 rgSCHUtlIndRntiRls2Mac(cell, oldRnti, TRUE, ueRecfg->newCrnti);
4112 * @brief Handler for the UE reconfiguration request from RRC to MAC.
4116 * Function : rgSCHCfgRgrUeRecfg
4119 * - If rnti changes,
4120 * - Invoke RAM for UE reconfiguration.
4121 * - Delete old UE from the list.
4122 * - Update the new rnti and re-insert the UE in the list.
4123 * - Update the UE control block with the reconfigured values.
4124 * - Invoke SCH, UHM and DHM with updated UE control block to
4125 * update scheduler, uplink HARQ and downlink HARQ specific
4127 * - If successful, return ROK else RFAILED.
4129 * @param[in] RgSchCellCb *cell
4130 * @param[in] RgSchUeCb *ue
4131 * @param[in] RgrUeRecfg *ueRecfg
4132 * @param[out] RgSchErrInfo *errInfo
4138 PUBLIC S16 rgSCHCfgRgrUeRecfg
4142 RgrUeRecfg *ueRecfg,
4143 RgSchErrInfo *errInfo
4146 PUBLIC S16 rgSCHCfgRgrUeRecfg(cell, ue, ueRecfg, errInfo)
4149 RgrUeRecfg *ueRecfg;
4150 RgSchErrInfo *errInfo;
4155 Bool dciChange = TRUE;
4158 TRC2(rgSCHCfgRgrUeRecfg);
4160 errInfo->errCause = RGSCHERR_CFG_RGR_UE_RECFG;
4163 if (ue->numSCells > 0)
4167 if ((ueRecfg->ueRecfgTypes & RGR_UE_UE_ACCESS_STRATUM_REL_RECFG) && \
4168 (ue->accessStratumRls != ueRecfg->accessStratumRls))
4170 ue->accessStratumRls = ueRecfg->accessStratumRls;
4174 /* if SCELL_RECFG is present , no other
4175 * type will be present. Process Scell addition
4178 if (ueRecfg->ueRecfgTypes & RGR_UE_SCELL_ADD_RECFG)
4180 ret = rgSCHSCellCfgUeCfg(cell, ue, ueRecfg, errInfo);
4183 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_UE_SCELL_RECFG;
4184 /*FH: SCell config failed for a scell index hence revert all successful
4185 * Scell config and send negative confirmation to APP*/
4186 rgSCHSCellCfgUeCfgRollBack(cell, ue, ueRecfg);
4190 if (dciChange == TRUE)
4192 if (ue->numSCells > 0)
4195 rgSCHUtlUpdUeDciSize(cell, ue, TRUE);
4199 /* 1 bit CSI Access Stratum Release Change */
4200 rgSCHUtlUpdUeDciSize(cell, ue, FALSE);
4203 if (ueRecfg->ueRecfgTypes & RGR_UE_SCELL_PUCCH_RECFG)
4205 ret = rgSCHSCellCfgUePucchReCfg(cell, ue, ueRecfg, errInfo);
4208 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_UE_SCELL_PUCCH_RECFG;
4213 if ((ueRecfg->ueRecfgTypes & RGR_UE_UE_ACCESS_STRATUM_REL_RECFG) && \
4214 (ue->accessStratumRls != ueRecfg->accessStratumRls))
4216 ue->accessStratumRls = ueRecfg->accessStratumRls;
4217 rgSCHUtlUpdUeDciSize(cell, ue, FALSE);
4219 #endif /* LTE_ADV */
4221 if (ueRecfg->ueRecfgTypes)
4223 /* Update scheduler related information for UE */
4224 ret = rgSCHUtlRgrUeRecfg(cell, ue, ueRecfg, errInfo);
4227 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,
4228 "Scheduler handling while reconfig failed"
4229 "for OLD CRNTI:%d NEW CRNTI:%d",ueRecfg->oldCrnti,ueRecfg->newCrnti);
4233 /* Update uplink HARQ related information for UE */
4234 rgSCHUhmRgrUeRecfg(cell, ue, ueRecfg);
4236 /* Update TA related information for UE */
4237 if (ueRecfg->ueRecfgTypes & RGR_UE_TATMR_RECFG)
4239 rgSCHCfgUeTaRecfg(cell, ue, ueRecfg, errInfo);
4242 /*Update Measurement Gap and AckNack Details */
4243 /* After merging from 2.2 */
4244 if (ueRecfg->ueRecfgTypes & RGR_UE_ACKNACK_MEASGAP_RECFG)
4246 ret = rgSCHMeasGapANRepUeRecfg(cell, ue, ueRecfg);
4249 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Measurement Gap and"
4250 "AckNack Rep Recfg failed for OLD CRNTI:%d NEW CRNTI:%d",
4251 ueRecfg->oldCrnti,ueRecfg->newCrnti);
4255 if (ueRecfg->ueRecfgTypes & RGR_UE_BSRTMR_RECFG)
4257 cmInitTimers(&ue->bsrTmr, 1);
4258 ue->ul.bsrTmrCfg = ueRecfg->ueBsrTmrRecfg;
4259 if ((ue->ul.bsrTmrCfg.isPrdBsrTmrPres) &&
4260 (ue->ul.bsrTmrCfg.prdBsrTmr == 0xFFFF))
4262 ue->ul.bsrTmrCfg.isPrdBsrTmrPres = FALSE;
4267 if (RFAILED == rgSCHCfgRgrUeRecfgRntiChg (cell, ue, ueRecfg, errInfo))
4269 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"RNTI change "
4270 "failed for OLD CRNTI:%d NEW CRNTI:%d",
4271 ueRecfg->oldCrnti,ueRecfg->newCrnti);
4276 /* Re-Initialize Aperiodic CQI Information for UE*/
4277 if ( ueRecfg->ueRecfgTypes & RGR_UE_APRD_DLCQI_RECFG )
4279 ret = rgSCHCfgAcqiUeReCfg(cell, ue, &ueRecfg->aprdDlCqiRecfg,
4282 /* Re-Initialize Periodic CQI/PMI, RI Information for UE */
4283 if ( ueRecfg->ueRecfgTypes & RGR_UE_PCQI_RECFG)
4285 ret = rgSCHCfgPCqiUeReCfg(cell, ue, &ueRecfg->cqiCfg,
4288 /* Re-Initialize UL SRS Information for UE */
4289 if ( ueRecfg->ueRecfgTypes & RGR_UE_SRS_RECFG)
4291 ret = rgSCHCfgSrsUeReCfg(cell, ue, &ueRecfg->srsCfg);
4293 /* Re-Initialize SR Information for UE */
4294 if ( ueRecfg->ueRecfgTypes & RGR_UE_SR_RECFG)
4296 ret = rgSCHCfgSrUeReCfg(cell, ue, &ueRecfg->srCfg);
4301 if(ueRecfg->isHdFddEnbld)
4303 ret = rgSCHHdFddUeCfg(cell, ue, ueRecfg->isHdFddEnbld);
4306 errInfo->errCause = RGSCHERR_HDFDD_SPSCFGRD;
4310 #endif /* LTEMAC_HDFDD */
4312 if ( ueRecfg->ueRecfgTypes & RGR_UE_DRX_RECFG)
4314 ret = rgSCHDrxUeReCfg(cell,ue,ueRecfg);
4318 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"UE DRX reconfig failed"
4319 "failed for OLD CRNTI:%d NEW CRNTI:%d",
4320 ueRecfg->oldCrnti,ueRecfg->newCrnti);
4325 /* ccpu00117452 - MOD - Changed macro name from
4326 RGR_RRM_DLPWR_CNTRL to RGR_CQI_REPT */
4328 /* CQI Reporting (N) Re-configuration */
4329 if(ueRecfg->ueRecfgTypes & RGR_UE_CQIREPT_RECFG)
4331 ret = rgSCHCfgUeCqiReptReCfg(cell, ue, ueRecfg);
4334 errInfo->errCause = RGSCHERR_CQIREPT;
4338 #endif /* End of RGR_CQI_REPT */
4340 /* pA Re-configuration */
4341 if((ueRecfg->ueRecfgTypes & RGR_UE_PA_RECFG) &&
4342 RG_SCH_UE_CFG_ISPAPRSNT(ueRecfg->uePdschDedCfg.uepACfg))
4344 RG_SCH_CMN_GET_PA(ue,cell).pres = TRUE;
4345 RG_SCH_CMN_GET_PA(ue,cell).val = ueRecfg->uePdschDedCfg.uepACfg.pA;
4349 /* LTE_ADV_FLAG_REMOVED_START */
4350 if(ueRecfg->ueRecfgTypes & RGR_UE_LTEA_RECFG)
4352 if(ueRecfg->ueLteAdvCfg.pres & RGR_ABS)
4354 ue->lteAdvUeCb.rgrLteAdvUeCfg.isAbsUe = ueRecfg->ueLteAdvCfg.isAbsUe;
4357 if(ueRecfg->ueLteAdvCfg.pres & RGR_SFR)
4359 ue->lteAdvUeCb.rgrLteAdvUeCfg.isUeCellEdge = ueRecfg->ueLteAdvCfg.isUeCellEdge;
4362 /* LTE_ADV_FLAG_REMOVED_END */
4364 if(ueRecfg->ueRecfgTypes & RGR_UE_EMTC_DPLXMODE_RECFG)
4366 rgSCHEmtcHdFddUeCfg (cell, ue,
4367 ueRecfg->emtcUeRecfg.isHdFddEnbld);
4369 if(ueRecfg->ueRecfgTypes & RGR_UE_EMTC_PO_TRIGGER)
4371 rgSCHEmtcPOTrigger(cell, ue);
4374 errInfo->errCause = RGSCHERR_NONE;
4377 } /* rgSCHCfgRgrUeRecfg */
4381 * @brief Handler for the logical channel reconfiguration request from
4386 * Function : rgSCHCfgRgrLchRecfg
4389 * - Invoke scheduler to update scheduler specific information.
4390 * - Update the dedicated logical channel Cb with the reconfigured
4392 * - If successful, return ROK else RFAILED.
4394 * @param[in] RgUlCellCb *cell
4395 * @param[in] RgUlUeCb *ue
4396 * @param[in] RgSchUlLcCb *ulLc
4397 * @param[in] RgSchDlLcCb *dlLc
4398 * @param[in] RgrLchRecfg *lcRecfg
4399 * @param[out] RgSchErrInfo *errInfo
4405 PUBLIC S16 rgSCHCfgRgrLchRecfg
4410 RgrLchRecfg *lcRecfg,
4411 RgSchErrInfo *errInfo
4414 PUBLIC S16 rgSCHCfgRgrLchRecfg(cell, ue, dlLc, lcRecfg, errInfo)
4418 RgrLchRecfg *lcRecfg;
4419 RgSchErrInfo *errInfo;
4424 TRC2(rgSCHCfgRgrLchRecfg);
4426 errInfo->errCause = RGSCHERR_CFG_RGR_LC_RECFG;
4427 /* Invoke Scheduler to update the new configuration */
4428 ret = rgSCHUtlRgrLcRecfg(cell, ue, dlLc, lcRecfg, errInfo);
4431 RLOG_ARG2(L_ERROR,DBG_CELLID,lcRecfg->cellId,"Scheduler handling for LC Recfg"
4432 " failed for CRNTI:%d LCID:%d",lcRecfg->crnti,lcRecfg->lcId);
4436 errInfo->errCause = RGSCHERR_NONE;
4438 } /* rgSCHCfgRgrLchRecfg */
4440 * @brief Handler for the logical channel reconfiguration request from
4445 * Function : rgSCHCfgRgrLcgRecfg
4448 * - Invoke scheduler to update scheduler specific information.
4449 * - Update the dedicated logical channel Cb with the re-configured
4451 * - If successful, return ROK else RFAILED.
4453 * @param[in] RgUlCellCb *cell
4454 * @param[in] RgUlUeCb *ue
4455 * @param[in] RgrLcgRecfg *lcgRecfg
4456 * @param[out] RgSchErrInfo *errInfo
4462 PUBLIC S16 rgSCHCfgRgrLcgRecfg
4466 RgrLcgRecfg *lcgRecfg,
4467 RgSchErrInfo *errInfo
4470 PUBLIC S16 rgSCHCfgRgrLcgRecfg(cell, ue, lcgRecfg, errInfo)
4473 RgrLcgRecfg *lcgRecfg;
4474 RgSchErrInfo *errInfo;
4479 TRC2(rgSCHCfgRgrLcgRecfg);
4481 errInfo->errCause = RGSCHERR_CFG_RGR_LCG_RECFG;
4483 /*Added for handling LCG ReConfig if the LCG was deleted */
4484 ue->ul.lcgArr[lcgRecfg->ulRecfg.lcgId].lcgId = lcgRecfg->ulRecfg.lcgId;
4486 /* Invoke Scheduler to update the new configuration */
4487 ret = rgSCHUtlRgrLcgRecfg(cell, ue, lcgRecfg, errInfo);
4490 RLOG_ARG2(L_ERROR,DBG_CELLID,lcgRecfg->cellId,"Scheduler handling for LCG Recfg"
4491 " failed for CRNTI:%d LCGID:%d",lcgRecfg->crnti,lcgRecfg->ulRecfg.lcgId);
4495 errInfo->errCause = RGSCHERR_NONE;
4497 } /* rgSCHCfgRgrLcgRecfg */
4500 * @brief Handler for the UE Reset request from RRM to MAC.
4504 * Function : rgSCHCfgRgrUeReset
4507 * - Call Measument Gap Module and Ack/Nack Module for resetting UE.
4508 * - Call Common Schduler UE rest API which inturn will call scheduler
4509 * specific UE Reset APis to reset UE.
4511 * @param[in] RgSchCellCb *cell
4512 * @param[in] RgSchUeCb *ue
4513 * @param[in] RgrRst *reset
4514 * @param[out] RgSchErrInfo *errInfo
4520 PUBLIC S16 rgSCHCfgRgrUeReset
4525 RgSchErrInfo *errInfo
4528 PUBLIC S16 rgSCHCfgRgrUeReset(cell, ue, reset, errInfo)
4532 RgSchErrInfo *errInfo;
4538 TRC2(rgSCHCfgRgrUeReset);
4541 errInfo->errCause = RGSCHERR_CFG_RGR_UE_RESET;
4543 /* Setting BO of Each Logical Channel of the UE to 0 */
4544 for (idx = 0; idx < RGSCH_MAX_LC_PER_UE; idx++)
4546 if(ue->dl.lcCb[idx] != NULLP)
4547 ue->dl.lcCb[idx]->bo = 0;
4550 /* Reset the totalBo */
4552 /* Call DRX module to stop all DRX timers */
4554 if(ue->drxCb != NULLP)
4556 (Void)rgSCHDrxUeDel(cell,ue);
4559 /* ccpu00140894- Stop TXMode transiition timer if it is running*/
4560 if (ue->txModeTransTmr.tmrEvnt != TMR_NONE)
4562 rgSCHTmrStopTmr(cell, RG_SCH_TMR_TXMODE_TRNSTN, ue);
4563 ue->txModeTransCmplt =TRUE;
4566 /* ccpu00133470- Meas Gap should be released during RRC re-establishment */
4567 rgSCHMeasGapANRepUeDel(cell, ue, FALSE);
4569 /* Call Common scheduler which in turn will call specific scheduler for UE
4571 rgSCHUtlUeReset(cell, ue);
4573 /*PCell which is at idx 0 is always active. Adding a line after the loop
4574 *setting RGSCH_PCELL_INDEX to SCELL ACTIVE*/
4575 ue->cellInfo[RGSCH_PCELL_INDEX]->sCellState = RG_SCH_SCELL_ACTIVE;
4578 /* In case of back to back reestablishments, when this UE's
4579 * previous ReEst is still in progress and has got RESET
4580 * as part of new ReEst */
4581 if((raCb = rgSCHDbmGetRaCb(cell, ue->ueId)) != NULLP)
4583 rgSCHRamDelRaCb(cell, raCb, FALSE);
4585 /* Fix : syed set UE inactive in DL until UE is reinitialization completed */
4586 ue->dl.dlInactvMask |= RG_HQENT_INACTIVE;
4587 ue->ul.ulInactvMask |= RG_HQENT_INACTIVE;
4588 /* [ccpu00127141] Resetting TA related parameters */
4589 ue->dl.taCb.ta = RGSCH_NO_TA_RQD;
4590 ue->dl.taCb.state = RGSCH_TA_IDLE;
4592 /*[ccpu00121813]-ADD-Initializing outstanding TA value */
4593 ue->dl.taCb.outStndngTa = FALSE;
4594 ue->dl.taCb.outStndngTaval = RGSCH_NO_TA_RQD;
4596 if (ue->dl.taCb.cfgTaTmr)
4598 rgSCHTmrStartTmr (cell, ue, RG_SCH_TMR_TA, ue->dl.taCb.cfgTaTmr);
4602 /* Resetting the Tx mode change factor on UE reset */
4603 ue->mimoInfo.txModUpChgFactor = 0;
4604 ue->mimoInfo.txModDownChgFactor = 0;
4607 errInfo->errCause = RGSCHERR_NONE;
4609 } /* rgSCHCfgRgrUeReset */
4612 * @brief Handler for the cell delete request from RRM to MAC.
4616 * Function : rgSCHCfgRgrCellDel
4619 * - Fetch the cell control block.
4620 * - Remove the cell control block from the hash list of cells.
4621 * - Free the cell control block.
4622 * - If successful, return ROK else return RFAILED.
4624 * @param[in] RgSchCellCb *cell
4625 * @param[in] RgrDel *cellDelInfo
4626 * @param[out] RgSchErrInfo *errInfo
4632 PUBLIC S16 rgSCHCfgRgrCellDel
4635 RgrDel *cellDelInfo,
4636 RgSchErrInfo *errInfo
4639 PUBLIC S16 rgSCHCfgRgrCellDel(cell, cellDelInfo, errInfo)
4641 RgrDel *cellDelInfo;
4642 RgSchErrInfo *errInfo;
4645 TRC2(rgSCHCfgRgrCellDel);
4648 errInfo->errCause = RGSCHERR_CFG_RGR_CELL_DEL;
4650 if (cell->cellId != cellDelInfo->u.cellDel.cellId)
4652 RLOG_ARG0(L_ERROR,DBG_CELLID,cellDelInfo->u.cellDel.cellId,
4653 "Cell does not exist");
4657 /* Free the active cell */
4658 rgSCHCfgFreeCellCb(cell);
4660 errInfo->errCause = RGSCHERR_NONE;
4662 } /* rgSCHCfgRgrCellDel */
4666 * @brief Handler for the UE delete request from RRM to MAC.
4670 * Function : rgSCHCfgRgrUeDel
4673 * - Fetch the UE control block.
4674 * - Remove the UE control block from the hash list of UEs for the cell.
4675 * - Free the UE control block.
4676 * - If successful, return ROK else return RFAILED.
4678 * @param[in] RgSchCellCb *cell
4679 * @param[in] RgrDel *ueDelInfo
4680 * @param[out] RgSchErrInfo *errInfo
4686 PUBLIC S16 rgSCHCfgRgrUeDel
4690 RgSchErrInfo *errInfo
4693 PUBLIC S16 rgSCHCfgRgrUeDel(cell, ueDelInfo, errInfo)
4696 RgSchErrInfo *errInfo;
4702 Inst inst = cell->instIdx;
4703 RgSchCellCb *secCellCb = NULLP;
4706 TRC2(rgSCHCfgRgrUeDel);
4707 errInfo->errCause = RGSCHERR_CFG_RGR_UE_DEL;
4709 if (cell->cellId != ueDelInfo->u.ueDel.cellId)
4711 RLOG_ARG1(L_ERROR,DBG_CELLID,ueDelInfo->u.ueDel.cellId,
4712 "Cell does not exist CRNTI:%d",
4713 ueDelInfo->u.ueDel.crnti);
4716 if ((ue = rgSCHDbmGetUeCb(cell, ueDelInfo->u.ueDel.crnti)) == NULLP)
4718 if((raCb = rgSCHDbmGetRaCb(cell, ueDelInfo->u.ueDel.crnti)) == NULLP)
4720 RLOG_ARG1(L_ERROR,DBG_CELLID,ueDelInfo->u.ueDel.cellId,
4721 "RaCb does not exist for CRNTI:%d",ueDelInfo->u.ueDel.crnti);
4726 /* This happens in case of Msg4 rejection */
4734 if(ueDelInfo->u.ueScellRel.ueDelTypes & RGR_UE_SCELL_DEL_RECFG)
4736 for(U8 idx = 0; idx < ueDelInfo->u.ueScellRel.ueSCellRelCfgInfo.numSCells; idx++)
4738 if(NULLP != (secCellCb = (RgSchCellCb *)rgSchUtlGetCellCb(inst, \
4739 ueDelInfo->u.ueScellRel.ueSCellRelCfgInfo.ueSCellRelDedCfg[idx].sCellId)))
4741 rgSCHUtlSndUeSCellDel2Mac(secCellCb, ue->ueId);
4742 rgSCHSCellDelUeSCell(cell,ue,ueDelInfo->u.ueScellRel.ueSCellRelCfgInfo.ueSCellRelDedCfg[idx].sCellIdx);
4744 if ( ue->numSCells == 0)
4746 ue->allocCmnUlPdcch = TRUE;
4750 if (ue->numSCells == 0)
4752 /* As there is no SCell left so DCI 0 size at UE specific search space
4753 * will be recalculated as the CSI is reduced to 1 bit */
4754 rgSCHUtlUpdUeDciSize(cell, ue, FALSE);
4760 /* Delete Ue from the UE list of CELL*/
4761 rgSCHDbmDelUeCb(cell, ue);
4764 rgSCHDbmDelL2MUe(cell, ue);
4767 /* Call MeasGap and AckNakRep processing module */
4768 rgSCHMeasGapANRepUeDel(cell, ue, TRUE);
4770 /* ccpu00140894- Stop TXMode transiition timer if it is running*/
4771 if (ue->txModeTransTmr.tmrEvnt != TMR_NONE)
4773 rgSCHTmrStopTmr(cell, RG_SCH_TMR_TXMODE_TRNSTN, ue);
4776 /* Call DRX module to remove UEs from various
4780 if(ue->drxCb != NULLP)
4782 (Void)rgSCHDrxUeDel(cell,ue);
4785 /*Fix: If RA CB exists, delete it*/
4786 if((raCb = rgSCHDbmGetRaCb(cell, ueDelInfo->u.ueDel.crnti)) != NULLP)
4788 /* Fix : syed RNTI was getting released twice, once by racb del
4789 * and subsequently by ueDel. Let it get released by ueDel alone */
4790 rgSCHRamDelRaCb(cell, raCb, FALSE);
4795 rgSCHEmtcUeDel(cell, ue);
4799 rgSCHCfgFreeUeCb(cell, ue);
4801 errInfo->errCause = RGSCHERR_NONE;
4806 } /* rgSCHCfgRgrUeDel */
4810 * @brief Handler for the logical channel delete request from
4815 * Function : rgSCHCfgRgrLcDel
4818 * - Fetch the logical channel control block.
4819 * - Free the logical channel control block.
4820 * - If successful, return ROK else return RFAILED.
4822 * @param[in] RgrDel *lcDelInfo
4823 * @param[out] RgSchErrInfo *errInfo
4829 PUBLIC S16 rgSCHCfgRgrLcDel
4833 RgSchErrInfo *errInfo
4836 PUBLIC S16 rgSCHCfgRgrLcDel(cell, lcDelInfo, errInfo)
4839 RgSchErrInfo *errInfo;
4850 TRC2(rgSCHCfgRgrLcDel);
4852 errInfo->errCause = RGSCHERR_CFG_RGR_LC_DEL;
4854 /* Fetch the Active cell */
4855 if (cell->cellId != lcDelInfo->u.lchDel.cellId)
4857 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId, "Cell does not exist %d",
4858 lcDelInfo->u.lchDel.cellId);
4863 if ((ue = rgSCHDbmGetUeCb(cell, lcDelInfo->u.lchDel.crnti)) == NULLP)
4865 RLOG_ARG2(L_ERROR,DBG_CELLID,lcDelInfo->u.lchDel.cellId,
4866 "UE does not exist for CRNTI:%d LCID:%d",
4867 lcDelInfo->u.lchDel.crnti,lcDelInfo->u.lchDel.lcId);
4870 if (lcDelInfo->u.lchDel.lcgId > 3)
4872 RLOG_ARG3(L_ERROR,DBG_CELLID,lcDelInfo->u.lchDel.cellId,
4873 "[%d]UEID:For LC %d, LCGid %d is invalid",
4874 lcDelInfo->u.lchDel.crnti,lcDelInfo->u.lchDel.lcId,
4875 lcDelInfo->u.lchDel.lcgId);
4878 if ((dlLc = rgSCHDbmGetDlDedLcCb(ue, lcDelInfo->u.lchDel.lcId))
4881 RLOG_ARG2(L_ERROR,DBG_CELLID,lcDelInfo->u.lchDel.cellId,
4882 "LC does not exist for CRNTI:%d LCID:%d",
4883 lcDelInfo->u.lchDel.crnti, lcDelInfo->u.lchDel.lcId);
4886 rgSCHUtlRgrLcDel(cell, ue, lcDelInfo->u.lchDel.lcId,lcDelInfo->u.lchDel.lcgId);
4888 /* Reduce any pending bo from this LC(if any)
4889 * from the UE's total BO */
4892 if(ue->totalBo >= dlLc->bo)
4894 ue->totalBo -= dlLc->bo;
4898 ue->totalBo = 0; /* this scenario should not occur */
4901 rgSCHDbmDelDlDedLcCb(ue, dlLc);
4902 rgSCHCfgFreeDlDedLcCb(cell, ue, dlLc);
4905 lcId = lcDelInfo->u.lchDel.lcId;
4906 if (TRUE == ue->ul.lcCb[lcId -1].isValid)
4908 ulLc = &(ue->ul.lcCb[lcId -1]);
4909 ue->ul.lcCb[lcId -1].isValid = FALSE;
4911 if((ulLc->qciCb->ulUeCount) &&
4912 (ue->ulActiveLCs & (1 << (ulLc->qciCb->qci -1))))
4914 ulLc->qciCb->ulUeCount--;
4915 ue->ulActiveLCs &= ~(1 << (ulLc->qciCb->qci -1));
4917 /* Shifting LCs in LCG Array because of LC deletion */
4918 for (idx = ulLc->lcgArrIdx +1; idx < ulLc->lcg->numLch;
4921 ulLc->lcg->lcArray[idx -1] =
4922 ulLc->lcg->lcArray[idx];
4923 ulLc->lcg->lcArray[idx -1]->lcgArrIdx = idx -1;
4925 ulLc->lcg->numLch--;
4926 ulLc->lcg->lcArray[idx -1] = NULLP;
4928 #endif /* LTE_L2_MEAS */
4931 errInfo->errCause = RGSCHERR_NONE;
4933 } /* rgSCHCfgRgrLcDel */
4938 * @brief Handler for the logical channel delete request from
4943 * Function : rgSCHCfgRgrLcgDel
4946 * - Fetch the logical channel control block.
4947 * - Free the logical channel control block.
4948 * - If successful, return ROK else return RFAILED.
4950 * @param[in] RgrDel *lcDelInfo
4951 * @param[out] RgSchErrInfo *errInfo
4957 PUBLIC S16 rgSCHCfgRgrLcgDel
4961 RgSchErrInfo *errInfo
4964 PUBLIC S16 rgSCHCfgRgrLcgDel(cell, lcDelInfo, errInfo)
4967 RgSchErrInfo *errInfo;
4970 RgSchUeCb *ue = NULLP;
4976 TRC2(rgSCHCfgRgrLcgDel);
4979 lcgId = lcDelInfo->u.lcgDel.lcgId;
4981 errInfo->errCause = RGSCHERR_CFG_RGR_LCG_DEL;
4983 /* Fetch the Active cell */
4984 if (cell->cellId != lcDelInfo->u.lcgDel.cellId)
4986 RLOG_ARG2(L_ERROR,DBG_CELLID,lcDelInfo->u.lchDel.cellId,
4987 "CELL does not exist for CRNTI:%d LCGID:%d",
4988 lcDelInfo->u.lchDel.crnti,lcDelInfo->u.lchDel.lcId);
4993 if ((ue = rgSCHDbmGetUeCb(cell, lcDelInfo->u.lcgDel.crnti)) == NULLP)
4995 RLOG_ARG2(L_ERROR,DBG_CELLID,lcDelInfo->u.lchDel.cellId,
4996 "UE does not exist for CRNTI:%d LCGID:%d",
4997 lcDelInfo->u.lchDel.crnti,lcDelInfo->u.lchDel.lcId);
5001 /* set lcgId in UEs lcg cntrl blk to invalid */
5002 rgSCHUtlRgrLcgDel(cell, ue, lcgId);
5003 ue->ul.lcgArr[lcgId].lcgId = RGSCH_INVALID_LCG_ID;
5006 /* Since LCs are being deleted, if any of them are contributing
5007 to Active UE count for a QCI, decrease the count */
5008 for (lcCount =0; (lcCount < RGSCH_MAX_LC_PER_UE) &&
5009 (lcCount < ue->ul.lcgArr[lcgId].numLch) ; lcCount++)
5011 if (ue->ul.lcgArr[lcgId].lcArray[lcCount])
5013 if((ue->ul.lcgArr[lcgId].
5014 lcArray[lcCount]->qciCb->ulUeCount) &&
5016 (1 << ((ue->ul.lcgArr[lcgId].
5017 lcArray[lcCount])->qciCb->qci -1))))
5020 ue->ul.lcgArr[lcgId].
5021 lcArray[lcCount]->qciCb->ulUeCount--;
5022 ue->ulActiveLCs &= ~(1 <<
5023 (ue->ul.lcgArr[lcgId].
5024 lcArray[lcCount]->qciCb->qci -1));
5030 errInfo->errCause = RGSCHERR_NONE;
5032 } /* rgSCHCfgRgrLcgDel */
5036 /***********************************************************
5038 * Func : rgSCHCfgVldtRgrLcCfg
5041 * Desc : Validates dedicated logical channel configuration recieved from RRM.
5051 **********************************************************/
5053 PUBLIC S16 rgSCHCfgVldtRgrLcCfg
5059 RgSchErrInfo *errInfo
5062 PUBLIC S16 rgSCHCfgVldtRgrLcCfg(inst, lcCfg, cell, ue, errInfo)
5067 RgSchErrInfo *errInfo;
5070 TRC2(rgSCHCfgVldtRgrLcCfg);
5073 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_DED_LC_CFG;
5075 if (((*cell) == NULLP) ||
5076 ((*cell)->cellId != lcCfg->cellId))
5078 RLOG_ARG2(L_ERROR,DBG_CELLID,lcCfg->cellId,"Cell does not existi for "
5079 "CRNTI:%d LCID:%d",lcCfg->crnti, lcCfg->lcId);
5084 if ((*ue = rgSCHDbmGetUeCb(*cell, lcCfg->crnti)) == NULLP)
5086 RLOG_ARG2(L_ERROR,DBG_CELLID,lcCfg->cellId,"UE does not exist for dedicated"
5087 " logical channel CRNTI:%d LCID:%d", lcCfg->crnti, lcCfg->lcId);
5091 /* Validate logical channel Id */
5092 if ((lcCfg->lcId < RGSCH_DEDLC_MIN_LCID)
5093 ||(lcCfg->lcId > RGSCH_DEDLC_MAX_LCID))
5095 RLOG_ARG2(L_ERROR,DBG_CELLID,lcCfg->cellId,"Invalid logical channel Id:%d"
5096 "for CRNTI:%d",lcCfg->lcId,lcCfg->crnti);
5100 if (lcCfg->lcType != CM_LTE_LCH_DTCH && lcCfg->lcType != CM_LTE_LCH_DCCH)
5102 RLOG_ARG3(L_ERROR,DBG_CELLID,lcCfg->cellId,"Invalid logical channel Type %d"
5103 "CRNTI:%d LCID:%d",lcCfg->lcType,lcCfg->crnti, lcCfg->lcId);
5108 } /* rgSCHCfgVldtRgrLcCfg */
5110 /***********************************************************
5112 * Func : rgSCHCfgVldtRgrLcgCfg
5115 * Desc : Validates dedicated logical channel group configuration recieved from RRM.
5125 **********************************************************/
5127 PUBLIC S16 rgSCHCfgVldtRgrLcgCfg
5133 RgSchErrInfo *errInfo
5136 PUBLIC S16 rgSCHCfgVldtRgrLcgCfg(inst, lcgCfg, cell, ue, errInfo)
5141 RgSchErrInfo *errInfo;
5144 TRC2(rgSCHCfgVldtRgrLcgCfg);
5147 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_DED_LCG_CFG;
5149 if (((*cell) == NULLP) ||
5150 ((*cell)->cellId != lcgCfg->cellId))
5152 RLOG_ARG2(L_ERROR,DBG_CELLID,lcgCfg->cellId,"Cell does not exist for"
5153 "CRNTI:%d LCGID:%d",lcgCfg->crnti,lcgCfg->ulInfo.lcgId);
5158 if ((*ue = rgSCHDbmGetUeCb(*cell, lcgCfg->crnti)) == NULLP)
5160 RLOG_ARG2(L_ERROR,DBG_CELLID,lcgCfg->cellId,"UE does not exist for "
5161 "dedicated logical channel CRNTI:%d LCGID:%d", lcgCfg->crnti, lcgCfg->ulInfo.lcgId);
5165 if ((lcgCfg->ulInfo.gbr != 0) && (lcgCfg->ulInfo.mbr < lcgCfg->ulInfo.gbr))
5171 } /* rgSCHCfgVldtRgrLcgCfg */
5174 /***********************************************************
5176 * Func : rgSCHCfgVldtRgrCellPwrCfg
5178 * Desc : Validates cell power configuration.
5188 **********************************************************/
5190 PRIVATE S16 rgSCHCfgVldtRgrCellPwrCfg
5193 RgrCellCfg *cellCfg,
5194 RgSchErrInfo *errInfo
5197 PRIVATE S16 rgSCHCfgVldtRgrCellPwrCfg(inst, cellCfg, errInfo)
5199 RgrCellCfg *cellCfg;
5200 RgSchErrInfo *errInfo;
5207 TRC2(rgSCHCfgVldtRgrCellPwrCfg);
5209 /* This function does nothing now, placeholder for
5210 * subsequent power config validations that may be needed */
5214 } /* rgSCHCfgVldtRgrCellPwrCfg */
5217 /***********************************************************
5219 * Func : rgSCHCfgVldtRgrCmnLcCfg
5222 * Desc : Validates common logical channel configuration recieved from RRM.
5224 * @param[in] Inst inst
5225 * @param[in] RgrCellCfg *cellCfg
5226 * @param[out] RgSchErrInfo *errInfo
5235 **********************************************************/
5237 PRIVATE S16 rgSCHCfgVldtRgrCmnLcCfg
5240 RgrCellCfg *cellCfg,
5241 RgSchErrInfo *errInfo
5244 PRIVATE S16 rgSCHCfgVldtRgrCmnLcCfg(inst, cellCfg, errInfo)
5246 RgrCellCfg *cellCfg;
5247 RgSchErrInfo *errInfo;
5251 RgrCmnLchCfg *lcCfg;
5256 TRC2(rgSCHCfgVldtRgrCmnLcCfg);
5258 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_CMN_LC_CFG;
5260 for (idx = 0; idx < cellCfg->numCmnLcs; idx++)
5262 lcCfg = &(cellCfg->cmnLcCfg[idx]);
5263 /* Validate downlink info */
5264 if (lcCfg->dir & RGR_DIR_TX)
5266 if (lcCfg->lcType == CM_LTE_LCH_BCCH)
5268 if (lcCfg->dlTrchType == CM_LTE_TRCH_DL_SCH)
5272 bitMask |= RGSCH_BCCH_DLSCH_CFG1;
5279 (cellCfg->siCfg.siWinSize == 1) ||
5280 (cellCfg->siCfg.siWinSize == 2) ||
5281 (cellCfg->siCfg.siWinSize == 5) ||
5282 (cellCfg->siCfg.siWinSize == 10) ||
5283 (cellCfg->siCfg.siWinSize == 15) ||
5284 (cellCfg->siCfg.siWinSize == 20) ||
5285 (cellCfg->siCfg.siWinSize == 40)) &&
5286 (cellCfg->siCfg.retxCnt>0)
5289 bitMask |= RGSCH_BCCH_DLSCH_CFG2;
5293 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCfg->cellId,
5294 "Invalid si config for cell");
5299 else if (lcCfg->dlTrchType == CM_LTE_TRCH_BCH)
5301 bitMask |= RGSCH_BCCH_BCH_CFG;
5305 RLOG_ARG1(L_ERROR,DBG_CELLID, cellCfg->cellId,
5306 "Invalid transport channel %d for cell", lcCfg->dlTrchType);
5310 else if (lcCfg->lcType == CM_LTE_LCH_PCCH)
5312 bitMask |= RGSCH_PCCH_CFG;
5314 else if (lcCfg->lcType == CM_LTE_LCH_CCCH)
5316 bitMask |= RGSCH_DL_CCCH_CFG;
5321 /* Validate uplink info */
5322 if (lcCfg->dir & RGR_DIR_RX)
5325 if (lcCfg->lcType != CM_LTE_LCH_CCCH)
5327 RLOG_ARG1(L_ERROR,DBG_CELLID, cellCfg->cellId,"Invalid UL common lcType %d "
5328 "for cell", lcCfg->lcType);
5333 bitMask |= RGSCH_UL_CCCH_CFG;
5338 /* Invalid direction */
5341 RLOG_ARG1(L_ERROR,DBG_CELLID, cellCfg->cellId,"Invalid Direction %d",
5346 if (bitMask != RGSCH_CELL_ACTIVE_CFG)
5348 RLOG_ARG0(L_ERROR,DBG_CELLID, cellCfg->cellId,
5349 "Invalid Common channel config for cell");
5354 } /* rgSCHCfgVldtRgrCmnLcCfg */
5357 /***********************************************************
5359 * Func : rgSCHCfgVldtUeCqiModeCfg
5362 * Desc : Validates UE CQI modes Configuration recieved from RRC.
5372 **********************************************************/
5374 PRIVATE S16 rgSCHCfgVldtUeCqiModeCfg
5377 RgrUeDlCqiCfg *ueDlCqiCfg
5380 PRIVATE S16 rgSCHCfgVldtUeCqiModeCfg(cell, ueDlCqiCfg)
5382 RgrUeDlCqiCfg *ueDlCqiCfg;
5386 TRC2(rgSCHCfgVldtUeCqiModeCfg)
5389 if((ueDlCqiCfg->prdCqiCfg.cqiPmiCfgIdx < 1) ||
5390 (ueDlCqiCfg->prdCqiCfg.cqiPmiCfgIdx > 1024))
5392 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,
5393 "Invalid Periodic CQI Info");
5397 /* Validate UE Aperiodic CQI mode */
5398 if ((ueDlCqiCfg->aprdCqiCfg.pres == TRUE) &&
5399 ((ueDlCqiCfg->aprdCqiCfg.aprdModeEnum > RGR_APRD_CQI_MOD31) ||
5400 (cell->bwCfg.dlTotalBw <= 7)))
5402 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,
5403 "Invalid Aperiodic mode config for DL CQI",
5404 ueDlCqiCfg->aprdCqiCfg.aprdModeEnum);
5408 /* Validate UE Periodic CQI mode */
5409 if (ueDlCqiCfg->prdCqiCfg.prdModeEnum > RGR_PRD_CQI_MOD21)
5411 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,
5412 "Invalid periodic mode config for DL CQI",
5413 ueDlCqiCfg->prdCqiCfg.prdModeEnum);
5416 /* Validate K value in periodic CQI Config */
5417 if(((ueDlCqiCfg->prdCqiCfg.prdModeEnum == RGR_PRD_CQI_MOD20) ||
5418 (ueDlCqiCfg->prdCqiCfg.prdModeEnum == RGR_PRD_CQI_MOD21)) &&
5419 ((ueDlCqiCfg->prdCqiCfg.k < 1)||
5420 (ueDlCqiCfg->prdCqiCfg.k > 4)))
5422 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,
5423 "Invalid K for Subband CQI reporting");
5427 if ((ueDlCqiCfg->prdCqiCfg.type == 1) &&
5428 (ueDlCqiCfg->prdCqiCfg.cqiSetup.prdModeEnum > RGR_PRD_CQI_MOD21))
5430 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,
5431 "Invalid periodic mode config for DL CQI",
5432 ueDlCqiCfg->prdCqiCfg.cqiSetup.prdModeEnum);
5441 /***********************************************************
5443 * Func : rgSCHCfgVldtUeMeasGapAckNakRepCfg
5446 * Desc : Validates UE Measurement Gap and Ack Nack Repetition Configuration recieved from RRC.
5456 **********************************************************/
5458 PRIVATE S16 rgSCHCfgVldtUeMeasGapAckNakRepCfg
5464 PRIVATE S16 rgSCHCfgVldtUeMeasGapAckNakRepCfg(cell, ueCfg)
5470 TRC2(rgSCHCfgVldtUeMeasGapAckNakRepCfg)
5473 if ((ueCfg->ackNackModeEnum == RGR_TDD_ACKNACK_MODE_MULT) &&
5474 (ueCfg->ueAckNackCfg.isAckNackEnabled == TRUE))
5476 RLOG_ARG2(L_ERROR,DBG_CELLID,ueCfg->cellId,"TDD ACK NACK Multiplexing Mode"
5477 "is not allowed when Ack/Nack is Enabled: %d CRNTI:%d",
5478 ueCfg->ueAckNackCfg.ackNackRepFactor,ueCfg->crnti);
5481 #endif /* LTE_TDD */
5482 /* Validate AckNackRep Factor */
5483 if((ueCfg->ueAckNackCfg.isAckNackEnabled == FALSE) &&
5484 (!ueCfg->ueMesGapCfg.isMesGapEnabled))
5489 if(ueCfg->ueAckNackCfg.isAckNackEnabled)
5491 if ( (ueCfg->ueAckNackCfg.ackNackRepFactor < RGR_ACKNACK_REPFACT_N2)
5492 || (ueCfg->ueAckNackCfg.ackNackRepFactor > RGR_ACKNACK_REPFACT_N6))
5494 RLOG_ARG2(L_ERROR,DBG_CELLID,ueCfg->cellId, "Invalid ACK NACK REP Factor:%d CRNTI:%d",
5495 ueCfg->ueAckNackCfg.ackNackRepFactor,ueCfg->crnti);
5499 if(ueCfg->ueMesGapCfg.isMesGapEnabled)
5501 switch(ueCfg->ueMesGapCfg.gapPrd)
5503 case RG_MEAS_GAPPRD_40:
5504 if(ueCfg->ueMesGapCfg.gapOffst >= RG_MEAS_GAPPRD_40)
5506 RLOG_ARG2(L_ERROR,DBG_CELLID,ueCfg->cellId,"Invalid GAP Offset:%d CRNTI:%d",
5507 ueCfg->ueMesGapCfg.gapOffst,ueCfg->crnti);
5511 case RG_MEAS_GAPPRD_80:
5512 if(ueCfg->ueMesGapCfg.gapOffst >= RG_MEAS_GAPPRD_80)
5514 RLOG_ARG2(L_ERROR,DBG_CELLID,ueCfg->cellId,"Invalid GAP Offset:%d CRNTI:%d",
5515 ueCfg->ueMesGapCfg.gapOffst,ueCfg->crnti);
5521 RLOG_ARG2(L_ERROR,DBG_CELLID,ueCfg->cellId,"Invalid GAP Periodicity Settings:%d"
5522 "CRNTI:%d", ueCfg->ueMesGapCfg.gapPrd,ueCfg->crnti);
5529 } /* rgSCHCfgVldtUeMeasGapAckNakRepCfg*/
5532 /***********************************************************
5534 * Func : rgSCHCfgVldtUeMeasGapAckNakRepRecfg
5537 * Desc : Validates UE Measurement Gap and Ack Nack Repetition Configuration recieved from RRC.
5547 **********************************************************/
5549 PRIVATE S16 rgSCHCfgVldtUeMeasGapAckNakRepRecfg
5555 PRIVATE S16 rgSCHCfgVldtUeMeasGapAckNakRepRecfg(cell, ueRecfg)
5557 RgrUeRecfg *ueRecfg;
5561 TRC2(rgSCHCfgVldtUeMeasGapAckNakRepRecfg)
5562 if((ueRecfg->ueAckNackRecfg.isAckNackEnabled == FALSE) &&
5563 (!ueRecfg->ueMeasGapRecfg.isMesGapEnabled))
5568 if(ueRecfg->ueAckNackRecfg.isAckNackEnabled )
5570 /* Validate AckNackRep Factor */
5571 if ( (ueRecfg->ueAckNackRecfg.ackNackRepFactor < RGR_ACKNACK_REPFACT_N2)
5572 || (ueRecfg->ueAckNackRecfg.ackNackRepFactor > RGR_ACKNACK_REPFACT_N6))
5574 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid ACK NACK REP Factor:%d"
5575 "NEW CRNTI:%d",ueRecfg->ueAckNackRecfg.ackNackRepFactor,ueRecfg->newCrnti);
5579 if(ueRecfg->ueMeasGapRecfg.isMesGapEnabled)
5581 switch(ueRecfg->ueMeasGapRecfg.gapPrd)
5583 case RG_MEAS_GAPPRD_40:
5584 if(ueRecfg->ueMeasGapRecfg.gapOffst >= RG_MEAS_GAPPRD_40)
5586 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid GAP Offset:%d"
5587 "NEW CRNTI:%d",ueRecfg->ueMeasGapRecfg.gapOffst,ueRecfg->newCrnti);
5591 case RG_MEAS_GAPPRD_80:
5592 if(ueRecfg->ueMeasGapRecfg.gapOffst >= RG_MEAS_GAPPRD_80)
5594 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid GAP Offset:%d"
5595 "NEW CRNTI:%d",ueRecfg->ueMeasGapRecfg.gapOffst,ueRecfg->newCrnti);
5601 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid GAP Periodicity Settings:%d"
5602 "NEW CRNTI:%d",ueRecfg->ueMeasGapRecfg.gapPrd,ueRecfg->newCrnti);
5609 } /* rgSCHCfgVldtUeMeasGapAckNakRepRecfg*/
5612 /***********************************************************
5614 * Func : rgSCHCfgVldtUeDlSpsCfg
5617 * Desc : Validates UE's DL SPS configuration recieved from RRC.
5627 **********************************************************/
5629 PRIVATE S16 rgSCHCfgVldtUeDlSpsCfg
5632 RgrUeSpsDlCfg *dlSpsCfg
5635 PRIVATE S16 rgSCHCfgVldtUeDlSpsCfg(cell, dlSpsCfg)
5637 RgrUeSpsDlCfg *dlSpsCfg;
5643 TRC2(rgSCHCfgVldtUeDlSpsCfg);
5645 /* peridicity validation done in SPS module */
5646 if ((dlSpsCfg->numPucchVal > RG_SCH_MAX_NUM_N1PUCCH_PER_UE) ||
5647 (dlSpsCfg->numPucchVal == 0))
5649 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid number of n1Pucch values"
5650 " in DL SPS Config");
5654 for (idx = 0; idx < dlSpsCfg->numPucchVal; ++idx)
5656 if (dlSpsCfg->n1PucchVal[idx] > RG_SCH_MAX_N1PUCCH_VAL)
5659 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid N1Pucch value"
5660 " in DL SPS Config %u", dlSpsCfg->n1PucchVal[idx]);
5662 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid N1Pucch value"
5663 " in DL SPS Config %lu", dlSpsCfg->n1PucchVal[idx]);
5668 /* SPS_TODO: check will change for TDD */
5669 if ((dlSpsCfg->numSpsHqProc == 0) ||
5670 (dlSpsCfg->numSpsHqProc > RGSCH_MAX_DL_HQ_PROC))
5672 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid number of SPS HARQ procs"
5673 " in DL SPS Config");
5678 } /* rgSCHCfgVldtDlSpsCfg */
5679 #endif /* LTEMAC_SPS */
5681 /***********************************************************
5683 * Func : rgSCHCfgVldtUePwrCfg
5686 * Desc : Validates UE Group power configuration recieved from RRC.
5696 **********************************************************/
5698 PRIVATE S16 rgSCHCfgVldtUePwrCfg
5701 RgrUeUlPwrCfg *pwrCfg
5704 PRIVATE S16 rgSCHCfgVldtUePwrCfg(cell, pwrCfg)
5706 RgrUeUlPwrCfg *pwrCfg;
5710 TRC2(rgSCHCfgVldtUePwrCfg);
5712 /* Group power control works only in accumulated mode */
5713 if (!pwrCfg->isAccumulated)
5716 if (pwrCfg->uePuschPwr.pres)
5718 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Accumulation configutation"
5719 " not in sync with group power configuration");
5724 if (rgSCHCfgVldtUeGrpPwrCfg(cell, &pwrCfg->uePuschPwr) != ROK)
5726 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid PUSCH Group power"
5730 if (rgSCHCfgVldtUeGrpPwrCfg(cell, &pwrCfg->uePucchPwr) != ROK)
5732 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid PUSCH Group power"
5738 } /* rgSCHCfgVldtUePwrCfg */
5740 /***********************************************************
5742 * Func : rgSCHCfgVldtUeGrpPwrCfg
5745 * Desc : Validates UE Group power configuration recieved from RRC.
5755 **********************************************************/
5757 PRIVATE S16 rgSCHCfgVldtUeGrpPwrCfg
5760 RgrUeGrpPwrCfg *grpPwrCfg
5763 PRIVATE S16 rgSCHCfgVldtUeGrpPwrCfg(cell, grpPwrCfg)
5765 RgrUeGrpPwrCfg *grpPwrCfg;
5769 TRC2(rgSCHCfgVldtUeGrpPwrCfg);
5771 if ((grpPwrCfg->pres) &&
5772 (((grpPwrCfg->tpcRnti > cell->rntiDb.rntiStart) &&
5773 ((grpPwrCfg->tpcRnti <
5774 (cell->rntiDb.rntiStart + cell->rntiDb.maxRntis))))))
5776 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid Uplink Group power "
5782 } /* rgSCHCfgVldtUeGrpPwrCfg */
5785 /***********************************************************
5787 * Func : rgSCHCfgVldtSpsReCfg
5790 * Desc : Validates UE SPS and other SPS dependent
5791 * configuration recieved from RRC.
5801 **********************************************************/
5803 PRIVATE S16 rgSCHCfgVldtSpsReCfg
5810 PRIVATE S16 rgSCHCfgVldtSpsReCfg(cell, ue, ueRecfg)
5813 RgrUeRecfg *ueRecfg;
5817 TRC2(rgSCHCfgVldtSpsReCfg);
5818 if ((ueRecfg->ueRecfgTypes & RGR_UE_DLSPS_RECFG) &&
5819 (ueRecfg->ueSpsRecfg.dlSpsCfg.isDlSpsEnabled))
5821 /* Validating SPS RNTI */
5822 if (((ueRecfg->ueSpsRecfg.spsRnti >= cell->rntiDb.rntiStart) &&
5823 (ueRecfg->ueSpsRecfg.spsRnti<=
5824 (cell->rntiDb.rntiStart+cell->rntiDb.maxRntis)))||
5825 (ueRecfg->ueSpsRecfg.spsRnti == RGSCH_SI_RNTI) ||
5826 (ueRecfg->ueSpsRecfg.spsRnti == RGSCH_P_RNTI))
5828 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid SPS RNTI "
5829 " in DL SPS Recfg OLD CRNTI:%d NEW CCRNTI:%d",
5830 ueRecfg->oldCrnti,ueRecfg->newCrnti);
5833 if (rgSCHCfgVldtUeDlSpsCfg(cell, &ueRecfg->ueSpsRecfg.dlSpsCfg) != ROK)
5835 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalid DL SPS configuration"
5836 " for the OLD CRNTI:%d NEW CRNTI:%d",
5837 ueRecfg->oldCrnti,ueRecfg->newCrnti);
5843 if(ueRecfg->ueSpsRecfg.dlSpsCfg.isDlSpsEnabled)
5845 if (ueRecfg->ueRecfgTypes & RGR_UE_DRX_RECFG)
5847 /* ccpu00117035 - MOD - changed instIdx to inst */
5848 /* ccpu00117035 - MOD - changed ueID to oldCrnti*/
5849 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,
5850 " DRX reconfig not supported DL SPS enabled for OLD CRNTI:%d NEW CRNTI:%d",
5851 ueRecfg->oldCrnti,ueRecfg->newCrnti);
5856 /* ccpu00117627 - ADD - SPS recfg validation against HDFDD */
5858 if(ueRecfg->ueSpsRecfg.dlSpsCfg.isDlSpsEnabled)
5860 if(ue->hdFddEnbld == TRUE)
5862 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,
5863 "DL SPS is not supported for HDFDD enabled for OLD CRNTI:%d NEW CRNTI:%d",
5864 ueRecfg->oldCrnti,ueRecfg->newCrnti);
5868 if(ueRecfg->ueSpsRecfg.ulSpsCfg.isUlSpsEnabled)
5870 if(ue->hdFddEnbld == TRUE)
5872 RLOG_ARG2(L_ERROR,DBG_CELLID,ueRecfg->cellId,
5873 "UL SPS is not supported for HDFDD enabled for OLD CRNTI:%d NEW CRNTI:%d",
5874 ueRecfg->oldCrnti,ueRecfg->newCrnti);
5881 } /*rgSCHCfgVldtSpsReCfg*/
5884 #if ((defined (RGR_CQI_REPT)) && (defined (RGR_V2)))
5885 /***********************************************************
5887 * Func : rgSCHCfgVldtCqiReptReCfg
5890 * Desc : Validates UE CQI report for DL Power control
5891 * configuration recieved from RRC.
5901 **********************************************************/
5903 PRIVATE S16 rgSCHCfgVldtCqiReptReCfg
5909 PRIVATE S16 rgSCHCfgVldtCqiReptReCfg(cell, ueRecfg)
5911 RgrUeRecfg *ueRecfg;
5915 TRC2(rgSCHCfgVldtCqiReptReCfg);
5916 /* Validate DL Power Control Config parameters */
5917 if (ueRecfg->ueCqiReptCfg.numColltdCqiRept > RGR_CQIRPTS_MAXN)
5919 RLOG_ARG3(L_ERROR,DBG_CELLID,ueRecfg->cellId,"Invalide numColltdCqiRept,"
5920 "MAX supported %d for OLD CRNTI:%d NEW CRNTI:%d",RGR_CQIRPTS_MAXN,
5921 ueRecfg->oldCrnti,ueRecfg->newCrnti);
5926 } /*rgSCHCfgVldtCqiReptReCfg*/
5929 /***********************************************************
5931 * Func : rgSCHCfgRgrLcChfg
5934 * Desc : Handles dedicated logical channel configuration
5935 * recieved from RRC.
5945 **********************************************************/
5947 PUBLIC S16 rgSCHCfgRgrLchCfg
5952 RgSchErrInfo *errInfo
5955 PUBLIC S16 rgSCHCfgRgrLchCfg(cell, ue, lcCfg, errInfo)
5959 RgSchErrInfo *errInfo;
5963 RgSchDlLcCb *dlLc = NULLP;
5964 Inst inst = cell->instIdx;
5969 TRC2(rgSCHCfgRgrLchCfg);
5971 errInfo->errCause = RGSCHERR_CFG_RGR_DED_LC_CFG;
5973 /* Allocate the downlink logical channel control block */
5974 if((ret = rgSCHUtlAllocSBuf(inst, (Data**)&dlLc,
5975 sizeof(RgSchDlLcCb))) != ROK)
5977 RLOG_ARG2(L_ERROR,DBG_CELLID,lcCfg->cellId,"Memory allocation FAILED for "
5978 "Downlink LCId:%d CRNTI:%d", lcCfg->lcId,lcCfg->crnti);
5981 if ((U8 *)dlLc == NULLP)
5983 RLOG_ARG2(L_ERROR,DBG_CELLID,lcCfg->cellId,"Memory allocation FAILED for "
5984 "Downlink LCID:%d CRNTI:%d", lcCfg->lcId,lcCfg->crnti);
5987 dlLc->lcId = lcCfg->lcId;
5989 rgSCHLaaLcCfg(cell, dlLc, lcCfg);
5992 rgSCHDbmInsDlDedLcCb(ue, dlLc);
5994 ret = rgSCHUtlRgrLcCfg(cell, ue, dlLc, lcCfg, errInfo);
6001 rgSCHDbmDelDlDedLcCb(ue, dlLc);
6002 rgSCHCfgFreeDlDedLcCb(cell, ue, dlLc);
6005 RLOG_ARG3(L_ERROR,DBG_CELLID,cell->cellId,"Dedicated logical channel "
6006 "configuration failed at SCH:UEID:%d LCID:%d CRNTI:%d",
6007 ue->ueId, lcCfg->lcId,lcCfg->crnti);
6011 RGSCH_ARRAY_BOUND_CHECK(inst, ue->ul.lcCb, (lcCfg->lcId -1));
6012 if ( !lcCfg->lcId ||
6013 (TRUE == ue->ul.lcCb[lcCfg->lcId -1].isValid))
6018 rgSCHDbmDelDlDedLcCb(ue, dlLc);
6019 rgSCHCfgFreeDlDedLcCb(cell, ue, dlLc);
6022 RLOG_ARG3(L_ERROR,DBG_CELLID,cell->cellId,"Dedicated logical channel "
6023 "configuration failed at SCH: UL LC CB already existing"
6024 " UEID:%d LCID:%d CRNTI:%d",
6025 ue->ueId, lcCfg->lcId,lcCfg->crnti);
6029 /* Create UL LC context to maintain LCG to LC mapping and
6030 LC and QCI mapping, this is for L2 Counters :UL ACTIVE UE
6032 ue->ul.lcCb[lcCfg->lcId -1].isValid = TRUE;
6033 ulLc = &(ue->ul.lcCb[lcCfg->lcId -1]);
6035 ulLc->lcId = lcCfg->lcId;
6036 ulLc->qciCb = &(cell->qciArray[lcCfg->dlInfo.dlQos.qci]);
6037 ulLc->qciCb->qci = lcCfg->dlInfo.dlQos.qci;
6038 ue->ul.lcgArr[lcCfg->lcgId].lcArray[ue->ul.lcgArr[lcCfg->lcgId].numLch] = ulLc;
6039 ulLc->lcg = &ue->ul.lcgArr[lcCfg->lcgId];
6040 ulLc->lcgArrIdx = ue->ul.lcgArr[lcCfg->lcgId].numLch;
6041 ue->ul.lcgArr[lcCfg->lcgId].numLch++;
6043 dlLc->qciCb = &(cell->qciArray[lcCfg->dlInfo.dlQos.qci]);
6044 dlLc->qciCb->qci = lcCfg->dlInfo.dlQos.qci;
6045 if(lcCfg->lcType == CM_LTE_LCH_DTCH)
6047 rgSchAddToL2Meas(cell,dlLc); /*LTE_L2_MEAS_PHASE2*/
6049 #endif /* LTE_L2_MEAS */
6052 } /* rgSCHCfgRgrLchCfg */
6054 /***********************************************************
6056 * Func : rgSCHCfgRgrLcgCfg
6059 * Desc : Handles dedicated logical channel group configuration
6060 * recieved from RRM.
6070 **********************************************************/
6072 PUBLIC S16 rgSCHCfgRgrLcgCfg
6077 RgSchErrInfo *errInfo
6080 PUBLIC S16 rgSCHCfgRgrLcgCfg(cell, ue, lcgCfg, errInfo)
6084 RgSchErrInfo *errInfo;
6090 //#ifdef LTE_L2_MEAS
6094 TRC2(rgSCHCfgRgrLcgCfg);
6096 errInfo->errCause = RGSCHERR_CFG_RGR_DED_LCG_CFG;
6098 ue->ul.lcgArr[lcgCfg->ulInfo.lcgId].lcgId = lcgCfg->ulInfo.lcgId;
6100 ret = rgSCHUtlRgrLcgCfg(cell, ue, lcgCfg, errInfo);
6103 RLOG_ARG3(L_ERROR,DBG_CELLID,cell->cellId,"Dedicated logical channel "
6104 "configuration failed at SCH: UEID:%d LCGID:%d CRNTI:%d",
6105 ue->ueId, lcgCfg->ulInfo.lcgId,lcgCfg->crnti);
6106 /* Roll back lcgCfg */
6107 ue->ul.lcgArr[lcgCfg->ulInfo.lcgId].lcgId = RGSCH_INVALID_LCG_ID;
6108 rgSCHUtlRgrLcgDel(cell, ue, lcgCfg->ulInfo.lcgId);
6112 //#ifdef LTE_L2_MEAS
6113 /* Copy all info of UL LCH in cfg to ulLcgCb */
6114 for (idx = 0; idx < lcgCfg->ulInfo.numLch; idx++)
6116 /* Allocate the uplink logical channel control block */
6117 if((ret = rgSCHUtlAllocSBuf(cell->instIdx, (Data**)&ulLc,
6118 sizeof(RgSchUlLcCb))) != ROK)
6120 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId, "Memory allocation FAILED for ");
6123 if ((U8 *)ulLc == NULLP)
6125 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId, "Memory allocation FAILED for ");
6128 /* Create UL LC context to maintain LCG to LC mapping and
6129 LC and QCI mapping, this is for L2 Counters :UL ACTIVE UE
6131 ulLc->lcId = lcgCfg->ulInfo.lchUlCfg[idx].lcId;
6132 ulLc->qciCb = &(cell->qciArray[lcgCfg->ulInfo.lchUlCfg[idx].qci]);
6133 ulLc->qciCb->qci = lcgCfg->ulInfo.lchUlCfg[idx].qci;
6134 ue->ul.lcgArr[lcgCfg->ulInfo.lcgId].lcArray[idx] = ulLc;
6136 ue->ul.lcCb[ulLc->lcId -1] = ulLc;
6137 ulLc->lcg = &ue->ul.lcgArr[lcgCfg->ulInfo.lcgId];
6138 ulLc->lcgArrIdx = idx;
6140 ue->ul.lcgArr[lcgCfg->ulInfo.lcgId].numLch = lcgCfg->ulInfo.numLch;
6141 #endif /* LTE_L2_MEAS */
6144 } /* rgSCHCfgRgrLcgCfg */
6148 /***********************************************************
6150 * Func : rgSCHCfgRgrCmnLcCfg
6153 * Desc : Handles dedicated logical channel configuration
6154 * recieved from RRC.
6164 **********************************************************/
6166 PRIVATE S16 rgSCHCfgRgrCmnLcCfg
6169 RgrCmnLchCfg *lcCfg,
6170 RgSchErrInfo *errInfo
6173 PRIVATE S16 rgSCHCfgRgrCmnLcCfg(cell, lcCfg, errInfo)
6175 RgrCmnLchCfg *lcCfg;
6176 RgSchErrInfo *errInfo;
6179 RgSchClcDlLcCb cmnLcCb;
6180 TRC2(rgSCHCfgRgrCmnLcCfg);
6182 errInfo->errCause = RGSCHERR_CFG_RGR_CMN_LC_CFG;
6184 cmMemset((U8 *)&cmnLcCb, 0, sizeof(cmnLcCb));
6186 /* Handle configuration for CCCH/BCCH/PCCH */
6187 if (lcCfg->lcType == CM_LTE_LCH_CCCH)
6189 /* UL and DL CCCH configuration */
6190 if (lcCfg->dir & RGR_DIR_TX)
6192 cell->dlCcchId = lcCfg->lcId;
6195 if (lcCfg->dir & RGR_DIR_RX)
6197 cell->ulCcchId = lcCfg->lcId;
6202 cmnLcCb.lcId = lcCfg->lcId;
6203 rgSCHDbmInitCmnLcBoLst(&cmnLcCb);
6204 if (lcCfg->lcType == CM_LTE_LCH_BCCH)
6206 /* BCCH on BCH and DLSCH configuration */
6207 if (lcCfg->dlTrchType == CM_LTE_TRCH_DL_SCH)
6209 rgSCHDbmInsBcchOnDlsch(cell, &cmnLcCb);
6213 rgSCHDbmInsBcchOnBch(cell, &cmnLcCb);
6216 else /* PCCH configuration */
6218 rgSCHDbmInsPcch(cell, &cmnLcCb);
6223 } /* rgSCHCfgRgrCmnLcCfg */
6227 /***********************************************************
6229 * Func : rgSCHCfgFreeDlDedLcCb
6233 * - Processing Steps:
6234 * - Frees downlink dedicated logical channel control block.
6242 **********************************************************/
6244 PRIVATE Void rgSCHCfgFreeDlDedLcCb
6251 PRIVATE Void rgSCHCfgFreeDlDedLcCb(cell, ue, dlLc)
6257 Inst inst = cell->instIdx;
6258 TRC2(rgSCHCfgFreeDlDedLcCb);
6260 rgSCHUtlFreeDlLc(cell, ue, dlLc);
6262 /* De-allocate the Cb */
6263 /* ccpu00117052 - MOD - Passing double pointer
6264 for proper NULLP assignment*/
6265 rgSCHUtlFreeSBuf(inst, (Data **)&dlLc, sizeof(*dlLc));
6268 /* Stack Crash problem for TRACE5 changes. Added the return below */
6271 } /* rgSCHCfgFreeDlDedLcCb */
6274 /***********************************************************
6276 * Func : rgSCHCfgFreeDlCmnLcCb
6280 * - Processing Steps:
6281 * - Frees downlink common logical channel control block.
6289 **********************************************************/
6291 PRIVATE Void rgSCHCfgFreeDlCmnLcCb
6293 RgSchClcDlLcCb *cmnDlLc
6296 PRIVATE Void rgSCHCfgFreeDlCmnLcCb(cmnDlLc)
6297 RgSchClcDlLcCb *cmnDlLc;
6300 TRC2(rgSCHCfgFreeDlCmnLcCb);
6302 cmMemset((U8*)cmnDlLc, 0, sizeof(*cmnDlLc));
6303 cmnDlLc->lcId = RGSCH_INVALID_LC_ID;
6305 } /* rgSCHCfgFreeDlCmnLcCb */
6308 /***********************************************************
6310 * Func : rgSCHCfgFreeCellCb
6314 * - Processing Steps:
6315 * - Frees scheduler cell control block.
6323 **********************************************************/
6325 PUBLIC Void rgSCHCfgFreeCellCb
6330 PUBLIC Void rgSCHCfgFreeCellCb(cell)
6334 Inst inst = cell->instIdx;
6337 RgSchWarningSiInfo *warningSi;
6338 RgSchWarningSiPdu *warningSiPdu;
6341 TRC2(rgSCHCfgFreeCellCb);
6342 /* ccpu00132385- SI Warning PDUs which are not processed need to be deleted */
6343 /* Search for used index in WarningSi */
6344 for(idx = 0; idx < RGR_MAX_NUM_WARNING_SI; idx++)
6346 if(cell->siCb.warningSi[idx].siId == 0)
6348 cell->siCb.siCtx.siId = cell->siCb.warningSi[idx].siId;
6349 warningSi = (RgSchWarningSiInfo *) cell->siCb.
6350 siArray[cell->siCb.siCtx.siId-1].si;
6351 if(warningSi != NULLP)
6353 /* ccpu00136659: CMAS ETWS design change */
6354 while (CM_LLIST_FIRST_NODE(&warningSi->warningSiMsg.segLstCp, node))
6356 warningSiPdu = (RgSchWarningSiPdu *)node->node;
6357 pdu = warningSiPdu->pdu;
6358 /* ccpu00136659: CMAS ETWS design change */
6359 cmLListDelFrm(&warningSi->warningSiMsg.segLstCp, node);
6360 RGSCH_FREE_MSG(pdu);
6362 cell->siCb.siArray[cell->siCb.siCtx.siId-1].si = NULLP;
6365 /* Free lists of the cell */
6366 rgSCHCfgFreeUeLst(cell);
6368 rgSCHCfgFreeSpsUeLst(cell);
6369 #endif /* LTEMAC_SPS */
6371 if ( TRUE == cell->emtcEnable )
6373 rgSCHEmtcCellDel(cell);
6376 rgSCHRamFreeCell(cell);
6378 rgSCHDbmRntiDbDeInit(cell);
6379 /* Deallocate the subframe allocation information */
6380 rgSCHUtlPutSfAlloc(cell);
6381 rgSCHUtlFreeCell(cell);
6383 rgSCHCfgFreeRgrCfgLst(cell);
6384 rgSCHCfgFreeCmnLcLst(cell);
6386 rgSCHUtlPutRlsHqAlloc(cell);
6389 rgSCHDbmDeInitUeTfuPendLst(cell);
6390 #endif /* LTE_TDD */
6393 rgSCHUtlPutSiInfo(cell);
6394 #endif/*RGR_SI_SCH*/
6396 (Void)rgSCHDrxCellDel(cell);
6398 rgSCHUtlFreeSBuf(inst, (Data**)&(cell->dynCfiCb.cceFailSamples),
6399 (cell->dynCfiCb.numFailSamples * sizeof(U16)));
6402 TSL2DeallocCellStatsBlk(cell->cellId);
6406 /* LAA_SCELL: Trigger the De-Init function for the LAA Module */
6407 rgSCHLaaSCellCbDeInit(cell);
6411 if(cell->emtcEnable)
6413 rgSCHEmtcCellFree(cell);
6416 /* De-allocate the Cell */
6417 /* ccpu00117052 - MOD - Passing double pointer
6418 for proper NULLP assignment*/
6419 rgSCHUtlFreeSBuf(inst, (Data **)&cell, sizeof(*cell));
6423 /* Stack Crash problem for TRACE5 changes. Added the return below */
6426 } /* rgSCHCfgFreeCellCb */
6429 /***********************************************************
6431 * Func : rgSCHCfgFreeUeCb
6435 * - Processing Steps:
6436 * - Frees UE control block.
6444 **********************************************************/
6446 PRIVATE Void rgSCHCfgFreeUeCb
6452 PRIVATE Void rgSCHCfgFreeUeCb(cell, ue)
6457 RgSchCmnUlUe *ueUl = RG_SCH_CMN_GET_UL_UE(ue, cell);
6458 RgUeUlHqCb *ulHqEnt;
6460 Inst inst = cell->instIdx;
6463 TRC2(rgSCHCfgFreeUeCb);
6465 /* Free all logical channel info per UE */
6466 while((dlLc = rgSCHDbmGetNextDlDedLcCb(ue, NULLP)) != NULLP)
6468 rgSCHDbmDelDlDedLcCb(ue, dlLc);
6469 rgSCHCfgFreeDlDedLcCb(cell, ue, dlLc);
6471 for (lcCnt =0; lcCnt<RGSCH_MAX_LC_PER_UE; lcCnt++)
6473 if(ue->ul.lcCb[lcCnt].isValid == TRUE)
6475 lcgId = ue->ul.lcCb[lcCnt].lcg->lcgId;
6478 rgSCHUtlRgrLcDel(cell, ue, ue->ul.lcCb[lcCnt].lcId,lcgId);
6479 ue->ul.lcCb[lcCnt].isValid = FALSE;
6484 ulHqEnt = &(ueUl->hqEnt);
6485 /* Free Scheduler specific information per UE */
6486 rgSCHUtlFreeUe(cell, ue);
6488 /* Free Uplink HARQ specific information per UE */
6489 rgSCHUhmFreeUe(cell, ulHqEnt);
6491 if ( ue->drxCb != NULLP)
6494 /* ccpu00117052 - MOD - Passing double pointer
6495 for proper NULLP assignment*/
6496 rgSCHUtlFreeSBuf(cell->instIdx,
6497 (Data**)(&(ue->drxCb)),
6498 sizeof(RgSchDrxUeCb));
6501 ue->drxCb = (RgSchDrxUeCb *)NULLP;
6502 /* Free Downlink HARQ specific information per UE */
6504 /* Release the RNTI */
6507 rgSCHUtlRlsRnti(cell, ue->rntiLnk, FALSE, 0);
6511 /* Fix : syed HO UE does not have a valid ue->rntiLnk */
6512 /* Just indicate to MAC, no need to release at SCH */
6513 rgSCHUtlIndRntiRls2Mac(cell, ue->ueId, FALSE, 0);
6515 /* rg009.201. Added changes of TFU_UPGRADE */
6517 rgSCHCfgPCqiSrsSrUeDel(cell,ue);
6520 rgSCHHdFddUeDel(cell, ue);
6525 TSL2DeallocUeStatsBlk(ue->ueId, ue->tenbStats);
6529 /* CA TODO Some handling needed while SCell Delete*/
6531 /* Delete the UE from the PCell secCellActCeLst*/
6532 rgSCHSCellRmvFrmActLst(cell, ue);
6533 rgSCHSCellDelUe(cell,ue);
6537 rgSCHLaaDeInitDlRbAllocCb(cell, &ue->cellInfo[RGSCH_PCELL_INDEX]->dlAllocCb);
6540 rgSCHUtlFreeSBuf(inst, (Data **)&ue->cellInfo[0], sizeof(RgSchUeCellInfo));
6541 /* De-allocate the Ue */
6542 /* ccpu00117052 - MOD - Passing double pointer
6543 for proper NULLP assignment*/
6547 rgSCHEmtcUeInfoFree(cell, ue);
6550 rgSCHUtlFreeSBuf(inst, (Data **)&ue, sizeof(*ue));
6552 /* Stack Crash problem for TRACE5 changes. Added the return below */
6555 } /* rgSCHCfgFreeUeCb */
6557 /***********************************************************
6559 * Func : rgSCHCfgFreeRgrCfgLst
6563 * - Processing Steps:
6564 * - Frees configuration lists in cell control block.
6572 **********************************************************/
6574 PRIVATE Void rgSCHCfgFreeRgrCfgLst
6579 PRIVATE Void rgSCHCfgFreeRgrCfgLst(cell)
6583 RgSchCfgElem *rgCfgElem;
6584 Inst inst = cell->instIdx;
6586 TRC2(rgSCHCfgFreeRgrCfgLst);
6588 /* Free CURRENT RGR cfg list */
6589 while ((rgCfgElem = rgSCHDbmGetNextCrntRgrCfgElem(cell, NULLP)) != NULLP)
6591 rgSCHDbmDelCrntRgrCfgElem(cell, rgCfgElem);
6592 /* ccpu00117052 - MOD - Passing double pointer
6593 for proper NULLP assignment*/
6594 rgSCHUtlFreeSBuf(inst, (Data **)&rgCfgElem, sizeof(*rgCfgElem));
6597 /* Free PENDING RGR cfg list */
6598 while ((rgCfgElem = rgSCHDbmGetNextPndngRgrCfgElem(cell, NULLP)) != NULLP)
6600 rgSCHDbmDelPndngRgrCfgElem(cell, rgCfgElem);
6601 /* ccpu00117052 - MOD - Passing double pointer
6602 for proper NULLP assignment*/
6603 rgSCHUtlFreeSBuf(inst, (Data **)&rgCfgElem, sizeof(*rgCfgElem));
6607 /* Stack Crash problem for TRACE5 changes. Added the return below */
6610 } /* rgSCHCfgFreeRgrCfgLst */
6613 /***********************************************************
6615 * Func : rgSCHCfgFreeCmnLcLst
6619 * - Processing Steps:
6620 * - Frees common logical channels in cell control block.
6628 **********************************************************/
6630 PRIVATE Void rgSCHCfgFreeCmnLcLst
6635 PRIVATE Void rgSCHCfgFreeCmnLcLst(cell)
6639 RgSchClcDlLcCb *dlCmnLc;
6641 TRC2(rgSCHCfgFreeCmnLcLst);
6643 if ((dlCmnLc = rgSCHDbmGetBcchOnBch(cell)) != NULLP)
6645 rgSCHCfgFreeDlCmnLcCb(dlCmnLc);
6647 if ((dlCmnLc = rgSCHDbmGetFirstBcchOnDlsch(cell)) != NULLP)
6649 rgSCHCfgFreeDlCmnLcCb(dlCmnLc);
6651 if ((dlCmnLc = rgSCHDbmGetSecondBcchOnDlsch(cell)) != NULLP)
6653 rgSCHCfgFreeDlCmnLcCb(dlCmnLc);
6655 if ((dlCmnLc = rgSCHDbmGetPcch(cell)) != NULLP)
6657 rgSCHCfgFreeDlCmnLcCb(dlCmnLc);
6661 /* Stack Crash problem for TRACE5 changes. Added the return below */
6664 } /* rgSCHCfgFreeCmnLcLst */
6667 /***********************************************************
6669 * Func : rgSCHCfgFreeUeLst
6673 * - Processing Steps:
6674 * - Frees UE list in cell control block.
6682 **********************************************************/
6684 PRIVATE Void rgSCHCfgFreeUeLst
6689 PRIVATE Void rgSCHCfgFreeUeLst(cell)
6695 RgSchUeCellInfo *sCellInfo;
6698 TRC2(rgSCHCfgFreeUeLst);
6700 /* Free Ues in the list */
6701 while ((ue = rgSCHDbmGetNextUeCb(cell, NULLP)) != NULLP)
6703 rgSCHDbmDelUeCb(cell, ue);
6706 if(ue->cell != cell)
6712 /* Call MeasGap and AckNakRep processing module */
6713 rgSCHMeasGapANRepUeDel(cell, ue, TRUE);
6715 rgSCHCfgFreeUeCb(cell, ue);
6718 /* De-initialize the Ue list */
6719 rgSCHDbmDeInitUeCbLst(cell);
6723 node = cell->sCellUeLst.first;
6726 sCellInfo = (RgSchUeCellInfo *)node->node;
6728 rgSCHSCellDelUeSCell(sCellInfo->ue->cell, sCellInfo->ue, sCellInfo->sCellIdx);
6732 /* Stack Crash problem for TRACE5 changes. Added the return below */
6735 } /* rgSCHCfgFreeUeLst */
6738 /***********************************************************
6740 * Func : rgSCHCfgFreeSpsUeLst
6744 * - Processing Steps:
6745 * - Frees Sps UE list in cell control block.
6753 **********************************************************/
6755 PRIVATE Void rgSCHCfgFreeSpsUeLst
6760 PRIVATE Void rgSCHCfgFreeSpsUeLst(cell)
6766 TRC2(rgSCHCfgFreeSpsUeLst);
6768 /* Free Ues in the list */
6769 while ((ue = rgSCHDbmGetNextSpsUeCb(cell, NULLP)))
6771 rgSCHDbmDelSpsUeCb(cell, ue);
6774 /* De-initialize the Ue list */
6775 rgSCHDbmDeInitSpsUeCbLst(cell);
6777 } /* rgSCHCfgFreeSpsUeLst */
6779 #endif /* LTEMAC_SPS */
6782 /***********************************************************
6784 * Func : rgSCHCfgVldtRgrCellSiCfg
6786 * Desc : Validates SI Configuration for SI
6796 **********************************************************/
6798 PRIVATE S16 rgSCHCfgVldtRgrCellSiCfg
6804 PRIVATE S16 rgSCHCfgVldtRgrCellSiCfg(inst, siCfg)
6809 U8 idx; /* idx for iteration */
6813 TRC2(rgSCHCfgVldtRgrCellSiCfg);
6817 /* Check that retxCnt value should be <= value of siWinSize.
6818 This validation is only applicable for FDD mode. */
6819 if(siCfg->retxCnt > siCfg->siWinSize)
6821 RLOG0(L_ERROR,"retxCnt is greater than siWinSize, validation failed");
6826 /* Validate that a valid value for numSi has been specified */
6827 if(siCfg->numSi > RGR_MAX_NUM_SI)
6829 RLOG0(L_ERROR,"Validation for numSi in SI CFG failed");
6833 /* MinPeriodicity will have the least configured periodicity
6834 * Hence initializing with Max periodicity */
6835 siCfg->minPeriodicity = RGR_SI_PERD_512;
6837 /*Validate the value of periodicity specified for SIs */
6838 for(idx = 0;idx < siCfg->numSi;idx++)
6840 siCfg->minPeriodicity = RGSCH_MIN(siCfg->minPeriodicity,
6841 siCfg->siPeriodicity[idx]);
6842 /* Set the siPeriodicity as a multiple of 80 subframes */
6843 switch(siCfg->siPeriodicity[idx])
6846 case RGR_SI_PERD_16:
6847 case RGR_SI_PERD_32:
6848 case RGR_SI_PERD_64:
6849 case RGR_SI_PERD_128:
6850 case RGR_SI_PERD_256:
6851 case RGR_SI_PERD_512:
6855 RLOG0(L_ERROR,"Validation for SI Periodicity in SI-CFG failed");
6861 } /* rgSCHCfgVldtRgrCellSiCfg */
6863 /* LTE_ADV_FLAG_REMOVED_START */
6864 /***********************************************************
6866 * Func : rgSCHCfgVldtRgrCellLtrAdvCfg
6868 * Desc : Validates Lte Adv Configuration
6878 **********************************************************/
6880 PRIVATE S16 rgSCHCfgVldtRgrCellLteAdvCfg
6883 RgrLteAdvancedCellConfig *lteAdvCfg,
6887 PRIVATE S16 rgSCHCfgVldtRgrCellLteAdvCfg(inst, lteAdvCfg, dlTotalBw)
6889 RgrLteAdvancedCellConfig *lteAdvCfg;
6893 U8 temp[RGR_ABS_PATTERN_LEN];
6897 TRC2(rgSCHCfgVldtRgrCellLteAdvCfg);
6900 if((lteAdvCfg->pres & RGR_SFR) && (RGR_ENABLE == lteAdvCfg->sfrCfg.status))
6902 if(lteAdvCfg->sfrCfg.cellEdgeRbRange.startRb > lteAdvCfg->sfrCfg.cellEdgeRbRange.endRb)
6904 RLOG0(L_ERROR,"Invalid configuration of cell edge bandwidth for SFR feature");
6908 if(lteAdvCfg->sfrCfg.cellEdgeRbRange.endRb >= dlTotalBw)
6910 RLOG0(L_ERROR,"Invalid configuration of cell edge end RB for SFR feature");
6915 if(lteAdvCfg->sfrCfg.pwrThreshold.pLow >= lteAdvCfg->sfrCfg.pwrThreshold.pHigh)
6917 RLOG0(L_ERROR,"Invalid configuration of power threshold for SFR feature");
6923 if((lteAdvCfg->pres & RGR_ABS) && (RGR_ENABLE == lteAdvCfg->absCfg.status))
6925 if((RGR_ABS_MUTE != lteAdvCfg->absCfg.absPatternType) &&
6926 (RGR_ABS_TRANSMIT != lteAdvCfg->absCfg.absPatternType))
6928 RLOG0(L_ERROR,"Invalid configuration of ABS pattern type");
6932 cmMemcpy(temp, (U8 *) lteAdvCfg->absCfg.absPattern,RGR_ABS_PATTERN_LEN);
6934 /* Added validation for ABS pattern len */
6935 for(idx = 0; idx < RGR_ABS_PATTERN_LEN; idx++)
6937 if((temp[idx] != 1) && (temp[idx] != 0))
6939 RLOG0(L_ERROR,"Invalid configuration of ABS pattern type");
6947 /* LTE_ADV_FLAG_REMOVED_END */
6950 /***********************************************************
6952 * Func : rgSCHCfgVldtRgrCellCsgParamCfg
6954 * Desc : Validates CSG Parameter Configuration
6964 **********************************************************/
6966 PRIVATE S16 rgSCHCfgVldtRgrCellCsgParamCfg
6969 RgrCellCsgParamCfg *csgParam
6972 PRIVATE S16 rgSCHCfgVldtRgrCellCsgParamCfg(inst, csgParam)
6974 RgrCellCsgParamCfg *csgParam;
6978 TRC2(rgSCHCfgVldtRgrCellCsgParamCfg);
6980 RGSCHDBGPRM(inst, (rgSchPBuf(inst), "Validating CSG Parameters \n"));
6982 if(csgParam->minDlResNonCsg > 100)
6984 RLOG0(L_ERROR,"Invalid Configuration of minimum DL resources "
6988 if(csgParam->minUlResNonCsg > 100)
6990 RLOG0(L_ERROR,"Invalid Configuration of minimum UL resources "
6998 * @brief Validates the SI configuration request from RRM to MAC.
7002 * Function : rgSCHCfgVldtRgrSiCfg
7005 * - Validate the range of configured values recieved in
7006 * configuration request.
7007 * - If validated successfully,
7011 * - Else return RFAILED.
7012 * @param[in] Inst inst
7013 * @param[in] RgrCellCfg *siCfg
7014 * @param[out] RgSchCellCb *cell
7015 * @param[out] RgSchErrInfo *errInfo
7021 PUBLIC S16 rgSCHCfgVldtRgrSiCfg
7024 RgrSiCfgReqInfo *siCfg,
7026 RgSchErrInfo *errInfo
7029 PUBLIC S16 rgSCHCfgVldtRgrSiCfg(inst, siCfg, cell, errInfo)
7031 RgrSiCfgReqInfo *siCfg;
7033 RgSchErrInfo *errInfo;
7039 TRC2(rgSCHCfgVldtRgrSiCfg);
7042 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_SI_CFG;
7044 /*Validate the cfgType parameter */
7045 switch(siCfg->cfgType)
7049 numSi = (cell->siCb.siBitMask & RGSCH_SI_SICFG_UPD) ?
7050 cell->siCb.newSiCfg.numSi : cell->siCfg.numSi;
7051 if((siCfg->siId < RGSCH_SI_SIID_LOWER_LMT) ||
7052 (siCfg->siId > numSi))
7054 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId, "Invalid SI Id value"
7058 errInfo->errCause = RGSCHERR_NONE;
7061 case RGR_SI_CFG_TYPE_MIB: /* SI CFG Type MIB */
7062 case RGR_SI_CFG_TYPE_SIB1: /* SI CFG TYPE SIB1 */
7063 case RGR_SI_CFG_TYPE_SIB1_PWS: /* SI CFG TYPE SIB1_PWS */
7064 case RGR_SI_CFG_TYPE_SIB8_CDMA: /* SI CFG TYPE SIB 8 CDMA */
7066 case RGR_SI_CFG_EMTC_TYPE_SIB1_BR:
7067 case RGR_SI_CFG_EMTC_TYPE_SIB1_BR_PER:
7071 case RGR_SI_CFG_TYPE_SI: /* SI CFG TYPE SI */
7072 /*Check that value of SI should be less than equal
7073 to configured numSi parameter value */
7074 /* Added siId validation for lower limit */
7075 numSi = (cell->siCb.siBitMask & RGSCH_SI_SICFG_UPD) ?
7076 cell->siCb.newSiCfg.numSi : cell->siCfg.numSi;
7077 if((siCfg->siId < RGSCH_SI_SIID_LOWER_LMT) ||
7078 (siCfg->siId > numSi))
7080 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId, "Invalid SI Id value"
7085 if(siCfg->siId > ((cell->siCfg.minPeriodicity * 10)/cell->siCfg.siWinSize))
7087 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId, "SiId can not be scheduled ");
7093 case RGR_SI_CFG_EMTC_TYPE_SI:
7094 case RGR_SI_CFG_EMTC_TYPE_SI_PER:
7095 if(ROK != rgEmtcvalidateSiCfg(siCfg,cell))
7102 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId, "Invalid cfgType "
7107 /*Validate the specified pdu */
7108 if(NULLP == siCfg->pdu)
7110 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId, "Invalid NULLP pdu "
7115 /*Check if PDU is of 0 length*/
7116 SFndLenMsg(siCfg->pdu, &msgLen);
7119 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId, "Invalid pdu "
7124 errInfo->errCause = RGSCHERR_NONE;
7128 } /* rgSCHCfgVldtRgrSiCfg */
7129 #endif /*RGR_SI_SCH*/
7131 /* LTE_ADV_FLAG_REMOVED_START */
7133 * @brief Validates the RNTP INF request from RRM to MAC.
7137 * Function : rgSCHCfgVldtRgrLoadInf
7140 * - Validate the range of configured values recieved in
7142 * - If validated successfully,
7146 * - Else return RFAILED.
7147 * @param[in] Inst inst
7148 * @param[in] RgrLoadInfReqInfo *loadInfReq
7149 * @param[out] RgSchCellCb *cell
7150 * @param[out] RgSchErrInfo *errInfo
7156 PUBLIC S16 rgSCHCfgVldtRgrLoadInf
7159 RgrLoadInfReqInfo *loadInfReq,
7161 RgSchErrInfo *errInfo
7164 PUBLIC S16 rgSCHCfgVldtRgrLoadInf(inst, loadInfReq, cell, errInfo)
7166 RgrLoadInfReqInfo *loadInfReq;
7168 RgSchErrInfo *errInfo;
7172 TRC2(rgSCHCfgVldtRgrLoadInf);
7175 errInfo->errCause = RGSCHERR_CFG_INVALID_RGR_LOAD_INF;
7177 /* Validate if the CC startRb which we have received from DSFR lies in CE sub-band of the receiving eNB */
7178 if((loadInfReq->rgrCcPHighStartRb >= cell->lteAdvCb.sfrCfg.cellEdgeRbRange.startRb) &&
7179 (loadInfReq->rgrCcPHighStartRb <= cell->lteAdvCb.sfrCfg.cellEdgeRbRange.endRb))
7181 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid rgrCcPHighStartRb received specified");
7185 /* Validate if the CC endRb which we have received from DSFR lies in CE sub-band of the receiving eNB */
7186 if((loadInfReq->rgrCcPHighEndRb >= cell->lteAdvCb.sfrCfg.cellEdgeRbRange.startRb) &&
7187 (loadInfReq->rgrCcPHighEndRb <= cell->lteAdvCb.sfrCfg.cellEdgeRbRange.endRb))
7189 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId, "Invalid rgrCcPHighEndRb received specified");
7193 errInfo->errCause = RGSCHERR_NONE;
7197 } /* rgSCHCfgVldtRgrLoadInf */
7198 /* LTE_ADV_FLAG_REMOVED_END */
7202 /********************************************************************
7203 * UE ACQI, PCQI, RI, SRS and SR Re/Configuration Validation Functions *
7205 *********************************************************************/
7208 * @brief Validates the Tx Mode and PUSCH Mode configuration.
7212 * Function : rgSCHCfgVldtRgrTxmodePuschMode
7215 * - Validate whether the configured PUSCH Mode and the
7216 * Configured Tx Mode are in the right combination
7217 * - If validated successfully,
7222 * @param[in] RgSchCellCb *cellCb
7223 * @param[in] RgrTxMode txMde
7224 * @param[in] RgrAprdCqiMode puschMode
7225 * @param[out] RgSchErrInfo *errInfo
7231 PUBLIC S16 rgSCHCfgVldtRgrTxmodePuschMode
7233 RgSchCellCb *cellCb,
7235 RgrAprdCqiMode puschMode,
7236 RgSchErrInfo *errInfo
7239 PUBLIC S16 rgSCHCfgVldtRgrTxmodePuschMode(cellCb, txMde, puschMode,errInfo)
7240 RgSchCellCb *cellCb;
7242 RgrAprdCqiMode puschMode;
7243 RgSchErrInfo *errInfo;
7246 TRC2(rgSCHCfgVldtRgrTxmodePuschMode);
7249 if (txMde == RGR_UE_TM_1 || txMde == RGR_UE_TM_2 ||
7250 txMde == RGR_UE_TM_3 || txMde == RGR_UE_TM_7)
7252 if (puschMode == RGR_APRD_CQI_MOD12 ||
7253 puschMode == RGR_APRD_CQI_MOD22 ||
7254 puschMode == RGR_APRD_CQI_MOD31)
7260 if (txMde == RGR_UE_TM_4 || txMde == RGR_UE_TM_6)
7262 if (puschMode == RGR_APRD_CQI_MOD20 ||
7263 puschMode == RGR_APRD_CQI_MOD30)
7269 if (txMde == RGR_UE_TM_5 )
7271 if (puschMode != RGR_APRD_CQI_MOD31)
7277 /* TOODO:: Tm8 and TM9 validation has to
7278 * be changed as mentioned inthe commented
7280 /* TM8 and TM9 supports all modes
7281 * Mode 1-2, 2-2, 3-1 if pmi/ri reporting enabled
7282 * 2-0,3-0 of pmi/ri reporitng isdisabled *
7283 * if pmi/ri is enabled
7284 * Mode 1-2, 2-2, 3-1 if with pmi/ri and csi-rs ports > 1
7285 * 2-0,3-0 of pmi/ri reporitng isdisabled and csi-rs ports == 1*/
7289 }/*rgSCHCfgVldtRgrTxmodePuschMode ends*/
7292 * @brief Validates the UE ACQI configuration request from RRM to MAC.
7296 * Function : rgSCHCfgVldtRgrUeACqiCfg
7299 * - Validate the UE configuration request from RRC to MAC at CFG:
7300 * validate the ACQI Configuration
7301 * - If validated successfully,
7306 * @param[in] RgSchCellCb *cellCb,
7307 * @param[in] CmLteRnti crnti,
7308 * @param[in] RgrUeAprdDlCqiCfg *acqiCfg,
7309 * @param[in] RgrUeTxModeCfg txMode,
7310 * @param[out] RgSchErrInfo *errInfo
7317 PUBLIC S16 rgSCHCfgVldtRgrUeACqiCfg
7319 RgSchCellCb *cellCb,
7321 RgrUeAprdDlCqiCfg *acqiCfg,
7322 RgrUeTxModeCfg txMode,
7323 RgSchErrInfo *errInfo
7326 PUBLIC S16 rgSCHCfgVldtRgrUeACqiCfg(cellCb, crnti, acqiCfg,txMode, errInfo)
7327 RgSchCellCb *cellCb;
7329 RgrUeAprdDlCqiCfg *acqiCfg;
7330 RgrUeTxModeCfg txMode;
7331 RgSchErrInfo *errInfo;
7335 RgrAprdCqiMode puschMode;
7336 TRC2(rgSCHCfgVldtRgrUeACqiCfg);
7341 if(txMode.pres == TRUE)
7343 txMde = txMode.txModeEnum;
7344 puschMode = acqiCfg->aprdModeEnum;
7345 if ( ROK != rgSCHCfgVldtRgrTxmodePuschMode(cellCb, txMde,
7346 puschMode, errInfo))
7348 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
7349 "Invalid Aperiodic CQI configuration CRNTI:%d",crnti);
7358 * @brief Validates the Tx Mode and PUCCH Mode configuration.
7362 * Function : rgSCHCfgVldtRgrTxmodePucchMode
7365 * - Validate whether the configured PUCCH Mode and the
7366 * Configured Tx Mode are in the right combination
7367 * - If validated successfully,
7372 * @param[in] RgSchCellCb *cellCb
7373 * @param[in] RgrTxMode txMde
7374 * @param[in] RgrPrdCqiMode pucchMode
7375 * @param[out] RgSchErrInfo *errInfo
7381 PUBLIC S16 rgSCHCfgVldtRgrTxmodePucchMode
7383 RgSchCellCb *cellCb,
7385 RgrPrdCqiMode pucchMode,
7386 RgSchErrInfo *errInfo
7389 PUBLIC S16 rgSCHCfgVldtRgrTxmodePucchMode(cellCb, txMde, pucchMode,errInfo)
7390 RgSchCellCb *cellCb;
7392 RgrPrdCqiMode pucchMode;
7393 RgSchErrInfo *errInfo;
7396 TRC2(rgSCHCfgVldtRgrTxmodePucchMode);
7399 if (pucchMode == RGR_PRD_CQI_MOD10 || pucchMode == RGR_PRD_CQI_MOD20 )
7401 if (txMde ==RGR_UE_TM_4 || txMde ==RGR_UE_TM_5 || txMde ==RGR_UE_TM_6)
7406 else if (pucchMode == RGR_PRD_CQI_MOD11 || pucchMode == RGR_PRD_CQI_MOD21)
7408 if (txMde ==RGR_UE_TM_1 || txMde ==RGR_UE_TM_2 || txMde ==RGR_UE_TM_3 \
7409 || txMde ==RGR_UE_TM_7)
7414 /* TODO:: Tm8 and TM9 validation needs to be added */
7419 * @brief Validates the UE Periodic CQI, PMI, RI, re/configuration request from RRM to MAC.
7423 * Function : rgSCHCfgVldtRgrUePCqiCfg
7426 * - Validate the UE configuration request from RRC to MAC at CFG:
7427 * validate the value range for Periodic CQI, PMI, RI values.
7428 * - If validated successfully,
7433 * @param[in] RgSchCellCb *cellCb,
7434 * @param[in] CmLteRnti crnti,
7435 * @param[in] RgrUePrdDlCqiCfg *cqiCfg,
7436 * @param[in] RgrUeTxModeCfg txMode,
7437 * @param[out] RgSchErrInfo *errInfo
7444 PUBLIC S16 rgSCHCfgVldtRgrUePCqiCfg
7446 RgSchCellCb *cellCb,
7448 RgrUePrdDlCqiCfg *cqiCfg,
7450 RgrUeTxModeCfg txMode,
7451 RgSchErrInfo *errInfo
7454 PUBLIC S16 rgSCHCfgVldtRgrUePCqiCfg(cellCb, crnti, cqiCfg, hdFdd,
7456 RgSchCellCb *cellCb;
7458 RgrUePrdDlCqiCfg *cqiCfg;
7460 RgrUeTxModeCfg txMode;
7461 RgSchErrInfo *errInfo;
7465 PUBLIC S16 rgSCHCfgVldtRgrUePCqiCfg
7467 RgSchCellCb *cellCb,
7469 RgrUePrdDlCqiCfg *cqiCfg,
7470 RgrUeTxModeCfg txMode,
7471 RgSchErrInfo *errInfo
7474 PUBLIC S16 rgSCHCfgVldtRgrUePCqiCfg(cellCb, crnti, cqiCfg, txMode, errInfo)
7475 RgSchCellCb *cellCb;
7477 RgrUePrdDlCqiCfg *cqiCfg;
7478 RgrUeTxModeCfg txMode;
7479 RgSchErrInfo *errInfo;
7484 RgrPrdCqiMode pucchMode;
7486 TRC2(rgSCHCfgVldtRgrUePCqiCfg);
7488 txMde = RGR_UE_TM_1;
7489 pucchMode = RGR_PRD_CQI_MOD20;
7490 if ( RGR_SCH_PCQI_SETUP == cqiCfg->type )
7492 /*1. Validate for Tx Mode and PUCCH Mode combination*/
7493 if(txMode.pres == TRUE)
7495 txMde = txMode.txModeEnum;
7496 pucchMode = cqiCfg->cqiSetup.prdModeEnum;
7497 if ( ROK != rgSCHCfgVldtRgrTxmodePucchMode(cellCb, txMde,
7498 pucchMode, errInfo))
7500 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
7501 "Invalid Tx Mode-PUCCH Mode combination CRNTI:%d",crnti);
7506 /*2. Validate for PCQI Reporting Type and PUCCH Mode combination*/
7507 if((cqiCfg->cqiSetup.cqiRepType==1) &&
7508 ((pucchMode == RGR_PRD_CQI_MOD20) ||
7509 (pucchMode == RGR_PRD_CQI_MOD21)))
7511 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
7512 "Invalid Reporting Type-PUCCH Mode combination CRNTI:%d",crnti);
7516 if((cqiCfg->cqiSetup.cqiRepType==2) &&
7517 ((pucchMode == RGR_PRD_CQI_MOD10) ||
7518 (pucchMode == RGR_PRD_CQI_MOD11)))
7520 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
7521 "Invalid Reporting Type-PUCCH Mode combination CRNTI:%d",crnti);
7525 /*3. Validate CQI/PMI and RI Configuration related parameter values */
7526 /*TODO- To be compared with configured n2Pucch Index*/
7527 if (cqiCfg->cqiSetup.cqiPResIdx > RG_SCH_PUCCH_RES_MAX_SUPP )
7529 RLOG_ARG3(L_ERROR,DBG_CELLID,cellCb->cellId,
7530 "Not Supported or Invalid CQI-PUCCH resourceIndex=%d Cfg Val=%d CRNTI:%d",
7531 RG_SCH_PUCCH_RES_MAX_SUPP, cqiCfg->type,crnti);
7538 if((cqiCfg->cqiSetup.cqiPCfgIdx > RG_SCH_ICQI_MAX_SUPP)||
7539 (cqiCfg->cqiSetup.cqiPCfgIdx < 7) ||
7540 (cqiCfg->cqiSetup.cqiPCfgIdx == 317))
7542 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7543 "Not Supported or Invalid Cfg CQI Min Index Sup =%d"
7544 "Max Index Sup=%d Cfg Val=%d CRNTI:%d", RG_SCH_ICQI_MIN_SUPP,
7545 RG_SCH_ICQI_MAX_SUPP, cqiCfg->type,crnti);
7551 if((cqiCfg->cqiSetup.cqiPCfgIdx > RG_SCH_ICQI_MAX_SUPP)||
7552 (cqiCfg->cqiSetup.cqiPCfgIdx == 317))
7554 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7555 "Not Supported or Invalid Cfg CQI Min Index Sup =%d "
7556 "Max Index Sup=%d Cfg Val=%d CRNTI:%d", RG_SCH_ICQI_MIN_SUPP,
7557 RG_SCH_ICQI_MAX_SUPP, cqiCfg->type,crnti);
7562 if((cqiCfg->cqiSetup.cqiPCfgIdx > RG_SCH_ICQI_MAX_SUPP)||
7563 (cqiCfg->cqiSetup.cqiPCfgIdx == 317))
7565 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7566 "Not Supported or Invalid Cfg CQI Min Index Sup =%d"
7567 "Max Index Sup=%d Cfg Val=%d CRNTI;%d", RG_SCH_ICQI_MIN_SUPP,
7568 RG_SCH_ICQI_MAX_SUPP, cqiCfg->type,crnti);
7573 if((cqiCfg->cqiSetup.cqiRepType < RGR_UE_PCQI_WB_REP) ||
7574 (cqiCfg->cqiSetup.cqiRepType > RGR_UE_PCQI_SB_REP))
7576 RLOG_ARG2(L_ERROR,DBG_CELLID,cellCb->cellId,
7577 "Invalid Cfg CQI Report"
7578 "ModeCfg Val=%d CRNTI:%d", cqiCfg->type,crnti);
7582 if((cqiCfg->cqiSetup.cqiRepType == RGR_UE_PCQI_SB_REP) &&
7583 ((cqiCfg->cqiSetup.k < RG_SCH_CQI_K_MIN) ||
7584 (cqiCfg->cqiSetup.k > RG_SCH_CQI_K_MAX)))
7586 RLOG_ARG2(L_ERROR,DBG_CELLID,cellCb->cellId,
7587 "Invalid CQI Cfg K Cfg Val=%d CRNTI:%d", cqiCfg->type,crnti);
7591 if((cqiCfg->cqiSetup.cqiRepType == RGR_UE_PCQI_SB_REP) &&
7592 (cellCb->bwCfg.dlTotalBw <= 7))
7594 RLOG_ARG2(L_ERROR,DBG_CELLID,cellCb->cellId,
7595 "Invalid Periodic CQI mode Cfg for dlTotalBw (%d) for CRNTI:%d",
7596 cellCb->bwCfg.dlTotalBw, crnti);
7601 if (cqiCfg->cqiSetup.cqiPCfgIdx == RG_SCH_ICQI_RESV_FDD )
7603 RLOG_ARG2(L_ERROR,DBG_CELLID,cellCb->cellId,
7604 "Reserved value Cfg =%d CRNTI:%d",
7605 cqiCfg->cqiSetup.cqiPResIdx,crnti);
7610 /* 4. Check RI Configuration values */
7611 if(cqiCfg->cqiSetup.riEna == TRUE)
7613 if(txMode.pres == TRUE)
7615 if((txMde != RGR_UE_TM_3)
7616 && (txMde != RGR_UE_TM_4)
7617 && (txMde != RGR_UE_TM_8)
7619 && (txMde != RGR_UE_TM_9)
7623 RLOG_ARG2(L_ERROR,DBG_CELLID,cellCb->cellId,
7624 "Invalid Transmission Mode =%d CRNTI:%d",
7630 if(cqiCfg->cqiSetup.riCfgIdx > RG_SCH_IRI_MAX_SUPP)
7632 RLOG_ARG2(L_ERROR,DBG_CELLID,cellCb->cellId,
7633 "Invalid Index RI value Cfg =%d CRNTI:%d",
7634 cqiCfg->cqiSetup.riCfgIdx,crnti);
7645 * @brief Validates the UE SRS Re/Configuation request from RRM to MAC.
7649 * Function : rgSCHCfgVldtRgrUeUlSrsCfg
7652 * - Validate the UE configuration request from RRC to MAC at CFG:
7653 * validate the value range for SRS values.
7654 * - If validated successfully,
7659 * @param[in] RgSchCellCb *cellCb,
7660 * @param[in] CmLteRnti crnti,
7661 * @param[in] RgrUeUlSrsCfg *srsCfg,
7662 * @param[out] RgSchErrInfo *errInfo
7669 PUBLIC S16 rgSCHCfgVldtRgrUeUlSrsCfg
7671 RgSchCellCb *cellCb,
7673 RgrUeUlSrsCfg *srsCfg,
7675 RgSchErrInfo *errInfo
7678 PUBLIC S16 rgSCHCfgVldtRgrUeUlSrsCfg(cellCb, crnti, srsCfg, hdFdd, errInfo)
7679 RgSchCellCb *cellCb;
7681 RgrUeUlSrsCfg *srsCfg;
7683 RgSchErrInfo *errInfo;
7687 PUBLIC S16 rgSCHCfgVldtRgrUeUlSrsCfg
7689 RgSchCellCb *cellCb,
7691 RgrUeUlSrsCfg *srsCfg,
7692 RgSchErrInfo *errInfo
7695 PUBLIC S16 rgSCHCfgVldtRgrUeUlSrsCfg(cellCb, crnti, srsCfg, errInfo)
7696 RgSchCellCb *cellCb;
7698 RgrUeUlSrsCfg *srsCfg;
7699 RgSchErrInfo *errInfo;
7707 TRC2(rgSCHCfgVldtRgrUeUlSrsCfg);
7710 if ( RGR_SCH_SRS_SETUP == srsCfg->type )
7713 /*ccpu00130768 - ADD - if cell specific SRS is not configured*/
7714 if(cellCb->srsCfg.isSrsCfgPres == FALSE)
7716 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
7717 "Cell specific SRS is not configured CRNTI:%d",crnti);
7721 /* 1. Validate SRS Configuration related parameter values */
7722 /* 1.1 iSRS should be 0-636; Ref: 36.213. Table 8.2-1 */
7726 if ( (srsCfg->srsSetup.srsCfgIdx < 7) ||
7727 (srsCfg->srsSetup.srsCfgIdx > RG_SCH_ISRS_MAX_SUPP) )
7729 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7730 "Not Supported or Invalid Cfg "
7731 "SRS Min Index Sup =%d Max Index Sup=%d Cfg Val=%d CRNTI:%d",
7732 RG_SCH_ISRS_MIN_SUPP, RG_SCH_ISRS_MAX_SUPP,
7733 srsCfg->srsSetup.srsCfgIdx,crnti);
7739 if ( srsCfg->srsSetup.srsCfgIdx > RG_SCH_ISRS_MAX_SUPP )
7741 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7742 "Not Supported or Invalid Cfg"
7743 "SRS Min Index Sup =%d Max Index Sup=%d Cfg Val=%d CRNTI:%d",
7744 RG_SCH_ISRS_MIN_SUPP, RG_SCH_ISRS_MAX_SUPP,
7745 srsCfg->srsSetup.srsCfgIdx,crnti);
7751 if ( srsCfg->srsSetup.srsCfgIdx > RG_SCH_ISRS_MAX_SUPP )
7753 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7754 "Not Supported or Invalid Cfg"
7755 "SRS Min Index Sup =%d Max Index Sup=%d Cfg Val=%d CRNTI:%d",
7756 RG_SCH_ISRS_MIN_SUPP, RG_SCH_ISRS_MAX_SUPP,
7757 srsCfg->srsSetup.srsCfgIdx,crnti);
7762 /* Compute SRS Offset and Periodicity */
7763 rgSCHUtlGetCfgPerOff( RG_SCH_TDD_SRS_TBL,
7764 srsCfg->srsSetup.srsCfgIdx,
7765 &srsPeri, &srsOffset);
7767 rgSCHUtlGetCfgPerOff( RG_SCH_FDD_SRS_TBL,
7768 srsCfg->srsSetup.srsCfgIdx,
7769 &srsPeri, &srsOffset);
7771 srsSubframe = srsOffset%RGSCH_NUM_SUB_FRAMES;
7773 if(rgSchTddCellSpSrsSubfrmTbl[cellCb->srsCfg.srsSubFrameCfg][srsSubframe] == FALSE) {
7775 if(rgSchFddCellSpSrsSubfrmTbl[cellCb->srsCfg.srsSubFrameCfg][srsSubframe] == FALSE) {
7777 RLOG_ARG2(L_ERROR,DBG_CELLID,cellCb->cellId,
7778 "UE specific SRS is not occuring in Cell specific SRS subframe"
7779 "srs Cfg Idx =%d CRNTI:%d",
7780 srsCfg->srsSetup.srsCfgIdx,crnti);
7785 if ( srsCfg->srsSetup.fDomPosi > RG_SCH_SRS_FREQDOM_POS_MAX )
7787 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7788 "Not Supported or Invalid Cfg"
7789 "SRS Min Freq Domain Position =%d"
7790 "Max Freq Domain Position =%d Cfg Val=%d CRNTI:%d",
7791 RG_SCH_SRS_FREQDOM_POS_MIN, RG_SCH_SRS_FREQDOM_POS_MAX,
7792 srsCfg->srsSetup.srsCfgIdx,crnti);
7796 if ( srsCfg->srsSetup.txComb > RG_SCH_SRS_TXCOMB_MAX )
7798 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7799 "Not Supported or Invalid Cfg"
7800 "SRS Min TX Comb =%d Max TX Comb =%d Cfg Val=%d CRNTI:%d",
7801 RG_SCH_SRS_TXCOMB_MIN, RG_SCH_SRS_TXCOMB_MAX,
7802 srsCfg->srsSetup.srsCfgIdx,crnti);
7810 * @brief Validates the UE SR Re/configuration request from RRM to MAC.
7814 * Function : rgSCHCfgVldtRgrUeSrCfg
7817 * - Validate the UE re/configuration request from RRC to MAC at CFG:
7818 * validate the value range for SR values.
7819 * - If validated successfully,
7824 * @param[in] RgSchCellCb *cellCb,
7825 * @param[in] CmLteRnti crnti,
7826 * @param[in] RgrUeSrCfg *srCfg,
7827 * @param[out] RgSchErrInfo *errInfo
7834 PUBLIC S16 rgSCHCfgVldtRgrUeSrCfg
7836 RgSchCellCb *cellCb,
7840 RgSchErrInfo *errInfo
7843 PUBLIC S16 rgSCHCfgVldtRgrUeSrCfg(cellCb, crnti, srCfg, hdFdd, errInfo)
7844 RgSchCellCb *cellCb;
7848 RgSchErrInfo *errInfo;
7852 PUBLIC S16 rgSCHCfgVldtRgrUeSrCfg
7854 RgSchCellCb *cellCb,
7857 RgSchErrInfo *errInfo
7860 PUBLIC S16 rgSCHCfgVldtRgrUeSrCfg(cellCb, crnti, srCfg, errInfo)
7861 RgSchCellCb *cellCb;
7864 RgSchErrInfo *errInfo;
7869 TRC2(rgSCHCfgVldtRgrUeSrCfg);
7873 if ( RGR_SCH_SR_SETUP == srCfg->type )
7875 /* 1. Validate SR Configuration related parameter values */
7879 if (( srCfg->srSetup.srResIdx > RG_SCH_SR_RES_IDX ) ||
7880 ( srCfg->srSetup.srCfgIdx < 5 ) ||
7881 ( srCfg->srSetup.srCfgIdx > RG_SCH_ISR_MAX_SUPP ))
7883 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7884 "Invalid SR Index Cfg =%d"
7885 "Max Supp=%d,Min Supp=%d CRNTI:%d", srCfg->srSetup.srCfgIdx,
7886 RG_SCH_ISR_MAX_SUPP, RG_SCH_ISR_MIN_SUPP,crnti);
7893 if (( srCfg->srSetup.srResIdx > RG_SCH_SR_RES_IDX ) ||
7894 ( srCfg->srSetup.srCfgIdx > RG_SCH_ISR_MAX_SUPP ))
7896 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7897 "Invalid SR Index Cfg =%d"
7898 "Max Supp=%d,Min Supp=%d CRNTI:%d", srCfg->srSetup.srCfgIdx,
7899 RG_SCH_ISR_MAX_SUPP, RG_SCH_ISR_MIN_SUPP,crnti);
7905 if (( srCfg->srSetup.srResIdx > RG_SCH_SR_RES_IDX ) ||
7906 ( srCfg->srSetup.srCfgIdx > RG_SCH_ISR_MAX_SUPP ))
7908 RLOG_ARG4(L_ERROR,DBG_CELLID,cellCb->cellId,
7909 "Invalid SR Index Cfg =%d"
7910 "Max Supp=%d,Min Supp=%d CRNTI:%d", srCfg->srSetup.srCfgIdx,
7911 RG_SCH_ISR_MAX_SUPP, RG_SCH_ISR_MIN_SUPP,crnti);
7922 * @brief Validates the UE Aperiodic & Periodic CQI, PMI, RI, SRS and SR Configuration
7923 * request from RRM to MAC.
7927 * Function :rgSCHCfgVldtCqiSrSrsUeCfg
7930 * - Validate the UE configuration request from RRC to MAC at CFG:
7931 * validate the value range for Aperiodic & Periodic CQI, PMI, RI , SRS and SR values.
7932 * - If validated successfully,
7937 * @param[in] RgSchCellCb *cellCb
7938 * @param[in] RgrUeCfg *ueCfg
7939 * @param[out] RgSchErrInfo *errInfo
7945 PRIVATE S16 rgSCHCfgVldtCqiSrSrsUeCfg
7947 RgSchCellCb *cellCb,
7949 RgSchErrInfo *errInfo
7952 PRIVATE S16 rgSCHCfgVldtCqiSrSrsUeCfg(cellCb, ueCfg, errInfo)
7953 RgSchCellCb *cellCb;
7955 RgSchErrInfo *errInfo;
7959 TRC2(rgSCHCfgVldtCqiSrSrsUeCfg);
7962 /* 1. Validate UE Aperiodic CQI related parameters */
7963 if ( ROK != rgSCHCfgVldtRgrUeACqiCfg (cellCb, ueCfg->crnti,
7964 &ueCfg->ueDlCqiCfg.aprdCqiCfg, ueCfg->txMode, errInfo ))
7966 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
7967 "Invalid Aperiodic CQI configuration CRNTI:%d",ueCfg->crnti);
7971 /* 1. Validate UE Periodic CQI/PMI, SRS and SR related parameters */
7973 if ( ROK != rgSCHCfgVldtRgrUePCqiCfg (cellCb, ueCfg->crnti,
7974 &ueCfg->ueDlCqiCfg.prdCqiCfg, ueCfg->isHdFddEnbld,
7975 ueCfg->txMode, errInfo ))
7977 if ( ROK != rgSCHCfgVldtRgrUePCqiCfg (cellCb, ueCfg->crnti,
7978 &ueCfg->ueDlCqiCfg.prdCqiCfg, ueCfg->txMode, errInfo ))
7981 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
7982 "Invalid Periodic CQI configuration CRNTI:%d",ueCfg->crnti);
7986 /* 2. Validate SRS Configuration related parameter values */
7988 if ( ROK != rgSCHCfgVldtRgrUeUlSrsCfg(cellCb, ueCfg->crnti, &ueCfg->srsCfg,
7989 ueCfg->isHdFddEnbld, errInfo ))
7991 if ( ROK != rgSCHCfgVldtRgrUeUlSrsCfg(cellCb, ueCfg->crnti,
7992 &ueCfg->srsCfg, errInfo ))
7995 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
7996 "Invalid SRS configuration CRNTI:%d",ueCfg->crnti);
8000 /* 3. Validate SR Configuration related parameter values */
8002 if ( ROK != rgSCHCfgVldtRgrUeSrCfg (cellCb, ueCfg->crnti, &ueCfg->srCfg,
8003 ueCfg->isHdFddEnbld, errInfo))
8005 if ( ROK != rgSCHCfgVldtRgrUeSrCfg (cellCb, ueCfg->crnti,
8006 &ueCfg->srCfg, errInfo))
8009 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
8010 "Invalid SR configuration CRNTI:%d",ueCfg->crnti);
8020 /*****************************************************************
8021 * UE PCQI, RI, SRS and SR Re Configuration Validation Functions *
8023 ******************************************************************/
8025 * @brief Validates the UE Periodic CQI, PMI, RI, SRS and SR
8026 * Re-configuration request from RRM to MAC.
8030 * Function : rgSCHCfgVldtCqiSrSrsUeReCfg
8033 * - Validate the UE Re configuration request from RRC to MAC at CFG:
8034 * validate the value range for Periodic CQI, PMI, RI, SRS and SR values.
8035 * - If validated successfully,
8040 * @param[in] RgSchCellCb *cellCb
8041 * @param[in] RgSchUeCb *ueCb
8042 * @param[in] RgrUeCfg *ueCfg
8043 * @param[out] RgSchErrInfo *errInfo
8049 PRIVATE S16 rgSCHCfgVldtCqiSrSrsUeReCfg
8051 RgSchCellCb *cellCb,
8053 RgrUeRecfg *ueReCfg,
8054 RgSchErrInfo *errInfo
8057 PRIVATE S16 rgSCHCfgVldtCqiSrSrsUeReCfg(cellCb, ueCb, ueReCfg, errInfo)
8058 RgSchCellCb *cellCb;
8060 RgrUeRecfg *ueReCfg;
8061 RgSchErrInfo *errInfo;
8064 RgrUeTxModeCfg txMode;
8065 TRC3(rgSCHCfgVldtCqiSrSrsUeReCfg);
8068 txMode.tmTrnstnState = RGR_TXMODE_RECFG_CMPLT;
8069 if ((ueReCfg->ueRecfgTypes & RGR_UE_TXMODE_RECFG) &&
8070 (ueReCfg->txMode.pres == TRUE))
8072 txMode.txModeEnum = ueReCfg->txMode.txModeEnum;
8076 txMode.txModeEnum = ueCb->mimoInfo.txMode;
8079 /* 1. Validate UE CQI/PMI, SRS and SR related parameters */
8081 if ( ueReCfg->ueRecfgTypes & RGR_UE_APRD_DLCQI_RECFG )
8083 if ( ROK != rgSCHCfgVldtRgrUeACqiCfg (cellCb, ueReCfg->oldCrnti,
8084 &ueReCfg->aprdDlCqiRecfg, txMode, errInfo ))
8086 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
8087 "Invalid Aperiodic CQI configuration OLD CRNTI:%d",ueReCfg->oldCrnti);
8093 /* 2. Validate UE CQI/PMI, SRS and SR related parameters */
8095 if ( ueReCfg->ueRecfgTypes & RGR_UE_PCQI_RECFG )
8098 if ( ROK != rgSCHCfgVldtRgrUePCqiCfg (cellCb, ueReCfg->oldCrnti,
8099 &ueReCfg->cqiCfg, ueReCfg->isHdFddEnbld, txMode, errInfo ))
8101 if ( ROK != rgSCHCfgVldtRgrUePCqiCfg (cellCb, ueReCfg->oldCrnti,
8102 &ueReCfg->cqiCfg, txMode, errInfo ))
8106 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
8107 "Invalid Periodic CQI configuration OLD CRNTI:%d",ueReCfg->oldCrnti);
8112 if(ueReCfg->ueRecfgTypes & RGR_UE_SRS_RECFG )
8115 if ( ROK != rgSCHCfgVldtRgrUeUlSrsCfg(cellCb, ueReCfg->oldCrnti,
8116 &ueReCfg->srsCfg, ueReCfg->isHdFddEnbld, errInfo ))
8118 if ( ROK != rgSCHCfgVldtRgrUeUlSrsCfg(cellCb, ueReCfg->oldCrnti,
8119 &ueReCfg->srsCfg, errInfo ))
8122 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
8123 "Invalid SRS configuration OLD CRNTI:%d",ueReCfg->oldCrnti);
8129 if ( ueReCfg->ueRecfgTypes & RGR_UE_SR_RECFG )
8132 if ( ROK != rgSCHCfgVldtRgrUeSrCfg (cellCb, ueReCfg->oldCrnti,
8133 &ueReCfg->srCfg, ueReCfg->isHdFddEnbld, errInfo))
8135 if ( ROK != rgSCHCfgVldtRgrUeSrCfg (cellCb, ueReCfg->oldCrnti,
8136 &ueReCfg->srCfg, errInfo))
8139 RLOG_ARG1(L_ERROR,DBG_CELLID,cellCb->cellId,
8140 "Invalid SR configuration OLD CRNTI:%d",ueReCfg->oldCrnti);
8149 /*****************************************************************
8150 * UE ACQI, PCQI, RI, SRS SR Configuration Functions *
8152 ******************************************************************/
8154 * @brief Handles Aperiodic CQI , PMI, RI configuration for a UE.
8158 * Function : rgSCHCfgACqiUeCfg
8160 * Invoking Module Processing:
8161 * - This shall be invoked by SCH_GOM at UE configuration. It
8162 * shall do the validations for the spec-defined values.
8168 * @param[in] RgSchCellCb *cell
8169 * @param[in] RgrTxMode txMode
8170 * @param[in] RgrUeAprdDlCqiCfg *aCqiCfg
8171 * @param[in] CmLteUeCategory ueCat
8177 PUBLIC S16 rgSCHCfgACqiUeCfg
8179 RgSchCellCb *cellCb,
8181 RgSchUeACqiCb *acqiCb,
8183 RgrUeAprdDlCqiCfg *aCqiCfg,
8184 CmLteUeCategory ueCat
8187 PUBLIC S16 rgSCHCfgACqiUeCfg(cellCb,ue,acqiCb ueTxMode, aCqiCfg, ueCat)
8188 RgSchCellCb *cellCb;
8190 RgSchUeACqiCb *acqiCb;
8192 RgrUeAprdDlCqiCfg *aCqiCfg;
8193 CmLteUeCategory ueCat;
8196 U8 M; /*Num of Subbands -- Applicable only for Mode 2-0 and 2-2*/
8197 U8 k; /*SubBand Size (RB) --
8198 Holds different values depending on Mode*/
8199 U8 cqiPmiSzR1; /*CQIPMI Size for Rank =1*/
8200 U8 cqiPmiSzRn1; /*CQIPMI Size for Rank > 1*/
8202 TRC3(rgSCHCfgACqiUeCfg);
8207 acqiCb->aCqiCfg.pres = aCqiCfg->pres;
8208 acqiCb->aCqiCfg.aprdModeEnum = aCqiCfg->aprdModeEnum;
8213 /*Store Trigger Set Bit String to UE */
8214 RgSchUeCellInfo *pCellInfo = RG_SCH_CMN_GET_PCELL_INFO(ue);
8215 pCellInfo->acqiCb.aCqiCfg.triggerSet1 = aCqiCfg->triggerSet1;
8216 pCellInfo->acqiCb.aCqiCfg.triggerSet2 = aCqiCfg->triggerSet2;
8220 switch(aCqiCfg->aprdModeEnum)
8222 case RGR_APRD_CQI_MOD12:
8223 case RGR_APRD_CQI_MOD30:
8224 case RGR_APRD_CQI_MOD31:
8225 RG_SCH_GET_CQI_K_VAL(cellCb->bwCfg.dlTotalBw, k);
8226 acqiCb->N = RGSCH_CEIL(cellCb->bwCfg.dlTotalBw, k);
8230 case RGR_APRD_CQI_MOD20:
8231 case RGR_APRD_CQI_MOD22:
8232 RG_SCH_GET_SBCQI_M_K_VAL(cellCb->bwCfg.dlTotalBw, M, k);
8233 acqiCb->N = RGSCH_CEIL(cellCb->bwCfg.dlTotalBw, k);
8236 acqiCb->L = RgSCHUeAcqi2022LBitWidth[M-1][acqiCb->N-1];
8242 if((ueTxMode == RGR_UE_TM_3) ||
8243 (ueTxMode == RGR_UE_TM_4))
8245 if(cellCb->numTxAntPorts ==2)
8247 acqiCb->riNumBits = 1;
8249 else if(cellCb->numTxAntPorts ==4)
8251 if(ueCat == CM_LTE_UE_CAT_8)
8253 acqiCb->riNumBits = 3;
8255 else if(ueCat >= CM_LTE_UE_CAT_5)
8257 acqiCb->riNumBits = 2;
8261 acqiCb->riNumBits = 1;
8265 rgSCHCfgUtlFetchAcqiBitSz(acqiCb, cellCb->numTxAntPorts,
8266 &cqiPmiSzR1, &cqiPmiSzRn1);
8267 acqiCb->cqiPmiSzR1 = cqiPmiSzR1;
8268 acqiCb->cqiPmiSzRn1 = cqiPmiSzRn1;
8270 acqiCb->cqiReqField = TRUE;
8272 rgSchCmnSetCqiReqField(RG_SCH_CMN_GET_SCELL_INFO(ue, cellCb),ue,&acqiCb->cqiReqField);
8279 * @brief Handles Periodic CQI , PMI, RI configuration for a UE.
8283 * Function : rgSCHCfgPCqiUeCfg
8285 * Invoking Module Processing:
8286 * - This shall be invoked by SCH_GOM at UE configuration. It shall do the
8287 * validations for the spec-defined values.
8290 * - For UE-specific Periodic CQI related configuration,
8291 * - If Periodic CQI/PMI is configured,
8292 * - Update UE with the configured values.
8293 - Compute and Update next occurance of CQI/PMI or RI Tranmission instance.
8294 - Update the CQI offset and CQI perodicity information
8295 - Add Ue to cell's list
8298 * - For UE-specific Periodic RI related configuration,
8299 * - If Periodic RI is configured,
8300 * - Update UE with the configured values.
8301 - Compute and Update next occurance of RI Tranmission instance.
8302 - Update the RI offset and RI perodicity information
8307 * @param[in] RgSchCellCb *cell
8308 * @param[in] RgSchUeCb *ue
8309 * @param[in] RgrUePrdDlCqiCfg *cqiCfg
8310 * @param[in] CmLteUeCategory ueCat
8316 PUBLIC S16 rgSCHCfgPCqiUeCfg
8318 RgSchCellCb *cellCb,
8320 RgrUePrdDlCqiCfg *cqiCfg,
8321 CmLteUeCategory ueCat
8324 PUBLIC S16 rgSCHCfgPCqiUeCfg(cellCb, ueCb, cqiCfg, ueCat)
8325 RgSchCellCb *cellCb;
8327 RgrUePrdDlCqiCfg *cqiCfg;
8328 CmLteUeCategory ueCat;
8331 CmLteTimingInfo timingInfo;
8334 U8 j; /*Bandwidth Parts*/
8337 RgSchUePCqiCb *cqiCb = NULLP;
8338 TRC3(rgSCHCfgPCqiUeCfg);
8340 crntTime = (cellCb->crntTime.sfn * RGSCH_NUM_SUB_FRAMES_5G)+
8341 (cellCb->crntTime.subframe);
8342 cqiCb = RG_SCH_GET_UE_CELL_CQI_CB(ueCb,cellCb);
8343 cqiCb->servCellInfo = ueCb->cellInfo[0];
8344 /* Periodic CQI is setup */
8345 if (cqiCfg->type == RGR_SCH_PCQI_SETUP)
8347 for(loop = 0; loop < MAX_CQI_RI_RPT_BUFF;loop++)
8349 ueCb->rawCqiBitW[loop].type = TFU_RECP_REQ_INVLD; /* setting invalid type*/
8351 /* 1. Copy the Received CQI Cfg parameters to ueCb */
8352 cmMemcpy((U8 *)&cqiCb->cqiCfg, (U8 *)cqiCfg,
8353 sizeof(RgrUePrdDlCqiCfg));
8355 /* 2. Compute Periodic CQI Periodicity and subframe offset */
8357 rgSCHUtlGetCfgPerOff(RG_SCH_FDD_PCQI_TBL, cqiCfg->cqiSetup.cqiPCfgIdx,
8358 &cqiCb->cqiPeri, &cqiCb->cqiOffset);
8360 rgSCHUtlGetCfgPerOff( RG_SCH_TDD_PCQI_TBL,
8361 cqiCfg->cqiSetup.cqiPCfgIdx,
8362 &cqiCb->cqiPeri, &cqiCb->cqiOffset);
8364 RLOG_ARG3(L_DEBUG,DBG_CELLID,cellCb->cellId,
8365 "rgSCHCfgPCqiUeCfg(): UEID:%d CQI Peri=%d, CQI Offset=%d",
8371 cqiTrInstTime = ((cqiCb->cqiPeri+crntTime) - cqiCb->cqiOffset)
8373 cqiCb->nCqiTrIdx = (crntTime +
8374 (cqiCb->cqiPeri - cqiTrInstTime));
8375 /* Introduced timing delta for reception req
8377 if(cqiCb->nCqiTrIdx <= (crntTime + TFU_RECPREQ_DLDELTA))
8379 cqiCb->nCqiTrIdx = cqiCb->nCqiTrIdx + cqiCb->cqiPeri;
8382 /* To handle the SFN wrap around case */
8383 cqiCb->nCqiTrIdx = cqiCb->nCqiTrIdx % (RGSCH_MAX_SFN * RGSCH_NUM_SUB_FRAMES_5G);
8385 timingInfo.sfn = cqiCb->nCqiTrIdx/RGSCH_NUM_SUB_FRAMES_5G;
8386 timingInfo.subframe = cqiCb->nCqiTrIdx % RGSCH_NUM_SUB_FRAMES_5G;
8388 cqiCb->nCqiTrIdx = cqiCb->nCqiTrIdx
8389 %RG_SCH_PCQI_SRS_SR_TRINS_SIZE;
8392 /*CQI Repetition configuration*/
8395 rgSchfillPucchCqiRepNumCountemtc(cqiCb, ueCb);
8399 if(RGR_UE_PCQI_SB_REP == cqiCfg->cqiSetup.cqiRepType)
8401 U8 k; /*SubBand Size (RB) */
8402 RG_SCH_GET_CQI_J_VAL(cellCb->bwCfg.dlTotalBw, j);
8403 RG_SCH_GET_CQI_K_VAL(cellCb->bwCfg.dlTotalBw, k);
8404 cqiCb->J = j; /*Number of Bandwidth Parts*/
8405 /*h: reporting instances required for a complete CQI/PMI report */
8406 /*j:Number of bandwidth parts; k: Subband Size*/
8407 cqiCb->h = (cqiCb->cqiCfg.cqiSetup.k *j )+1;
8408 /* ccpu00140905- L-size is coming as 3 for 100Rbs where it should be 2*/
8409 temp = RGSCH_CEIL(cellCb->bwCfg.dlTotalBw, (j*k));
8410 cqiCb->label = (temp & (temp-1)) ?
8411 (1+ rgSCHUtlLog32bitNbase2(temp)) : rgSCHUtlLog32bitNbase2(temp);
8413 rgSCHTomUtlPcqiSbCalcBpIdx(timingInfo,ueCb, cqiCb);
8418 cqiCb->prioLvl = RG_SCH_CQI_PRIO_LVL_1;
8422 /* Place the UE in cellCb->tIUeLstCp */
8423 cqiCb->cqiLstEnt.node=(PTR) cqiCb;
8425 cqiCb->isCqiIgnoByCollsn = FALSE;
8426 cqiCb->isRiIgnoByCollsn = FALSE;
8430 cmLListAdd2Tail(&cellCb->pCqiSrsSrLst[cqiCb->nCqiTrIdx].cqiLst,
8434 /* 4. Rank Indicator Cfg handler */
8435 rgSCHCfgRiUeCfg(cellCb, ueCb, cqiCfg, ueCat);
8439 cqiCb->cqiCfg.type = RGR_SCH_PCQI_REL;
8440 if(cqiCb->nCqiTrIdx != RG_SCH_INVALID_IDX)
8442 cmLListDelFrm(&cellCb->pCqiSrsSrLst[cqiCb->nCqiTrIdx].cqiLst,\
8445 if(cqiCb->nRiTrIdx != RG_SCH_INVALID_IDX)
8447 cmLListDelFrm(&cellCb->pCqiSrsSrLst[cqiCb->nRiTrIdx].riLst, \
8449 RG_SCH_RECORD(&cqiCb->histElem,RGSCH_ACTION_DEL,
8450 &cellCb->pCqiSrsSrLst[cqiCb->nRiTrIdx].riLst);
8452 cqiCb->nCqiTrIdx = RG_SCH_INVALID_IDX;
8453 cqiCb->nRiTrIdx = RG_SCH_INVALID_IDX;
8454 cqiCb->riDist = RG_SCH_INVALID_IDX;
8456 ueCb->nPCqiCb = cqiCb;
8457 ueCb->nPRiCb = cqiCb;
8462 * @brief Handles Periodic RI configuration for a UE.
8466 * Function : rgSCHCfgRiUeCfg
8468 * Invoking Module Processing:
8469 * - This shall be invoked by SCH_GOM at UE configuration. It shall do the
8470 * validations for the spec-defined values.
8473 * - For UE-specific Periodic RI related configuration,
8474 * - If Periodic RI is configured,
8475 * - Update UE with the configured values.
8476 - Compute and Update next occurance of RI Tranmission instance.
8477 - Update the RI offset and RI perodicity information
8481 * @param[in] RgSchCellCb *cell
8482 * @param[in] RgSchUeCb *ue
8483 * @param[in] RgrUePrdDlCqiCfg *cqiCfg
8484 * @param[in] CmLteUeCategory ueCat
8490 PUBLIC S16 rgSCHCfgRiUeCfg
8492 RgSchCellCb *cellCb,
8494 RgrUePrdDlCqiCfg *cqiCfg,
8495 CmLteUeCategory ueCat
8498 PUBLIC S16 rgSCHCfgRiUeCfg(cellCb, ueCb, cqiCfg, ueCat)
8499 RgSchCellCb *cellCb;
8501 RgrUePrdDlCqiCfg *cqiCfg;
8502 CmLteUeCategory ueCat;
8507 U8 j; /*Bandwidth parts. Valid for Modes 2-0, 2-1*/
8510 RgSchUePCqiCb *cqiCb = NULLP;
8512 TRC3(rgSCHCfgRiUeCfg);
8516 crntTime = (cellCb->crntTime.sfn * RGSCH_NUM_SUB_FRAMES_5G)
8517 +(cellCb->crntTime.subframe);
8518 cqiCb = RG_SCH_GET_UE_CELL_CQI_CB(ueCb,cellCb);
8519 /* 1. Rank Indicator is enabled */
8520 if(cqiCfg->cqiSetup.riEna)
8523 rgSCHUtlGetCfgPerOff(RG_SCH_RI_TBL,
8524 cqiCfg->cqiSetup.riCfgIdx,
8525 &cqiCb->riPeri, &cqiCb->riOffset);
8527 RLOG_ARG3(L_DEBUG,DBG_CELLID,cellCb->cellId,
8528 "rgSCHCfgRiUeCfg(): RI Peri=%d, RI Offset=%d UEID:%d",
8529 cqiCb->riPeri, cqiCb->riOffset,ueCb->ueId);
8531 cqiCb->perRiVal = 1;
8532 cqiCb->invalidateCqi = FALSE;
8534 if(RGR_UE_PCQI_WB_REP == cqiCfg->cqiSetup.cqiRepType)
8537 1. wideband RI reporting is configured
8539 (10*sfn+floor(subframe)-Noffsetcqi-NoffsetRI )Mod(NCqiperiod
8542 periodicity = cqiCb->cqiPeri * cqiCb->riPeri;
8547 * Where Widesband and Subband RI reporting is configured
8548 * (Mode 2-0 or 2-1 )
8549 * (10*sfn+floor(subframe)-Noffsetcqi-NoffsetRI )
8550 * Mod(H. NCqiperiod *MriPeriod )=0
8551 * where H= J * K +1; J=Number of bandwidth parts(BW/subsize).
8552 * K is RGR interf input
8555 RG_SCH_GET_CQI_J_VAL(cellCb->bwCfg.dlTotalBw, j);
8556 cqiCb->h = (cqiCb->cqiCfg.cqiSetup.k *j )+1;
8557 periodicity = cqiCb->h * cqiCb->cqiPeri *
8561 /* In case of SFN wraparound, the SB CQI reporting cycle breaks
8562 * and RI->WB CQI->SBCQI.. should resume. RI is repositioned
8563 * accordingly. WBCQI handling is naturally accomplished */
8564 if (periodicity >= RGSCH_MAX_SUBFRM_5G)
8566 periodicity = cqiCb->cqiOffset - cqiCb->riOffset +
8567 RGSCH_MAX_SUBFRM_5G - (crntTime);
8568 tempIdx = crntTime + periodicity;
8569 printf("CHECK_SID - periodicity %d tempIdx %d\n", periodicity, tempIdx);
8573 if ((crntTime + TFU_RECPREQ_DLDELTA + periodicity) >
8574 (RGSCH_MAX_SUBFRM_5G - 1))
8576 riTrInsTime = (periodicity - cqiCb->cqiOffset + cqiCb->riOffset) % periodicity;
8577 tempIdx = RGSCH_MAX_SUBFRM_5G + (periodicity - riTrInsTime);
8581 riTrInsTime = ((periodicity +crntTime )- \
8582 cqiCb->cqiOffset + cqiCb->riOffset)\
8584 tempIdx = (crntTime + (periodicity -riTrInsTime));
8587 if (tempIdx <= (crntTime + TFU_RECPREQ_DLDELTA))
8589 tempIdx = tempIdx + periodicity;
8591 cqiCb->nRiTrIdx = tempIdx
8592 % RG_SCH_PCQI_SRS_SR_TRINS_SIZE;
8593 if(periodicity >= RG_SCH_PCQI_SRS_SR_TRINS_SIZE)
8595 cqiCb->riDist = rgSCHUtlFindDist((U16)(crntTime + TFU_RECPREQ_DLDELTA),
8602 if(ueCb->mimoInfo.txMode == RGR_UE_TM_3
8603 || ueCb->mimoInfo.txMode == RGR_UE_TM_4)
8605 if (cellCb->numTxAntPorts ==2)
8607 cqiCb->riNumBits = 1;
8609 else if(cellCb->numTxAntPorts ==4)
8611 if(ueCat == CM_LTE_UE_CAT_8)
8613 cqiCb->riNumBits = 3;
8615 else if(ueCat >= CM_LTE_UE_CAT_5)
8617 cqiCb->riNumBits = 2;
8621 cqiCb->riNumBits = 1;
8625 /* Place the UE in cellCb->tIUeLstCp */
8626 cqiCb->riLstEnt.node=(PTR) cqiCb;
8628 cmLListAdd2Tail(&cellCb->pCqiSrsSrLst[cqiCb->nRiTrIdx].riLst,
8630 RG_SCH_RECORD(&cqiCb->histElem,RGSCH_ACTION_ADD,
8631 &cellCb->pCqiSrsSrLst[cqiCb->nRiTrIdx].riLst);
8637 cqiCb->nRiTrIdx = RG_SCH_INVALID_IDX;
8638 cqiCb->riDist = RG_SCH_INVALID_IDX;
8645 /* @brief Handles SRS configuration for a UE.
8649 * Function : rgSCHCfgSrsUeCfg
8651 * Invoking Module Processing:
8652 * - This shall be invoked by SCH_GOM at UE configuration. It shall do the
8653 * validations for the spec-defined values.
8656 * - For UE-specific SRS related configuration,
8657 * - If SRS is configured,
8658 * - Update UE with the configured values.
8659 - Compute and Update next occurance of SRS Tranmission instance.
8660 - Update the SRS offset and SRS perodicity information
8661 - Add Ue to cell's srs list
8663 * - next occurance transmission instance of SRS = RG_SCH_INVALID_IDX
8667 * @param[in] RgSchCellCb *cell
8668 * @param[in] RgSchUeCb *ue
8669 * @param[in] RgrUeUlSrsCfg *srsCfg
8676 PUBLIC S16 rgSCHCfgSrsUeCfg
8678 RgSchCellCb *cellCb,
8680 RgrUeUlSrsCfg *srsCfg
8683 PUBLIC S16 rgSCHCfgSrsUeCfg(cellCb, ueCb, srsCfg)
8684 RgSchCellCb *cellCb;
8686 RgrUeUlSrsCfg *srsCfg;
8693 TRC3(rgSCHCfgSrsUeCfg);
8696 crntTime = (cellCb->crntTime.sfn * RGSCH_NUM_SUB_FRAMES_5G)
8697 +(cellCb->crntTime.subframe);
8699 if(RGR_SCH_SRS_SETUP == srsCfg->type)
8701 /* 1. Copy the Received Cfg parameters to local cb */
8702 cmMemcpy((U8 *)&ueCb->srsCb.srsCfg, (U8 *)srsCfg, sizeof(RgrUeUlSrsCfg));
8705 /* 2. Compute SRS Offset and Periodicity */
8706 rgSCHUtlGetCfgPerOff( RG_SCH_FDD_SRS_TBL,
8707 srsCfg->srsSetup.srsCfgIdx,
8708 &ueCb->srsCb.peri, &ueCb->srsCb.offset);
8710 rgSCHUtlGetCfgPerOff( RG_SCH_TDD_SRS_TBL,
8711 srsCfg->srsSetup.srsCfgIdx,
8712 &ueCb->srsCb.peri, &ueCb->srsCb.offset);
8715 RLOG_ARG3(L_DEBUG,DBG_CELLID,cellCb->cellId,
8716 "rgSCHCfgSrsUeCfg(): SRS Peri=%d, SRS Offset=%d UEID:%d",
8717 ueCb->srsCb.peri,ueCb->srsCb.offset,ueCb->ueId);
8719 /* 3. Compute next Tranmission index for SRS */
8720 /* Referenence: 36.213 Section:8.2
8721 i. SRS transmission instances for TDD with period > 2 and for FDD are
8722 ((10*sfn +Ksrs-suframeoffset))/mod(periodicity))
8724 TDD: Ksrs Table 8.2-3:
8725 ii.The SRS transmission instances for TDD (periodicity == 2)
8726 (Ksrs-Toffset)mod(5)==0. Note: This is not supported now
8729 srsTrInsTime = ((ueCb->srsCb.peri+crntTime) - ueCb->srsCb.offset)
8731 tempIdx = (crntTime + (ueCb->srsCb.peri - srsTrInsTime));
8733 if (tempIdx <= (crntTime + TFU_DELTA))
8735 if (tempIdx <= (crntTime + TFU_RECPREQ_DLDELTA))
8738 tempIdx = tempIdx + ueCb->srsCb.peri;
8740 ueCb->srsCb.nSrsTrIdx =(U16) (tempIdx
8741 % RG_SCH_PCQI_SRS_SR_TRINS_SIZE);
8742 if(ueCb->srsCb.peri >= RG_SCH_PCQI_SRS_SR_TRINS_SIZE)
8745 ueCb->srsCb.srsDist = rgSCHUtlFindDist((U8)(crntTime+TFU_DELTA),
8748 ueCb->srsCb.srsDist = rgSCHUtlFindDist((U8)(crntTime + TFU_RECPREQ_DLDELTA),
8754 ueCb->srsCb.srsDist = 0;
8757 /*UE Tx Antenna Selection - START*/
8758 if(ueCb->ul.ulTxAntSel.pres == TRUE )
8760 /*for both partial and full sounding bandwidth,
8761 and when frequency hopping is disabled */
8762 ueCb->srsCb.selectedAnt = (crntTime/ueCb->srsCb.peri)%2;
8766 /* TS 36.213 specifies that if Tx Antenna Selection is
8767 disabled/not supported then its Port 0*/
8768 ueCb->srsCb.selectedAnt=0;
8770 ueCb->validTxAnt = ueCb->srsCb.selectedAnt;
8771 /*UE Tx Antenna Selection - ENDS*/
8773 ueCb->srsCb.srsLstEnt.node=(PTR)ueCb;
8774 cmLListAdd2Tail(&cellCb->pCqiSrsSrLst[ueCb->srsCb.nSrsTrIdx].srsLst,
8775 &ueCb->srsCb.srsLstEnt);
8781 /* SRS Release / Not configured */
8782 ueCb->srsCb.srsCfg.type = RGR_SCH_SRS_REL;
8783 if(ueCb->srsCb.nSrsTrIdx != RG_SCH_INVALID_IDX)
8785 cmLListDelFrm(&cellCb->pCqiSrsSrLst[ueCb->srsCb.nSrsTrIdx].srsLst,
8786 &ueCb->srsCb.srsLstEnt);
8788 ueCb->srsCb.nSrsTrIdx = RG_SCH_INVALID_IDX;
8789 ueCb->srsCb.srsLstEnt.node =(PTR) NULLP;
8796 /* * @brief Handles SR configuration for a UE.
8800 * Function : rgSCHCfgSrUeCfg
8802 * Invoking Module Processing:
8803 * - This shall be invoked by SCH_GOM at UE configuration. It shall do the
8804 * validations for the spec-defined values.
8806 * - If SR is configured,
8807 * - Update UE with the configured values.
8808 - Compute and Update next occurance of SR Tranmission instance.
8809 - Update the SR offset and SR perodicity information
8810 - Add Ue to cell->tIUeLstCp[n]
8812 * - next occurance transmission instance of SR = RG_INVALID_SR_ID
8817 * @param[in] RgSchCellCb *cell
8818 * @param[in] RgSchUeCb *ue
8819 * @param[in] RgrUeSrCfg *srCfg
8826 PUBLIC S16 rgSCHCfgSrUeCfg
8828 RgSchCellCb *cellCb,
8833 PUBLIC S16 rgSCHCfgSrUeCfg(cellCb, ueCb, srCfg)
8834 RgSchCellCb *cellCb;
8842 TRC3(rgSCHCfgSrUeCfg);
8845 crntTime = (cellCb->crntTime.sfn * RGSCH_NUM_SUB_FRAMES_5G)
8846 +(cellCb->crntTime.subframe);
8847 if(srCfg->type == RGR_SCH_SR_SETUP)
8849 /* 1. Copy the Received Cfg parameters to local cb */
8850 cmMemcpy((U8 *)&ueCb->srCb.srCfg, (U8 *)srCfg, sizeof(RgrUeSrCfg));
8853 /* 2. Compute SR periodicity and offset */
8854 rgSCHUtlGetCfgPerOff( RG_SCH_SR_TBL,
8855 srCfg->srSetup.srCfgIdx,
8856 &ueCb->srCb.peri, &ueCb->srCb.offset);
8858 RLOG_ARG4(L_DEBUG,DBG_CELLID,cellCb->cellId ,
8859 "SR Config: idx(%u), period (%u) offset (%u) UEID:%d",
8860 srCfg->srSetup.srCfgIdx,
8867 rgSchfillPucchSrRepNumCountemtc(ueCb);
8870 /* 3. Compute Next Transmission Instance */
8872 srTrInsTime = ((ueCb->srCb.peri+crntTime) - ueCb->srCb.offset)
8874 ueCb->srCb.nSrTrIdx = (crntTime + (ueCb->srCb.peri- srTrInsTime));
8876 if (ueCb->srCb.nSrTrIdx <= (crntTime + TFU_DELTA))
8878 if (ueCb->srCb.nSrTrIdx <= (crntTime + TFU_RECPREQ_DLDELTA))
8881 ueCb->srCb.nSrTrIdx = ueCb->srCb.nSrTrIdx + ueCb->srCb.peri;
8883 ueCb->srCb.nSrTrIdx = ueCb->srCb.nSrTrIdx
8884 % RG_SCH_PCQI_SRS_SR_TRINS_SIZE;
8885 ueCb->srCb.srLstEnt.node= (PTR) ueCb;
8887 /* 4. Place UE in Cell SR Tranmisison Instance List */
8888 cmLListAdd2Tail(&cellCb->pCqiSrsSrLst[ueCb->srCb.nSrTrIdx].srLst,
8889 &ueCb->srCb.srLstEnt);
8893 ueCb->srCb.srCfg.type = RGR_SCH_SR_REL;
8895 if(ueCb->srCb.nSrTrIdx != RG_SCH_INVALID_IDX)
8897 cmLListDelFrm(&cellCb->pCqiSrsSrLst[ueCb->srCb.nSrTrIdx].srLst,
8898 &ueCb->srCb.srLstEnt);
8900 ueCb->srCb.nSrTrIdx = RG_SCH_INVALID_IDX;
8901 ueCb->srCb.srLstEnt.node = (PTR)NULLP;
8908 /*****************************************************************
8909 * UE PCQI, RI, SRS and SR Re Configuration Functions *
8911 ******************************************************************/
8914 /* * @brief Handles Periodic CQI, PMI, RI Re-configuration for a UE.
8918 * Function : rgSCHCfgPCqiUeReCfg
8920 * Invoking Module Processing:
8921 * - This shall be invoked by SCH_GOM at UE Re configuration. It shall do the
8922 * validations for the spec-defined values.
8925 * - For UE-specific Periodic CQI related configuration,
8926 * - If Periodic CQI/PMI is re configured(first time enabled),
8927 * - Update UE with the configured values.
8928 * - Compute and Update next occurance of CQI/PMI or RI Tranmission
8930 * - Update the CQI offset and CQI perodicity information
8931 * - Add Ue to cell's list
8932 * - If Periodic CQI/PMI is re configured(modify),
8933 * - Update UE with the configured values.
8934 * - Del Ue from cell->tIUeLstCp list
8935 * - Compute and Update next occurance of CQI/PMI or RI Tranmission
8937 * - Update the CQI offset and CQI perodicity information
8938 * - Add Ue to cell's list
8939 * - If Periodic CQI/PMI is re configured(disabled),
8940 * - Update UE with the configured values.
8941 * - Del Ue from cell's list
8942 * - Update next occurance of CQI/PMI or RI Tranmission instance.
8943 * - next occurance of CQI/PMI = RG_INVALID_CQIPMI_ID
8945 * - For UE-specific Periodic RI related configuration,
8946 * - If Periodic RI is configured(first time enabled),
8947 * - Update UE with the configured values.
8948 * - Compute and Update next occurance of RI Tranmission instance.
8949 * - Update the RI offset and RI perodicity information
8950 * - If Periodic RI is configured(modify),
8951 * - Update UE with the configured values.
8952 * - Compute and Update next occurance of RI Tranmission instance.
8953 * - Update the RI offset and RI perodicity information
8955 * - next occurance of RI = RG_INVALID_CQIPMI_ID
8959 * @param[in] RgSchCellCb *cell
8960 * @param[in] RgSchUeCb *ue
8961 * @param[in] RgrUeCfg *ueCfg
8968 PUBLIC S16 rgSCHCfgPCqiUeReCfg
8970 RgSchCellCb *cellCb,
8972 RgrUePrdDlCqiCfg *cqiCfg,
8973 CmLteUeCategory ueCat
8976 PUBLIC S16 rgSCHCfgPCqiUeReCfg(cellCb, ueCb, cqiCfg, ueCat)
8977 RgSchCellCb *cellCb;
8979 RgrUePrdDlCqiCfg *cqiCfg;
8980 CmLteUeCategory ueCat;
8984 RgSchUePCqiCb *cqiCb = NULLP;
8985 TRC3(rgSCHCfgPCqiUeReCfg);
8987 cqiCb = RG_SCH_GET_UE_CELL_CQI_CB(ueCb,cellCb);
8988 /* Fix: ccpu00124008 Fix for incorrect check causing missed CQI reception instance */
8989 if((cqiCfg->type == RGR_SCH_PCQI_SETUP) &&
8990 (cqiCb->cqiCfg.type != RGR_SCH_PCQI_SETUP))
8992 /* 1. cqi is in Release (Disable) state, Recfg is allowing Setup (Enable)
8994 rgSCHCfgPCqiUeCfg(cellCb, ueCb, cqiCfg, ueCat);
8997 else if((cqiCfg->type == RGR_SCH_PCQI_SETUP) &&
8998 (cqiCb->cqiCfg.type == RGR_SCH_PCQI_SETUP ))
9002 2. Present is SETUP(Enable) state, Recfg is modifying SETUP(Enable)
9004 2.1 Delete UE from the cqiList
9005 2.2 Set next occurance Transmission instace to "INVALID"
9006 2.3 Compute Next occurance Transmission instace
9007 2.4 Placed ue in Transmission instance list.
9009 if(cqiCb->nCqiTrIdx != RG_SCH_INVALID_IDX )
9010 cmLListDelFrm(&cellCb->pCqiSrsSrLst[cqiCb->nCqiTrIdx].cqiLst,
9013 if(cqiCb->nRiTrIdx != RG_SCH_INVALID_IDX )
9015 cmLListDelFrm(&cellCb->pCqiSrsSrLst[cqiCb->nRiTrIdx].riLst,
9017 RG_SCH_RECORD(&cqiCb->histElem,RGSCH_ACTION_DEL,
9018 &cellCb->pCqiSrsSrLst[cqiCb->nRiTrIdx].riLst);
9022 cqiCb->cqiLstEnt.next = NULLP;
9023 cqiCb->cqiLstEnt.prev = NULLP;
9024 cqiCb->nCqiTrIdx = RG_SCH_INVALID_IDX;
9025 cqiCb->nRiTrIdx = RG_SCH_INVALID_IDX;
9026 cqiCb->riDist = RG_SCH_INVALID_IDX;
9028 rgSCHCfgPCqiUeCfg(cellCb, ueCb, cqiCfg, ueCat);
9032 /* Present is SETUP(Enable) state, Recfg is Release(Disable) */
9033 rgSCHCfgPCqiUeCfg(cellCb, ueCb, cqiCfg, ueCat);
9036 /* ccpu00140578:: */
9037 cqiCb->riRecpPrcsd = FALSE;
9042 /* * @brief Handles SRS Re-configuration for a UE.
9046 * Function : rgSCHCfgSrsUeReCfg
9048 * Invoking Module Processing:
9049 * - This shall be invoked by SCH_GOM at UE Re configuration. It shall do the
9050 * validations for the spec-defined values.
9053 * - For UE-specific SRS related re configuration,
9054 * - If SRS is configured modified(First time Enabled),
9055 * - Update UE with the configured values.
9056 * - Compute and Update next occurance of SRS Tranmission instance.
9057 * - Update the SRS offset and SRS perodicity information
9058 * - Add Ue to cell's list
9059 * - If SRS is configured modified(Changed offset or index ),
9060 * - Delete UE from cell->tIUeLstCp[n] if present
9061 * - Update UE with the configured values.
9062 * - Compute and Update next occurance of SRS Tranmission instance.
9063 * - Update the SRS offset and SRS perodicity information
9064 * - Add Ue to cell's list
9065 * - If SRS is configured modified(disabled),
9066 * - Delete UE from cell->tIUeLstCp[n] if present
9067 * - Update next occurance of SRS Tranmission instance to "INVALID".
9068 * - Update the SRS offset and SRS perodicity information "INVALID"
9074 * @param[in] RgSchCellCb *cell
9075 * @param[in] RgSchUeCb *ue
9076 * @param[in] RgrUeUlSrsCfg *srsCfg
9083 PUBLIC S16 rgSCHCfgSrsUeReCfg
9085 RgSchCellCb *cellCb,
9087 RgrUeUlSrsCfg *srsCfg
9090 PUBLIC S16 rgSCHCfgSrsUeReCfg(cellCb, ueCb, srsCfg)
9091 RgSchCellCb *cellCb;
9093 RgrUeUlSrsCfg *srsCfg;
9097 TRC3(rgSCHCfgSrsUeReCfg);
9101 if(( RGR_SCH_SRS_SETUP == srsCfg->type) ||
9102 ( RGR_SCH_SRS_SETUP != ueCb->srsCb.srsCfg.type ))
9104 /* 1. Present is Release(Disable) state, Recfg is allowing
9106 rgSCHCfgSrsUeCfg(cellCb, ueCb, srsCfg);
9108 else if (( RGR_SCH_SRS_SETUP == srsCfg->type ) &&
9109 ( RGR_SCH_SRS_SETUP == ueCb->srsCb.srsCfg.type))
9112 /* 2. Present is SETUP(Eanble) state, Recfg is modifying SETUP(Enable)
9114 2.1 Delete UE from the cqiList
9115 2.2 Set next occurance Transmission instance to "INVALID"
9116 2.3 Compute Next occurance Transmission instance
9117 2.4 Placed ue in Transmission instance list.
9119 if (ueCb->srsCb.nSrsTrIdx != RG_SCH_INVALID_IDX)
9121 cmLListDelFrm(&cellCb->pCqiSrsSrLst[ueCb->srsCb.nSrsTrIdx].srsLst,
9122 &ueCb->srsCb.srsLstEnt);
9123 ueCb->srsCb.nSrsTrIdx = RG_SCH_INVALID_IDX;
9126 rgSCHCfgSrsUeCfg(cellCb, ueCb, srsCfg);
9130 /* 3. Present is SETUP(Enable) state, Recfg is Release(Disable)*/
9131 rgSCHCfgSrsUeCfg(cellCb, ueCb, srsCfg);
9133 /* ccpu00140578:: */
9134 ueCb->srsCb.srsRecpPrcsd = FALSE;
9139 /* @brief Handles SR Re-configuration for a UE.
9143 * Function : rgSCHCfgSrUeReCfg
9145 * Invoking Module Processing:
9146 * - This shall be invoked by SCH_GOM at UE Re configuration.
9147 * It shall do the validations for the spec-defined values.
9150 * - For UE-specific SR related re configuration,
9151 * - If SR is configured modified(First time Enabled),
9152 * - Update UE with the configured values.
9153 * - Compute and Update next occurance of SR Tranmission instance.
9154 * - Update the SR offset and SR perodicity information
9155 * - Add Ue to cell->tIUeLstCp[n]
9156 * - If SR is configured modified(Changed offset or index ),
9157 * - Delete UE from cell->tIUeLstCp[n] if present
9158 * - Update UE with the configured values.
9159 * - Compute and Update next occurance of SR Tranmission instance.
9160 * - Update the SR offset and SR perodicity information
9161 * - Add Ue to cell->tIUeLstCp[n]
9162 * - If SR is configured modified(disabled),
9163 * - Delete UE from cell->tIUeLstCp[n] if present
9164 * - Update next occurance of SR Tranmission instance to "INVALID".
9165 * - Update the SR offset and SR perodicity information "INVALID"
9173 * @param[in] RgSchCellCb *cell
9174 * @param[in] RgSchUeCb *ue
9175 * @param[in] RgrUeCfg *ueCfg
9182 PUBLIC S16 rgSCHCfgSrUeReCfg
9184 RgSchCellCb *cellCb,
9189 PUBLIC S16 rgSCHCfgSrUeReCfg(cellCb, ueCb, srCfg)
9190 RgSchCellCb *cellCb;
9195 TRC3(rgSCHCfgSrUeReCfg);
9198 /* Fix : syed Incorrect check for SR RECFG */
9199 if((srCfg->type == RGR_SCH_SR_SETUP) &&
9200 (ueCb->srCb.srCfg.type != RGR_SCH_SR_SETUP))
9203 1. Present is Release(Disable) state, Recfg is allowing SETUP(Enable)
9205 rgSCHCfgSrUeCfg(cellCb, ueCb, srCfg);
9207 else if((srCfg->type == RGR_SCH_SR_SETUP) &&
9208 (ueCb->srCb.srCfg.type == RGR_SCH_SR_SETUP))
9211 /* 2. Present is SETUP(Eanble) state, Recfg is modifying SETUP(Enable)
9213 2.1 Delete UE from the cqiList
9214 2.2 Compute Next occurance Transmission instace
9216 if(ueCb->srCb.nSrTrIdx != RG_SCH_INVALID_IDX )
9218 cmLListDelFrm(&cellCb->pCqiSrsSrLst[ueCb->srCb.nSrTrIdx].srLst,
9219 &ueCb->srCb.srLstEnt);
9220 ueCb->srCb.nSrTrIdx = RG_SCH_INVALID_IDX;
9222 rgSCHCfgSrUeCfg(cellCb, ueCb, srCfg);
9227 /* 3. Present is SETUP(Enable) state, Recfg is Release(Disable) */
9228 rgSCHCfgSrUeCfg(cellCb, ueCb, srCfg);
9234 /* @brief Handles ACQI Re-configuration for a UE.
9238 * Function : rgSCHCfgAcqiUeReCfg
9240 * Invoking Module Processing:
9241 * - This shall be invoked by SCH_GOM at UE Re configuration.
9242 * It shall do the validations for the spec-defined values.
9245 * - For UE-specific ACQI related re configuration,
9246 * - Check if the ACQI Mode has been changed from the
9247 * existing Configuration.
9248 * - If the configuration has been changed,
9249 * - Call Aperiodic Config function to change the config
9256 * @param[in] RgSchCellCb *cell
9257 * @param[in] RgSchUeCb *ue
9258 * @param[in] RgrUeAprdDlCqiCfg *acqiCfg
9265 PUBLIC S16 rgSCHCfgAcqiUeReCfg
9267 RgSchCellCb *cellCb,
9269 RgrUeAprdDlCqiCfg *acqiCfg,
9270 CmLteUeCategory ueCat
9273 PUBLIC S16 rgSCHCfgAcqiUeReCfg(cellCb, ueCb, acqiCfg, ueCat)
9274 RgSchCellCb *cellCb;
9276 RgrUeAprdDlCqiCfg *acqiCfg;
9277 CmLteUeCategory ueCat;
9280 TRC3(rgSCHCfgAcqiUeReCfg);
9282 RETVALUE(rgSCHCfgACqiUeCfg(cellCb,ueCb,(RG_SCH_CMN_GET_ACQICB(ueCb,cellCb))
9283 ,ueCb->mimoInfo.txMode, acqiCfg, ueCat));
9287 /*****************************************************************
9288 * UE PCQI, RI, SRS and SR Configuration Delete *
9290 *****************************************************************/
9292 /* @brief Free Periodic CQI/PMI/RI, SRS and SR transmission instance
9293 * related data structures of this UE from CellCb
9297 * Function : rgSCHCfgPCqiSrsSrUeDel
9299 * Invoking Module Processing:
9300 * - This shall be invoked by SCH_GOM at Ue deletion.
9303 * - For SRS Transmission Instance
9304 * - if (srsTxInst!= RG_INVALID)
9305 * - Remove from the cellCb->tIUeLstCp[srsTxInst*3+2]
9308 * - For SR Transmission Instance
9309 * - if (srTxInst!= RG_INVALID)
9310 * - Remove from the cellCb->tIUeLstCp[srTxInst*3+1]
9313 * - For Periodic CQI/PMI RI Transmission Instance
9314 * - if (pCqiTxInst!= RG_INVALID)
9315 * - Remove from the cellCb->tIUeLstCp[srTxInst*3+0]
9319 * @param[in] RgSchCellCb *cell
9320 * @param[in] RgSchUeCb *ue
9326 PUBLIC S16 rgSCHCfgPCqiSrsSrUeDel
9328 RgSchCellCb *cellCb,
9332 PUBLIC S16 rgSCHCfgPCqiSrsSrUeDel(cellCb, ueCb)
9333 RgSchCellCb *cellCb;
9341 RgSchUePCqiCb *cqiRiCb = NULLP;
9342 TRC3(rgSCHCfgPCqiSrsSrUeDel);
9344 cqiRiCb = RG_SCH_GET_UE_CELL_CQI_CB(ueCb,cellCb);
9348 /* Delete SRS Transmission Instance */
9349 if (ueCb->srsCb.nSrsTrIdx != RG_SCH_INVALID_IDX)
9351 cmLListDelFrm(&cellCb->pCqiSrsSrLst[ueCb->srsCb.nSrsTrIdx].srsLst,
9352 &ueCb->srsCb.srsLstEnt);
9353 ueCb->srsCb.nSrsTrIdx = RG_SCH_INVALID_IDX;
9356 /* Delete SR Transmission Instance */
9357 if (ueCb->srCb.nSrTrIdx != RG_SCH_INVALID_IDX)
9359 cmLListDelFrm(&cellCb->pCqiSrsSrLst[ueCb->srCb.nSrTrIdx].srLst,
9360 &ueCb->srCb.srLstEnt);
9361 ueCb->srCb.nSrTrIdx = RG_SCH_INVALID_IDX;
9364 /* Delete Periodic CQI/PMI Transmission Instance */
9365 if (cqiRiCb->nCqiTrIdx != RG_SCH_INVALID_IDX)
9367 cmLListDelFrm(&cellCb->pCqiSrsSrLst[cqiRiCb->nCqiTrIdx].cqiLst,
9368 &cqiRiCb->cqiLstEnt);
9369 cqiRiCb->nCqiTrIdx = RG_SCH_INVALID_IDX;
9371 /* Delete Periodic RI Transmission Instance */
9373 if (cqiRiCb->nRiTrIdx != RG_SCH_INVALID_IDX)
9375 cmLListDelFrm(&cellCb->pCqiSrsSrLst[cqiRiCb->nRiTrIdx].riLst,
9376 &cqiRiCb->riLstEnt);
9377 RG_SCH_RECORD(&cqiRiCb->histElem,RGSCH_ACTION_DEL,
9378 &cellCb->pCqiSrsSrLst[cqiRiCb->nRiTrIdx].riLst);
9379 cqiRiCb->nRiTrIdx = RG_SCH_INVALID_IDX;
9384 for (cellIdx =1; cellIdx <= RG_SCH_MAX_SCELL; cellIdx++)
9386 /* If a serving cell is configured */
9387 if(ueCb->cellInfo[cellIdx] != NULLP)
9389 /* If the serving cell is in ACTIVE state and
9390 If it is not the same serving cell as cqiRiCb for which
9391 collision is being checked */
9392 cqiRiCb = &ueCb->cellInfo[cellIdx]->cqiCb;
9393 /* Delete Periodic CQI/PMI Transmission Instance */
9394 if (cqiRiCb->nCqiTrIdx != RG_SCH_INVALID_IDX)
9396 cmLListDelFrm(&cellCb->pCqiSrsSrLst[cqiRiCb->nCqiTrIdx].cqiLst,
9397 &cqiRiCb->cqiLstEnt);
9398 cqiRiCb->nCqiTrIdx = RG_SCH_INVALID_IDX;
9400 /* Delete Periodic RI Transmission Instance */
9402 if (cqiRiCb->nRiTrIdx != RG_SCH_INVALID_IDX)
9404 cmLListDelFrm(&cellCb->pCqiSrsSrLst[cqiRiCb->nRiTrIdx].riLst,
9405 &cqiRiCb->riLstEnt);
9406 RG_SCH_RECORD(&cqiRiCb->histElem,RGSCH_ACTION_DEL,
9407 &cellCb->pCqiSrsSrLst[cqiRiCb->nRiTrIdx].riLst);
9408 cqiRiCb->nRiTrIdx = RG_SCH_INVALID_IDX;
9412 /* If all of the num of configured scells are checked then break */
9413 if (sCellCnt == ueCb->numSCells)
9425 /* @brief Search the cfgIdx in given table and retrive periodicity & offset
9428 * Function : rgSCHUtlGetCfgPerOff
9430 * Invoking Module Processing:
9431 * - This shall be invoked by Cfg Module
9434 * binary search for given entry in table
9435 * find the periodicty, offset for a given config index from the table
9437 * @param[in] RgSchPerTbl tbl
9438 * @param[in] U16 cfgIdx
9439 * @param[out] U16 *peri
9440 * @param[out] U16 *offset
9447 PUBLIC S16 rgSCHUtlGetCfgPerOff
9455 PUBLIC S16 rgSCHUtlGetCfgPerOff ( tbl, cfgIdx, peri, offset)
9465 CONSTANT RgSchUePCqiSrsSrCfgIdxTbl* table;
9466 TRC3(rgSCHUtlGetCfgPerOff);
9468 /* Added the function instead of the MACRO to get the
9469 * periodicity table */
9470 table = rgSCHCfgUtlGetPcqiSrsSrRiTbl ( tbl,&min,&max );
9473 if (( cfgIdx >= table[mid].min) &&
9474 ( cfgIdx <= table[mid].max))
9476 *peri = table[mid].peri;
9477 *offset = cfgIdx - table[mid].offset;
9481 if ( cfgIdx > table[mid].min)
9490 }while( min <= max );
9496 /***********************************************************
9498 * Func : rgSCHCfgUtlFetchAcqiBitSz
9501 * Desc : Fetch the CQI/PMI bits for a UE based on the mode and store them
9511 **********************************************************/
9513 PRIVATE Void rgSCHCfgUtlFetchAcqiBitSz
9515 RgSchUeACqiCb *acqiCb,
9521 PRIVATE Void rgSCHCfgUtlFetchAcqiBitSz(acqiCb, numTxAnt, cqiPmiSzR1, cqiPmiSzRn1)
9522 RgSchUeACqiCb *acqiCb;
9532 TRC3(rgSCHCfgUtlFetchAcqiBitSz);
9534 confRepMode = acqiCb->aCqiCfg.aprdModeEnum;
9537 case RGR_APRD_CQI_MOD12:
9541 *cqiPmiSzR1 = 4 + 2*acqiCb->N;
9542 *cqiPmiSzRn1 = 8+ acqiCb->N;
9544 else if(numTxAnt == 4)
9546 *cqiPmiSzR1 = 4 + 4*acqiCb->N;
9547 *cqiPmiSzRn1 = 8 + 4*acqiCb->N;
9552 case RGR_APRD_CQI_MOD20:
9554 *cqiPmiSzR1 = 6 + acqiCb->L;
9555 *cqiPmiSzRn1 = 6 + acqiCb->L;
9559 case RGR_APRD_CQI_MOD22:
9563 *cqiPmiSzR1 = 10 + acqiCb->L;
9564 *cqiPmiSzRn1 = 14 + acqiCb->L;
9566 else if(numTxAnt == 4)
9568 *cqiPmiSzR1 = 14 + acqiCb->L;
9569 *cqiPmiSzRn1 = 20 + acqiCb->L;
9574 case RGR_APRD_CQI_MOD30:
9576 *cqiPmiSzR1 = 4 + 2*acqiCb->N;
9577 *cqiPmiSzRn1 = 4 + 2*acqiCb->N;
9581 case RGR_APRD_CQI_MOD31:
9585 *cqiPmiSzR1 = 6 + 2*acqiCb->N;
9586 *cqiPmiSzRn1 = 9 + 4*acqiCb->N;
9588 else if(numTxAnt == 4)
9590 *cqiPmiSzR1 = 8 + 2*acqiCb->N;
9591 *cqiPmiSzRn1 = 12 + 4*acqiCb->N;
9600 /* Added the function rgSCHCfgUtlGetPcqiCrsSrRiTbl to be used
9601 * instead of the MACRO RG_SCH_GET_PERIODICITY_TBL */
9602 /***********************************************************
9604 * Func : rgSCHCfgUtlGetPcqiCrsSrRiTbl
9607 * Desc : Get the Srs Cqi Crs Ri Table
9616 **********************************************************/
9619 PRIVATE CONSTANT RgSchUePCqiSrsSrCfgIdxTbl * rgSCHCfgUtlGetPcqiSrsSrRiTbl
9621 RgSchPerTbl tblType,
9626 PRIVATE CONSTANT RgSchUePCqiSrsSrCfgIdxTbl * rgSCHCfgUtlGetPcqiSrsSrRiTbl(tblType, min, max)
9627 RgSchPerTbl tblType;
9632 CONSTANT RgSchUePCqiSrsSrCfgIdxTbl * table;
9633 TRC3(rgSCHCfgUtlGetPcqiCrsSrRiTbl);
9638 case RG_SCH_FDD_PCQI_TBL:
9640 table = rgSchUePCqiCfgIdxFddTbl;
9642 * max=RG_SCH_CQIPMI_CFGIDX_MAX_FDD;
9645 case RG_SCH_TDD_PCQI_TBL:
9647 table = rgSchUeCqiPmiCfgIdxTddTbl;
9649 * max=RG_SCH_CQIPMI_CFGIDX_MAX_TDD;
9654 table = rgSchUeRiCfgIdxTbl;
9656 * max=RG_SCH_RI_CFGIDX_MAX;
9659 case RG_SCH_FDD_SRS_TBL:
9661 table = rgSchUeSrsCfgIdxFddTbl;
9663 * max=RG_SCH_SRS_ISRS_INDX_MAX_FDD;
9666 case RG_SCH_TDD_SRS_TBL:
9668 table = rgSchUeSrsCfgIdxTddTbl;
9670 * max=RG_SCH_SRS_ISRS_INDX_MAX_TDD;
9675 table = rgSchUeSrCfgIdxTbl;
9677 * max=RG_SCH_ISR_INDX_MAX;
9682 table = (CONSTANT RgSchUePCqiSrsSrCfgIdxTbl *) 0;
9692 #endif /* TFU_UPGRADE */
9694 /***********************************************************
9696 * Func : rgSCHCfgVldtDrxUeCfg
9699 * Desc : Validates UE DRX Timers Configuration recieved from RRC.
9709 **********************************************************/
9711 PRIVATE S16 rgSCHCfgVldtDrxUeCfg
9714 RgrUeDrxCfg *ueDrxCfg
9717 PRIVATE S16 rgSCHCfgVldtDrxUeCfg(cell, ueDrxCfg)
9719 RgrUeDrxCfg *ueDrxCfg;
9722 TRC2(rgSCHCfgVldtDrxUeCfg)
9725 if (ueDrxCfg->isDrxEnabled == FALSE)
9731 if ( ueDrxCfg->cqiMask.pres )
9733 if ( ueDrxCfg->cqiMask.val != RGR_DRX_SETUP )
9736 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid cqiMask configuration (%d)",
9737 ueDrxCfg->cqiMask.val);
9739 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid cqiMask configuration(%ld)",
9740 ueDrxCfg->cqiMask.val);
9745 #endif /*LTEMAC_R9*/
9747 if(ueDrxCfg->isEmtcUe)
9749 if(ueDrxCfg->drxOnDurTmrR13Pres)
9751 if ( rgSCHEmtcCfgVldtDrxOnDurCfg(ueDrxCfg->drxOnDurTmr) != ROK )
9753 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid onDurTimer configuration(%d)",
9754 ueDrxCfg->drxOnDurTmr);
9760 if (rgSCHCfgVldtDrxOnDurCfg(ueDrxCfg->drxOnDurTmr) != ROK )
9762 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid onDurTimer configuration(%d) for EMTC",
9763 ueDrxCfg->drxOnDurTmr);
9772 if ( rgSCHCfgVldtDrxOnDurCfg(ueDrxCfg->drxOnDurTmr) != ROK )
9774 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid onDurTimer configuration(%d) for EMTC",
9775 ueDrxCfg->drxOnDurTmr);
9780 if ( rgSCHCfgVldtDrxInActvCfg(ueDrxCfg->drxInactvTmr) != ROK )
9782 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid Inactivity configuration(%d)",
9783 ueDrxCfg->drxInactvTmr);
9787 if(ueDrxCfg->isEmtcUe)
9789 if(ueDrxCfg->drxRetxTmrR13Pres)
9791 if ( rgSCHEmtcCfgVldtDrxReTxCfg(ueDrxCfg->drxRetxTmr) != ROK )
9793 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid DrxReTX configuration(%d) for EMTC",
9794 ueDrxCfg->drxRetxTmr);
9800 if (rgSCHCfgVldtDrxReTxCfg(ueDrxCfg->drxRetxTmr) != ROK )
9802 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid DrxReTX configuration(%d)",
9803 ueDrxCfg->drxRetxTmr);
9812 if ( rgSCHCfgVldtDrxReTxCfg(ueDrxCfg->drxRetxTmr) != ROK )
9814 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid DrxReTX configuration(%d)",
9815 ueDrxCfg->drxRetxTmr);
9820 if(ueDrxCfg->isEmtcUe)
9822 if ( rgSCHEmtcCfgVldtDrxUlReTxCfg(ueDrxCfg->emtcDrxUlRetxTmr) != ROK )
9824 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Invalid DrxReTX configuration(%d) for EMTC",
9825 ueDrxCfg->drxRetxTmr);
9832 if ( rgSCHCfgVldtDrxLngCycCfg(ueDrxCfg->drxLongCycleOffst) != ROK )
9834 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid LongCycle configuration");
9838 if ( ueDrxCfg->drxLongCycleOffst.longDrxCycle < ueDrxCfg->drxOnDurTmr )
9840 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid combination of Long DRX Cycle "
9841 " and onDuration timer values");
9846 if( rgSCHCfgVldtTddDrxCycCfg(cell, ueDrxCfg->drxLongCycleOffst.longDrxCycle,
9847 ueDrxCfg->drxOnDurTmr, ueDrxCfg->drxLongCycleOffst.drxStartOffst) != ROK)
9849 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid combination of Long DRX Cycle "
9850 " and onDuration timer values");
9855 if( TRUE == ueDrxCfg->drxShortDrx.pres )
9857 if ( ueDrxCfg->drxShortDrx.shortDrxCycle < ueDrxCfg->drxOnDurTmr )
9859 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid combination of short DRX "
9860 "Cycle and onDuration timer values");
9864 if ( (ueDrxCfg->drxLongCycleOffst.longDrxCycle %
9865 ueDrxCfg->drxShortDrx.shortDrxCycle) != 0)
9867 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId," Long DRX cycle is not multiple of "
9872 if ( rgSCHCfgVldtDrxShrtCycCfg(ueDrxCfg->drxShortDrx) != ROK )
9874 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid Short Cycle configuration");
9879 if( rgSCHCfgVldtTddDrxCycCfg(cell, ueDrxCfg->drxShortDrx.shortDrxCycle,
9880 ueDrxCfg->drxOnDurTmr,
9881 ueDrxCfg->drxLongCycleOffst.drxStartOffst %
9882 ueDrxCfg->drxShortDrx.shortDrxCycle) != ROK)
9884 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Invalid combination of Long DRX Cycle "
9885 " and onDuration timer values");
9892 }/*rgSCHCfgVldtDrxUeCfg*/
9894 /***********************************************************
9896 * Func : rgSCHCfgVldtDrxOnDurCfg
9899 * Desc : Validates UE DRX On Duration configuration
9900 * recieved from RRC.
9910 **********************************************************/
9912 PRIVATE S16 rgSCHCfgVldtDrxOnDurCfg
9917 PRIVATE S16 rgSCHCfgVldtDrxOnDurCfg(onDurTmr)
9921 TRC2(rgSCHCfgVldtDrxOnDurCfg)
9925 case RGR_DRX_PRD_1PSF:
9926 case RGR_DRX_PRD_2PSF:
9927 case RGR_DRX_PRD_3PSF:
9928 case RGR_DRX_PRD_4PSF:
9929 case RGR_DRX_PRD_5PSF:
9930 case RGR_DRX_PRD_6PSF:
9931 case RGR_DRX_PRD_8PSF:
9932 case RGR_DRX_PRD_10PSF:
9933 case RGR_DRX_PRD_20PSF:
9934 case RGR_DRX_PRD_30PSF:
9935 case RGR_DRX_PRD_40PSF:
9936 case RGR_DRX_PRD_50PSF:
9937 case RGR_DRX_PRD_60PSF:
9938 case RGR_DRX_PRD_80PSF:
9939 case RGR_DRX_PRD_100PSF:
9940 case RGR_DRX_PRD_200PSF:
9947 }/*switch(onDurTmr)*/
9950 }/*rgSCHCfgVldtOnDurCfg*/
9952 /***********************************************************
9954 * Func : rgSCHCfgVldtDrxInActvCfg
9957 * Desc : Validates UE DRX InActivity configuration
9958 * recieved from RRC.
9968 **********************************************************/
9970 PRIVATE S16 rgSCHCfgVldtDrxInActvCfg
9975 PRIVATE S16 rgSCHCfgVldtDrxInActvCfg(inActvTmr)
9979 TRC2(rgSCHCfgVldtDrxInActvCfg)
9981 switch ( inActvTmr )
9983 case RGR_DRX_PRD_1PSF:
9984 case RGR_DRX_PRD_2PSF:
9985 case RGR_DRX_PRD_3PSF:
9986 case RGR_DRX_PRD_4PSF:
9987 case RGR_DRX_PRD_5PSF:
9988 case RGR_DRX_PRD_6PSF:
9989 case RGR_DRX_PRD_8PSF:
9990 case RGR_DRX_PRD_10PSF:
9991 case RGR_DRX_PRD_20PSF:
9992 case RGR_DRX_PRD_30PSF:
9993 case RGR_DRX_PRD_40PSF:
9994 case RGR_DRX_PRD_50PSF:
9995 case RGR_DRX_PRD_60PSF:
9996 case RGR_DRX_PRD_80PSF:
9997 case RGR_DRX_PRD_100PSF:
9998 case RGR_DRX_PRD_200PSF:
9999 case RGR_DRX_PRD_300PSF:
10000 case RGR_DRX_PRD_500PSF:
10001 case RGR_DRX_PRD_750PSF:
10002 case RGR_DRX_PRD_1280PSF:
10003 case RGR_DRX_PRD_1920PSF:
10004 case RGR_DRX_PRD_2560PSF:
10011 }/*switch(InactvTmr)*/
10014 }/*rgSCHCfgVldtDrxInActvCfg*/
10016 /***********************************************************
10018 * Func : rgSCHCfgVldtDrxReTxCfg
10021 * Desc : Validates DRX ReTx timer configuration
10022 * recieved from RRC.
10032 **********************************************************/
10034 PRIVATE S16 rgSCHCfgVldtDrxReTxCfg
10039 PRIVATE S16 rgSCHCfgVldtDrxReTxCfg(reTxTmr)
10043 TRC2(rgSCHCfgVldtDrxReTxCfg)
10047 case RGR_DRX_PRD_1PSF:
10048 case RGR_DRX_PRD_2PSF:
10049 case RGR_DRX_PRD_4PSF:
10050 case RGR_DRX_PRD_6PSF:
10051 case RGR_DRX_PRD_8PSF:
10052 case RGR_DRX_PRD_16PSF:
10053 case RGR_DRX_PRD_24PSF:
10054 case RGR_DRX_PRD_33PSF:
10061 }/*switch(drxRetxTmr)*/
10064 }/*rgSCHCfgVldtDrxReTxCfg*/
10066 /***********************************************************
10068 * Func : rgSCHCfgVldtDrxShrtCycCfg
10071 * Desc : Validates DRX Short Cycle timer configuration
10072 * recieved from RRC.
10083 **********************************************************/
10085 PRIVATE S16 rgSCHCfgVldtDrxLngCycCfg
10087 RgrDrxLongCycleOffst lngCycleOffst
10090 PRIVATE S16 rgSCHCfgVldtDrxLngCycCfg(lngCycleOffst)
10091 RgrDrxLongCycleOffst lngCycleOffst;
10094 TRC2(rgSCHCfgVldtDrxLngCycCfg)
10096 if ( rgSCHCfgVldtDrxLngCyclTmrs(lngCycleOffst.longDrxCycle) != ROK )
10101 if ( lngCycleOffst.drxStartOffst >= lngCycleOffst.longDrxCycle )
10107 }/*rgSCHCfgVldtDrxLngCycCfg*/
10109 /***********************************************************
10111 * Func : rgSCHCfgVldtDrxLngCyclTmrs
10114 * Desc : Validates DRX Long Cycle timer values
10115 * recieved from RRC.
10126 **********************************************************/
10128 PRIVATE S16 rgSCHCfgVldtDrxLngCyclTmrs
10133 PRIVATE S16 rgSCHCfgVldtDrxLngCyclTmrs(val)
10137 TRC2(rgSCHCfgVldtDrxLngCyclTmrs)
10141 case RGR_DRX_PRD_10SF:
10142 case RGR_DRX_PRD_20SF:
10143 case RGR_DRX_PRD_32SF:
10144 case RGR_DRX_PRD_40SF:
10145 case RGR_DRX_PRD_64SF:
10146 case RGR_DRX_PRD_80SF:
10147 case RGR_DRX_PRD_128SF:
10148 case RGR_DRX_PRD_160SF:
10149 case RGR_DRX_PRD_256SF:
10150 case RGR_DRX_PRD_320SF:
10151 case RGR_DRX_PRD_512SF:
10152 case RGR_DRX_PRD_640SF:
10153 case RGR_DRX_PRD_1024SF:
10154 case RGR_DRX_PRD_1280SF:
10155 case RGR_DRX_PRD_2048SF:
10156 case RGR_DRX_PRD_2560SF:
10163 }/*switch(longDrxCycle)*/
10166 }/*rgSCHCfgVldtDrxLngCyclTmrs*/
10168 /***********************************************************
10170 * Func : rgSCHCfgVldtDrxShrtCycCfg
10173 * Desc : Validates DRX Short Cycle timer configuration
10174 * recieved from RRC.
10185 **********************************************************/
10187 PRIVATE S16 rgSCHCfgVldtDrxShrtCycCfg
10189 RgrDrxShortDrx shrtCycCfg
10192 PRIVATE S16 rgSCHCfgVldtDrxShrtCycCfg(shrtCycCfg)
10193 RgrDrxShortDrx shrtCycCfg;
10196 TRC2(rgSCHCfgVldtDrxShrtCycCfg)
10198 switch(shrtCycCfg.shortDrxCycle)
10200 case RGR_DRX_PRD_2SF:
10201 case RGR_DRX_PRD_5SF:
10202 case RGR_DRX_PRD_8SF:
10203 case RGR_DRX_PRD_10SF:
10204 case RGR_DRX_PRD_16SF:
10205 case RGR_DRX_PRD_20SF:
10206 case RGR_DRX_PRD_32SF:
10207 case RGR_DRX_PRD_40SF:
10208 case RGR_DRX_PRD_64SF:
10209 case RGR_DRX_PRD_80SF:
10210 case RGR_DRX_PRD_128SF:
10211 case RGR_DRX_PRD_160SF:
10212 case RGR_DRX_PRD_256SF:
10213 case RGR_DRX_PRD_320SF:
10214 case RGR_DRX_PRD_640SF:
10222 }/*switch(shortDrxCycle)*/
10224 if ( (shrtCycCfg.drxShortCycleTmr < RGR_DRX_SHRTCYCLE_MIN) ||
10225 (shrtCycCfg.drxShortCycleTmr > RGR_DRX_SHRTCYCLE_MAX)
10235 * @brief Handler for TA related UE Reconfiguration.
10239 * Function : rgSCHCfgUeTaRecfg
10241 * This function shall fetch the TA timer related information into the
10242 * respective ueCb from the UE configuration as provided by the
10245 * @param[in] RgSchCellCb *cell
10246 * @param[in] RgSchUeCb *ueCb
10247 * @param[in] RgrUeCfg *ueCfg
10248 * @param[out] RgSchErrInfo *errInfo
10254 PRIVATE Void rgSCHCfgUeTaRecfg
10262 PRIVATE Void rgSCHCfgUeTaRecfg(cell, ueCb, ueCfg, err)
10269 TRC2(rgSCHCfgUeTaRecfg)
10273 /* Update the TA related information */
10275 if (ueCfg->ueTaTmrRecfg.pres)
10277 /* Configuring taTmr with 30 deficit, to enable eNodeB sending
10278 * TA command before the expiry of TA at UE. Also considering for
10279 * possible retx for this TA command */
10280 /* [ccpu00121813]-ADD-Added chk if tatmr val > 30 */
10281 if(ueCfg->ueTaTmrRecfg.taTmr > 30)
10283 ueCb->dl.taCb.cfgTaTmr = ueCfg->ueTaTmrRecfg.taTmr - 30;
10285 /* If TA Timer is running. Stop it and then start it*/
10286 if (ueCb->taTmr.tmrEvnt != TMR_NONE)
10288 rgSCHTmrStopTmr(cell, ueCb->taTmr.tmrEvnt, ueCb);
10289 rgSCHTmrStartTmr(cell, ueCb, RG_SCH_TMR_TA, ueCb->dl.taCb.cfgTaTmr);
10293 rgSCHTmrStartTmr(cell, ueCb, RG_SCH_TMR_TA, ueCb->dl.taCb.cfgTaTmr);
10297 } /* rgSCHCfgUeTaRecfg */
10299 /* ccpu00117452 - MOD - Changed macro name from
10300 RGR_RRM_DLPWR_CNTRL to RGR_CQI_REPT */
10301 #if ((defined (RGR_CQI_REPT)) && (defined (RGR_V2)))
10302 /***********************************************************
10304 * Func : rgSCHCfgUeCqiReptReCfg
10307 * Desc : Reconfiguration of PUSH N CQI Reporting
10309 * Ret : RFAILED in case of failure
10316 **********************************************************/
10318 PRIVATE S16 rgSCHCfgUeCqiReptReCfg
10322 RgrUeRecfg *ueRecfg
10325 PRIVATE S16 rgSCHCfgUeCqiReptReCfg(cell, ue, ueRecfg)
10328 RgrUeRecfg *ueRecfg;
10332 TRC3(rgSCHCfgUeCqiReptReCfg)
10334 /* Check has it been disabled */
10335 if(ueRecfg->ueCqiReptCfg.numColltdCqiRept)
10337 /* Check if we need to send CQI reports collagted so far and send if so */
10338 if(ue->schCqiInfo.cqiCount >=
10339 ueRecfg->ueCqiReptCfg.numColltdCqiRept)
10341 RgrStaIndInfo *staInfo;
10342 /* if yes, Send StaInd to RRM */
10343 retVal = rgSCHUtlAllocSBuf (cell->instIdx,(Data**)&staInfo,
10344 sizeof(RgrStaIndInfo));
10347 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,
10348 "Could not allocate memory for sending StaInd OLD CRNTI:%d",ueRecfg->oldCrnti);
10352 /* Fill StaInd for sending collated N CQI rpeort */
10353 rgSCHUtlFillSndStaInd(cell, ue, staInfo,
10354 ueRecfg->ueCqiReptCfg.numColltdCqiRept);
10359 ue->schCqiInfo.cqiCount = 0;
10362 ue->cqiReptCfgInfo.numColltdCqiRept =
10363 ueRecfg->ueCqiReptCfg.numColltdCqiRept;
10365 } /* End of rgSCHCfgUeCqiReptReCfg */
10366 #endif /* End of RGR_CQI_REPT */
10367 /*This function Added Ue in ongoing L2 Meas*/
10368 /*LTE_L2_MEAS_PHASE2*/
10370 PRIVATE S16 rgSchAddToL2Meas(RgSchCellCb *cellCb,RgSchDlLcCb *dlLc)
10374 RgSchL2MeasCb *measCb = NULLP;
10375 lnk = cellCb->l2mList.first;
10377 while(lnk != NULLP)
10379 /* Get the MeasCb : RgSchL2MeasCb */
10380 measCb = (RgSchL2MeasCb *)lnk->node;
10381 if (measCb->measReq.measType & LRG_L2MEAS_AVG_PRB_PER_QCI_DL)
10383 for(idx = 0;idx < measCb->measReq.avgPrbQciDl.numQci;idx++)
10385 if(measCb->measReq.avgPrbQciDl.qci[idx] == dlLc->qciCb->qci)
10387 break; /*exit from for loop*/
10390 if(idx == measCb->measReq.avgPrbQciDl.numQci)
10392 measCb->measReq.avgPrbQciDl.qci[measCb->measReq.avgPrbQciDl.numQci++] = dlLc->qciCb->qci;
10396 }/*End of while loop*/
10403 * @brief UE SCell Buffer Free
10407 * Function : rgSCHSCellFreeBuf
10409 * This functions will free allocated memory
10410 * for UE secondart cellCB
10413 * @param[in] Inst inst
10414 * @param[in] RgSchUeCb *ue
10415 * @param[int] RgrUeRecfg *ueRecfg
10416 * @param[out] U8 idx
10420 PUBLIC Void rgSCHSCellFreeBuf
10424 RgrUeRecfg *ueRecfg,
10428 PUBLIC Void rgSCHSCellFreeBuf(inst ,ue, ueRecfg, idx)
10431 RgrUeRecfg *ueRecfg;
10435 RgSchUeCellInfo *sCellInfo = NULLP;
10436 RgrUeSecCellCfg *sCellInfoRecfg = NULLP;
10438 TRC2(rgSCHSCellFreeBuf);
10440 for(U8 i = 0; i <= idx; i++)
10442 sCellInfoRecfg = &ueRecfg->ueSCellCfgInfo.ueSCellDedCfg[i];
10443 sCellInfo = ue->cellInfo[(sCellInfoRecfg->sCellIdx)];
10445 if (NULLP != sCellInfo)
10447 rgSCHUtlFreeSBuf(inst, (Data**)&(sCellInfo),
10448 sizeof(RgSchUeCellInfo));
10449 ue->cellInfo[(sCellInfoRecfg->sCellIdx)] = NULLP;
10456 /**********************************************************************
10459 **********************************************************************/