Implementation of TDD M1 100 MHZ MSG1, MSG2, MSG3 & MSG4 changes JIRA-ID : ODUHIGH-333 38/5938/10
authorsphoorthi <sphoorthi.dayanand@radisys.com>
Mon, 26 Apr 2021 17:12:56 +0000 (22:42 +0530)
committersphoorthi <sphoorthi.dayanand@radisys.com>
Tue, 18 May 2021 10:56:14 +0000 (16:26 +0530)
Change-Id: Ia4c8c4238d6009f02d4407db3da8e3a89053764b
Signed-off-by: sphoorthi <sphoorthi.dayanand@radisys.com>
Signed-off-by: lal.harshita <Harshita.Lal@radisys.com>
Signed-off-by: sphoorthi <sphoorthi.dayanand@radisys.com>
src/5gnrsch/sch.c
src/5gnrsch/sch_rach.c
src/5gnrsch/sch_utils.c

index 89c3473..f68015d 100644 (file)
@@ -412,15 +412,12 @@ uint16_t schGetPeriodicityInMsec(DlUlTxPeriodicity tddPeriod)
 void schInitTddSlotCfg(SchCellCb *cell, SchCellCfg *schCellCfg)
 {
    uint16_t periodicityInMicroSec = 0;
-   uint32_t slotBitPos, symbBitPos, bitMask;
    int8_t slotIdx, symbIdx;
 
    periodicityInMicroSec = schGetPeriodicityInMsec(schCellCfg->tddCfg.tddPeriod);
    cell->numSlotsInPeriodicity = (periodicityInMicroSec * pow(2, schCellCfg->numerology))/1000;
-cell->slotFrmtBitMap = 0;
+   cell->slotFrmtBitMap = 0;
    cell->symbFrmtBitMap = 0;
-   slotBitPos = (cell->numSlotsInPeriodicity*2)-1; /* considering 2 bits to represent a slot */
-   symbBitPos = (MAX_SYMB_PER_SLOT*2)-1; /* considering 2 bits to represent a symbol */
    for(slotIdx = cell->numSlotsInPeriodicity-1; slotIdx >= 0; slotIdx--)
    {
       symbIdx = 0;
@@ -433,23 +430,13 @@ cell->slotFrmtBitMap = 0;
             case DL_SLOT:
             {
                /*BitMap to be set to 00 */
-               bitMask = 1<<slotBitPos;
-               cell->slotFrmtBitMap = (cell->slotFrmtBitMap & ~(bitMask)) | ((0<<slotBitPos) & bitMask);
-               slotBitPos--;
-               bitMask = 1<<slotBitPos;
-               cell->slotFrmtBitMap = (cell->slotFrmtBitMap & ~(bitMask)) | ((0<<slotBitPos) & bitMask);
-               slotBitPos--;
+               cell->slotFrmtBitMap = (cell->slotFrmtBitMap<<2);
                break;
             }
             case UL_SLOT:
             {
                /*BitMap to be set to 01 */
-               bitMask = 1<<slotBitPos;
-               cell->slotFrmtBitMap = (cell->slotFrmtBitMap & ~(bitMask)) | ((0<<slotBitPos) & bitMask);
-               slotBitPos--;
-               bitMask = 1<<slotBitPos;
-               cell->slotFrmtBitMap = (cell->slotFrmtBitMap & ~(bitMask)) | ((1<<slotBitPos) & bitMask);
-               slotBitPos--;
+               cell->slotFrmtBitMap = ((cell->slotFrmtBitMap<<2) | (UL_SLOT));
                break;
             }
             default:
@@ -458,12 +445,8 @@ cell->slotFrmtBitMap = 0;
          continue;
       }
       /* slot config is flexible. First set slotBitMap to 10 */
-      bitMask = 1<<slotBitPos;
-      cell->slotFrmtBitMap = (cell->slotFrmtBitMap & ~(bitMask)) | ((1<<slotBitPos) & bitMask);
-      slotBitPos--;
-      bitMask = 1<<slotBitPos;
-      cell->slotFrmtBitMap = (cell->slotFrmtBitMap & ~(bitMask)) | ((0<<slotBitPos) & bitMask);
-      slotBitPos--;
+      cell->slotFrmtBitMap = ((cell->slotFrmtBitMap<<2) | (FLEXI_SLOT));
+
       /* Now set symbol bitmap */ 
       for(symbIdx = MAX_SYMB_PER_SLOT-1; symbIdx >= 0; symbIdx--)
       {
@@ -472,34 +455,19 @@ cell->slotFrmtBitMap = 0;
             case DL_SLOT:
             {
                /*symbol BitMap to be set to 00 */
-               bitMask = 1<<symbBitPos;
-               cell->symbFrmtBitMap = (cell->symbFrmtBitMap & ~(bitMask)) | ((0<<symbBitPos) & bitMask);
-               symbBitPos--;
-               bitMask = 1<<symbBitPos;
-               cell->symbFrmtBitMap = (cell->symbFrmtBitMap & ~(bitMask)) | ((0<<symbBitPos) & bitMask);
-               symbBitPos--;
+               cell->symbFrmtBitMap = (cell->symbFrmtBitMap<<2);
                break;
             }
             case UL_SLOT:
             {
                /*symbol BitMap to be set to 01 */
-               bitMask = 1<<symbBitPos;
-               cell->symbFrmtBitMap = (cell->symbFrmtBitMap & ~(bitMask)) | ((0<<symbBitPos) & bitMask);
-               symbBitPos--;
-               bitMask = 1<<symbBitPos;
-               cell->symbFrmtBitMap = (cell->symbFrmtBitMap & ~(bitMask)) | ((1<<symbBitPos) & bitMask);
-               symbBitPos--;
+               cell->symbFrmtBitMap = ((cell->symbFrmtBitMap<<2) | (UL_SLOT));
                break;
             }
             case FLEXI_SLOT:
             {
                /*symbol BitMap to be set to 10 */
-               bitMask = 1<<symbBitPos;
-               cell->symbFrmtBitMap = (cell->symbFrmtBitMap & ~(bitMask)) | ((1<<symbBitPos) & bitMask);
-               symbBitPos--;
-               bitMask = 1<<symbBitPos;
-               cell->symbFrmtBitMap = (cell->symbFrmtBitMap & ~(bitMask)) | ((0<<symbBitPos) & bitMask);
-               symbBitPos--;
+               cell->symbFrmtBitMap = ((cell->symbFrmtBitMap<<2) | (FLEXI_SLOT));
                break;
             }
             default:
@@ -507,7 +475,6 @@ cell->slotFrmtBitMap = 0;
          }
       }
    }
