X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrsch%2Fsch_common.c;h=89f1969b3fdb2ba68e6ed4045abdde3748be243f;hb=eae02ffcdfa215eb3ad990e2b0718d7a62eaa84a;hp=c077ec02dcebf3064e34db9577b17a0c8fe00bbe;hpb=3ba126e9d0aff0ceca5012c27ffd4a3722fdbc4e;p=o-du%2Fl2.git diff --git a/src/5gnrsch/sch_common.c b/src/5gnrsch/sch_common.c index c077ec02d..89f1969b3 100644 --- a/src/5gnrsch/sch_common.c +++ b/src/5gnrsch/sch_common.c @@ -47,6 +47,7 @@ SchCb schCb[SCH_MAX_INST]; 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[] = { @@ -166,7 +167,7 @@ int sendUlSchInfoToMac(UlSchedInfo *ulSchedInfo, Inst inst) * @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; @@ -367,7 +368,7 @@ uint8_t fillUlSchedPucchFormat(uint8_t pucchFormat, SchPucchInfo *ulSchedPucch,\ **/ 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; @@ -495,7 +496,7 @@ uint8_t schUlResAlloc(SchCellCb *cell, Inst schInst) int ret = ROK; UlSchedInfo ulSchedInfo; SchUlSlotInfo *schUlSlotInfo = NULLP; - SlotIndInfo ulTimingInfo; + SlotTimingInfo ulTimingInfo; memset(&ulSchedInfo, 0, sizeof(UlSchedInfo)); /* add PHY delta */ @@ -863,10 +864,15 @@ uint8_t schDlRsrcAllocDlMsg(DlMsgAlloc *dlMsgAlloc, SchCellCb *cell, uint16_t cr 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)); @@ -878,7 +884,8 @@ SchPdschConfig pdschDedCfg, uint8_t ulAckListCount, uint8_t *UlAckTbl) numTimeDomAlloc = pdschCmnCfg.numTimeDomAlloc; for(cfgIdx = 0; cfgIdxtblSize = 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; checkSymbolcellCfg.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; checkSymbolcellCfg.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 **********************************************************************/