PUSCH PDU for msg3 and UL-CCCH Ind flow completion
[o-du/l2.git] / src / 5gnrmac / lwr_mac_fsm.c
index 88e8a65..2e92246 100644 (file)
@@ -69,6 +69,7 @@
 #define PDSCH_PDU_TYPE 1
 #define SSB_PDU_TYPE 3
 #define PRACH_PDU_TYPE 0
+#define PUSCH_PDU_TYPE 1
 #define PDU_PRESENT 1
 #define SET_MSG_LEN(x, size) x += size
 
@@ -3397,9 +3398,15 @@ uint8_t getnPdus(fapi_ul_tti_req_t *ulTtiReq, MacUlSlot *currUlSlot)
          if(ulTtiReq)
             ulTtiReq->rachPresent = PDU_PRESENT;
       }
-      if(currUlSlot->ulCellInfo.dataType & SCH_DATATYPE_PUSCH_UCI)
-      {
-         pduCount++;
+               if(currUlSlot->ulCellInfo.dataType & SCH_DATATYPE_PUSCH)
+               {
+                  pduCount++;
+         if(ulTtiReq)
+            ulTtiReq->nUlsch++;
+               }
+               if(currUlSlot->ulCellInfo.dataType & SCH_DATATYPE_PUSCH_UCI)
+               {
+                  pduCount++;
          if(ulTtiReq)
             ulTtiReq->nUlsch = PDU_PRESENT;
       }
@@ -3487,6 +3494,67 @@ void fillPrachPdu(fapi_ul_tti_req_pdu_t *ulTtiReqPdu, MacCellCfg *macCellCfg, Ma
          sizeof(ulTtiReqPdu->pduSize) + sizeof(fapi_ul_prach_pdu_t)));
    }
 }
+
+void fillPuschPdu(fapi_ul_tti_req_pdu_t *ulTtiReqPdu, MacCellCfg *macCellCfg, MacUlSlot *currUlSlot, uint32_t *msgLen)
+{
+   if(ulTtiReqPdu != NULLP)
+   {
+      ulTtiReqPdu->pduType = PUSCH_PDU_TYPE;
+      ulTtiReqPdu->u.pusch_pdu.pduBitMap = 1;
+      ulTtiReqPdu->u.pusch_pdu.rnti = currUlSlot->ulCellInfo.crnti;
+               /* TODO : Fill handle in raCb when scheduling pusch and access here */
+      ulTtiReqPdu->u.pusch_pdu.handle = 100;
+      ulTtiReqPdu->u.pusch_pdu.bwpSize = macCellCfg->initialUlBwp.bwp.numPrb;
+      ulTtiReqPdu->u.pusch_pdu.bwpStart = macCellCfg->initialUlBwp.bwp.firstPrb;
+      ulTtiReqPdu->u.pusch_pdu.subCarrierSpacing = \
+                  macCellCfg->initialUlBwp.bwp.scs;
+      ulTtiReqPdu->u.pusch_pdu.cyclicPrefix = \
+                  macCellCfg->initialUlBwp.bwp.cyclicPrefix;
+      ulTtiReqPdu->u.pusch_pdu.targetCodeRate = 308;
+      ulTtiReqPdu->u.pusch_pdu.qamModOrder = 2;
+      ulTtiReqPdu->u.pusch_pdu.mcsIndex = \
+                  currUlSlot->ulCellInfo.schPuschInfo.tbInfo.mcs;
+      ulTtiReqPdu->u.pusch_pdu.mcsTable = 0;
+      ulTtiReqPdu->u.pusch_pdu.transformPrecoding = 1;
+      ulTtiReqPdu->u.pusch_pdu.dataScramblingId = currUlSlot->ulCellInfo.cellId;
+      ulTtiReqPdu->u.pusch_pdu.nrOfLayers = 1;
+      ulTtiReqPdu->u.pusch_pdu.ulDmrsSymbPos = 4;
+      ulTtiReqPdu->u.pusch_pdu.dmrsConfigType = 0;
+      ulTtiReqPdu->u.pusch_pdu.ulDmrsScramblingId = currUlSlot->ulCellInfo.cellId;
+      ulTtiReqPdu->u.pusch_pdu.scid = 0;
+      ulTtiReqPdu->u.pusch_pdu.numDmrsCdmGrpsNoData = 1;
+      ulTtiReqPdu->u.pusch_pdu.dmrsPorts = 0;
+      ulTtiReqPdu->u.pusch_pdu.resourceAlloc = \
+                  currUlSlot->ulCellInfo.schPuschInfo.resAllocType;
+      ulTtiReqPdu->u.pusch_pdu.rbStart = \
+                  currUlSlot->ulCellInfo.schPuschInfo.fdAlloc.startPrb;
+      ulTtiReqPdu->u.pusch_pdu.rbSize = \
+                  currUlSlot->ulCellInfo.schPuschInfo.fdAlloc.numPrb;
+      ulTtiReqPdu->u.pusch_pdu.vrbToPrbMapping = 0;
+      ulTtiReqPdu->u.pusch_pdu.frequencyHopping = 0;
+      ulTtiReqPdu->u.pusch_pdu.txDirectCurrentLocation = 0;
+      ulTtiReqPdu->u.pusch_pdu.uplinkFrequencyShift7p5khz = 0;
+      ulTtiReqPdu->u.pusch_pdu.startSymbIndex = \
+                  currUlSlot->ulCellInfo.schPuschInfo.tdAlloc.startSymb;
+      ulTtiReqPdu->u.pusch_pdu.nrOfSymbols = \
+                  currUlSlot->ulCellInfo.schPuschInfo.tdAlloc.numSymb;
+      ulTtiReqPdu->u.pusch_pdu.puschData.rvIndex = \
+                  currUlSlot->ulCellInfo.schPuschInfo.tbInfo.rv;
+      ulTtiReqPdu->u.pusch_pdu.puschData.harqProcessId = \
+                  currUlSlot->ulCellInfo.schPuschInfo.harqProcId;
+      ulTtiReqPdu->u.pusch_pdu.puschData.newDataIndicator = \
+                  currUlSlot->ulCellInfo.schPuschInfo.tbInfo.ndi;
+      ulTtiReqPdu->u.pusch_pdu.puschData.tbSize = \
+                  currUlSlot->ulCellInfo.schPuschInfo.tbInfo.tbSize;
+               /* numCb is 0 for new transmission */
+      ulTtiReqPdu->u.pusch_pdu.puschData.numCb = 0;
+
+      ulTtiReqPdu->pduSize = sizeof(fapi_ul_pusch_pdu_t);
+       
+      SET_MSG_LEN(*msgLen, (sizeof(ulTtiReqPdu->pduType) + \
+         sizeof(ulTtiReqPdu->pduSize) + sizeof(fapi_ul_pusch_pdu_t)));
+   }
+}
 #endif
 
 /*******************************************************************
@@ -3534,6 +3602,7 @@ uint16_t handleUlTtiReq(CmLteTimingInfo *currTimingInfo)
 
          if(ulTtiReq != NULLP)
          {
+                          memset(ulTtiReq, 0, msgSize);
             ulTtiReq->sfn = currTimingInfo->sfn;
             ulTtiReq->slot = currTimingInfo->slot;
             ulTtiReq->nPdus = getnPdus(ulTtiReq, currUlSlot);
@@ -3543,17 +3612,28 @@ uint16_t handleUlTtiReq(CmLteTimingInfo *currTimingInfo)
                ulTtiReq->pdus = (fapi_ul_tti_req_pdu_t *)(ulTtiReq + \
                   (sizeof(fapi_ul_tti_req_t) - sizeof(fapi_ul_tti_req_pdu_t*)));
                /* Fill Prach Pdu */
