Merge "Implementation of TDD M1 100 MHZ MSG1, MSG2, MSG3 & MSG4 changes JIRA-ID...
authorSphoorthi Dayanand <sphoorthi.dayanand@radisys.com>
Tue, 18 May 2021 11:32:17 +0000 (11:32 +0000)
committerGerrit Code Review <gerrit@o-ran-sc.org>
Tue, 18 May 2021 11:32:17 +0000 (11:32 +0000)
1  2 
src/5gnrsch/sch_rach.c
src/5gnrsch/sch_utils.c

diff --combined src/5gnrsch/sch_rach.c
@@@ -106,14 -106,10 +106,10 @@@ void createSchRaCb(uint16_t tcrnti, Ins
   *  @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;
     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);
     }
     tbSize = 0;  /* since nPrb has been incremented, recalculating tbSize */
     tbSize = schCalcTbSizeFromNPrb(numRb, mcs, numPdschSymbols);
 -
 +   tbSize = tbSize/8;/*bits to byte conversion*/
     schUlSlotInfo->schPuschInfo->crnti             = crnti;
     schUlSlotInfo->schPuschInfo->harqProcId        = SCH_HARQ_PROC_ID;
     schUlSlotInfo->schPuschInfo->resAllocType      = SCH_ALLOC_TYPE_1;
@@@ -204,9 -193,43 +193,43 @@@ uint8_t schProcessRachInd(RachIndInfo *
     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 */
  
     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 */
diff --combined src/5gnrsch/sch_utils.c
@@@ -837,7 -837,6 +837,7 @@@ uint16_t schCalcNumPrb(uint16_t tbSize
     numPrb = ceil((float)nre / nreDash);   
     return numPrb;
  }
 +
  /**
  * @brief calculation of transport block size.
  *
  **/
  uint16_t schCalcTbSizeFromNPrb(uint16_t numPrb, uint16_t mcs, uint8_t numSymbols)
  {   
 -   uint16_t tbSize = 0;
 -   uint16_t tbsIndex = 0;
 -   uint16_t nre = 0;
 -   uint16_t nreDash = 0;
     uint8_t  qm     = mcsTable[mcs][1];
     uint16_t rValue = mcsTable[mcs][2];
 -   uint8_t  numLayer = 1;       /* v value */
 +   uint16_t tbsIndex = 0;
 +   uint32_t tbSize = 0;
 +   uint32_t nre = 0;
 +   uint32_t nreDash = 0;
 +   uint32_t nInfo = 0;
 +   uint32_t n = 0;
 +   uint32_t nInfoDash = 0;
 +   uint32_t c = 0;
 +   const uint8_t  numLayer = 1;
 +   const uint16_t numRbSc = 12;
 +   const uint16_t numDmrsRes = 12;
 +   const uint16_t sf = 1;
 +//   uint16_t numPrbOvrHead = 0;
     
 -   /* formula used for calculation of rbSize, 38.213 section 5.1.3.2 *
 -   * Ninfo = Nre . R . Qm . v   where [ NInfo is tbSize]                *
 +  /* formula used for calculation of rbSize, 38.214 section 5.1.3.2  *
 +   * Ninfo = Nre . R . Qm . v   where [ NInfo is tbSize]             *
     * Nre' = Nsc . NsymPdsch - NdmrsSymb - Noh                        *
     * Nre = min(156,Nre') . nPrb                                      */
 -   
 -   nreDash = ceil( (12 * numSymbols) - NUM_DMRS_SYMBOLS - 0);
 -  
 -   if(nreDash > 156)
 -      nreDash = 156;
  
 +   nreDash = MIN(156, ceil( (numRbSc * numSymbols) - numDmrsRes - 0));
     nre = nreDash * numPrb;
 -   tbSize = ceil(nre * qm * numLayer * rValue/1024.0);
 -   tbSize = ceil(tbSize/8.0);
 -   
 -   while(tbSize > tbSizeTable[tbsIndex])
 +   nInfo = ceil(nre * qm * numLayer * rValue/(1024.0 * sf));
 +
 +   if(nInfo <= 3824)
     {
 -      tbsIndex++;
 +      n = MAX(3, (uint32_t)cmLog2(nInfo) - 6);
 +      nInfoDash = MAX(24, (1<<n)*(nInfo/(1<<n)));
 +      while(nInfoDash > tbSizeTable[tbsIndex])
 +      {
 +         tbsIndex++;
 +      }
 +      tbSize = tbSizeTable[tbsIndex];
     }
 -   tbSize = tbSizeTable[tbsIndex];
 +   else
 +   {
 +      n = (uint32_t)cmLog2(nInfo - 24) - 5;
 +      nInfoDash = MAX(3840, (1<<n)*ceil((nInfo - 24)/(1<<n)));
  
 +      if(rValue<256)
 +      {
 +         c = ceil((nInfoDash + 24)/3816);
 +         tbSize = 8 * c * ceil((nInfoDash + 24)/(8 * c)) - 24;
 +      }
 +      else
 +      {
 +         if(nInfoDash > 8424)
 +         {
 +            c = ceil((nInfoDash + 24)/8424);
 +            tbSize = 8 * c * ceil((nInfoDash + 24)/(8 * c)) - 24;
 +         }
 +         else
 +         {
 +            tbSize = 8 * ceil((nInfoDash + 24)/(8)) - 24;
 +         }
 +      }
 +   }
     return tbSize;
 -
  }
  /**
   * @brief fetching ueCb from cellCb
@@@ -1015,10 -985,13 +1015,13 @@@ void schInitDlSlot(SchDlSlotInfo *schDl
   **/
  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)));
     //printf("\n\n\n\n*****FormatType:%d Slot:%d****\n\n\n\n", slotFrmt, slot/2);
  
     return slotFrmt;
+ #endif
  }
  
  #endif