MacProcSchSliceReCfgRsp, /* TC */
packSchSliceReCfgRsp /* LWLC */
};
+
/**
* @brief Task Initiation function.
*
return LCM_REASON_INVALID_MSGTYPE;
}
/* Update the Pst structure for LM interface */
- memcpy(&schCb[inst].schInit.lmPst,
- &cfg->s.schInstCfg.genCfg.lmPst,
- sizeof(Pst));
+ memcpy(&schCb[inst].schInit.lmPst, &cfg->s.schInstCfg.genCfg.lmPst, sizeof(Pst));
schCb[inst].schInit.inst = inst;
schCb[inst].schInit.lmPst.srcProcId = schCb[inst].schInit.procId;
/* SS_MT_TMR needs to be enabled as schActvTmr needs instance information */
/* Timer Registration request to system services */
- if (ODU_REG_TMR_MT(schCb[inst].schInit.ent, dInst,
- (int)schCb[inst].genCfg.tmrRes, schActvTmr) != ROK)
+ if (ODU_REG_TMR_MT(schCb[inst].schInit.ent, dInst, (int)schCb[inst].genCfg.tmrRes, schActvTmr) != ROK)
{
DU_LOG("\nERROR --> SCH : SchInstCfg(): Failed to "
"register timer.");
* ****************************************************************/
uint8_t MacSchCrcInd(Pst *pst, CrcIndInfo *crcInd)
{
+ Inst inst = pst->dstInst-SCH_INST_START;
#ifdef CALL_FLOW_DEBUG_LOG
DU_LOG("\nCall Flow: ENTMAC -> ENTSCH : EVENT_CRC_IND_TO_SCH\n");
#endif
- switch(crcInd->crcInd[0])
- {
- case CRC_FAILED:
- DU_LOG("\nDEBUG --> SCH : Received CRC indication. CRC Status [FAILURE]");
- break;
- case CRC_PASSED:
- DU_LOG("\nDEBUG --> SCH : Received CRC indication. CRC Status [PASS]");
- break;
- default:
- DU_LOG("\nDEBUG --> SCH : Invalid CRC state %d", crcInd->crcInd[0]);
- return RFAILED;
- }
+ schProcessCrcInd(crcInd, inst);
return ROK;
}
SchCellCb *cellCb;
SchCellCfgCfm schCellCfgCfm;
Pst rspPst;
- Inst inst = pst->dstInst-1;
+ Inst inst = pst->dstInst - SCH_INST_START;
uint8_t coreset0Idx = 0;
uint8_t numRbs = 0;
uint8_t offset = 0;
fillSchSib1Cfg(schCellCfg->numerology, schCellCfg->bandwidth, cellCb->numSlots,
&(schCellCfg->sib1SchCfg), schCellCfg->phyCellId,
schCellCfg->ssbSchCfg.ssbOffsetPointA);
+
+
memcpy(&cellCb->cellCfg, schCellCfg, sizeof(SchCellCfg));
+ schProcPagingCfg(cellCb);
/* Fill coreset frequencyDomainResource bitmap */
coreset0Idx = cellCb->cellCfg.schInitialDlBwp.pdcchCommon.commonSearchSpace.coresetId;
cellCb->actvUeBitMap = 0;
cellCb->boIndBitMap = 0;
+ cellCb->cellCfg.schHqCfg.maxDlDataHqTx = SCH_MAX_NUM_DL_HQ_TX;
+ cellCb->cellCfg.schHqCfg.maxMsg4HqTx = SCH_MAX_NUM_MSG4_TX;
+ cellCb->cellCfg.schHqCfg.maxUlDataHqTx = SCH_MAX_NUM_UL_HQ_TX;
+ cellCb->cellCfg.schRachCfg.maxMsg3Tx = SCH_MAX_NUM_MSG3_TX;
+
/* Fill and send Cell config confirm */
memset(&rspPst, 0, sizeof(Pst));
FILL_PST_SCH_TO_MAC(rspPst, pst->dstInst);
bool isLcIdValid = false;
SchUeCb *ueCb = NULLP;
SchCellCb *cell = NULLP;
- Inst inst = pst->dstInst-SCH_INST_START;
- CmLListCp *lcLL = NULLP;
+ Inst inst = pst->dstInst-SCH_INST_START;
#ifdef CALL_FLOW_DEBUG_LOG
DU_LOG("\nCall Flow: ENTMAC -> ENTSCH : EVENT_DL_RLC_BO_INFO_TO_SCH\n");
-#endif
-
+#endif
DU_LOG("\nDEBUG --> SCH : Received RLC BO Status indication LCId [%d] BO [%d]", dlBoInfo->lcId, dlBoInfo->dataVolume);
cell = schCb[inst].cells[inst];
return RFAILED;
}
- GET_UE_IDX(dlBoInfo->crnti, ueId);
+ GET_UE_ID(dlBoInfo->crnti, ueId);
ueCb = &cell->ueCb[ueId-1];
+ if(ueCb->ueCfg.dataTransmissionAction == STOP_DATA_TRANSMISSION)
+ {
+ DU_LOG("INFO --> SCH : DL Data transmission not allowed for UE %d", ueCb->ueCfg.ueId);
+ return ROK;
+ }
+
lcId = dlBoInfo->lcId;
CHECK_LCID(lcId, isLcIdValid);
if(isLcIdValid == FALSE)
*Thus clearing out the LC from the Lc priority list*/
if(dlBoInfo->dataVolume == 0)
{
- /*Check the LC is Dedicated or default and accordingly LCList will
- * be used*/
- if(ueCb->dlInfo.dlLcCtxt[lcId].isDedicated)
- {
- lcLL = &(ueCb->dlLcPrbEst.dedLcInfo->dedLcList);
- }
- else
- {
- lcLL = &(ueCb->dlLcPrbEst.defLcList);
- }
- handleLcLList(lcLL, lcId, DELETE);
+ /* TODO : Check the LC is Dedicated or default and accordingly LCList
+ * will be used*/
return ROK;
}
if(lcId == SRB0_LCID)
{
cell->raCb[ueId -1].msg4recvd = true;
- cell->raCb[ueId -1].dlMsgPduLen = dlBoInfo->dataVolume;
-
+ cell->raCb[ueId -1].dlMsgPduLen = dlBoInfo->dataVolume;
}
else
{
return RFAILED;
}
}
-
/* Adding UE Id to list of pending UEs to be scheduled */
addUeToBeScheduled(cell, ueId);
return ROK;
return RFAILED;
}
+ if(ueCb->ueCfg.dataTransmissionAction == STOP_DATA_TRANSMISSION)
+ {
+ DU_LOG("\nINFO --> SCH: UL Data transmission not allowed for UE %d", ueCb->ueCfg.ueId);
+ return ROK;
+ }
+
ueCb->bsrRcvd = true;
/* store dataVolume per lcg in uecb */
for(lcgIdx = 0; lcgIdx < bsrInd->numLcg; lcgIdx++)
}
/* Adding UE Id to list of pending UEs to be scheduled */
- addUeToBeScheduled(cellCb, ueCb->ueIdx);
+ addUeToBeScheduled(cellCb, ueCb->ueId);
return ROK;
}
DU_LOG("\nERROR --> SCH : Crnti %d is inactive", uciInd->crnti);
return ROK;
}
-
+ if(ueCb->ueCfg.dataTransmissionAction == STOP_DATA_TRANSMISSION)
+ {
+ DU_LOG("\nINFO --> SCH: UL Data transmission not allowed for UE %d", ueCb->ueCfg.ueId);
+ return ROK;
+ }
if(uciInd->numSrBits)
{
- ueCb->srRcvd = true;
-
+ ueCb->srRcvd = true;
/* Adding UE Id to list of pending UEs to be scheduled */
- addUeToBeScheduled(cellCb, ueCb->ueIdx);
+ addUeToBeScheduled(cellCb, ueCb->ueId);
+ }
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Processes HARQ UCI indication from MAC
+ *
+ * @details
+ *
+ * Function : MacSchHarqUciInd
+ *
+ * Functionality:
+ * Processes HARQ UCI indication from MAC
+ *
+ * @params[in] Post structure
+ * UCI Indication
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t MacSchHarqUciInd(Pst *pst, HarqUciIndInfo *uciInd)
+{
+ Inst inst = pst->dstInst-SCH_INST_START;
+ SchUeCb *ueCb;
+ SchCellCb *cellCb = schCb[inst].cells[inst];
+
+#ifdef CALL_FLOW_DEBUG_LOG
+ DU_LOG("\nCall Flow: ENTMAC -> ENTSCH : EVENT_UCI_IND_TO_SCH\n");
+#endif
+
+ DU_LOG("\nDEBUG --> SCH : Received HARQ");
+
+ ueCb = schGetUeCb(cellCb, uciInd->crnti);
+
+ if(ueCb->state == SCH_UE_STATE_INACTIVE)
+ {
+ DU_LOG("\nERROR --> SCH : Crnti %d is inactive", uciInd->crnti);
+ return ROK;
}
+
+ schUpdateHarqFdbk(ueCb, uciInd->numHarq, uciInd->harqPayload, &uciInd->slotInd);
+
return ROK;
}
*ueId = ueIdToAdd;
if(addNodeToLList(&cell->ueToBeScheduled, ueId, NULLP) != ROK)
{
- DU_LOG("\nERROR --> SCH : Failed to add UeIdx to cell->ueToBeScheduled list");
+ DU_LOG("\nERROR --> SCH : Failed to add ueId [%d] to cell->ueToBeScheduled list", *ueId);
return RFAILED;
}
return ROK;
return RFAILED;
}
- memcpy(storeSliceCfg->listOfConfirguration[sliceIdx], cfgReq->listOfConfirguration[sliceIdx], sizeof(SchRrmPolicyOfSlice));
+ memcpy(&storeSliceCfg->listOfConfirguration[sliceIdx]->snssai, &cfgReq->listOfConfirguration[sliceIdx]->snssai, sizeof(Snssai));
+ memcpy(storeSliceCfg->listOfConfirguration[sliceIdx]->rrmPolicyRatioInfo, cfgReq->listOfConfirguration[sliceIdx]->rrmPolicyRatioInfo,
+ sizeof(SchRrmPolicyRatio));
sliceIdx++;
}
}
uint8_t MacSchSliceCfgReq(Pst *pst, SchSliceCfgReq *schSliceCfgReq)
{
uint8_t count = 0;
- Inst inst = pst->dstInst - 1;
+ Inst inst = pst->dstInst - SCH_INST_START;
SchSliceCfgRsp sliceCfgRsp;
DU_LOG("\nINFO --> SCH : Received Slice Cfg request from MAC");
{
if(!memcmp(&storeSliceCfg->listOfConfirguration[sliceIdx]->snssai, &cfgReq->listOfConfirguration[cfgIdx]->snssai, sizeof(Snssai)))
{
- storeSliceCfg->listOfConfirguration[sliceIdx]->rrmPolicyRatioInfo = cfgReq->listOfConfirguration[cfgIdx]->rrmPolicyRatioInfo;
+ memcpy(storeSliceCfg->listOfConfirguration[sliceIdx]->rrmPolicyRatioInfo, cfgReq->listOfConfirguration[cfgIdx]->rrmPolicyRatioInfo,
+ sizeof(SchRrmPolicyRatio));
break;
}
}
uint8_t MacSchSliceReCfgReq(Pst *pst, SchSliceCfgReq *schSliceReCfgReq)
{
uint8_t count = 0;
- Inst inst = pst->dstInst - 1;
+ Inst inst = pst->dstInst - SCH_INST_START;
SchSliceCfgRsp schSliceReCfgRsp;
DU_LOG("\nINFO --> SCH : Received Slice ReCfg request from MAC");
return ROK;
}
+/****************************************************************************
+ *
+ * @brief Stores the Paging Configuration from DU APP in CellCb
+ *
+ * @details
+ *
+ * Function : schProcPagingParam
+ *
+ * Functionality:
+ * Process the Paging Configuration when FirstPDCCHMonitoring for
+ * Paging Ocassion is not present.
+ *
+ * As per 38.304 Sec 7.1,
+ * "When firstPDCCH-MonitoringOccasionOfPO is present, the
+ * starting PDCCH monitoring occasion number of (i_s + 1)th PO is the
+ * (i_s + 1)th value of the firstPDCCHMonitoringOccasionOfPO
+ * parameter; otherwise, it is equal to i_s * S."
+ * "S = number of actual transmitted SSBs determined according
+ * to ssb-PositionsInBurst in SIB1"
+ *
+ * @params[in] SchCellCb *cell
+ *
+ * @return void
+ *
+ *************************************************************************/
+void schProcPagingCfg(SchCellCb *cell)
+{
+ PageCfg *pageCfgRcvd = NULL;
+ uint8_t i_sIdx = 0;
+
+ pageCfgRcvd = &(cell->cellCfg.sib1SchCfg.pageCfg);
+
+ if(pageCfgRcvd->poPresent == TRUE)
+ {
+ /*Fetching first Pdcch Monitoring Occasion for SFN (i_s + 1)th*/
+ for(i_sIdx = 0; i_sIdx < pageCfgRcvd->numPO; i_sIdx++)
+ {
+ cell->pageCb.pagMonOcc[i_sIdx].pagingOccSlot = pageCfgRcvd->pagingOcc[i_sIdx] / MAX_SYMB_PER_SLOT ;
+ if ((pageCfgRcvd->pagingOcc[i_sIdx] % MAX_SYMB_PER_SLOT) != 0 )
+ {
+ cell->pageCb.pagMonOcc[i_sIdx].pagingOccSlot++;
+ }
+
+ cell->pageCb.pagMonOcc[i_sIdx].frameOffset = 0;
+
+ }
+ }
+ else
+ {
+ schCfgPdcchMonOccOfPO(cell);
+ }
+}
+
+/****************************************************************************
+ *
+ * @brief Calculate PO if not present in Configuration
+ *
+ * @details
+ *
+ * Function : schCfgPdcchMonOccOfPO
+ *
+ * Functionality: In this function, PO are calculated i_s * S because
+ * FirstPDCCHMonitoring_ForPO is not present.
+ *
+ * @params[in] SchCellCb *cellCb
+ *
+ * @return void
+ *
+ *************************************************************************/
+void schCfgPdcchMonOccOfPO(SchCellCb *cell)
+{
+ uint8_t cnt = 0, incr = 1, i_sIdx = 0, frameOffSet = 0;
+ uint8_t nsValue = cell->cellCfg.sib1SchCfg.pageCfg.numPO;
+ uint8_t totalNumSsb = cell->cellCfg.ssbSchCfg.totNumSsb;
+ SlotTimingInfo tmpTimingInfo, pdcchTime;
+
+ /*Starting with First Sfn and slot*/
+ tmpTimingInfo.sfn = 0;
+ tmpTimingInfo.slot = 0;
+
+ pdcchTime = tmpTimingInfo;
+
+ while(i_sIdx < nsValue)
+ {
+ /*Increment frame Offset if PO falls on next SFN*/
+ if(pdcchTime.sfn != tmpTimingInfo.sfn)
+ {
+ frameOffSet++;
+ }
+ pdcchTime = tmpTimingInfo;
+ schIncrSlot(&(tmpTimingInfo), incr, cell->numSlots);
+
+ if (i_sIdx == 0)
+ {
+ cell->pageCb.pagMonOcc[i_sIdx].pagingOccSlot = pdcchTime.slot;
+ cell->pageCb.pagMonOcc[i_sIdx].frameOffset = frameOffSet;
+ i_sIdx++;
+ }
+ else
+ {
+ cnt++;
+ if((cnt == totalNumSsb) && (i_sIdx < MAX_PO_PER_PF))
+ {
+ cell->pageCb.pagMonOcc[i_sIdx].pagingOccSlot = pdcchTime.slot;
+ cell->pageCb.pagMonOcc[i_sIdx].frameOffset = frameOffSet;
+ cnt = 0;
+ i_sIdx++;
+ }
+ }
+ }
+}
+
+/****************************************************************************
+ *
+ * @brief Storing the paging information in SCH database
+ *
+ * @details
+ *
+ * Function : schAddPagingIndtoList
+ *
+ * Functionality: Storing the paging information in SCH database
+ *
+ * @params[in] CmLListCp *storedPageList, CmLList *pageIndInfo
+ *
+ * @return ROK - sucess
+ * RFAILED - failure
+ *
+ *************************************************************************/
+uint8_t schAddPagingIndtoList(CmLListCp *storedPageList,void * pageIndInfo)
+{
+ CmLList *firstNodeOfList = NULLP;
+ CmLList *currentNodeInfo = NULLP;
+ SchPageInfo *tempNode = NULLP, *recvdNode = NULLP;
+
+ recvdNode = (SchPageInfo*) pageIndInfo;
+ CM_LLIST_FIRST_NODE(storedPageList,firstNodeOfList);
+
+ SCH_ALLOC(currentNodeInfo, sizeof(CmLList));
+ if(!currentNodeInfo)
+ {
+ DU_LOG("\nERROR --> SCH : schAddPagingIndtoList() : Memory allocation failed");
+ return RFAILED;
+ }
+
+ currentNodeInfo->node = (PTR)pageIndInfo;
+ while(firstNodeOfList)
+ {
+ tempNode = (SchPageInfo*)(firstNodeOfList->node);
+ if ((recvdNode->pageTxTime.slot < tempNode->pageTxTime.slot))
+ {
+ cmLListInsCrnt(storedPageList, currentNodeInfo);
+ break;
+ }
+ else if ((recvdNode->pageTxTime.slot == tempNode->pageTxTime.slot))
+ {
+ DU_LOG("\nERROR --> SCH : schAddPagingIndtoList() : Slot[%d] is already present in the list", recvdNode->pageTxTime.slot);
+ return RFAILED;
+ }
+ else
+ {
+ CM_LLIST_NEXT_NODE(storedPageList, firstNodeOfList);
+ }
+ }
+
+ if(!firstNodeOfList)
+ {
+ cmLListAdd2Tail(storedPageList, currentNodeInfo);
+ }
+ DU_LOG("\nDEBUG --> SCH : Paging information is stored successfully for PF:%d, Slot:%d",\
+ recvdNode->pageTxTime.sfn, recvdNode->pageTxTime.slot);
+ return ROK;
+}
+
+/****************************************************************************
+ *
+ * @brief Process paging indication at SCH recevied form MAC
+ *
+ * @details
+ *
+ * Function : MacSchPagingInd
+ *
+ * Functionality: Process paging indication at SCH recevied form MAC
+ *
+ * @params[in] Pst *pst, SchPageInd *pageInd
+ *
+ * @return void
+ *
+ *************************************************************************/
+uint8_t MacSchPagingInd(Pst *pst, SchPageInd *pageInd)
+{
+ uint8_t ret = RFAILED;
+ uint16_t cellIdx = 0;
+ Inst inst = pst->dstInst - SCH_INST_START;
+ SchCellCb *cellCb = NULLP;
+ SchPageInfo *pageInfo = NULLP;
+
+ if(pageInd)
+ {
+ DU_LOG("\nDEBUG --> SCH : Received paging indication from MAC for cellId[%d]",\
+ pageInd->cellId);
+
+ /* Fetch Cell CB */
+ for(cellIdx = 0; cellIdx < MAX_NUM_CELL; cellIdx++)
+ {
+ if((schCb[inst].cells[cellIdx]) && (schCb[inst].cells[cellIdx]->cellId == pageInd->cellId))
+ {
+ cellCb = schCb[inst].cells[cellIdx];
+ break;
+ }
+ }
+ if(cellCb)
+ {
+ if(pageInd->i_s > cellCb->cellCfg.sib1SchCfg.pageCfg.numPO)
+ {
+ DU_LOG("\nERROR --> SCH : MacSchPagingInd(): i_s should not be greater than number of paging occasion");
+ }
+ else
+ {
+ SCH_ALLOC(pageInfo, sizeof(SchPageInfo));
+ if(pageInfo)
+ {
+ pageInfo->pf = pageInd->pf;
+ pageInfo->i_s = pageInd->i_s;
+ pageInfo->pageTxTime.cellId = pageInd->cellId;
+ pageInfo->pageTxTime.sfn = (pageInd->pf + cellCb->pageCb.pagMonOcc[pageInd->i_s].frameOffset) % MAX_SFN;
+ pageInfo->pageTxTime.slot = cellCb->pageCb.pagMonOcc[pageInd->i_s].pagingOccSlot;
+ pageInfo->mcs = DEFAULT_MCS;
+ pageInfo->msgLen = pageInd->pduLen;
+ SCH_ALLOC(pageInfo->pagePdu, pageInfo->msgLen);
+ if(!pageInfo->pagePdu)
+ {
+ DU_LOG("\nERROR --> SCH : MacSchPagingInd(): Failed to allocate memory");
+ }
+ else
+ {
+ memcpy(pageInfo->pagePdu, pageInd->pagePdu, pageInfo->msgLen);
+ ret = schAddPagingIndtoList(&cellCb->pageCb.pageIndInfoRecord[pageInfo->pageTxTime.sfn], pageInfo);
+ if(ret != ROK)
+ {
+ DU_LOG("\nERROR --> SCH : MacSchPagingInd(): Failed to store paging record");
+ }
+ }
+ }
+ else
+ {
+ DU_LOG("\nERROR --> SCH : MacSchPagingInd(): Failed to allocate memory");
+ }
+ }
+ }
+ else
+ {
+ DU_LOG("\nERROR --> SCH : Cell ID [%d] not found", pageInd->cellId);
+ }
+ SCH_FREE(pageInd->pagePdu, pageInd->pduLen);
+ SCH_FREE(pageInd, sizeof(SchPageInd));
+ }
+ else
+ {
+ DU_LOG("\nERROR --> SCH : MacSchPagingInd(): Received null pointer");
+ }
+ return ret;
+}
/**********************************************************************
End of file
**********************************************************************/