<PUCCH_GROUP_HOPPING>0</PUCCH_GROUP_HOPPING>
</PUCCH_CFG_COMMON>
<PUSCH_CFG_COMMON>
- <NUM_TIME_DOM_RSRC_ALLOC>2</NUM_TIME_DOM_RSRC_ALLOC>
+ <NUM_TIME_DOM_RSRC_ALLOC>3</NUM_TIME_DOM_RSRC_ALLOC>
<PUSCH_COMM_TIME_ALLOC_LIST>
<PUSCH_COMM_TIME_ALLOC>
<PUSCH_K2_CFG>4</PUSCH_K2_CFG>
<PUSCH_MAPPING_TYPE>0</PUSCH_MAPPING_TYPE>
- <PUSCH_START_SYMBOL>3</PUSCH_START_SYMBOL>
- <PUSCH_LENGTH_SYMBOL>11</PUSCH_LENGTH_SYMBOL>
+ <PUSCH_START_SYMBOL>10</PUSCH_START_SYMBOL>
+ <PUSCH_LENGTH_SYMBOL>3</PUSCH_LENGTH_SYMBOL>
+ </PUSCH_COMM_TIME_ALLOC>
+ <PUSCH_COMM_TIME_ALLOC>
+ <PUSCH_K2_CFG>4</PUSCH_K2_CFG>
+ <PUSCH_MAPPING_TYPE>0</PUSCH_MAPPING_TYPE>
+ <PUSCH_START_SYMBOL>10</PUSCH_START_SYMBOL>
+ <PUSCH_LENGTH_SYMBOL>3</PUSCH_LENGTH_SYMBOL>
</PUSCH_COMM_TIME_ALLOC>
<PUSCH_COMM_TIME_ALLOC>
<PUSCH_K2_CFG>5</PUSCH_K2_CFG>
<PUSCH_MAPPING_TYPE>0</PUSCH_MAPPING_TYPE>
- <PUSCH_START_SYMBOL>3</PUSCH_START_SYMBOL>
- <PUSCH_LENGTH_SYMBOL>11</PUSCH_LENGTH_SYMBOL>
+ <PUSCH_START_SYMBOL>10</PUSCH_START_SYMBOL>
+ <PUSCH_LENGTH_SYMBOL>3</PUSCH_LENGTH_SYMBOL>
</PUSCH_COMM_TIME_ALLOC>
</PUSCH_COMM_TIME_ALLOC_LIST>
</PUSCH_CFG_COMMON>
</E2AP_CFG>
<GLOBAL_CFG>
<RADIO_FRAME_DURATION>10</RADIO_FRAME_DURATION>
- <PHY_DELTA_DL>1</PHY_DELTA_DL>
+ <PHY_DELTA_DL>0</PHY_DELTA_DL>
<PHY_DELTA_UL>0</PHY_DELTA_UL>
<ODU_UE_THROUGHPUT_PRINT_TIME_INTERVAL>5</ODU_UE_THROUGHPUT_PRINT_TIME_INTERVAL>
<ODU_SNSSAI_THROUGHPUT_PRINT_TIME_INTERVAL>60000</ODU_SNSSAI_THROUGHPUT_PRINT_TIME_INTERVAL>
ulTtiReqPdu->pdu.pusch_pdu.puschData.tbSize = reverseBytes32(puschInfo->tbInfo.tbSize);
/* numCb is 0 for new transmission */
ulTtiReqPdu->pdu.pusch_pdu.puschData.numCb = reverseBytes16(0);
+ ulTtiReqPdu->pdu.pusch_pdu.maintParamV3.ldpcBaseGraph = 2;
+ ulTtiReqPdu->pdu.pusch_pdu.maintParamV3.tbSizeLbrmBytes = reverseBytes32(0);
#else
ulTtiReqPdu->pdu.pusch_pdu.puschData.tbSize = (puschInfo->tbInfo.tbSize);
/* numCb is 0 for new transmission */
uint8_t qam = 0;
uint8_t ssbIdx = 0;
uint8_t freqIdx = 0;
+ uint8_t numDmrsSymbol = 0;
PdcchCfg *pdcch;
PdschCfg *pdsch;
BwpCfg *bwp;
pdsch->pduIndex = 0;
pdsch->numCodewords = 1;
pdsch->pdschFreqAlloc.startPrb = 0;
+ pdsch->dmrs.dlDmrsSymbPos = DL_DMRS_SYMBOL_POS;
+ numDmrsSymbol = findNumDmrsSymbol(pdsch->dmrs.dlDmrsSymbPos);
for(cwCount = 0; cwCount < pdsch->numCodewords; cwCount++)
{
mcs = DEFAULT_MCS;
else
break;
}
- tbSize = (schCalcTbSizeFromNPrb(pdsch->pdschFreqAlloc.numPrb, mcs, 10, &targetCodeRate, &qam) >> 3);
+ tbSize = (schCalcTbSizeFromNPrb(pdsch->pdschFreqAlloc.numPrb, mcs, 10, numDmrsSymbol, &targetCodeRate, &qam) >> 3);
}while(sib1PduLen > tbSize);
pdsch->codeword[cwCount].targetCodeRate = targetCodeRate;
pdsch->numLayers = 1;
pdsch->transmissionScheme = 0;
pdsch->refPoint = 1;
- pdsch->dmrs.dlDmrsSymbPos = DL_DMRS_SYMBOL_POS;
pdsch->dmrs.dmrsConfigType = 0; /* type-1 */
pdsch->dmrs.dlDmrsScramblingId = pci;
pdsch->dmrs.scid = 0;
if((freePrbBlock->endPrb > prachEndPrb) && ((freePrbBlock->endPrb - prachEndPrb) >= numPrb))
{
/* If sufficient free PRBs are available above PRACH message then,
- * endPrb = freePrbBlock->endPrb
- * startPrb = endPrb - numPrb +1;
+ * startPrb = freeBlock's StartPrb;
*/
- *startPrb = freePrbBlock->endPrb - numPrb +1;
+ *startPrb = freePrbBlock->startPrb;
break;
}
else if((prachStartPrb > freePrbBlock->startPrb) && ((prachStartPrb - freePrbBlock->startPrb) >= numPrb))
freePrbNode = freePrbNode->next;
continue;
}
- *startPrb = freePrbBlock->endPrb - numPrb +1;
+ *startPrb = freePrbBlock->startPrb;
break;
}
}
uint16_t startRb = 0;
uint16_t numRb = 0;
uint16_t tbSize = 0;
- uint16_t msg3PduLen = 8; /* 6 bytes msg3 and 2 bytes header */
+ uint16_t msg3PduLen = 7; /*RRC Setup Req min size required as per Spec 38.331 RRCSetupReq */
uint16_t tgtCodeRate = 0;
uint8_t qam = 0;
tbSize = schCalcTbSizeFromNPrb(numRb, mcs, NUM_PDSCH_SYMBOL, NULLP, NULLP);
tbSize = tbSize / 8 ; /*bits to byte conversion*/
#else
- numRb = 1;
+ numRb = 0;
do
{
if(numRb < cell->cellCfg.ulCfgCommon.schInitialUlBwp.bwp.freqAlloc.numPrb)
else
break;
}
- tbSize = (schCalcTbSizeFromNPrb(numRb, mcs, NUM_PDSCH_SYMBOL, &tgtCodeRate, &qam) >> 3);
+ tbSize = (schCalcTbSizeFromNPrb(numRb, mcs, symbLen, 1, &tgtCodeRate, &qam) >> 3);
}while(tbSize < msg3PduLen);
#endif
{
k2Index = msg3K2InfoTbl->k2TimingInfo[rarSlot].k2Indexes[k2TblIdx];
k2 = cell->cellCfg.ulCfgCommon.schInitialUlBwp.puschCommon.timeDomRsrcAllocList[k2Index].k2;
-
/* Delta is added to the slot allocation for msg3 based on 38.214 section 6.1.2.1 */
k2 = k2 + msg3Delta;
+
if(k2 >= msg3MinSchTime)
{
ADD_DELTA_TO_TIME(rarTime, msg3Time, k2, cell->numSlots);
uint8_t coreset0Idx = 0;
uint8_t firstSymbol = 0, numSymbols = 0;
uint8_t mcs;
- uint8_t dmrsStartSymbol, startSymbol, numSymbol ;
+ uint8_t dmrsStartSymbol, numDmrsSymbol = 0, startSymbol, numSymbol ;
uint16_t numRbs = 0;
uint16_t tbSize = 0;
uint16_t offsetToPointA = 0;
pdsch->rnti = cell->raReq[ueId-1]->raRnti; /* RA-RNTI */
pdsch->pduIndex = 0;
pdsch->numCodewords = 1;
+ pdsch->dmrs.dlDmrsSymbPos = 2180;
+ numDmrsSymbol = findNumDmrsSymbol(pdsch->dmrs.dlDmrsSymbPos);
for(cwCount = 0; cwCount < pdsch->numCodewords; cwCount++)
{
rarPduLen = RAR_PAYLOAD_SIZE + TX_PAYLOAD_HDR_LEN;
else
break;
}
- tbSize = (schCalcTbSizeFromNPrb(pdsch->pdschFreqAlloc.numPrb, mcs, 13, &targetCodeRate, &qam) >> 3);
+ tbSize = (schCalcTbSizeFromNPrb(pdsch->pdschFreqAlloc.numPrb, mcs, 13, numDmrsSymbol, &targetCodeRate, &qam) >> 3);
}while(rarPduLen > tbSize);
pdsch->codeword[cwCount].targetCodeRate = targetCodeRate;
pdsch->numLayers = 1;
pdsch->transmissionScheme = 0;
pdsch->refPoint = 0;
- pdsch->dmrs.dlDmrsSymbPos = 2180;
pdsch->dmrs.dmrsConfigType = 0; /* type-1 */
pdsch->dmrs.dlDmrsScramblingId = cell->cellCfg.phyCellId;
pdsch->dmrs.scid = 0;
return position;
}
+/**
+ * @brief Function to find number of DMRS symbol in PDSCH
+ *
+ * @details
+ *
+ * Function: findNumDmrsSymbol
+ *
+ * This function finds number of DMRS symbol using DMRS symbol
+ * position bitmap.
+ *
+ * @param[in] DMRS symbol position bitmap
+ * @return Success : total Number of Symbols
+ * Failure : 0
+ **/
+uint8_t findNumDmrsSymbol(uint16_t dlDmrsSymbBitMap)
+{
+ uint8_t numDmrsSymb = 0,position = 0;
+ uint16_t mask = 1;
+
+ while(position < MAX_SYMB_PER_SLOT)
+ {
+ if(dlDmrsSymbBitMap & mask)
+ {
+ numDmrsSymb++;
+ }
+ mask = mask << 1;
+ position++;
+ }
+ return numDmrsSymb;
+}
/**
* @brief Function to add a node to a linked list
*
* @param[in] number of symbols
* @return tbSize
**/
-uint16_t schCalcTbSizeFromNPrb(uint16_t numPrb, uint16_t mcs, uint8_t numSymbols, uint16_t *targeCodeRate, uint8_t *qam)
+uint16_t schCalcTbSizeFromNPrb(uint16_t numPrb, uint16_t mcs, uint8_t numSymbols, uint8_t numDmrsSymbPerPrb, uint16_t *targeCodeRate, uint8_t *qam)
{
uint8_t qm = mcsTable[mcs][1];
uint16_t rValue = mcsTable[mcs][2];
uint32_t c = 0;
const uint8_t numLayer = 1;
const uint16_t numRbSc = 12;
- const uint16_t numDmrsRes = 36;
+ const uint16_t numDmrsRes = 12 * numDmrsSymbPerPrb;
+ uint32_t nTmp = 0;
// uint16_t numPrbOvrHead = 0;
/* formula used for calculation of rbSize, 38.214 section 5.1.3.2 *
if(nInfo <= 3824)
{
- n = MAX(3, (uint32_t)cmLog2(nInfo) - 6);
+ nTmp = (floor(cmLog2(nInfo)) >= 6) ? floor(cmLog2(nInfo)) - 6 : 0;
+ n = MAX(3, nTmp);
nInfoDash = MAX(24, (1<<n)*(nInfo/(1<<n)));
while(nInfoDash > tbSizeTable[tbsIndex])
{
/*Loop Exit: Either estPRB reaches the maxRB or TBS is found greater than equal to reqBO*/
do
{
- tbs = schCalcTbSizeFromNPrb(*estPrb, mcsIdx, numSymbols, NULLP, NULLP);
+ tbs = schCalcTbSizeFromNPrb(*estPrb, mcsIdx, numSymbols, 3, NULLP, NULLP);
/*TBS size calculated in above function is in Bits.
* So to convert it into Bytes , we right shift by 3.
/* Functions declarations : Resource allocation handler */
uint16_t schCalcTbSize(uint32_t payLoadSize);
uint16_t schCalcNumPrb(uint16_t tbSize, uint16_t mcs, uint8_t numSymbols);
-uint16_t schCalcTbSizeFromNPrb(uint16_t numPrb, uint16_t mcs, uint8_t numSymbols, uint16_t *targeCodeRate, uint8_t* qam);
+uint16_t schCalcTbSizeFromNPrb(uint16_t numPrb, uint16_t mcs, uint8_t numSymbols,\
+ uint8_t numDmrsSymbPerPrb, uint16_t *targeCodeRate, uint8_t* qam);
bool fillPrbBitmap(uint64_t *prbBitmap, uint16_t startPrb, uint16_t numPrb);
CmLList* isPrbAvailable(CmLListCp *freePrbBlockList, uint16_t startPrb, uint16_t numPrb);
void removeAllocatedPrbFromFreePrbList(CmLListCp *freePrbBlockList, CmLList *node, \
uint16_t startPrb, uint16_t numPrb);
uint8_t findDmrsStartSymbol(uint16_t dlDmrsSymbBitMap);
+uint8_t findNumDmrsSymbol(uint16_t dlDmrsSymbBitMap);
uint8_t updateLcListReqPRB(CmLListCp *lcLL, uint8_t lcId, uint32_t payloadSize);
uint32_t calculateEstimateTBSize(uint32_t reqBO, uint16_t mcsIdx,uint8_t numSymbols,\
- uint16_t maxPRB, uint16_t *estPrb);
+ uint16_t maxPRB, uint16_t *estPrb);
void deleteLcLL(CmLListCp *lcLL);
CmLList *schPageInfoSearchFromPageList(SlotTimingInfo slotInfo, CmLListCp *storedPageList);