1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /************************************************************************
25 Desc: C source code for Entry point fucntions
29 **********************************************************************/
31 /** @file rg_sch_gom.c
32 @brief This module does processing related to handling of upper interface APIs
33 invoked by RRM towards MAC.
36 static const char* RLOG_MODULE_NAME="MAC";
37 static int RLOG_MODULE_ID=4096;
38 static int RLOG_FILE_ID=164;
40 /* header include files -- defines (.h) */
41 #include "common_def.h"
46 #include "rg_sch_inf.h"
48 #include "rg_sch_err.h"
49 #include "rl_interface.h"
50 #include "rl_common.h"
52 /* header/extern include files (.x) */
56 #include "rg_sch_inf.x"
60 PRIVATE S16 rgSCHGomHndlCfgReq ARGS((RgSchCb *instCb, SpId spId,
61 RgrCfg *cfg, RgSchErrInfo *errInfo));
62 PRIVATE S16 rgSCHGomHndlRecfgReq ARGS((RgSchCb *instCb, SpId spId,
63 RgrRecfg *recfg, RgSchErrInfo *errInfo));
64 PRIVATE S16 rgSCHGomHndlResetReq ARGS((RgSchCb *instCb,SpId spId,RgrRst *reset,
65 RgSchErrInfo *errInfo));
66 PRIVATE S16 rgSCHGomGetCellIdFrmCfgReq ARGS((RgrCfgReqInfo *rgrCfgReq,
67 CmLteCellId *cellId));
68 PRIVATE S16 rgSCHGomCfgReq ARGS((Region reg, Pool pool, RgSchCb *instCb,
69 RgrCfgTransId transId, RgrCfgReqInfo *cfgReqInfo));
70 PRIVATE S16 rgSCHGomEnqCfgReq ARGS((Region reg, Pool pool, RgSchCellCb *cell,
71 RgrCfgTransId transId, RgrCfgReqInfo *rgrCfgReq));
72 PRIVATE S16 rgSCHGomHndlDelReq ARGS((RgSchCb *instCb,SpId spId,
73 RgrDel *del,RgSchErrInfo *errInfo));
75 PRIVATE S16 rgSCHGomHndlSCellActDeactReq ARGS((RgSchCb *instCb, SpId spId,
76 RgrSCellActDeactEvnt *sCellActDeactEvnt, RgSchErrInfo *errInfo, U8 action));
79 EXTERN S16 rgSchEmtcGetSiWinPerd ARGS((
84 extern S16 rgSCHEmtcUtlCalMcsAndNPrb
92 EXTERN S32 rgSCHEmtcUtlGetAllwdCchTbSzForSI ARGS(
97 EXTERN Void rgSCHEmtcWarningSiCfg ARGS(
100 RgrWarningSiCfgReqInfo *warningSiCfgReqInfo,
110 /* forward references */
115 * @brief Handler for config request from RRM to Schedular.
119 * Function: rgSCHGomHndlCfg
121 * This API is called from schedulers UIM and it handles config request
122 * from RRM to Scheduler.
125 * - If the request is for the inactive cell,
126 * - Handle request.Call rgSCHGomCfgReq.
128 * - Enqueue the request. Call rgSCHGomEnqCfgReq.
130 * @param[in] Pst *pst
131 * @param[in] RgSchCb *instCb
132 * @param[in] RgrCfgTransId transId
133 * @param[in] RgrCfgReqInfo *cfgReqInfo
143 RgrCfgTransId transId,
144 RgrCfgReqInfo *cfgReqInfo
147 S16 rgSCHGomHndlCfg(pst, instCb, transId, cfgReqInfo)
150 RgrCfgTransId transId;
151 RgrCfgReqInfo *cfgReqInfo;
157 RgSchCellCb *cell = NULLP;
158 U8 cfmStatus = RGR_CFG_CFM_NOK;
160 Inst inst = (instCb->rgSchInit.inst );
163 /* Apply the configuration for Cell Configuration or Delete */
164 if (cfgReqInfo->action != RGR_RECONFIG)
166 ret = rgSCHGomCfgReq (pst->region, pst->pool, instCb,
167 transId, cfgReqInfo);
171 /* Fetch the cell Id for the recieved request */
172 if((rgSCHGomGetCellIdFrmCfgReq(cfgReqInfo, &cellId)) != ROK)
174 RLOG_ARG0(L_ERROR,DBG_INSTID,inst, "Action.Config Type Error");
176 SPutSBuf(pst->region, pst->pool, (Data *)cfgReqInfo,
177 (Size)sizeof(*cfgReqInfo));
179 schSendCfgCfm(pst->region, pst->pool, transId, cfmStatus);
182 /* Extract the cell and Enquee Config Request */
183 if(NULLP != instCb->rgrSap[spId].cell)
185 if(cellId != instCb->rgrSap[spId].cell->cellId)
187 RLOG_ARG2(L_ERROR,DBG_CELLID,cellId, "Cell with Id %d already exists "
188 "on sap %d", instCb->rgrSap[spId].cell->cellId, spId);
190 SPutSBuf(pst->region, pst->pool, (Data *)cfgReqInfo,
191 (Size)sizeof(*cfgReqInfo));
193 schSendCfgCfm(pst->region, pst->pool, transId, cfmStatus);
196 cell = instCb->rgrSap[spId].cell;
198 /* Enqueue the configuration */
199 ret = rgSCHGomEnqCfgReq(pst->region, pst->pool, cell, transId, cfgReqInfo);
202 RLOG_ARG0(L_ERROR,DBG_CELLID,cellId, "rgSCHGomHndlCfg: Enqueuing CfgReq "
205 SPutSBuf(pst->region, pst->pool, (Data *)cfgReqInfo,
206 (Size)sizeof(*cfgReqInfo));
208 schSendCfgCfm(pst->region, pst->pool, transId, cfmStatus);
214 SPutSBuf(pst->region, pst->pool, (Data *)cfgReqInfo,
215 (Size)sizeof(*cfgReqInfo));
217 schSendCfgCfm(pst->region, pst->pool, transId, cfmStatus);
220 }/* rgSCHGomHndlCfg */
224 * @brief Handler to handle config request from RRM to Scheduler.
228 * Function: rgSCHGomCfgReq
230 * This API handles processing for config request from RRM to Scheduler.
233 * - If Configuration request, call rgSCHGomHndlCfgReq.
234 * - Else if Reconfiguration request, call rgSCHGomHndlRecfgReq.
235 * - If successful, send configuration confirm to RRM.
236 * Call schSendCfgCfm else FAIL.
238 * @param[in] Region reg
239 * @param[in] Pool pool
240 * @param[in] RgSchCb *instCb
241 * @param[in] RgrCfgTransId transId
242 * @param[in] RgrCfgReqInfo *cfgReqInfo
248 PRIVATE S16 rgSCHGomCfgReq
253 RgrCfgTransId transId,
254 RgrCfgReqInfo *cfgReqInfo
257 PRIVATE S16 rgSCHGomCfgReq(reg, pool, instCb, transId, cfgReqInfo)
261 RgrCfgTransId transId;
262 RgrCfgReqInfo *cfgReqInfo;
266 U8 cfmStatus = RGR_CFG_CFM_OK;
268 RgSchErrInfo errInfo;
270 Inst inst = (instCb->rgSchInit.inst );
273 printf("\n AT MAC rgSCHGomCfgReq \n");
276 /* Process Config/Reconfig/Delete request from RRM */
277 switch (cfgReqInfo->action)
281 ret = rgSCHGomHndlCfgReq(instCb, spId,
282 &cfgReqInfo->u.cfgInfo, &errInfo);
287 ret = rgSCHGomHndlRecfgReq(instCb, spId,
288 &cfgReqInfo->u.recfgInfo, &errInfo);
293 ret = rgSCHGomHndlResetReq(instCb, spId,
294 &cfgReqInfo->u.rstInfo, &errInfo);
299 ret = rgSCHGomHndlDelReq(instCb, spId,
300 &cfgReqInfo->u.delInfo, &errInfo);
305 case RGR_SCELL_DEACT:
306 case RGR_SCELL_READY:
308 ret = rgSCHGomHndlSCellActDeactReq(instCb, spId,
309 &cfgReqInfo->u.sCellActDeactEvnt, &errInfo, cfgReqInfo->action);
315 RLOG_ARG1(L_ERROR,DBG_INSTID,inst, "Invalid configuration "
316 "action %d", cfgReqInfo->action);
319 } /* End of switch */
323 cfmStatus = RGR_CFG_CFM_NOK;
326 SPutSBuf(reg, pool, (Data *)cfgReqInfo,
327 (Size)sizeof(*cfgReqInfo));
330 printf("\n AT MAC sending RGR cfg cfm \n");
333 /* Send back confirmation status to RRM */
334 schSendCfgCfm(reg, pool, transId, cfmStatus);
336 printf("\n AT MAC RGR cfg cfm sent\n");
340 } /* rgSCHGomCfgReq */
344 * @brief Handler to enqueuing config request from RRM to Scheduler.
348 * Function: rgSCHGomEnqCfgReq
350 * This API enqueues config request from RRM to MAC.
353 * - Allocate the configuration request element.
354 * - Copy the contents of the recieved configuration to config request
355 * element and free the recieved configuration pointer.
356 * - If the configuration is without activation time,
357 * - Enqueue the request in crntRgrCfgLst of the cell at the end of
360 * - Enqueue the request in pndngRgrCfgLst of the cell.
362 * @param[in] Region reg,
363 * @param[in] Pool pool
364 * @param[in] RgSchCellCb *cell
365 * @param[in] RgrCfgTransId transId
366 * @param[in] RgrCfgReqInfo *rgrCfgReq
372 PRIVATE S16 rgSCHGomEnqCfgReq
377 RgrCfgTransId transId,
378 RgrCfgReqInfo *rgrCfgReq
381 PRIVATE S16 rgSCHGomEnqCfgReq(reg, pool, cell, transId, rgrCfgReq)
385 RgrCfgTransId transId;
386 RgrCfgReqInfo *rgrCfgReq;
391 RgSchCfgElem *rgrCfgElem = NULLP;
392 CmLteTimingInfo actvTime;
393 Inst inst = cell->instIdx;
395 /* Allocate memory for config Element */
396 ret = rgSCHUtlAllocSBuf(inst, (Data **)&rgrCfgElem, sizeof(RgSchCfgElem));
397 if ((ret != ROK) || ((U8 *)rgrCfgElem == NULLP))
402 /* Initialize the configuration element */
403 memcpy(rgrCfgElem->rgrCfg.transId.trans,transId.trans,
404 sizeof(transId.trans));
405 rgrCfgElem->rgrCfg.reg = reg;
406 rgrCfgElem->rgrCfg.pool = pool;
407 rgrCfgElem->rgrCfg.rgrCfgReq = rgrCfgReq;
408 rgrCfgElem->cfgReqLstEnt.prev = NULLP;
409 rgrCfgElem->cfgReqLstEnt.next = NULLP;
410 rgrCfgElem->cfgReqLstEnt.node = (PTR )rgrCfgElem;
412 /* Add configuration element to current/pending cfgLst */
413 if (((rgrCfgReq->action == RGR_RECONFIG) &&
414 (rgrCfgReq->u.recfgInfo.recfgType == RGR_CELL_CFG) &&
415 (rgrCfgReq->u.recfgInfo.u.cellRecfg.recfgActvTime.pres == TRUE)))
419 rgrCfgReq->u.recfgInfo.u.cellRecfg.recfgActvTime.actvTime;
421 /* Check if the activation time is valid */
422 if (actvTime.sfn >= RGSCH_MAX_SFN
423 || actvTime.slot >= RGSCH_NUM_SUB_FRAMES_5G)
425 RLOG_ARG4(L_ERROR,DBG_CELLID,cell->cellId, "Invalid activation time for RGR "
426 "config request: activation sfn %d activation slot %d current "
427 "sfn %d current slot %d", actvTime.sfn, actvTime.slot,
428 cell->crntTime.sfn, cell->crntTime.slot);
429 /* ccpu00117052 - MOD - Passing double pointer
430 for proper NULLP assignment*/
431 rgSCHUtlFreeSBuf(inst, (Data **)&rgrCfgElem, sizeof(*rgrCfgElem));
435 sfDiff = RGSCH_CALC_SF_DIFF(actvTime, cell->crntTime);
437 if (sfDiff > (RGR_ACTV_WIN_SIZE * RGSCH_NUM_SUB_FRAMES_5G))
439 RLOG_ARG4(L_ERROR,DBG_CELLID,cell->cellId,"Invalid activation time for RGR"
440 " config request: activation sfn %d activation slot %d "
441 "current sfn %d current slot %d", actvTime.sfn,
442 actvTime.slot, cell->crntTime.sfn, cell->crntTime.slot);
443 /* ccpu00117052 - MOD - Passing double pointer
444 for proper NULLP assignment*/
445 rgSCHUtlFreeSBuf(inst, (Data **)&rgrCfgElem, sizeof(*rgrCfgElem));
451 /* Add to pending cfgReqLst */
452 rgrCfgElem->actvTime = actvTime;
453 rgSCHDbmInsPndngRgrCfgElem(cell, rgrCfgElem);
454 /* Cfm to be sent only after applying request */
459 /* Add to current cfgReq list */
460 rgSCHDbmInsCrntRgrCfgElem(cell, rgrCfgElem);
461 /* Cfm to be sent only after applying request */
463 } /* rgSCHGomEnqCfgReq */
467 * @brief Handler for TTI processing for configurations recieved from RRM.
471 * Function: rgSCHGomTtiHndlr
473 * This API does TTI processing for configurations recieved from RRM.
476 * - It dequeues config request from the current configuration list.
477 * For each config request in the list:
478 * - Processes the request. Call rgSCHGomCfgReq.
479 * - It dequeues config request for the current tti from the pending
480 * configuration list. For each config request in the list:
481 * - Processes the request. Call rgSCHGomCfgReq.
483 * @param[in] RgSchCellCb *cell
495 S16 rgSCHGomTtiHndlr(cell, spId)
500 RgSchCfgElem *cfgElem;
501 Inst inst= cell->instIdx;
503 /* Dequeue from current config list */
504 while ((cfgElem = rgSCHDbmGetNextCrntRgrCfgElem(cell, NULLP)) != NULLP)
506 rgSCHDbmDelCrntRgrCfgElem(cell, cfgElem);
507 rgSCHGomCfgReq(cfgElem->rgrCfg.reg,cfgElem->rgrCfg.pool,
508 &rgSchCb[inst], cfgElem->rgrCfg.transId,
509 cfgElem->rgrCfg.rgrCfgReq);
510 /* ccpu00117052 - MOD - Passing double pointer
511 for proper NULLP assignment*/
512 rgSCHUtlFreeSBuf(inst, (Data **)&cfgElem, sizeof(*cfgElem));
515 /* Handle config requests from pending config list */
516 while((cfgElem = rgSCHDbmGetPndngRgrCfgElemByKey(cell, cell->crntTime)) != NULLP)
518 rgSCHDbmDelPndngRgrCfgElem(cell, cfgElem);
519 rgSCHGomCfgReq(cfgElem->rgrCfg.reg, cfgElem->rgrCfg.pool,
520 &rgSchCb[inst], cfgElem->rgrCfg.transId,
521 cfgElem->rgrCfg.rgrCfgReq);
522 /* ccpu00117052 - MOD - Passing double pointer
523 for proper NULLP assignment*/
524 rgSCHUtlFreeSBuf(inst, (Data **)&cfgElem, sizeof(*cfgElem));
532 * @brief Handler to handle configuration request from RRM to MAC.
536 * Function: rgSCHGomHndlCfgReq
538 * This API handles processing for configuration request from RRM to MAC.
540 * - Processing Steps:
541 * - Validate configuration request parameters at CFG module.
542 * Call rgSCHCfgVldtRgrCellCfg for cell configuration.
543 * - If validated successfully, send configuration request to CFG.
544 * Call rgSCHCfgRgrCellCfg else FAIL.
546 * @param[in] RgSchCb *instCb
547 * @param[in] SpId spId
548 * @param[in] RgrCfg *cfg
549 * @param[out] RgSchErrInfo *errInfo
555 PRIVATE S16 rgSCHGomHndlCfgReq
560 RgSchErrInfo *errInfo
563 PRIVATE S16 rgSCHGomHndlCfgReq(instCb, spId, cfg, errInfo)
567 RgSchErrInfo *errInfo;
571 RgSchCellCb *cell = instCb->rgrSap[spId].cell;
572 Inst inst = (instCb->rgSchInit.inst );
575 errInfo->errType = RGSCHERR_GOM_CFG_REQ;
577 /* Validate and process the configuration request */
578 switch (cfg->cfgType)
582 ret = rgSCHCfgVldtRgrCellCfg(inst, &cfg->u.cellCfg, cell, errInfo);
585 RLOG1(L_ERROR,"Rgr Cell configuration "
586 "validation FAILED: Cell %d", cfg->u.cellCfg.cellId);
589 ret = rgSCHCfgRgrCellCfg(instCb, spId, &cfg->u.cellCfg, errInfo);
593 case RGR_SCELL_UE_CFG:
595 ret = rgSCHCfgVldtRgrUeCfg(inst, &cfg->u.ueCfg, &cell, errInfo);
598 RLOG1(L_ERROR,"Ue configuration validation"
599 " FAILED: CRNTI:%d", cfg->u.ueCfg.crnti);
602 ret = rgSCHCfgRgrUeCfg(cell, &cfg->u.ueCfg, errInfo);
607 ret = rgSCHCfgVldtRgrLcCfg(inst, &cfg->u.lchCfg, &cell, &ue, errInfo);
610 RLOG1(L_ERROR,"LC configuration validation "
611 "FAILED: LCID:%d", cfg->u.lchCfg.lcId);
614 ret = rgSCHCfgRgrLchCfg(cell, ue, &cfg->u.lchCfg, errInfo);
619 ret = rgSCHCfgVldtRgrLcgCfg(inst, &cfg->u.lcgCfg, &cell, &ue, errInfo);
622 RLOG1(L_ERROR,"LCG configuration validation "
623 "FAILED: LCGID:%d", cfg->u.lcgCfg.ulInfo.lcgId);
626 ret = rgSCHCfgRgrLcgCfg(cell, ue, &cfg->u.lcgCfg, errInfo);
631 ret = rgSCHCfgVldtRgrSchedEnbCfg(inst, &cfg->u.schedEnbCfg, errInfo);
634 RGSCHDBGERR(inst,(rgSchPBuf(inst), "SCH ENB configuration validation "
638 ret = rgSCHCfgRgrSchedEnbCfg(inst, spId, &cfg->u.schedEnbCfg, errInfo);
643 #if(ERRCLASS & ERRCLS_INT_PAR)
644 RLOG1(L_ERROR,"Should never come here: "
645 "cfgType %d", cfg->cfgType);
652 } /* rgSCHGomHndlCfgReq */
656 * @brief Handler to handle re-configuration request from RRM to MAC.
660 * Function: rgSCHGomHndlSCellActDeactReq
662 * This API handles processing for SCell Activation Request from RRM to SCH.
664 * - Processing Steps:
665 * - Validate sCell Actication request parameters at CFG module.
666 * - If validated successfully, send configuration request to CFG.
667 * - call activation function for each SCells configured
669 * @param[in] RgSchCb *instCb
670 * @param[in] SpId spId
671 * @param[in] RgrSCellActDeactEvnt *sCellActDeactEvnt
672 * @param[in] U8 action
673 * @param[out] RgSchErrInfo *errInfo
679 PRIVATE S16 rgSCHGomHndlSCellActDeactReq
683 RgrSCellActDeactEvnt *sCellActDeactEvnt,
684 RgSchErrInfo *errInfo,
688 PRIVATE S16 rgSCHGomHndlSCellActDeactReq(instCb, spId, sCellActDeactEvnt, errInfo, action)
691 RgrSCellActDeactEvnt *sCellActDeactEvnt;
692 RgSchErrInfo *errInfo;
696 RgSchUeCb *ue = NULLP;
699 RgSchCellCb *cell = instCb->rgrSap[spId].cell;
700 Inst inst = (instCb->rgSchInit.inst);
702 RGSCHDBGPRM(inst,(rgSchPBuf(inst), "Processing RGR SCell Actication request:"
703 "%d\n", sCellActDeactEvnt->crnti));
705 errInfo->errType = RGSCHERR_GOM_SCELL_REQ;
708 if ((ue = rgSCHDbmGetUeCb(cell, sCellActDeactEvnt->crnti)) == NULLP)
710 RGSCHDBGERRNEW(inst, (rgSchPBuf(inst), "[%d]UE: does not exist\n",
711 sCellActDeactEvnt->crnti));
715 for(idx = 0; idx < sCellActDeactEvnt->numOfSCells; idx++)
717 sCellIdx = sCellActDeactEvnt->sCellActDeactInfo[idx].sCellIdx;
719 if (ROK != (rgSCHSCellTrigActDeact(cell, ue, sCellIdx, action)))
721 RGSCHDBGERR(inst,(rgSchPBuf(inst), "SCell Actication failed"
722 "for UE [%d] with SCellIdx [%d]\n",
723 sCellActDeactEvnt->crnti, idx));
729 RGSCHDBGINFO(inst,(rgSchPBuf(inst), "RGR Reconfiguration processed\n"));
731 } /* rgSCHGomHndlSCellActDeactReq */
735 * @brief Handler to handle re-configuration request from RRM to MAC.
739 * Function: rgSCHGomHndlRecfgReq
741 * This API handles processing for re-configuration request from RRM to MAC.
743 * - Processing Steps:
744 * - Validate re-configuration request parameters at CFG module.
745 * Call rgSCHCfgVldtRgrCellRecfg for cell re-configuration.
746 * - If validated successfully, send configuration request to CFG.
747 * Call rgSCHCfgRgrCellRecfg else FAIL.
749 * @param[in] RgSchCb *instCb
750 * @param[in] SpId spId
751 * @param[in] RgrRecfg *recfg
752 * @param[out] RgSchErrInfo *errInfo
758 PRIVATE S16 rgSCHGomHndlRecfgReq
763 RgSchErrInfo *errInfo
766 PRIVATE S16 rgSCHGomHndlRecfgReq(instCb, spId, recfg, errInfo)
770 RgSchErrInfo *errInfo;
773 RgSchUeCb *ue = NULLP;
774 RgSchDlLcCb *dlLc = NULLP; /* PURIFY_FIX:UMR */
776 RgSchCellCb *cell = instCb->rgrSap[spId].cell;
777 Inst inst = (instCb->rgSchInit.inst );
779 errInfo->errType = RGSCHERR_GOM_RECFG_REQ;
781 /* Validate and process the re-configuration request */
782 switch (recfg->recfgType)
786 ret = rgSCHCfgVldtRgrCellRecfg(inst, &recfg->u.cellRecfg, &cell,
790 RLOG_ARG0(L_ERROR,DBG_CELLID,recfg->u.cellRecfg.cellId,"Rgr Cell Recfg Validation "
794 ret = rgSCHCfgRgrCellRecfg(cell, &recfg->u.cellRecfg, errInfo);
798 case RGR_SCELL_UE_CFG:
800 ret = rgSCHCfgVldtRgrUeRecfg(inst, &recfg->u.ueRecfg, &cell, &ue, errInfo);
803 RLOG_ARG1(L_ERROR,DBG_CELLID,recfg->u.ueRecfg.cellId,"Ue Recfg Validation FAILED"
804 "OLD CRNTI:%d",recfg->u.ueRecfg.oldCrnti);
807 ret = rgSCHCfgRgrUeRecfg(cell, ue, &recfg->u.ueRecfg, errInfo);
812 ret = rgSCHCfgVldtRgrLchRecfg(inst, &recfg->u.lchRecfg, &cell, &ue,
816 RLOG_ARG1(L_ERROR,DBG_CELLID,recfg->u.lchRecfg.cellId,"Lc Recfg Validation FAILED"
817 "LCID:%d",recfg->u.lchRecfg.lcId);
820 ret = rgSCHCfgRgrLchRecfg(cell, ue, dlLc, &recfg->u.lchRecfg, errInfo);
825 ret = rgSCHCfgVldtRgrLcgRecfg(inst, &recfg->u.lcgRecfg, cell, &ue,
829 RLOG_ARG1(L_ERROR,DBG_CELLID,recfg->u.lcgRecfg.cellId, "Lcg Recfg Validation FAILED"
830 "LCGID:%d",recfg->u.lcgRecfg.ulRecfg.lcgId);
833 ret = rgSCHCfgRgrLcgRecfg(cell, ue, &recfg->u.lcgRecfg, errInfo);
838 #if(ERRCLASS & ERRCLS_INT_PAR)
839 RLOG1(L_ERROR,"Should never come here: recfgType %d", recfg->recfgType);
846 } /* rgSCHGomHndlRecfgReq */
849 * @brief Handler to handle UE reset request from RRM to Scheduler.
853 * Function: rgSCHGomHndlResetReq
855 * This API handles processing for UE reset request from RRM to Scheduler.
857 * - Processing Steps:
858 * - Validate UE reset request parameters at CFG module.
859 * Call rgSCHCfgVldtRgrUeReset for UE reset.
860 * - If validated successfully, send UE reset request to CFG.
861 * Call rgSCHCfgRgrUeReset else FAIL.
863 * @param[in] RgrRst *rstInfo
864 * @param[out] RgSchErrInfo *errInfo
870 PRIVATE S16 rgSCHGomHndlResetReq
875 RgSchErrInfo *errInfo
878 PRIVATE S16 rgSCHGomHndlResetReq(instCb, spId, reset, errInfo)
882 RgSchErrInfo *errInfo;
886 RgSchCellCb *cell= instCb->rgrSap[spId].cell;
887 Inst inst = (instCb->rgSchInit.inst );
888 RgSchUeCb *ue = NULLP;
890 errInfo->errType = RGSCHERR_GOM_RESET_REQ;
892 /* Validate and process the UE reset request */
893 ret = rgSCHCfgVldtRgrUeReset(inst, reset, cell, &ue, errInfo);
896 RLOG_ARG1(L_ERROR,DBG_CELLID,reset->cellId,"Rgr UE Reset Validation FAILED"
897 "CRNTI:%d",reset->crnti);
901 ret = rgSCHCfgRgrUeReset(cell, ue, reset, errInfo);
904 RLOG_ARG1(L_ERROR,DBG_CELLID,reset->cellId,"Rgr UE Reset FAILED"
905 "CRNTI:%d",reset->crnti);
910 } /* rgSCHGomHndlResetReq */
914 * @brief Handler for processing Cell/Ue/Logical channel delete request
919 * Function: rgSCHGomHndlDelReq
921 * This API handles processing of delete request from RRM to MAC.
924 * - Fetch corresponding control block and pass it to CFG module.
925 * - If control block does not exist, FAIL.
927 * @param[in] RgSchCb *instCb
928 * @param[in] SpId spId
929 * @param[in] RgrDel *del
930 * @param[out] RgSchErrInfo *errInfo
936 PRIVATE S16 rgSCHGomHndlDelReq
941 RgSchErrInfo *errInfo
944 PRIVATE S16 rgSCHGomHndlDelReq(instCb, spId, del, errInfo)
948 RgSchErrInfo *errInfo;
954 Inst inst = (instCb->rgSchInit.inst);
956 VOLATILE U32 startTime=0;
958 errInfo->errType = RGSCHERR_GOM_DEL_REQ;
960 if(instCb->rgrSap[spId].cell == NULLP)
962 RLOG_ARG0(L_ERROR,DBG_INSTID,inst,"Cell doesnt exist");
966 /* Process the delete request */
967 switch (del->delType)
971 ret = rgSCHCfgRgrCellDel(instCb->rgrSap[spId].cell, del, errInfo);
974 /* TODO::Needs to be revisited after tti flow CaDev Start */
975 U8 idx = (U8)((instCb->rgrSap[spId].cell->cellId - instCb->genCfg.startCellId)&(CM_LTE_MAX_CELLS-1));
976 instCb->cells[idx] = NULLP;
978 instCb->rgrSap[spId].cell = NULLP;
979 instCb->tfuSap[spId].cell = NULLP;
984 case RGR_SCELL_UE_CFG:
988 SStartTask(&startTime, PID_SCH_UE_DEL);
990 ret = rgSCHCfgRgrUeDel(instCb->rgrSap[spId].cell, del, errInfo);
993 SStopTask(startTime, PID_SCH_UE_DEL);
999 ret = rgSCHCfgRgrLcDel(instCb->rgrSap[spId].cell, del, errInfo);
1004 ret = rgSCHCfgRgrLcgDel(instCb->rgrSap[spId].cell, del, errInfo);
1009 #if(ERRCLASS & ERRCLS_INT_PAR)
1010 RLOG1(L_ERROR,"Should never come here: delType %d", del->delType);
1017 } /* rgSCHGomHndlDelReq */
1022 /***********************************************************
1024 * Func : rgSCHGomGetCellIdFrmCfgReq
1028 * - Processing Steps:
1029 * - Retrieves the cell Id for a config request.
1031 * @param[in] RgrCfgReqInfo *rgrCfgReq
1032 * @param[out] CmLteCellId *cellId
1033 * Ret : ROK on fetching cellId
1034 * RFAILED on failure
1038 * File : rg_sch_gom.c
1040 **********************************************************/
1042 PRIVATE S16 rgSCHGomGetCellIdFrmCfgReq
1044 RgrCfgReqInfo *rgrCfgReq,
1048 PRIVATE S16 rgSCHGomGetCellIdFrmCfgReq(rgrCfgReq, cellId)
1049 RgrCfgReqInfo *rgrCfgReq;
1050 CmLteCellId *cellId;
1054 /* Extract CellId depending on the action and Config Type in the Request
1055 * As of now this function is called for only re configuration so removed
1056 * othe CASES below if needed we can add them*/
1057 switch (rgrCfgReq->action)
1061 if (rgrCfgReq->u.recfgInfo.recfgType ==RGR_CELL_CFG)
1063 *cellId = rgrCfgReq->u.recfgInfo.u.cellRecfg.cellId;
1065 else if ((rgrCfgReq->u.recfgInfo.recfgType == RGR_SCELL_UE_CFG) ||
1066 (rgrCfgReq->u.recfgInfo.recfgType == RGR_UE_CFG))
1068 *cellId = rgrCfgReq->u.recfgInfo.u.ueRecfg.cellId;
1070 else if (rgrCfgReq->u.recfgInfo.recfgType == RGR_LCH_CFG)
1072 *cellId = rgrCfgReq->u.recfgInfo.u.lchRecfg.cellId;
1074 else if (rgrCfgReq->u.recfgInfo.recfgType == RGR_LCG_CFG)
1076 *cellId = rgrCfgReq->u.recfgInfo.u.lcgRecfg.cellId;
1088 } /* End of Switch */
1091 } /* rgSCHGomGetCellIdFrmCfgReq */
1095 * @brief Handler to handle SI configuration request from RRM to MAC.
1099 * Function: rgSCHGomHndlSiCfg
1101 * This API handles processing for SI configuration request from RRM to MAC.
1103 * - Processing Steps:
1104 * - Validate SI configuration request parameters at CFG module.
1105 * Call rgSCHCfgVldtSiCfg for SI configuration.
1106 * - If validated successfully, send configuration request to CFG.
1107 * Call rgSCHCfgRgrCellCfg else FAIL.
1109 * @param[in] Region reg
1110 * @param[in] Pool pool
1111 * @param[in] RgSchCb *instCb
1112 * @param[in] SpId spId
1113 * @param[in] RgrCfgTransId transId
1114 * @param[in] RgrSiCfgReqInfo *cfgReqInfo
1120 S16 rgSCHGomHndlSiCfg
1126 RgrCfgTransId transId,
1127 RgrSiCfgReqInfo *cfgReqInfo
1130 S16 rgSCHGomHndlSiCfg(reg, pool, instCb, spId, transId, cfgReqInfo)
1135 RgrCfgTransId transId;
1136 RgrSiCfgReqInfo *cfgReqInfo;
1140 RgSchCellCb *cell = instCb->rgrSap[spId].cell;
1141 Inst inst = (instCb->rgSchInit.inst );
1142 RgSchErrInfo errInfo;
1143 U8 cfmStatus = RGR_CFG_CFM_NOK;
1144 MsgLen msgLen = 0, pduLen;
1150 /* check if cell does not exists */
1151 if (((U8 *)cell == NULLP) || (cell->cellId != cfgReqInfo->cellId))
1153 RLOG_ARG0(L_ERROR,DBG_CELLID,cfgReqInfo->cellId,"Cell Control block does not exist"
1155 RGSCH_FREE_MSG(cfgReqInfo->pdu);
1156 SPutSBuf(reg, pool, (Data *)cfgReqInfo, (Size)sizeof(*cfgReqInfo));
1158 rgSCHUtlRgrSiCfgCfm(instCb->rgSchInit.inst, spId, transId, cfmStatus);
1162 /*Validate the received SI configuration */
1163 ret = rgSCHCfgVldtRgrSiCfg(inst, cfgReqInfo, cell, &errInfo);
1166 RLOG_ARG0(L_ERROR,DBG_CELLID,cfgReqInfo->cellId,"Rgr SI configuration "
1167 "validation FAILED");
1168 RGSCH_FREE_MSG(cfgReqInfo->pdu);
1169 SPutSBuf(reg, pool, (Data *)cfgReqInfo, (Size)sizeof(*cfgReqInfo));
1171 rgSCHUtlRgrSiCfgCfm(instCb->rgSchInit.inst, spId, transId, cfmStatus);
1174 /*ccpu00140789: Stopping SI scheduling*/
1175 if(RGR_SI_STOP == cfgReqInfo->cfgType)
1177 if((cell->siCb.crntSiInfo.siInfo[cfgReqInfo->siId-1].si != NULLP)&&
1178 (cell->siCb.siArray[cfgReqInfo->siId-1].si != NULLP))
1180 cell->siCb.crntSiInfo.siInfo[cfgReqInfo->siId-1].si = NULLP;
1181 RGSCH_FREE_MSG(cell->siCb.siArray[cfgReqInfo->siId-1].si);
1182 cell->siCb.siArray[cfgReqInfo->siId-1].si = NULLP;
1183 if(cell->siCb.newSiInfo.siInfo[cfgReqInfo->siId-1].si != NULLP)
1185 RGSCH_FREE_MSG(cell->siCb.newSiInfo.siInfo[cfgReqInfo->siId-1].si);
1186 cell->siCb.newSiInfo.siInfo[cfgReqInfo->siId-1].si = NULLP;
1188 SPutSBuf(reg, pool, (Data *)cfgReqInfo, (Size)sizeof(*cfgReqInfo));
1190 cfmStatus = RGR_CFG_CFM_OK;
1191 rgSCHUtlRgrSiCfgCfm(instCb->rgSchInit.inst, spId, transId, cfmStatus);
1196 SPutSBuf(reg, pool, (Data *)cfgReqInfo, (Size)sizeof(*cfgReqInfo));
1198 rgSCHUtlRgrSiCfgCfm(instCb->rgSchInit.inst, spId, transId, cfmStatus);
1203 /* Check if the pdu sent from application
1204 * matches a transport block size. if not,
1205 * add padding bytes. This is usually done
1206 * by RRC but since we are bypassing RRC,
1207 * MAC is taking over that responsibility
1209 if ( RGR_SI_CFG_TYPE_MIB != cfgReqInfo->cfgType )
1211 SFndLenMsg(cfgReqInfo->pdu, &msgLen);
1213 /* check if the application pdu matches a tb size */
1214 tbSz = rgSCHUtlGetAllwdCchTbSz(msgLen*8, &nPrb, &mcs);
1216 if ( tbSz != (msgLen*8) )
1218 MsgLen nmPadBytes = 0;
1219 Data* padding = NULLP;
1221 /* need to add padding bytes */
1222 nmPadBytes = (tbSz - (msgLen*8))/8;
1224 if ( SGetSBuf(reg,pool,&padding,nmPadBytes) != ROK)
1226 RLOG_ARG0(L_ERROR,DBG_CELLID,cfgReqInfo->cellId,"Rgr SI configuration "
1227 "SGetSBuf failed for padding failed");
1228 SPutSBuf(reg, pool, (Data *)cfgReqInfo, (Size)sizeof(*cfgReqInfo));
1230 rgSCHUtlRgrSiCfgCfm(instCb->rgSchInit.inst, spId, transId,
1235 memset(padding,0,nmPadBytes);
1237 #ifdef MS_MBUF_CORRUPTION
1238 MS_BUF_ADD_ALLOC_CALLER();
1240 if ( SAddPstMsgMult((Data*)padding,nmPadBytes,cfgReqInfo->pdu) != ROK)
1242 RLOG_ARG0(L_ERROR,DBG_CELLID,cfgReqInfo->cellId,"Rgr SI configuration "
1243 "Failed to add padding bytes");
1244 SPutSBuf(reg, pool, (Data *)cfgReqInfo, (Size)sizeof(*cfgReqInfo));
1246 SPutSBuf(reg, pool, (Data* )padding,(Size)nmPadBytes);
1248 rgSCHUtlRgrSiCfgCfm(instCb->rgSchInit.inst, spId, transId,
1252 SPutSBuf(reg, pool, (Data* )padding,(Size)nmPadBytes);
1254 }/* if (tbSz != ...*/
1255 }/* if (RGR_SI_CFG_TYPE_SI...*/
1257 /*Set the received pdu at the appropriate place */
1258 switch(cfgReqInfo->cfgType)
1260 case RGR_SI_CFG_TYPE_MIB: /* SI CFG Type MIB */
1261 RGSCHCHKNUPDSIPDU(cell->siCb.crntSiInfo.mib,
1262 cell->siCb.newSiInfo.mib,
1263 cfgReqInfo->pdu, cell->siCb.siBitMask,
1267 case RGR_SI_CFG_TYPE_SIB1_PWS:
1269 SFndLenMsg(cfgReqInfo->pdu, &pduLen);
1270 ret = rgSCHUtlCalMcsAndNPrb(cell, cfgReqInfo->cfgType, pduLen,0);
1273 RLOG_ARG0(L_ERROR,DBG_CELLID,cfgReqInfo->cellId,"Failed to get MCS and NPRB"
1275 RGSCH_FREE_MSG(cfgReqInfo->pdu);
1276 SPutSBuf(reg, pool, (Data *)cfgReqInfo, (Size)sizeof(*cfgReqInfo));
1278 rgSCHUtlRgrSiCfgCfm(instCb->rgSchInit.inst, spId, transId,
1283 RGSCHCHKNUPDSIPDU(cell->siCb.crntSiInfo.sib1Info.sib1,
1284 cell->siCb.newSiInfo.sib1Info.sib1,
1285 cfgReqInfo->pdu, cell->siCb.siBitMask,
1286 RGSCH_SI_SIB1_PWS_UPD);
1290 case RGR_SI_CFG_TYPE_SIB1:
1291 SFndLenMsg(cfgReqInfo->pdu, &pduLen);
1292 ret = rgSCHUtlCalMcsAndNPrb(cell, cfgReqInfo->cfgType, pduLen,0);
1295 RLOG_ARG0(L_ERROR,DBG_CELLID,cfgReqInfo->cellId,"Failed to get MCS and NPRB"
1297 RGSCH_FREE_MSG(cfgReqInfo->pdu);
1298 SPutSBuf(reg, pool, (Data *)cfgReqInfo, (Size)sizeof(*cfgReqInfo));
1300 rgSCHUtlRgrSiCfgCfm(instCb->rgSchInit.inst, spId, transId,
1304 RGSCHCHKNUPDSIPDU(cell->siCb.crntSiInfo.sib1Info.sib1,
1305 cell->siCb.newSiInfo.sib1Info.sib1,
1306 cfgReqInfo->pdu, cell->siCb.siBitMask,
1310 case RGR_SI_CFG_TYPE_SI: /* SI CFG TYPE SI */
1311 SFndLenMsg(cfgReqInfo->pdu, &pduLen);
1312 ret = rgSCHUtlCalMcsAndNPrb(cell, cfgReqInfo->cfgType, pduLen,
1316 RLOG_ARG0(L_ERROR,DBG_CELLID,cfgReqInfo->cellId,"Failed to get MCS and NPRB"
1318 RGSCH_FREE_MSG(cfgReqInfo->pdu);
1319 SPutSBuf(reg, pool, (Data *)cfgReqInfo, (Size)sizeof(*cfgReqInfo));
1321 rgSCHUtlRgrSiCfgCfm(instCb->rgSchInit.inst, spId, transId,
1325 /* Si recfg, where numSi changes */
1326 if (cell->siCb.siBitMask & RGSCH_SI_SICFG_UPD)
1328 Buffer **newSiPdu = &cell->siCb.newSiInfo.siInfo[cfgReqInfo->siId-1].si;
1329 if(*newSiPdu != NULLP)
1331 RGSCH_FREE_MSG(*newSiPdu);
1333 *newSiPdu = (Buffer *)cfgReqInfo->pdu;
1334 cell->siCb.siBitMask |= RGSCH_SI_SI_UPD;
1336 else /* Initial Si cfg or si recfg where numSi did not change */
1339 /* Initial Si cfg */
1340 if (cell->siCb.crntSiInfo.siInfo[cfgReqInfo->siId-1].si == NULLP)
1342 cell->siCb.siArray[cfgReqInfo->siId-1].si = cfgReqInfo->pdu;
1343 cell->siCb.siArray[cfgReqInfo->siId-1].isWarningSi = FALSE;
1344 bitMask = RGSCH_SI_DFLT;
1348 bitMask = RGSCH_SI_SI_UPD;
1351 RGSCHCHKNUPDSIPDU(cell->siCb.crntSiInfo.siInfo[cfgReqInfo->siId-1].si,
1352 cell->siCb.newSiInfo.siInfo[cfgReqInfo->siId-1].si,
1354 cell->siCb.siBitMask, bitMask);
1358 case RGR_SI_CFG_TYPE_SIB8_CDMA: /* SI CFG TYPE SIB 8 CDMA */
1359 SFndLenMsg(cfgReqInfo->pdu, &pduLen);
1360 ret = rgSCHUtlCalMcsAndNPrb(cell, cfgReqInfo->cfgType, pduLen,
1364 RLOG_ARG0(L_ERROR,DBG_CELLID,cfgReqInfo->cellId,"Failed to get MCS and NPRB"
1366 RGSCH_FREE_MSG(cfgReqInfo->pdu);
1367 SPutSBuf(reg, pool, (Data *)cfgReqInfo, (Size)sizeof(*cfgReqInfo));
1369 rgSCHUtlRgrSiCfgCfm(instCb->rgSchInit.inst, spId, transId,
1373 /* No need to wait for Modification period boundary */
1374 cell->siCb.siArray[cfgReqInfo->siId-1].si = cfgReqInfo->pdu;
1375 RGSCH_SET_SI_INFO(cell->siCb.crntSiInfo.siInfo[cfgReqInfo->siId-1].si,
1377 cell->siCb.siArray[cfgReqInfo->siId-1].isWarningSi = FALSE;
1380 RLOG_ARG0(L_ERROR,DBG_CELLID,cfgReqInfo->cellId,"Invalid cfgType "
1382 RGSCH_FREE_MSG(cfgReqInfo->pdu);
1383 SPutSBuf(reg, pool, (Data *)cfgReqInfo,
1384 (Size)sizeof(*cfgReqInfo));
1386 rgSCHUtlRgrSiCfgCfm(instCb->rgSchInit.inst, spId, transId,
1391 SPutSBuf(reg, pool, (Data *)cfgReqInfo, (Size)sizeof(*cfgReqInfo));
1393 cfmStatus = RGR_CFG_CFM_OK;
1394 rgSCHUtlRgrSiCfgCfm(instCb->rgSchInit.inst, spId, transId, cfmStatus);
1398 } /* rgSCHGomHndlSiCfg */
1402 * @brief Handler to handle Warning SI configuration request from RRM to MAC.
1406 * Function: rgSCHGomHndlWarningSiCfg
1408 * This API handles processing for Warning SI configuration request from
1412 * @param[in] Region reg
1413 * @param[in] Pool pool
1414 * @param[in] RgSchCb *instCb
1415 * @param[in] SpId spId
1416 * @param[in] RgrWarningSiCfgReqInfo *warningSiCfgReqInfo
1422 S16 rgSCHGomHndlWarningSiCfg
1428 RgrCfgTransId transId,
1429 RgrWarningSiCfgReqInfo *warningSiCfgReqInfo
1432 S16 rgSCHGomHndlWarningSiCfg(reg, pool, instCb, spId, transId,
1433 warningSiCfgReqInfo)
1438 RgrCfgTransId transId;
1439 RgrWarningSiCfgReqInfo *warningSiCfgReqInfo;
1442 RgSchCellCb *cell = instCb->rgrSap[spId].cell;
1443 U8 cfmStatus = RGR_CFG_CFM_NOK;
1445 U8 siId = warningSiCfgReqInfo->siId;
1446 U8 j, mcs=0, nPrb=0;
1447 RgSchWarningSiSeg *warningSiMsg;
1448 RgSchWarningSiPdu *pduNode;
1451 Bool freeNodeFound = FALSE;
1455 U8 isEmtc = warningSiCfgReqInfo->emtcEnable;
1461 rgSchEmtcGetSiWinPerd(cell, &siWinSize, &minPeriod);
1466 siWinSize = cell->siCfg.siWinSize;
1467 minPeriod = cell->siCfg.minPeriodicity;
1469 /* check if cell does not exists */
1470 if (((U8 *)cell == NULLP) ||
1471 (cell->cellId != warningSiCfgReqInfo->cellId) ||
1472 (warningSiCfgReqInfo->siId >
1473 ((minPeriod * 10)/siWinSize)))
1475 RLOG_ARG2(L_ERROR,DBG_CELLID,warningSiCfgReqInfo->cellId,"Warning SI Cfg Failed for siId = %d"
1476 "warning cellID:%d",warningSiCfgReqInfo->siId,warningSiCfgReqInfo->cellId);
1477 rgSCHUtlFreeWarningSiSeg(reg, pool, &warningSiCfgReqInfo->siPduLst);
1478 SPutSBuf(reg, pool, (Data *)warningSiCfgReqInfo,
1479 sizeof(RgrWarningSiCfgReqInfo));
1480 warningSiCfgReqInfo = NULLP;
1481 rgSCHUtlRgrWarningSiCfgCfm(instCb->rgSchInit.inst, spId, siId, transId,
1486 /* Search for free index in WarningSi */
1487 for(idx = 0; idx < RGR_MAX_NUM_WARNING_SI; idx++)
1489 if((cell->siCb.warningSi[idx].siId == 0 ||
1490 cell->siCb.warningSi[idx].siId == warningSiCfgReqInfo->siId))
1492 warningSiMsg = (RgSchWarningSiSeg *)&cell->siCb.warningSi[idx].warningSiMsg;
1494 /* Search for free SI node */
1495 /* ccpu00136659: CMAS ETWS design changes */
1496 if (warningSiMsg->segLstCp.first == NULLP) /* Free SI Node */
1498 warningSiMsg->transId = transId;
1499 pduNode = (RgSchWarningSiPdu *)&cell->siCb.warningSi[idx].
1500 warningSiMsg.pduNode;
1501 CM_LLIST_FIRST_NODE(&warningSiCfgReqInfo->siPduLst, node);
1504 /* Get the PDUs one by one from the received pduLst of warning
1505 * message and calculate the MCS and nPrb of each pdu once.
1506 * Store the pdu in warningSiMsg pduLst, which will be scheduled
1507 * later while sending warning message as part of SIB11/SIB12
1509 while((node != NULLP) && (j < RGR_MAX_WARNING_SI_SEG))
1512 pduNode[j].pdu = (Buffer *)node->node;
1513 if(pduNode[j].pdu != NULLP)
1515 SFndLenMsg(pduNode[j].pdu, &msgLen);
1516 /*Get the nPrb and mcs parametr values */
1518 if (rgSCHEmtcUtlGetAllwdCchTbSzForSI(msgLen*8) != (msgLen*8))
1520 if (rgSCHUtlGetAllwdCchTbSz(msgLen*8, &nPrb, &mcs) != (msgLen*8))
1524 RGSCHLOGERROR(cell->instIdx,ERRCLS_INT_PAR,ERG011,
1526 "rgSCHGomHndlWarningSiCfg():msgLen does not match\
1527 any valid TB Size.");
1528 RLOG_ARG1(L_ERROR,DBG_CELLID,cell->cellId,"Warning SI Cfg Failed"
1529 "for siId = %d", warningSiCfgReqInfo->siId);
1530 rgSCHUtlFreeWarningSiSeg(reg, pool,
1531 &warningSiCfgReqInfo->siPduLst);
1532 SPutSBuf(reg, pool, (Data *)warningSiCfgReqInfo,
1533 sizeof(RgrWarningSiCfgReqInfo));
1534 warningSiCfgReqInfo = NULLP;
1535 rgSCHUtlRgrWarningSiCfgCfm(instCb->rgSchInit.inst, spId,
1536 siId, transId,cfmStatus);
1541 pduNode[j].mcs = mcs;
1542 pduNode[j].nPrb = nPrb;
1543 pduNode[j].msgLen = msgLen;
1544 /* ccpu00136659: CMAS ETWS design changes */
1545 cmLListAdd2Tail(&warningSiMsg->segLstCp, &pduNode[j].lnk);
1546 pduNode[j].lnk.node = (PTR)&pduNode[j];
1551 /* ccpu00132385- nodes in received SI config linked list should
1552 * be freed after processing the config.*/
1553 while(warningSiCfgReqInfo->siPduLst.first != NULLP)
1555 node = warningSiCfgReqInfo->siPduLst.first;
1556 cmLListDelFrm(&(warningSiCfgReqInfo->siPduLst), node);
1557 SPutSBuf(reg, pool, (Data *)node,sizeof(CmLList));
1561 cell->siCb.warningSi[idx].siId = warningSiCfgReqInfo->siId;
1562 cell->siCb.warningSi[idx].idx = idx;
1566 rgSCHEmtcWarningSiCfg(cell,warningSiCfgReqInfo,idx);
1571 cell->siCb.siArray[warningSiCfgReqInfo->siId-1].si =
1572 &cell->siCb.warningSi[idx];
1573 cell->siCb.siArray[warningSiCfgReqInfo->siId-1].isWarningSi =
1576 freeNodeFound = TRUE;
1582 if (freeNodeFound == FALSE)
1584 RLOG_ARG0(L_DEBUG,DBG_CELLID,cell->cellId,"No SI Index is free");
1585 rgSCHUtlFreeWarningSiSeg(reg, pool, &warningSiCfgReqInfo->siPduLst);
1586 SPutSBuf(reg, pool, (Data *)warningSiCfgReqInfo,
1587 sizeof(RgrWarningSiCfgReqInfo));
1588 warningSiCfgReqInfo = NULLP;
1589 rgSCHUtlRgrWarningSiCfgCfm(instCb->rgSchInit.inst, spId, siId, transId,
1594 SPutSBuf(reg, pool, (Data *)warningSiCfgReqInfo,
1595 sizeof(RgrWarningSiCfgReqInfo));
1596 warningSiCfgReqInfo = NULLP;
1602 * @brief Handler to handle SI Stop request from RRM to MAC.
1606 * Function: rgSCHGomHndlWarningSiStopReq
1608 * This API handles processing for SI stop request from RRM to MAC.
1610 * @param[in] Region reg
1611 * @param[in] Pool pool
1612 * @param[in] RgSchCb *instCb
1613 * @param[in] SpId siId
1617 Void rgSCHGomHndlWarningSiStopReq
1623 RgrCfgTransId transId,
1627 Void rgSCHGomHndlWarningSiStopReq(reg, pool, instCb, siId, transId, spId)
1632 RgrCfgTransId transId;
1636 RgSchCellCb *cell = instCb->rgrSap[spId].cell;
1639 RgSchWarningSiPdu *warningSiPdu;
1642 for(idx = 0; idx < RGR_MAX_NUM_WARNING_SI; idx++)
1644 if(cell->siCb.warningSi[idx].siId == siId)
1646 if ((cmMemcmp ((U8 *)&cell->siCb.warningSi[idx].warningSiMsg.transId,
1647 (U8 *)&transId, sizeof(RgrCfgTransId))) == 0)
1649 /* ccpu00136659: CMAS ETWS design changes */
1650 CM_LLIST_FIRST_NODE(&cell->siCb.warningSi[idx].warningSiMsg.segLstCp, node);
1651 while(node != NULLP)
1653 /* On receiving the warning stop message, remove one by one
1654 * each PDU from the warning SI list
1656 /* ccpu00136659: CMAS ETWS design changes */
1657 node = (CmLList *)&cell->siCb.warningSi[idx].warningSiMsg.segLstCp.first;
1658 warningSiPdu = (RgSchWarningSiPdu *)node->node;
1659 pdu = warningSiPdu->pdu;
1660 cmLListDelFrm(&cell->siCb.warningSi[idx].warningSiMsg.segLstCp, node);
1661 RGSCH_FREE_MSG(pdu);
1670 #endif/*RGR_SI_SCH */
1672 /* LTE_ADV_FLAG_REMOVED_START */
1675 * @brief This function sets the Phigh range for CC users corresponding to the CC Pool
1678 * Function: rgSchUpdtRNTPInfo
1680 * Invoked by: rgSCHGomHndlLoadInf
1682 * @param[in] RgSchCellCb* cell
1683 * @param[in] RgSubFrm* subFrm
1684 * @param[in] RgrLoadInfReqInfo *loadInfReq
1689 S16 rgSchUpdtRNTPInfo
1693 RgrLoadInfReqInfo *loadInfReq
1696 PRIVATE Void rgSchUpdtRNTPInfo(cell, sf)
1699 RgrLoadInfReqInfo *loadInfReq;
1703 /* Initialise the variables */
1704 RgSchSFRPoolInfo *sfrCCPool;
1709 l = &sf->sfrTotalPoolInfo.ccPool;
1711 /*Get the first node from the CC Pool*/
1712 n = cmLListFirst(l);
1715 sfrCCPool = (RgSchSFRPoolInfo*)n->node;
1716 if (sfrCCPool->poolendRB == loadInfReq->rgrCcPHighEndRb)
1718 sfrCCPool->pwrHiCCRange.endRb = loadInfReq->rgrCcPHighEndRb;
1719 sfrCCPool->pwrHiCCRange.startRb = loadInfReq->rgrCcPHighStartRb;
1730 * @brief Handler to handle LOAD INF request from RRM to MAC.
1734 * Function: rgSCHGomHndlLoadInf
1736 * This API handles processing for LOAD INF request from RRM to MAC.
1738 * - Processing Steps:
1739 * - Validate LOAD INF request parameters at CFG module.
1740 * Call rgSCHCfgVldtRgrLoadInf for SI configuration.
1741 * - If validated successfully, send configuration request.
1743 * @param[in] Region reg
1744 * @param[in] Pool pool
1745 * @param[in] RgSchCb *instCb
1746 * @param[in] SpId spId
1747 * @param[in] RgrCfgTransId transId
1748 * @param[in] RgrLoadInfReqInfo *loadInfReq
1754 S16 rgSCHGomHndlLoadInf
1760 RgrCfgTransId transId,
1761 RgrLoadInfReqInfo *loadInfReq
1764 S16 rgSCHGomHndlLoadInf(reg, pool, instCb, spId, transId, loadInfReq)
1769 RgrCfgTransId transId;
1770 RgrLoadInfReqInfo *loadInfReq;
1774 RgSchCellCb *cell = instCb->rgrSap[spId].cell;
1775 Inst inst = (instCb->rgSchInit.inst );
1776 RgSchErrInfo errInfo;
1779 /* check if cell does not exists */
1780 if (((U8 *)cell == NULLP) || (cell->cellId != loadInfReq->cellId))
1782 RLOG_ARG1(L_ERROR,DBG_CELLID,loadInfReq->cellId,"Cell Control block does not exist"
1783 "for load cellId:%d",loadInfReq->cellId);
1784 SPutSBuf(reg, pool, (Data *)loadInfReq, (Size)sizeof(*loadInfReq));
1788 if (cell->lteAdvCb.dsfrCfg.status == RGR_DISABLE)
1790 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId, "rgSCHGomHndlLoadInf(): DSFR Feature not enabled");
1791 SPutSBuf(reg, pool, (Data *)loadInfReq, (Size)sizeof(*loadInfReq));
1794 /* Validate the received LOAD INF Configuration */
1795 ret = rgSCHCfgVldtRgrLoadInf(inst, loadInfReq, cell, &errInfo);
1798 RLOG_ARG0(L_ERROR,DBG_CELLID,cell->cellId,"Rgr LOAD INF Configuration "
1799 "validation FAILED");
1800 SPutSBuf(reg, pool, (Data *)loadInfReq, (Size)sizeof(*loadInfReq));
1803 /* Update the RNTP info rcvd in the respective cell centre pool so that Phigh can be
1804 sent for the UEs scheduled in that particular RB range*/
1805 for(i = 0; i < RGSCH_NUM_DL_slotS; i++)
1807 if((rgSchUpdtRNTPInfo(cell, cell->subFrms[i], loadInfReq) != ROK))
1813 SPutSBuf(reg, pool, (Data *)loadInfReq, (Size)sizeof(*loadInfReq));
1817 } /* rgSCHGomHndlLoadInf */
1818 /* LTE_ADV_FLAG_REMOVED_END */
1820 /**********************************************************************
1823 **********************************************************************/