-
 }
 #endif
 
@@ -922,6 +889,9 @@ uint8_t MacSchDlRlcBoInfo(Pst *pst, DlRlcBoInfo *dlBoInfo)
    uint8_t  lcId = 0;
    uint16_t ueIdx = 0;
    uint16_t slot;
+#ifdef NR_TDD
+   uint16_t slotIdx = 0;
+#endif
    SchUeCb *ueCb = NULLP;
    SchCellCb *cell = NULLP;
    SchDlSlotInfo *schDlSlotInfo = NULLP;
@@ -947,6 +917,18 @@ uint8_t MacSchDlRlcBoInfo(Pst *pst, DlRlcBoInfo *dlBoInfo)
    }
 
    slot = (cell->slotInfo.slot + SCHED_DELTA + PHY_DELTA_DL + BO_DELTA) % cell->numSlots;
+#ifdef NR_TDD
+   while(schGetSlotSymbFrmt(cell->slotFrmtBitMap, slot) != DL_SLOT)
+   {
+      slot = (slot + 1)%cell->numSlots;
+      slotIdx++;
+      if(slotIdx==cell->numSlots)
+      {
+          DU_LOG("\nERROR  -->  SCH : No DL Slot available");
+          return RFAILED;
+      }
+   }
+#endif
    schDlSlotInfo = cell->schDlSlotInfo[slot];
 
    SCH_ALLOC(schDlSlotInfo->dlMsgInfo, sizeof(DlMsgInfo));
