Merge "Implementation of TDD M1 100 MHZ MSG1, MSG2, MSG3 & MSG4 changes JIRA-ID...
[o-du/l2.git] / src / 5gnrsch / sch_rach.c
index 0e9bd93..d3ea542 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 */