-               if(ulTtiReq->rachPresent)
+               if(currUlSlot->ulCellInfo.dataType & SCH_DATATYPE_PRACH)
                {
                   pduIdx++;
                   fillPrachPdu(&ulTtiReq->pdus[pduIdx], &macCellCfg, currUlSlot, &msgLen);
+               }
+
+               /* Fill PUSCH PDU */
+               if(currUlSlot->ulCellInfo.dataType & SCH_DATATYPE_PUSCH)
+               {
+                   pduIdx++;
+                   fillPuschPdu(&ulTtiReq->pdus[pduIdx], &macCellCfg, currUlSlot, &msgLen);
+               }
 
+               if((currUlSlot->ulCellInfo.dataType & SCH_DATATYPE_PRACH) || \
+                                          (currUlSlot->ulCellInfo.dataType & SCH_DATATYPE_PUSCH))
+               {
                   msgLen += (sizeof(fapi_ul_tti_req_t) - sizeof(fapi_msg_t));
                   fillMsgHeader(&ulTtiReq->header, FAPI_UL_TTI_REQUEST, msgLen);
 
                   DU_LOG("\nLWR_MAC: Sending UL TTI Request");
                   LwrMacSendToPhy(ulTtiReq->header.message_type_id, msgSize, (void *)ulTtiReq);
-               }
+               }   
             } 
             else
             {
@@ -3563,11 +3643,13 @@ uint16_t handleUlTtiReq(CmLteTimingInfo *currTimingInfo)
                DU_LOG("\nLWR_MAC: Sending UL TTI Request");
                LwrMacSendToPhy(ulTtiReq->header.message_type_id, msgSize, (void *)ulTtiReq);
             }
+            memset(&currUlSlot, 0, sizeof(MacUlSlot));
             return ROK;
          }
          else
          {
             DU_LOG("\nLWR_MAC: Failed to allocate memory for UL TTI Request");
+                               memset(&currUlSlot, 0, sizeof(MacUlSlot));
             return RFAILED;
          }
       }