index 2681a0d..7989caf 100644 (file)
@@ -106,14 +106,10 @@ void createSchRaCb(uint16_t tcrnti, Inst schInst)
  *  @return  void
  **/
 uint8_t schAllocMsg3Pusch(Inst schInst, uint16_t slot, uint16_t crnti, \
-   uint16_t *msg3StartRb, uint8_t *msg3NumRb)
+   uint16_t *msg3StartRb, uint8_t *msg3NumRb, uint16_t msg3SlotAlloc)
 {
    SchCellCb      *cell         = NULLP;
    SchUlSlotInfo  *schUlSlotInfo    = NULLP;
-   uint8_t    puschMu       = 0;
-   uint8_t    msg3SlotAlloc = 0;
-   uint8_t    delta         = 0;
-   uint8_t    k2            = 0; 
    uint8_t    startSymb     = 0;
    uint8_t    symbLen       = 0; 
    uint8_t    startRb       = 0;
@@ -124,16 +120,9 @@ uint8_t schAllocMsg3Pusch(Inst schInst, uint16_t slot, uint16_t crnti, \
    uint16_t   tbSize         = 0;
 
    cell = schCb[schInst].cells[schInst];
-   //  puschMu = cell->cellCfg.puschMu;
-   delta = puschDeltaTable[puschMu];
-   k2 = cell->cellCfg.schInitialUlBwp.puschCommon.k2;
    startSymb = cell->cellCfg.schInitialUlBwp.puschCommon.startSymbol;
    symbLen = cell->cellCfg.schInitialUlBwp.puschCommon.lengthSymbol;
 
-   /* Slot allocation for msg3 based on 38.214 section 6.1.2.1 */
-   msg3SlotAlloc = slot + k2 + delta;
-   msg3SlotAlloc = msg3SlotAlloc % cell->numSlots; 
-
    startRb = cell->schUlSlotInfo[msg3SlotAlloc]->puschCurrentPrb;
    tbSize = schCalcTbSize(8); /* 6 bytes msg3  and 2 bytes header */
    numRb = schCalcNumPrb(tbSize, mcs, numPdschSymbols);
@@ -204,9 +193,43 @@ uint8_t schProcessRachInd(RachIndInfo *rachInd, Inst schInst)
    uint16_t msg3StartRb;
    uint8_t  msg3NumRb;
    uint8_t  ret = ROK;
-
+   uint8_t delta = 0;
+   uint8_t k2 = 0; 
+   uint8_t puschMu = 0;
+   uint16_t msg3Slot = 0;
+#ifdef NR_TDD
+   uint16_t slotIdx = 0;
+#endif
+
+   //puschMu = cell->cellCfg.puschMu;
+   delta = puschDeltaTable[puschMu];
+   k2 = cell->cellCfg.schInitialUlBwp.puschCommon.k2;
    /* RAR will sent with a delay of RAR_DELAY */
    rarSlot = (rachInd->timingInfo.slot+RAR_DELAY+PHY_DELTA_DL)%cell->numSlots;
+#ifdef NR_TDD
+   for(slotIdx=0; slotIdx<cell->numSlots;slotIdx++)
+   {
+      /* Slot allocation for msg3 based on 38.214 section 6.1.2.1 */
+      msg3Slot = (rarSlot+delta+k2)%cell->numSlots;
+
+      if((schGetSlotSymbFrmt(rarSlot, cell->slotFrmtBitMap) != DL_SLOT) &&\
+         (schGetSlotSymbFrmt(msg3Slot, cell->slotFrmtBitMap) != UL_SLOT))
+      {
+         rarSlot = (rarSlot + 1) % cell->numSlots;
+         continue;
+      }
+      break;
+   }
+   if(slotIdx>=cell->numSlots)
+   {
+       DU_LOG("\nERROR  -->  SCH : NO Slot for Msg2 with Msg3 Grant\n");
+       return RFAILED;
+   }
+#else
+   /* Slot allocation for msg3 based on 38.214 section 6.1.2.1 */
+   msg3Slot = rarSlot + k2 + delta;
+   msg3Slot = msg3Slot % cell->numSlots; 
+#endif
 
    SchDlSlotInfo *schDlSlotInfo = cell->schDlSlotInfo[rarSlot]; /* RAR will sent in the next slot */
 
@@ -227,7 +250,7 @@ uint8_t schProcessRachInd(RachIndInfo *rachInd, Inst schInst)
    createSchRaCb(rachInd->crnti,schInst);
 
    /* allocate resources for msg3 */
-   ret = schAllocMsg3Pusch(schInst, rarSlot, rachInd->crnti, &msg3StartRb, &msg3NumRb);
+   ret = schAllocMsg3Pusch(schInst, rarSlot, rachInd->crnti, &msg3StartRb, &msg3NumRb, msg3Slot);
    if(ret == ROK)
    {
       /* fill RAR info */
index bdc4717..364ae5e 100644 (file)
@@ -985,10 +985,13 @@ void schInitDlSlot(SchDlSlotInfo *schDlSlotInfo)
  **/
 SlotConfig schGetSlotSymbFrmt(uint16_t slot, uint32_t bitMap)
 {
+   uint32_t offset = (slot)*2;
+   return (bitMap & 0x3<<offset)>>offset;
+#if 0
    SlotConfig slotFrmt;
    int mask1 = 0, mask2 = 0;
 
-   slot = (slot%10)*2;
+   slot = (slot%n)*2;//n num of slots in defined periodicity or num of symbols
    mask1 = 1<<(slot);
    mask2 = 1<<(slot+1);
    slotFrmt = ((mask1 & bitMap)>>slot) + (2*((mask2 & bitMap)>>(slot+1)));
@@ -996,6 +999,7 @@ SlotConfig schGetSlotSymbFrmt(uint16_t slot, uint32_t bitMap)
    //printf("\n\n\n\n*****FormatType:%d Slot:%d****\n\n\n\n", slotFrmt, slot/2);
 
    return slotFrmt;
+#endif
 }
 
 #endif