SsbInfo ssbInfo;
schDlSlotInfo = cell->schDlSlotInfo[slot];
+
if(dlBrdcstAlloc->ssbTrans)
{
- ssbStartPrb = cell->cellCfg.ssbSchCfg.ssbOffsetPointA;
+ ssbStartPrb = cell->cellCfg.ssbSchCfg.ssbOffsetPointA; //+Kssb
ssbStartSymb = cell->ssbStartSymbArr[dlBrdcstAlloc->ssbIdxSupported-1]; /*since we are
- supporting only 1 ssb beam */
+ supporting only 1 ssb beam */
/* Assign interface structure */
for(idx=0; idx<dlBrdcstAlloc->ssbIdxSupported; idx++)
{
- ssbInfo.ssbIdx = idx;
- ssbInfo.fdAlloc.startPrb = ssbStartPrb;
- ssbInfo.fdAlloc.numPrb = SCH_SSB_NUM_PRB;
- ssbInfo.tdAlloc.startSymb = ssbStartSymb;
- ssbInfo.tdAlloc.numSymb = SCH_SSB_NUM_SYMB;
- dlBrdcstAlloc->ssbInfo[idx] = ssbInfo;
- schDlSlotInfo->ssbInfo[idx] = ssbInfo;
+ ssbInfo.ssbIdx = idx;
+ ssbInfo.fdAlloc.startPrb = ssbStartPrb;
+ ssbInfo.fdAlloc.numPrb = SCH_SSB_NUM_PRB;
+ ssbInfo.tdAlloc.startSymb = ssbStartSymb;
+ ssbInfo.tdAlloc.numSymb = SCH_SSB_NUM_SYMB;
+ dlBrdcstAlloc->ssbInfo[idx] = ssbInfo;
+ schDlSlotInfo->ssbInfo[idx] = ssbInfo;
}
schDlSlotInfo->ssbPres = true;
schDlSlotInfo->ssbIdxSupported = dlBrdcstAlloc->ssbIdxSupported;
for(idx=ssbStartSymb; idx<ssbStartSymb+SCH_SSB_NUM_SYMB; idx++)
{
- schDlSlotInfo->assignedPrb[idx] = ssbStartPrb + SCH_SSB_NUM_PRB + 1; /* +1 for kSsb */
+ schDlSlotInfo->assignedPrb[idx] = ssbStartPrb + SCH_SSB_NUM_PRB + 1; /* +1 for kSsb */
}
}
numSib1Prb = schCalcNumPrb(tbSize,mcs,numPdschSymbols);
for(idx=0; idx<SCH_SYMBOL_PER_SLOT; idx++)
{
- schDlSlotInfo->assignedPrb[idx] = ssbStartPrb + SCH_SSB_NUM_PRB + 1 + numSib1Prb; /* 10 PRBs for sib1 */
+ schDlSlotInfo->assignedPrb[idx] = ssbStartPrb + SCH_SSB_NUM_PRB + 1 + numSib1Prb; /* 10 PRBs for sib1 */
}
memcpy(&dlBrdcstAlloc->sib1Alloc.bwp, &cell->cellCfg.sib1SchCfg.bwp, sizeof(BwpCfg));
memcpy(&dlBrdcstAlloc->sib1Alloc.sib1PdcchCfg, &cell->cellCfg.sib1SchCfg.sib1PdcchCfg, sizeof(PdcchCfg));
memcpy(&dlBrdcstAlloc->sib1Alloc.sib1PdschCfg, &cell->cellCfg.sib1SchCfg.sib1PdschCfg, sizeof(PdschCfg));
+ dlBrdcstAlloc->sib1Alloc.sib1PdcchCfg.dci.pdschCfg = &dlBrdcstAlloc->sib1Alloc.sib1PdschCfg;
}
return ROK;
}
uint8_t prachOcas = 0;
uint8_t dataType = 0;
uint8_t idx = 0;
+ uint8_t subFrame = 0;
SchUlSlotInfo *schUlSlotInfo = NULLP;
puschScs = cell->cellCfg.schInitialUlBwp.bwp.scs;
if((prachOccasionTimingInfo.sfn%x) == y)
{
+#ifdef NR_TDD
+ subFrame = prachOccasionTimingInfo.slot/2;
+#else
+ subFrame = prachOccasionTimingInfo.slot;
+#endif
/* check for subFrame number */
- if ((1 << prachOccasionTimingInfo.slot) & prachSubframe)
+ if ((1 << subFrame) & prachSubframe)
{
- /* prach ocassion present in this subframe */
-
- prachFormat = prachCfgIdxTable[prachCfgIdx][0];
- prachStartSymbol = prachCfgIdxTable[prachCfgIdx][4];
- prachOcas = prachCfgIdxTable[prachCfgIdx][6];
-
- /* freq domain resource determination for RACH*/
- freqStart = cell->cellCfg.schRachCfg.msg1FreqStart;
- /* numRa determined as 𝑛 belonging {0,1,.., M − 1},
- * where M is given by msg1Fdm */
- numRa = (cell->cellCfg.schRachCfg.msg1Fdm - 1);
- for(idx=0; idx<MAX_RACH_NUM_RB_IDX; idx++)
- {
- if(numRbForPrachTable[idx][0] == cell->cellCfg.schRachCfg.rootSeqLen)
+ /* prach ocassion present in this subframe */
+#ifdef NR_TDD
+ if(UL_SLOT != schGetSlotSymbFrmt(prachOccasionTimingInfo.slot%cell->numSlotsInPeriodicity,\
+ cell->slotFrmtBitMap))
+ {
+ DU_LOG("\nERROR --> SCH : PrachCfgIdx %d doesn't support UL slot", prachCfgIdx);
+ }
+ else
+#endif
+ {
+ prachFormat = prachCfgIdxTable[prachCfgIdx][0];
+ prachStartSymbol = prachCfgIdxTable[prachCfgIdx][4];
+ prachOcas = prachCfgIdxTable[prachCfgIdx][6];
+
+ /* freq domain resource determination for RACH*/
+ freqStart = cell->cellCfg.schRachCfg.msg1FreqStart;
+ /* numRa determined as 𝑛 belonging {0,1,.., M − 1},
+ * where M is given by msg1Fdm */
+ numRa = (cell->cellCfg.schRachCfg.msg1Fdm - 1);
+ for(idx=0; idx<MAX_RACH_NUM_RB_IDX; idx++)
+ {
+ if(numRbForPrachTable[idx][0] == cell->cellCfg.schRachCfg.rootSeqLen)
+ {
+ if(numRbForPrachTable[idx][1] == cell->cellCfg.schRachCfg.prachSubcSpacing)
+ {
+ if(numRbForPrachTable[idx][2] == puschScs)
+ {
+ break;
+ }
+ }
+ }
+ }
+ numPrachRb = numRbForPrachTable[idx][3];
+ dataType |= SCH_DATATYPE_PRACH;
+ /* Considering first slot in the frame for PRACH */
+ idx = 0;
+ schUlSlotInfo->assignedPrb[idx] = freqStart+numPrachRb;
+ }
+ ulSchedInfo->dataType = dataType;
+ /* prach info */
+ ulSchedInfo->prachSchInfo.numPrachOcas = prachOcas;
+ ulSchedInfo->prachSchInfo.prachFormat = prachFormat;
+ ulSchedInfo->prachSchInfo.numRa = numRa;
+ ulSchedInfo->prachSchInfo.prachStartSymb = prachStartSymbol;
+ DU_LOG("\nINFO --> SCH : RACH occassion set for slot %d", prachOccasionTimingInfo.slot);
+ }
+ }
+}
+
+
+/**
+ * @brief Function to fill Pucch Format 0
+ *
+ * @details
+ *
+ * Function : fillPucchFormat0
+ *
+ * Function to fill Pucch format 0
+ *
+ * @param[in] SchPucchInfo pointer, SchPucchResrcInfo pointer
+ * @return void
+ **/
+
+void fillPucchFormat0(SchPucchInfo *ulSchedPucch, SchPucchResrcInfo *resrcInfo)
+{
+ if(resrcInfo->SchPucchFormat.format0)
+ {
+ ulSchedPucch->fdAlloc.numPrb = PUCCH_NUM_PRB_FORMAT_0_1_4;
+ ulSchedPucch->pucchFormat = PUCCH_FORMAT_0;
+ ulSchedPucch->initialCyclicShift = resrcInfo->SchPucchFormat.format0->initialCyclicShift;
+ ulSchedPucch->tdAlloc.numSymb = resrcInfo->SchPucchFormat.format0->numSymbols;
+ ulSchedPucch->tdAlloc.startSymb = resrcInfo->SchPucchFormat.format0->startSymbolIdx;
+ }
+}
+
+/**
+ * @brief Function to fill Pucch Format 1
+ *
+ * @details
+ *
+ * Function : fillPucchFormat1
+ *
+ * Function to fill Pucch format 1
+ *
+ * @param[in] SchPucchInfo pointer, SchPucchResrcInfo pointer
+ * @return void
+ **/
+
+void fillPucchFormat1(SchPucchInfo *ulSchedPucch, SchPucchResrcInfo *resrcInfo)
+{
+ if(resrcInfo->SchPucchFormat.format1)
+ {
+ ulSchedPucch->fdAlloc.numPrb = PUCCH_NUM_PRB_FORMAT_0_1_4;
+ ulSchedPucch->pucchFormat = PUCCH_FORMAT_1;
+ ulSchedPucch->initialCyclicShift = resrcInfo->SchPucchFormat.format1->initialCyclicShift;
+ ulSchedPucch->tdAlloc.numSymb = resrcInfo->SchPucchFormat.format1->numSymbols;
+ ulSchedPucch->tdAlloc.startSymb = resrcInfo->SchPucchFormat.format1->startSymbolIdx;
+ ulSchedPucch->timeDomOCC = resrcInfo->SchPucchFormat.format1->timeDomOCC;
+ }
+}
+
+/**
+ * @brief Function to fill Pucch format for UL Sched Info
+ *
+ * @details
+ *
+ * Function : fillUlSchedPucchFormat
+ *
+ * Function to fill Pucch format for UL Sched Info
+ *
+ * @param[in] pucchFormat , SchPucchInfo pointer,
+ * @param[in] SchPucchFormatCfg pointer, SchPucchResrcInfo pointer
+ * @return void
+ **/
+
+uint8_t fillUlSchedPucchFormat(uint8_t pucchFormat, SchPucchInfo *ulSchedPucch,\
+ SchPucchResrcInfo *resrcInfo, SchPucchFormatCfg *formatCfg)
+{
+ uint8_t ret = ROK;
+
+ switch(pucchFormat)
+ {
+ case PUCCH_FORMAT_0:
+ {
+ if(resrcInfo)
+ fillPucchFormat0(ulSchedPucch, resrcInfo);
+ return ret;
+ }
+ case PUCCH_FORMAT_1:
+ {
+ if(resrcInfo)
{
- if(numRbForPrachTable[idx][1] == cell->cellCfg.schRachCfg.prachSubcSpacing)
- {
- if(numRbForPrachTable[idx][2] == puschScs)
- {
- break;
- }
- }
+ fillPucchFormat1(ulSchedPucch, resrcInfo);
}
- }
- numPrachRb = numRbForPrachTable[idx][3];
- dataType |= SCH_DATATYPE_PRACH;
- /* Considering first slot in the frame for PRACH */
- idx = 0;
- schUlSlotInfo->assignedPrb[idx] = freqStart+numPrachRb;
+ if(formatCfg)
+ {
+ memcpy(&ulSchedPucch->cmnFormatCfg, formatCfg, sizeof(SchPucchFormatCfg));
+ }
+ return ret;
+ }/* To Add support for more Pucch Format */
+
+ default:
+ DU_LOG("\nERROR --> SCH : Invalid PUCCH format[%d] in fillUlSchedPucchFormatCfg()", pucchFormat);
+ ret = RFAILED;
+ return ret;
+ }
+ return ret;
+}
+
+/**
+ * @brief Function to fill Pucch Dedicated Cfg for UL Sched Info
+ *
+ * @details
+ *
+ * Function : fillUlSchedPucchDedicatedCfg
+ *
+ * Function to fill Pucch Dedicated Cfg for UL Sched Info
+ *
+ * @param[in] pucchFormat to be filled
+ * @param[in] SchPucchFormatCfg pointer, SchPucchCfg pointer
+ * @return void
+ **/
+
+uint8_t fillUlSchedPucchDedicatedCfg(uint16_t numSlots, SchPucchCfg *pucchDedCfg,\
+ SlotIndInfo *slotInfo, SchPucchInfo *ulSchedPucch)
+{
+ uint8_t ret, resrcSetIdx, resrcIdx, schedReqIdx, srPeriodicity = 0;
+ uint16_t srOffset = 0;
+
+ ret = ROK;
+ if(pucchDedCfg->resrcSet && pucchDedCfg->resrc)
+ {
+ //Assuming one entry in the list
+ for(resrcSetIdx = 0; resrcSetIdx < pucchDedCfg->resrcSet->resrcSetToAddModListCount; resrcSetIdx++)
+ {
+ for(resrcIdx = 0; resrcIdx < pucchDedCfg->resrc->resrcToAddModListCount; resrcIdx++)
+ {
+ if(pucchDedCfg->resrcSet->resrcSetToAddModList[resrcSetIdx].resrcList[resrcSetIdx] ==\
+ pucchDedCfg->resrc->resrcToAddModList[resrcIdx].resrcId)
+ {
+ ulSchedPucch->intraFreqHop = pucchDedCfg->resrc->resrcToAddModList[resrcIdx].intraFreqHop;
+ ulSchedPucch->secondPrbHop = pucchDedCfg->resrc->resrcToAddModList[resrcIdx].secondPrbHop;
+ ulSchedPucch->fdAlloc.startPrb = pucchDedCfg->resrc->resrcToAddModList[resrcIdx].startPrb;
+ ulSchedPucch->pucchFormat = pucchDedCfg->resrc->resrcToAddModList[resrcIdx].pucchFormat;
+ ret = fillUlSchedPucchFormat(ulSchedPucch->pucchFormat, ulSchedPucch,\
+ &pucchDedCfg->resrc->resrcToAddModList[resrcIdx], NULLP);
+ if(ret == RFAILED)
+ return ret;
+ }
+ }
}
- ulSchedInfo->dataType = dataType;
- /* prach info */
- ulSchedInfo->prachSchInfo.numPrachOcas = prachOcas;
- ulSchedInfo->prachSchInfo.prachFormat = prachFormat;
- ulSchedInfo->prachSchInfo.numRa = numRa;
- ulSchedInfo->prachSchInfo.prachStartSymb = prachStartSymbol;
}
+ if(pucchDedCfg->format1)
+ {
+ memset(&ulSchedPucch->cmnFormatCfg, 0, sizeof(SchPucchFormatCfg));
+ ret = fillUlSchedPucchFormat(ulSchedPucch->pucchFormat, ulSchedPucch, NULLP, pucchDedCfg->format1);
+ if(ret == RFAILED)
+ return ret;
+ }
+
+ /* setting SR and UCI flag */
+ if(pucchDedCfg->schedReq)
+ {
+ for(schedReqIdx = 0; schedReqIdx < pucchDedCfg->schedReq->schedAddModListCount; schedReqIdx++)
+ {
+ srPeriodicity = pucchDedCfg->schedReq->schedAddModList[schedReqIdx].periodicity;
+ srOffset = pucchDedCfg->schedReq->schedAddModList[schedReqIdx].offset;
+ break;
+ }
+ if(((numSlots * slotInfo->sfn + slotInfo->slot - srOffset) % srPeriodicity) == 0)
+ {
+ ulSchedPucch->srFlag = true;
+ ulSchedPucch->uciFlag = true;
+ }
+ }
+ return ret;
}
+/**
+ * @brief Function to fill Pucch Resource Info
+ *
+ * @details
+ *
+ * Function : fillPucchResourceInfo
+ *
+ * Function to fill Pucch Resource Info
+ *
+ * @param[in] SchPucchInfo *schPucchInfo, Inst inst
+ * @return ROK/RFAILED
+ **/
+
uint16_t fillPucchResourceInfo(SchPucchInfo *schPucchInfo, Inst inst)
{
- /* derive pucchResourceSet from schCellCfg */
+ uint8_t ret = ROK, ueIdx = 0, pucchIdx = 0;
SchCellCb *cell = schCb[inst].cells[inst];
- SchPucchCfgCmn *pucchCfg = &cell->cellCfg.schInitialUlBwp.pucchCommon;
- uint8_t pucchIdx = pucchCfg->pucchResourceCommon;
- SchBwpParams *ulBwp = &cell->cellCfg.schInitialUlBwp.bwp;
-
- schPucchInfo->fdAlloc.startPrb = ulBwp->freqAlloc.startPrb + pucchResourceSet[pucchIdx][3];
- schPucchInfo->fdAlloc.numPrb = PUCCH_NUM_PRB_FORMAT_0;
- schPucchInfo->tdAlloc.startSymb = pucchResourceSet[pucchIdx][1];
- schPucchInfo->tdAlloc.numSymb = pucchResourceSet[pucchIdx][2];
- schPucchInfo->pucchFormat = pucchResourceSet[pucchIdx][0];
+ SchPucchCfgCmn *pucchCfg = NULLP;
+ SchBwpParams *ulBwp = NULLP;
+ GET_UE_IDX(schPucchInfo->rnti, ueIdx);
+ if(cell->ueCb[ueIdx].ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfgPres)
+ {
+ /* fill pucch dedicated cfg */
+ ret = fillUlSchedPucchDedicatedCfg(cell->numSlots,\
+ &cell->ueCb[ueIdx].ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfg, &cell->slotInfo, schPucchInfo);
+ if(ret == RFAILED)
+ {
+ memset(schPucchInfo, 0, sizeof(SchPucchInfo));
+ DU_LOG("\nERROR --> SCH : Filling PUCCH dedicated cfg failed at fillPucchResourceInfo()");
+ return ret;
+ }
+ }
+ else
+ {
+ /* fill pucch common cfg */
+ /* derive pucchResourceSet from schCellCfg */
+ pucchCfg = &cell->cellCfg.schInitialUlBwp.pucchCommon;
+ pucchIdx = pucchCfg->pucchResourceCommon;
+ ulBwp = &cell->cellCfg.schInitialUlBwp.bwp;
+ schPucchInfo->fdAlloc.startPrb = ulBwp->freqAlloc.startPrb + pucchResourceSet[pucchIdx][3];
+ schPucchInfo->fdAlloc.numPrb = PUCCH_NUM_PRB_FORMAT_0_1_4;
+ schPucchInfo->tdAlloc.startSymb = pucchResourceSet[pucchIdx][1];
+ schPucchInfo->tdAlloc.numSymb = pucchResourceSet[pucchIdx][2];
+ schPucchInfo->pucchFormat = pucchResourceSet[pucchIdx][0];
+
+ /* set SR and UCI flag to false */
+ schPucchInfo->srFlag = true;
+ schPucchInfo->uciFlag = true;
+ }
/* set HARQ flag to true */
schPucchInfo->harqFlag = true;
schPucchInfo->numHarqBits = 1; /* 1 bit for HARQ */
- /* set SR and UCI flag to false */
- schPucchInfo->srFlag = true;
- schPucchInfo->uciFlag = true;
-
return ROK;
}
memset(&ulSchedInfo, 0, sizeof(UlSchedInfo));
/* add PHY delta */
- ADD_DELTA_TO_TIME(cell->slotInfo,ulTimingInfo,PHY_DELTA+SCHED_DELTA);
+ ADD_DELTA_TO_TIME(cell->slotInfo,ulTimingInfo,PHY_DELTA_UL+SCHED_DELTA);
ulSchedInfo.cellId = cell->cellId;
ulSchedInfo.slotIndInfo.cellId = ulSchedInfo.cellId;
ulSchedInfo.slotIndInfo.slot = ulTimingInfo.slot;
/* Schedule resources for PRACH */
- schPrachResAlloc(cell, &ulSchedInfo, ulTimingInfo);
+ if(cell->firstSib1Transmitted)
+ schPrachResAlloc(cell, &ulSchedInfo, ulTimingInfo);
schUlSlotInfo = cell->schUlSlotInfo[ulTimingInfo.slot];
if(schUlSlotInfo->schPuschInfo)
ret = sendUlSchInfoToMac(&ulSchedInfo, schInst);
if(ret != ROK)
{
- DU_LOG("\nSending UL Sch info from SCH to MAC failed");
+ DU_LOG("\nERROR --> SCH : Sending UL Sch info from SCH to MAC failed");
}
schInitUlSlot(schUlSlotInfo);
* RFAILED - failure
*
* ****************************************************************/
-uint8_t schDlRsrcAllocMsg4(DlMsgAlloc *msg4Alloc, SchCellCb *cell, uint16_t slot)
+uint8_t schDlRsrcAllocMsg4(DlMsgAlloc *msg4Alloc, SchCellCb *cell, uint16_t slot, bool ssbPresent, bool sib1Present)
{
uint8_t coreset0Idx = 0;
uint8_t numRbs = 0;
uint8_t offsetPointA;
uint8_t FreqDomainResource[6] = {0};
uint16_t tbSize = 0;
- uint8_t numPdschSymbols = 12; /* considering pdsch region from 2 to 13 */
- uint8_t mcs = 4; /* MCS fixed to 4 */
+ uint8_t numPdschSymbols = 11; /* considering pdsch region from 3 to 13 */
+ uint8_t mcs = 4; /* MCS fixed to 4 */
SchBwpDlCfg *initialBwp;
+ FreqDomainAlloc *sib1PdschFreqAlloc = NULL;
PdcchCfg *pdcch = &msg4Alloc->dlMsgPdcchCfg;
PdschCfg *pdsch = &msg4Alloc->dlMsgPdschCfg;
pdsch->codeword[cwCount].mcsIndex = mcs; /* mcs configured to 4 */
pdsch->codeword[cwCount].mcsTable = 0; /* notqam256 */
pdsch->codeword[cwCount].rvIndex = 0;
- /* 38.214: Table 5.1.3.2-1, divided by 8 to get the value in bytes */
- /* TODO : Calculate tbSize based of DL CCCH msg size */
- tbSize = schCalcTbSize(2664/8); /* send this value to the func in bytes when considering msg4 size */
+ tbSize = schCalcTbSize(msg4Alloc->dlMsgInfo.dlMsgPduLen + TX_PAYLOAD_HDR_LEN); /* MSG4 size + FAPI header size*/
pdsch->codeword[cwCount].tbSize = tbSize;
}
pdsch->dataScramblingId = cell->cellCfg.phyCellId;
pdsch->numLayers = 1;
pdsch->transmissionScheme = 0;
pdsch->refPoint = 0;
- pdsch->dmrs.dlDmrsSymbPos = 2;
+ pdsch->dmrs.dlDmrsSymbPos = 4; /* Bitmap value 00000000000100 i.e. using 3rd symbol for PDSCH DMRS */
pdsch->dmrs.dmrsConfigType = 0; /* type-1 */
pdsch->dmrs.dlDmrsScramblingId = cell->cellCfg.phyCellId;
pdsch->dmrs.scid = 0;
pdsch->dmrs.nrOfDmrsSymbols = NUM_DMRS_SYMBOLS;
pdsch->dmrs.dmrsAddPos = DMRS_ADDITIONAL_POS;
pdsch->pdschFreqAlloc.resourceAllocType = 1; /* RAT type-1 RIV format */
- /* the RB numbering starts from coreset0, and PDSCH is always above SSB */
- pdsch->pdschFreqAlloc.freqAlloc.startPrb = offset + SCH_SSB_NUM_PRB;
- pdsch->pdschFreqAlloc.freqAlloc.numPrb = schCalcNumPrb(tbSize,mcs,numPdschSymbols);
+ /* The RB numbering starts from coreset0 */
+ pdsch->pdschFreqAlloc.freqAlloc.startPrb = PDSCH_START_RB;
+ if(ssbPresent)
+ {
+ /* PDSCH is always above SSB */
+ pdsch->pdschFreqAlloc.freqAlloc.startPrb = offsetPointA + SCH_SSB_NUM_PRB + 1;
+ }
+ if(sib1Present)
+ {
+ /* Must not overlap with SIB1 */
+ sib1PdschFreqAlloc = &cell->cellCfg.sib1SchCfg.sib1PdschCfg.pdschFreqAlloc.freqAlloc;
+ pdsch->pdschFreqAlloc.freqAlloc.startPrb = sib1PdschFreqAlloc->startPrb + sib1PdschFreqAlloc->numPrb + 1;
+ }
+ pdsch->pdschFreqAlloc.freqAlloc.numPrb = schCalcNumPrb(tbSize, mcs, numPdschSymbols);
pdsch->pdschFreqAlloc.vrbPrbMapping = 0; /* non-interleaved */
- pdsch->pdschTimeAlloc.timeAlloc.startSymb = 2; /* spec-38.214, Table 5.1.2.1-1 */
- pdsch->pdschTimeAlloc.timeAlloc.numSymb = 12;
+ pdsch->pdschTimeAlloc.timeAlloc.startSymb = 3; /* spec-38.214, Table 5.1.2.1-1 */
+ pdsch->pdschTimeAlloc.timeAlloc.numSymb = numPdschSymbols;
pdsch->beamPdschInfo.numPrgs = 1;
pdsch->beamPdschInfo.prgSize = 1;
pdsch->beamPdschInfo.digBfInterfaces = 0;
pdsch->txPdschPower.powerControlOffsetSS = 0;
pdcch->dci.pdschCfg = pdsch;
+
return ROK;
}
-
-uint16_t schAllocPucchResource(SchCellCb *cell,uint16_t crnti, uint16_t slot)
+
+uint16_t schAllocPucchResource(SchCellCb *cell, uint16_t crnti, uint16_t slot)
{
- uint8_t k1 = 1; /* dl-DataToUL-ACK RRC parameter will received from DU-APP msg4-pucch config */
- uint16_t pucchSlot = (slot + k1) % SCH_NUM_SLOTS;
+ uint8_t k1 = SCH_DEFAULT_K1, ueIdx = 0, dlToUlAckIdx;
+ uint16_t pucchSlot = 0;
SchUlSlotInfo *schUlSlotInfo = NULLP;
+ SchPucchCfg *schPucchCfg = NULLP;
+ GET_UE_IDX(crnti, ueIdx);
+ if(cell->ueCb[ueIdx].ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfgPres)
+ {
+ schPucchCfg = &(cell->ueCb[ueIdx].ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfg);
+ if(schPucchCfg->dlDataToUlAck)
+ {
+ for(dlToUlAckIdx = 0; dlToUlAckIdx < schPucchCfg->dlDataToUlAck->dlDataToUlAckListCount; dlToUlAckIdx++)
+ {
+ //For now considering only the first value in the list
+ k1 = schPucchCfg->dlDataToUlAck->dlDataToUlAckList[dlToUlAckIdx];
+ break;
+ }
+ }
+ }
+
+ pucchSlot = (slot + k1) % cell->numSlots;
schUlSlotInfo = cell->schUlSlotInfo[pucchSlot];
memset(&schUlSlotInfo->schPucchInfo, 0, sizeof(SchPucchInfo));
*
* ****************************************************************/
uint8_t schDlRsrcAllocDlMsg(DlMsgAlloc *dlMsgAlloc, SchCellCb *cell, uint16_t crnti,
- uint16_t accumalatedSize, uint16_t slot)
+ uint32_t *accumalatedSize, uint16_t slot)
{
uint8_t ueIdx;
uint16_t tbSize = 0;
- uint8_t numPdschSymbols = 12; /* considering pdsch region from 2 to 13 */
- uint8_t mcs = 4; /* MCS fixed to 4 */
PdcchCfg *pdcch = NULLP;
PdschCfg *pdsch = NULLP;
BwpCfg *bwp = NULLP;
for(cwCount = 0; cwCount < pdsch->numCodewords; cwCount++)
{
pdsch->codeword[cwCount].targetCodeRate = 308;
- pdsch->codeword[cwCount].qamModOrder = 2;
- pdsch->codeword[cwCount].mcsIndex = 4; /* mcs configured to 4 */
- pdsch->codeword[cwCount].mcsTable = 0; /* notqam256 */
+ pdsch->codeword[cwCount].qamModOrder = ueCb.ueCfg.dlModInfo.modOrder;
+ pdsch->codeword[cwCount].mcsIndex = ueCb.ueCfg.dlModInfo.mcsIndex;
+ pdsch->codeword[cwCount].mcsTable = ueCb.ueCfg.dlModInfo.mcsTable;
pdsch->codeword[cwCount].rvIndex = 0;
- tbSize = schCalcTbSize(accumalatedSize);
+ tbSize = schCalcTbSize(*accumalatedSize + TX_PAYLOAD_HDR_LEN);
+ if(tbSize < *accumalatedSize)
+ *accumalatedSize = tbSize - TX_PAYLOAD_HDR_LEN;
pdsch->codeword[cwCount].tbSize = tbSize;
}
pdsch->dataScramblingId = cell->cellCfg.phyCellId;
pdsch->numLayers = 1;
pdsch->transmissionScheme = 0;
pdsch->refPoint = 0;
- pdsch->dmrs.dlDmrsSymbPos = 2;
+ pdsch->dmrs.dlDmrsSymbPos = 4; /* Bitmap value 00000000000100 i.e. using 3rd symbol for PDSCH DMRS */
pdsch->dmrs.dmrsConfigType = 0; /* type-1 */
pdsch->dmrs.dlDmrsScramblingId = cell->cellCfg.phyCellId;
pdsch->dmrs.scid = 0;
pdsch->dmrs.nrOfDmrsSymbols = NUM_DMRS_SYMBOLS;
pdsch->dmrs.dmrsAddPos = pdschCfg.dmrsDlCfgForPdschMapTypeA.addPos;
pdsch->pdschFreqAlloc.resourceAllocType = 1; /* RAT type-1 RIV format */
- pdsch->pdschFreqAlloc.freqAlloc.startPrb = 1;
- pdsch->pdschFreqAlloc.freqAlloc.numPrb = schCalcNumPrb(tbSize,mcs,numPdschSymbols);
+ pdsch->pdschFreqAlloc.freqAlloc.startPrb = PDSCH_START_RB;
+ pdsch->pdschFreqAlloc.freqAlloc.numPrb = schCalcNumPrb(tbSize, ueCb.ueCfg.dlModInfo.mcsIndex, \
+ pdschCfg.timeDomRsrcAllociList[0].symbolLength);
pdsch->pdschFreqAlloc.vrbPrbMapping = 0; /* non-interleaved */
pdsch->pdschTimeAlloc.timeAlloc.startSymb = pdschCfg.timeDomRsrcAllociList[0].startSymbol;
pdsch->pdschTimeAlloc.timeAlloc.numSymb = pdschCfg.timeDomRsrcAllociList[0].symbolLength;