uint16_t prachCfgIdxTable[MAX_PRACH_CONFIG_IDX][8];
uint16_t numRbForPrachTable[MAX_RACH_NUM_RB_IDX][5];
uint8_t pucchResourceSet[MAX_PUCCH_RES_SET_IDX][4];
+uint8_t puschDeltaTable[MAX_MU_PUSCH];
SchMacUlSchInfoFunc schMacUlSchInfoOpts[] =
{
* @param[in] UlSchedInfo *ulSchedInfo, UL scheduling info
* @return void
**/
-void schPrachResAlloc(SchCellCb *cell, UlSchedInfo *ulSchedInfo, SlotIndInfo prachOccasionTimingInfo)
+void schPrachResAlloc(SchCellCb *cell, UlSchedInfo *ulSchedInfo, SlotTimingInfo prachOccasionTimingInfo)
{
uint8_t puschScs;
uint8_t numPrachRb = 0;
**/
uint8_t fillUlSchedPucchDedicatedCfg(uint16_t numSlots, SchPucchCfg *pucchDedCfg,\
- SlotIndInfo *slotInfo, SchPucchInfo *ulSchedPucch)
+ SlotTimingInfo *slotInfo, SchPucchInfo *ulSchedPucch)
{
uint8_t ret, resrcSetIdx, resrcIdx, schedReqIdx, srPeriodicity = 0;
uint16_t srOffset = 0;
int ret = ROK;
UlSchedInfo ulSchedInfo;
SchUlSlotInfo *schUlSlotInfo = NULLP;
- SlotIndInfo ulTimingInfo;
+ SlotTimingInfo ulTimingInfo;
memset(&ulSchedInfo, 0, sizeof(UlSchedInfo));
/* add PHY delta */
void BuildK0K1TableForFdd(SchCellCb *cell, SchK0K1TimingInfoTbl *k0K1InfoTbl, bool pdschCfgCmnPres,SchPdschCfgCmn pdschCmnCfg,\
SchPdschConfig pdschDedCfg, uint8_t ulAckListCount, uint8_t *UlAckTbl)
{
- uint8_t k0TmpVal = 0, k1TmpVal =0, cfgIdx=0;
+
+ uint8_t k1TmpVal =0, cfgIdx=0;
uint8_t slotIdx=0, k0Index=0, k1Index=0, numK0=0, numK1=0, numTimeDomAlloc=0;
- SchPdschCfgCmnTimeDomRsrcAlloc cmnTimeDomRsrcAllocList[MAX_NUM_DL_ALLOC];
- SchPdschTimeDomRsrcAlloc dedTimeDomRsrcAllocList[MAX_NUM_DL_ALLOC];
+
+ /* TODO Commented these below lines for resolving warnings. Presently these variable are not
+ * required but this will require for harq processing */
+ // uint8_t k0TmpVal = 0;
+ // SchPdschCfgCmnTimeDomRsrcAlloc cmnTimeDomRsrcAllocList[MAX_NUM_DL_ALLOC];
+ // SchPdschTimeDomRsrcAlloc dedTimeDomRsrcAllocList[MAX_NUM_DL_ALLOC];
/* Initialization the structure and storing the total slot values. */
memset(k0K1InfoTbl, 0, sizeof(SchK0K1TimingInfoTbl));
numTimeDomAlloc = pdschCmnCfg.numTimeDomAlloc;
for(cfgIdx = 0; cfgIdx<numTimeDomAlloc; cfgIdx++)
{
- cmnTimeDomRsrcAllocList[cfgIdx] = pdschCmnCfg.timeDomRsrcAllocList[cfgIdx];
+ /*TODO uncomment this line during harq processing */
+ //cmnTimeDomRsrcAllocList[cfgIdx] = pdschCmnCfg.timeDomRsrcAllocList[cfgIdx];
}
}
else
numTimeDomAlloc = pdschDedCfg.numTimeDomRsrcAlloc;
for(cfgIdx = 0; cfgIdx<numTimeDomAlloc; cfgIdx++)
{
- dedTimeDomRsrcAllocList[cfgIdx] = pdschDedCfg.timeDomRsrcAllociList[cfgIdx];
+ /*TODO uncomment this line during harq processing */
+ //dedTimeDomRsrcAllocList[cfgIdx] = pdschDedCfg.timeDomRsrcAllociList[cfgIdx];
}
}
* As per 38.331 PDSCH-TimeDomainResourceAllocation field descriptions. */
for(k0Index = 0; ((k0Index < numTimeDomAlloc) && (k0Index < MAX_NUM_K0_IDX)); k0Index++)
{
+ /* TODO These if 0 we will remove during harq processing */
+#if 0
if(pdschCfgCmnPres == true)
{
k0TmpVal = cmnTimeDomRsrcAllocList[k0Index].k0;
k0TmpVal = DEFAULT_K0_VALUE;
}
}
-
+#endif
/* Checking all the Ul Alloc values. If value is less than MIN_NUM_K1_IDX
* then skip else continue storing the values. */
numK1 = 0;
#endif
}
}
+
+/*******************************************************************
+*
+* @brief Fills K2 information table for FDD
+*
+* @details
+*
+* Function : BuildK2InfoTableForFdd
+*
+* Functionality:
+* Fills K2 information table for FDD
+*
+* @params[in] SchCellCb *cell,SchPuschTimeDomRsrcAlloc timeDomRsrcAllocList[],
+* uint16_t puschSymTblSize,SchK2TimingInfoTbl *k2InfoTbl
+* @return ROK - success
+* RFAILED - failure
+*
+* ****************************************************************/
+void BuildK2InfoTableForFdd(SchCellCb *cell, SchPuschTimeDomRsrcAlloc timeDomRsrcAllocList[], uint16_t puschSymTblSize,\
+SchK2TimingInfoTbl *msg3K2InfoTbl, SchK2TimingInfoTbl *k2InfoTbl)
+{
+ uint16_t slotIdx=0, k2Index=0, k2TmpIdx=0, msg3K2TmpIdx=0;
+
+ /* Initialization the structure and storing the total slot values. */
+ memset(k2InfoTbl, 0, sizeof(SchK2TimingInfoTbl));
+ k2InfoTbl->tblSize = cell->numSlots;
+ if(msg3K2InfoTbl)
+ msg3K2InfoTbl->tblSize = cell->numSlots;
+
+ /* Checking all possible indexes for K2. */
+ for(slotIdx = 0; slotIdx < cell->numSlots; slotIdx++)
+ {
+ /* Storing K2 values. */
+ for(k2Index = 0; ((k2Index < puschSymTblSize) && (k2Index < MAX_NUM_K2_IDX)); k2Index++)
+ {
+ k2TmpIdx= k2InfoTbl->k2TimingInfo[slotIdx].numK2;
+ k2InfoTbl->k2TimingInfo[slotIdx].k2Indexes[k2TmpIdx] = k2Index;
+ k2InfoTbl->k2TimingInfo[slotIdx].numK2++;
+
+ /* Updating K2 values for MSG3 */
+ if(msg3K2InfoTbl)
+ {
+ msg3K2TmpIdx = msg3K2InfoTbl->k2TimingInfo[slotIdx].numK2;
+ msg3K2InfoTbl->k2TimingInfo[slotIdx].k2Indexes[msg3K2TmpIdx] = k2Index;
+ msg3K2InfoTbl->k2TimingInfo[slotIdx].numK2++;
+ }
+ }
+ }
+}
+
+/*******************************************************************
+ *
+ * @brief Fills K2 information table
+ *
+ * @details
+ *
+ * Function : BuildK2InfoTable
+ *
+ * Functionality:
+ * Fills K2 information table
+ *
+ * @params[in] SchCellCb *cell,SchPuschTimeDomRsrcAlloc timeDomRsrcAllocList[],
+ * uint16_t puschSymTblSize, SchK2TimingInfoTbl *k2InfoTbl
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+void BuildK2InfoTable(SchCellCb *cell, SchPuschTimeDomRsrcAlloc timeDomRsrcAllocList[], uint16_t puschSymTblSize,\
+SchK2TimingInfoTbl *msg3K2InfoTbl, SchK2TimingInfoTbl *k2InfoTbl)
+{
+
+#ifdef NR_TDD
+ bool dlSymbolPresent = false;
+ uint8_t slotIdx=0, k2Index=0, k2Val=0, k2TmpVal=0, msg3K2TmpVal=0, msg3Delta=0, numK2 =0, currentSymbol =0;
+ uint8_t startSymbol =0, endSymbol =0, checkSymbol=0, totalCfgSlot=0, slotCfg=0;
+ SlotConfig currentSlot;
+#endif
+
+ if(cell->cellCfg.dupMode == DUPLEX_MODE_FDD)
+ {
+ BuildK2InfoTableForFdd(cell, timeDomRsrcAllocList, puschSymTblSize, msg3K2InfoTbl, k2InfoTbl);
+ }
+ else
+ {
+#ifdef NR_TDD
+
+ /* Initialization the structure and storing the total slot values. */
+ memset(k2InfoTbl, 0, sizeof(SchK2TimingInfoTbl));
+ k2InfoTbl->tblSize = cell->numSlots;
+ if(msg3K2InfoTbl)
+ msg3K2InfoTbl->tblSize = cell->numSlots;
+ totalCfgSlot = calculateSlotPatternLength(cell->cellCfg.ssbSchCfg.scsCommon, cell->cellCfg.tddCfg.tddPeriod);
+
+ /* Checking all possible indexes for K2. */
+ for(slotIdx = 0; slotIdx < cell->numSlots; slotIdx++)
+ {
+ currentSlot = schGetSlotSymbFrmt(slotIdx % totalCfgSlot, cell->slotFrmtBitMap);
+
+ /* If current slot is UL then skip because PDCCH is sent only in DL slots */
+ if(currentSlot != UL_SLOT)
+ {
+ for(k2Index = 0; ((k2Index < puschSymTblSize) && (k2Index < MAX_NUM_K2_IDX)); k2Index++)
+ {
+ /* Storing k2, startSymbol, endSymbol information for further processing.
+ * If k2 is absent then fill the default values given in spec 38.331
+ * PUSCH-TimeDomainResourceAllocationList field descriptions */
+ k2Val = timeDomRsrcAllocList[k2Index].k2;
+ if(!k2Val)
+ {
+ switch(cell->cellCfg.ssbSchCfg.scsCommon)
+ {
+ case SCS_15KHZ:
+ k2Val = DEFAULT_K2_VALUE_FOR_SCS15;
+ break;
+ case SCS_30KHZ:
+ k2Val = DEFAULT_K2_VALUE_FOR_SCS30;
+ break;
+ case SCS_60KHZ:
+ k2Val = DEFAULT_K2_VALUE_FOR_SCS60;
+ break;
+ case SCS_120KHZ:
+ k2Val = DEFAULT_K2_VALUE_FOR_SCS120;
+ break;
+ }
+ }
+
+ /* Current slot + k2 should be either UL or FLEXI slot.
+ * If slot is FLEXI then check all the symbols of that slot,
+ * it should not contain any DL or FLEXI slot */
+ k2TmpVal = (slotIdx + k2Val) % totalCfgSlot;
+ slotCfg = schGetSlotSymbFrmt(k2TmpVal, cell->slotFrmtBitMap);
+ if(slotCfg != DL_SLOT)
+ {
+ if(slotCfg == FLEXI_SLOT)
+ {
+ startSymbol = timeDomRsrcAllocList[k2Index].startSymbol;
+ endSymbol = startSymbol+ timeDomRsrcAllocList[k2Index].symbolLength;
+ dlSymbolPresent = false;
+ for(checkSymbol= startSymbol; checkSymbol<endSymbol; checkSymbol++)
+ {
+ currentSymbol = cell->cellCfg.tddCfg.slotCfg[k2TmpVal][checkSymbol];
+ if(currentSymbol == DL_SLOT || currentSymbol == FLEXI_SLOT)
+ {
+ dlSymbolPresent = true;
+ break;
+ }
+ }
+ }
+ /* Store all the values if all condition satisfies. */
+ if(dlSymbolPresent != true || slotCfg == UL_SLOT)
+ {
+ numK2 = k2InfoTbl->k2TimingInfo[slotIdx].numK2;
+ k2InfoTbl->k2TimingInfo[slotIdx].k2Indexes[numK2] = k2Index;
+ k2InfoTbl->k2TimingInfo[slotIdx].numK2++;
+ }
+ }
+
+ if(msg3K2InfoTbl)
+ {
+ msg3Delta = puschDeltaTable[cell->cellCfg.numerology];
+
+ /* Check for K2 for MSG3 */
+ /* Current slot + k2 should be either UL or FLEXI slot.
+ * If slot is FLEXI then check all the symbols of that slot,
+ * it should not contain any DL or FLEXI slot */
+ msg3K2TmpVal = (slotIdx + k2Val + msg3Delta) % totalCfgSlot;
+ slotCfg = schGetSlotSymbFrmt(msg3K2TmpVal, cell->slotFrmtBitMap);
+ if(slotCfg != DL_SLOT)
+ {
+ if(slotCfg == FLEXI_SLOT)
+ {
+ startSymbol = timeDomRsrcAllocList[k2Index].startSymbol;
+ endSymbol = startSymbol+ timeDomRsrcAllocList[k2Index].symbolLength;
+ dlSymbolPresent = false;
+ for(checkSymbol= startSymbol; checkSymbol<endSymbol; checkSymbol++)
+ {
+ currentSymbol = cell->cellCfg.tddCfg.slotCfg[msg3K2TmpVal][checkSymbol];
+ if(currentSymbol == DL_SLOT || currentSymbol == FLEXI_SLOT)
+ {
+ dlSymbolPresent = true;
+ break;
+ }
+ }
+ }
+ /* Store all the values if all condition satisfies. */
+ if(dlSymbolPresent != true || slotCfg == UL_SLOT)
+ {
+ numK2 = msg3K2InfoTbl->k2TimingInfo[slotIdx].numK2;
+ msg3K2InfoTbl->k2TimingInfo[slotIdx].k2Indexes[numK2] = k2Index;
+ msg3K2InfoTbl->k2TimingInfo[slotIdx].numK2++;
+ }
+ }
+ }
+ }
+ }
+ }
+#endif
+ }
+}
+
/**********************************************************************
End of file
**********************************************************************/