X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrmac%2Flwr_mac_fsm.c;h=5f8e0494878fc254eca2bc6aeccb232e250d6e31;hb=545c7a4a13972142fb36962323556dcad7119710;hp=168d96c104a60bce06d9ca12dc2e2ac9348fdcd6;hpb=36cff1647c97521875fbae57a9952291d0599022;p=o-du%2Fl2.git diff --git a/src/5gnrmac/lwr_mac_fsm.c b/src/5gnrmac/lwr_mac_fsm.c index 168d96c10..5f8e04948 100644 --- a/src/5gnrmac/lwr_mac_fsm.c +++ b/src/5gnrmac/lwr_mac_fsm.c @@ -25,7 +25,6 @@ #include "mac_sch_interface.h" #include "lwr_mac_upr_inf.h" #include "mac.h" -#include "lwr_mac_phy.h" #include "lwr_mac.h" #ifdef INTEL_FAPI #include "fapi.h" @@ -35,6 +34,7 @@ #include "wls_lib.h" #endif #include "lwr_mac_fsm.h" +#include "lwr_mac_phy.h" #include "mac_utils.h" #define MIB_SFN_BITMASK 0xFC @@ -47,20 +47,32 @@ #define PDU_PRESENT 1 #define SET_MSG_LEN(x, size) x += size -void fapiMacConfigRsp(uint16_t cellId); -uint8_t UnrestrictedSetNcsTable[MAX_ZERO_CORR_CFG_IDX]; - /* Global variables */ -uint8_t slotIndIdx; -uint16_t sendTxDataReq(SlotIndInfo currTimingInfo, DlSchedInfo *dlInfo); +LwrMacCb lwrMacCb; -void lwrMacLayerInit() +uint8_t UnrestrictedSetNcsTable[MAX_ZERO_CORR_CFG_IDX]; +void fapiMacConfigRsp(uint16_t cellId); +uint16_t sendTxDataReq(SlotTimingInfo currTimingInfo, DlSchedInfo *dlInfo, p_fapi_api_queue_elem_t prevElem); +uint16_t fillUlTtiReq(SlotTimingInfo currTimingInfo, p_fapi_api_queue_elem_t prevElem); +uint16_t fillUlDciReq(SlotTimingInfo currTimingInfo, p_fapi_api_queue_elem_t prevElem); +uint8_t lwr_mac_procStopReqEvt(SlotTimingInfo slotInfo, p_fapi_api_queue_elem_t prevElem); + +void lwrMacLayerInit(Region region, Pool pool) { #ifdef INTEL_WLS_MEM - uint8_t idx; + uint8_t idx; +#endif + memset(&lwrMacCb, 0, sizeof(LwrMacCb)); + lwrMacCb.region = region; + lwrMacCb.pool = pool; + lwrMacCb.clCfgDone = TRUE; + lwrMacCb.numCell = 0; + lwrMacCb.phyState = PHY_STATE_IDLE; + +#ifdef INTEL_WLS_MEM /* Initializing WLS free mem list */ - slotIndIdx = 1; + lwrMacCb.phySlotIndCntr = 1; for(idx = 0; idx < WLS_MEM_FREE_PRD; idx++) { cmLListInit(&wlsBlockToFreeList[idx]); @@ -86,6 +98,9 @@ void lwrMacLayerInit() * ****************************************************************/ uint8_t lwr_mac_procInvalidEvt(void *msg) { +#ifdef CALL_FLOW_DEBUG_LOG + DU_LOG("\nCall Flow: ENTMAC -> ENTLWRMAC : INVALID_EVENT\n"); +#endif DU_LOG("\nERROR --> LWR_MAC: Error Indication Event[%d] received in state [%d]", lwrMacCb.event, lwrMacCb.phyState); return ROK; } @@ -1288,7 +1303,7 @@ uint32_t getParamValue(fapi_uint16_tlv_t *tlv, uint16_t type) ******************************************************************/ void setMibPdu(uint8_t *mibPdu, uint32_t *val, uint16_t sfn) { - *mibPdu |= (((uint8_t)(sfn >> 2)) & MIB_SFN_BITMASK); + *mibPdu |= (((uint8_t)(sfn << 2)) & MIB_SFN_BITMASK); *val = (mibPdu[0] << 24 | mibPdu[1] << 16 | mibPdu[2] << 8); DU_LOG("\nDEBUG --> LWR_MAC: MIB PDU %x", *val); } @@ -1313,6 +1328,10 @@ void setMibPdu(uint8_t *mibPdu, uint32_t *val, uint16_t sfn) uint8_t lwr_mac_procParamReqEvt(void *msg) { #ifdef INTEL_FAPI +#ifdef CALL_FLOW_DEBUG_LOG + DU_LOG("\nCall Flow: ENTMAC -> ENTLWRMAC : PARAM_REQ\n"); +#endif + /* startGuardTimer(); */ fapi_param_req_t *paramReq = NULL; fapi_msg_header_t *msgHeader; @@ -1975,6 +1994,9 @@ uint8_t lwr_mac_procIqSamplesReqEvt(void *msg) uint8_t lwr_mac_procConfigReqEvt(void *msg) { #ifdef INTEL_FAPI +#ifdef CALL_FLOW_DEBUG_LOG + DU_LOG("\nCall Flow: ENTMAC -> ENTLWRMAC : CONFIG_REQ\n"); +#endif #ifdef NR_TDD uint8_t slotIdx = 0; uint8_t symbolIdx =0; @@ -2019,7 +2041,13 @@ uint8_t lwr_mac_procConfigReqEvt(void *msg) vendorMsg->config_req_vendor.carrier_aggregation_level = 0; vendorMsg->config_req_vendor.group_hop_flag = 0; vendorMsg->config_req_vendor.sequence_hop_flag = 0; - + vendorMsg->start_req_vendor.sfn = 0; + vendorMsg->start_req_vendor.slot = 0; + vendorMsg->start_req_vendor.mode = 4; +#ifdef DEBUG_MODE + vendorMsg->start_req_vendor.count = 0; + vendorMsg->start_req_vendor.period = 1; +#endif /* Fill FAPI config req */ LWR_MAC_ALLOC(cfgReqQElem, (sizeof(fapi_api_queue_elem_t) + sizeof(fapi_config_req_t))); if(!cfgReqQElem) @@ -2147,7 +2175,7 @@ uint8_t lwr_mac_procConfigReqEvt(void *msg) /* fill TDD table */ fillTlvs(&configReq->tlvs[index++], FAPI_TDD_PERIOD_TAG, \ sizeof(uint8_t), macCfgParams.tddCfg.tddPeriod, &msgLen); - for(slotIdx =0 ;slotIdx< MAXIMUM_TDD_PERIODICITY; slotIdx++) + for(slotIdx =0 ;slotIdx< MAX_TDD_PERIODICITY_SLOTS; slotIdx++) { for(symbolIdx = 0; symbolIdx< MAX_SYMB_PER_SLOT; symbolIdx++) { @@ -2261,6 +2289,9 @@ uint8_t lwr_mac_procConfigRspEvt(void *msg) uint8_t lwr_mac_procStartReqEvt(void *msg) { #ifdef INTEL_FAPI +#ifdef CALL_FLOW_DEBUG_LOG + DU_LOG("\nCall Flow: ENTMAC -> ENTLWRMAC : START_REQ\n"); +#endif fapi_msg_header_t *msgHeader; fapi_start_req_t *startReq; fapi_vendor_msg_t *vendorMsg; @@ -2280,7 +2311,7 @@ uint8_t lwr_mac_procStartReqEvt(void *msg) fillMsgHeader(&vendorMsg->header, FAPI_VENDOR_MESSAGE, sizeof(fapi_vendor_msg_t)); vendorMsg->start_req_vendor.sfn = 0; vendorMsg->start_req_vendor.slot = 0; - vendorMsg->start_req_vendor.mode = 1; /* for FDD */ + vendorMsg->start_req_vendor.mode = 4; /* for Radio mode */ #ifdef DEBUG_MODE vendorMsg->start_req_vendor.count = 0; vendorMsg->start_req_vendor.period = 1; @@ -2340,19 +2371,18 @@ uint8_t lwr_mac_procStartReqEvt(void *msg) * ********************************************************************/ -uint8_t lwr_mac_procStopReqEvt(void *msg) +uint8_t lwr_mac_procStopReqEvt(SlotTimingInfo slotInfo, p_fapi_api_queue_elem_t prevElem) { #ifdef INTEL_FAPI - SlotIndInfo *slotInfo; - fapi_msg_header_t *msgHeader; +#ifdef CALL_FLOW_DEBUG_LOG + DU_LOG("\nCall Flow: ENTMAC -> ENTLWRMAC : STOP_REQ\n"); +#endif + fapi_stop_req_t *stopReq; fapi_vendor_msg_t *vendorMsg; - p_fapi_api_queue_elem_t headerElem; p_fapi_api_queue_elem_t stopReqElem; p_fapi_api_queue_elem_t vendorMsgElem; - slotInfo = (SlotIndInfo *)msg; - /* Allocte And fill Vendor msg */ LWR_MAC_ALLOC(vendorMsgElem, (sizeof(fapi_api_queue_elem_t) + sizeof(fapi_vendor_msg_t))); if(!vendorMsgElem) @@ -2363,8 +2393,8 @@ uint8_t lwr_mac_procStopReqEvt(void *msg) FILL_FAPI_LIST_ELEM(vendorMsgElem, NULLP, FAPI_VENDOR_MESSAGE, 1, sizeof(fapi_vendor_msg_t)); vendorMsg = (fapi_vendor_msg_t *)(vendorMsgElem + 1); fillMsgHeader(&vendorMsg->header, FAPI_VENDOR_MESSAGE, sizeof(fapi_vendor_msg_t)); - vendorMsg->stop_req_vendor.sfn = slotInfo->sfn; - vendorMsg->stop_req_vendor.slot = slotInfo->slot; + vendorMsg->stop_req_vendor.sfn = slotInfo.sfn; + vendorMsg->stop_req_vendor.slot = slotInfo.slot; /* Fill FAPI stop req */ LWR_MAC_ALLOC(stopReqElem, (sizeof(fapi_api_queue_elem_t) + sizeof(fapi_stop_req_t))); @@ -2380,24 +2410,9 @@ uint8_t lwr_mac_procStopReqEvt(void *msg) memset(stopReq, 0, sizeof(fapi_stop_req_t)); fillMsgHeader(&stopReq->header, FAPI_STOP_REQUEST, sizeof(fapi_stop_req_t)); - /* Fill message header */ - LWR_MAC_ALLOC(headerElem, (sizeof(fapi_api_queue_elem_t) + sizeof(fapi_msg_header_t))); - if(!headerElem) - { - DU_LOG("\nERROR --> LWR_MAC: Memory allocation failed for header in stop req"); - LWR_MAC_FREE(stopReqElem, (sizeof(fapi_api_queue_elem_t) + sizeof(fapi_stop_req_t))); - LWR_MAC_FREE(vendorMsgElem, (sizeof(fapi_api_queue_elem_t) + sizeof(fapi_vendor_msg_t))); - return RFAILED; - } - FILL_FAPI_LIST_ELEM(headerElem, stopReqElem, FAPI_VENDOR_MSG_HEADER_IND, 1, \ - sizeof(fapi_msg_header_t)); - msgHeader = (fapi_msg_header_t *)(headerElem + 1); - msgHeader->num_msg = 2; /* Stop req msg and vendor specific msg */ - msgHeader->handle = 0; - /* Send to PHY */ DU_LOG("\nINFO --> LWR_MAC: Sending Stop Request to Phy"); - LwrMacSendToL1(headerElem); + prevElem->p_next = stopReqElem; #endif return ROK; @@ -2519,8 +2534,7 @@ void fillSib1DlDciPdu(fapi_dl_dci_t *dlDciPtr, PdcchCfg *sib1PdcchInfo) * Spec 38.214 Sec 5.1.2.2.2 */ coreset0Size= sib1PdcchInfo->coresetCfg.coreSetSize; - rbStart = 0; /* For SIB1 */ - //rbStart = sib1PdcchInfo->dci.pdschCfg->pdschFreqAlloc.freqAlloc.startPrb; + rbStart = sib1PdcchInfo->dci.pdschCfg->pdschFreqAlloc.freqAlloc.startPrb; rbLen = sib1PdcchInfo->dci.pdschCfg->pdschFreqAlloc.freqAlloc.numPrb; if((rbLen >=1) && (rbLen <= coreset0Size - rbStart)) @@ -2535,10 +2549,8 @@ void fillSib1DlDciPdu(fapi_dl_dci_t *dlDciPtr, PdcchCfg *sib1PdcchInfo) } /* Fetching DCI field values */ - timeDomResAssign = sib1PdcchInfo->dci.pdschCfg->pdschTimeAlloc. - rowIndex -1; - VRB2PRBMap = sib1PdcchInfo->dci.pdschCfg->pdschFreqAlloc.\ - vrbPrbMapping; + timeDomResAssign = sib1PdcchInfo->dci.pdschCfg->pdschTimeAlloc.rowIndex -1; + VRB2PRBMap = sib1PdcchInfo->dci.pdschCfg->pdschFreqAlloc.vrbPrbMapping; modNCodScheme = sib1PdcchInfo->dci.pdschCfg->codeword[0].mcsIndex; redundancyVer = sib1PdcchInfo->dci.pdschCfg->codeword[0].rvIndex; sysInfoInd = 0; /* 0 for SIB1; 1 for SI messages */ @@ -2658,8 +2670,7 @@ void fillRarDlDciPdu(fapi_dl_dci_t *dlDciPtr, PdcchCfg *rarPdcchInfo) /* TODO: Fill values of coreset0Size, rbStart and rbLen */ coreset0Size= rarPdcchInfo->coresetCfg.coreSetSize; - rbStart = 0; /* For SIB1 */ - //rbStart = rarPdcchInfo->dci.pdschCfg->freqAlloc.rbStart; + rbStart = rarPdcchInfo->dci.pdschCfg->pdschFreqAlloc.freqAlloc.startPrb; rbLen = rarPdcchInfo->dci.pdschCfg->pdschFreqAlloc.freqAlloc.numPrb; if((rbLen >=1) && (rbLen <= coreset0Size - rbStart)) @@ -2674,7 +2685,7 @@ void fillRarDlDciPdu(fapi_dl_dci_t *dlDciPtr, PdcchCfg *rarPdcchInfo) } /* Fetching DCI field values */ - timeDomResAssign = rarPdcchInfo->dci.pdschCfg->pdschTimeAlloc.rowIndex -1; + timeDomResAssign = rarPdcchInfo->dci.pdschCfg->pdschTimeAlloc.rowIndex; VRB2PRBMap = rarPdcchInfo->dci.pdschCfg->pdschFreqAlloc.vrbPrbMapping; modNCodScheme = rarPdcchInfo->dci.pdschCfg->codeword[0].mcsIndex; tbScaling = 0; /* configured to 0 scaling */ @@ -2911,8 +2922,8 @@ void fillDlMsgDlDciPdu(fapi_dl_dci_t *dlDciPtr, PdcchCfg *pdcchInfo,\ * @return ROK * ******************************************************************/ -uint8_t fillPdcchPdu(fapi_dl_tti_req_pdu_t *dlTtiReqPdu, DlSchedInfo *dlInfo, \ - RntiType rntiType, uint8_t coreSetType) +uint8_t fillPdcchPdu(fapi_dl_tti_req_pdu_t *dlTtiReqPdu, DlSchedInfo *dlInfo, int8_t dlMsgSchInfoIdx, \ + RntiType rntiType, uint8_t coreSetType, uint8_t ueIdx) { if(dlTtiReqPdu != NULLP) { @@ -2922,27 +2933,27 @@ uint8_t fillPdcchPdu(fapi_dl_tti_req_pdu_t *dlTtiReqPdu, DlSchedInfo *dlInfo, \ memset(&dlTtiReqPdu->pdu.pdcch_pdu, 0, sizeof(fapi_dl_pdcch_pdu_t)); if(rntiType == SI_RNTI_TYPE) { - pdcchInfo = &dlInfo->brdcstAlloc.sib1Alloc.sib1PdcchCfg; - bwp = &dlInfo->brdcstAlloc.sib1Alloc.bwp; - fillSib1DlDciPdu(dlTtiReqPdu->pdu.pdcch_pdu.dlDci, pdcchInfo); + pdcchInfo = &dlInfo->brdcstAlloc.sib1Alloc.sib1PdcchCfg; + bwp = &dlInfo->brdcstAlloc.sib1Alloc.bwp; + fillSib1DlDciPdu(dlTtiReqPdu->pdu.pdcch_pdu.dlDci, pdcchInfo); } else if(rntiType == RA_RNTI_TYPE) { - pdcchInfo = &dlInfo->rarAlloc->rarPdcchCfg; - bwp = &dlInfo->rarAlloc->bwp; - fillRarDlDciPdu(dlTtiReqPdu->pdu.pdcch_pdu.dlDci, pdcchInfo); + pdcchInfo = &dlInfo->rarAlloc[ueIdx]->rarPdcchCfg; + bwp = &dlInfo->rarAlloc[ueIdx]->bwp; + fillRarDlDciPdu(dlTtiReqPdu->pdu.pdcch_pdu.dlDci, pdcchInfo); } else if(rntiType == TC_RNTI_TYPE || rntiType == C_RNTI_TYPE) { - pdcchInfo = &dlInfo->dlMsgAlloc->dlMsgPdcchCfg; - bwp = &dlInfo->dlMsgAlloc->bwp; + pdcchInfo = &dlInfo->dlMsgAlloc[ueIdx]->dlMsgSchedInfo[dlMsgSchInfoIdx].dlMsgPdcchCfg; + bwp = &dlInfo->dlMsgAlloc[ueIdx]->dlMsgSchedInfo[dlMsgSchInfoIdx].bwp; fillDlMsgDlDciPdu(dlTtiReqPdu->pdu.pdcch_pdu.dlDci, pdcchInfo,\ - &dlInfo->dlMsgAlloc->dlMsgInfo); + &dlInfo->dlMsgAlloc[ueIdx]->dlMsgSchedInfo[dlMsgSchInfoIdx].dlMsgInfo); } else { - DU_LOG("\nERROR --> LWR_MAC: Failed filling PDCCH Pdu"); - return RFAILED; + DU_LOG("\nERROR --> LWR_MAC: Failed filling PDCCH Pdu"); + return RFAILED; } dlTtiReqPdu->pduType = PDCCH_PDU_TYPE; dlTtiReqPdu->pdu.pdcch_pdu.bwpSize = bwp->freqAlloc.numPrb; @@ -3064,33 +3075,47 @@ void fillPdschPdu(fapi_dl_tti_req_pdu_t *dlTtiReqPdu, PdschCfg *pdschInfo, uint8_t calcDlTtiReqPduCount(DlSchedInfo *dlInfo) { uint8_t count = 0; - uint8_t idx = 0; + uint8_t idx = 0, ueIdx=0; if(dlInfo->isBroadcastPres) { if(dlInfo->brdcstAlloc.ssbTrans) { - for(idx = 0; idx < dlInfo->brdcstAlloc.ssbIdxSupported; idx++) - { - /* SSB PDU is filled */ - count++; - } + for(idx = 0; idx < dlInfo->brdcstAlloc.ssbIdxSupported; idx++) + { + /* SSB PDU is filled */ + count++; + } } if(dlInfo->brdcstAlloc.sib1Trans) { - /* PDCCH and PDSCH PDU is filled */ - count += 2; + /* PDCCH and PDSCH PDU is filled */ + count += 2; } } - if(dlInfo->rarAlloc != NULLP) - { - /* PDCCH and PDSCH PDU is filled */ - count += 2; - } - if(dlInfo->dlMsgAlloc != NULLP) + + for(ueIdx=0; ueIdxrarAlloc[ueIdx] != NULLP) + { + /* PDCCH and PDSCH PDU is filled */ + if(dlInfo->rarAlloc[ueIdx]->pduPres == BOTH) + count += 2; + else + count += 1; + } + + if(dlInfo->dlMsgAlloc[ueIdx] != NULLP) + { + for(idx=0; idxdlMsgAlloc[ueIdx]->numSchedInfo; idx++) + { + /* PDCCH and PDSCH PDU is filled */ + if(dlInfo->dlMsgAlloc[ueIdx]->dlMsgSchedInfo[idx].pduPres == BOTH) + count += 2; + else if(dlInfo->dlMsgAlloc[ueIdx]->dlMsgSchedInfo[idx].pduPres != NONE) + count += 1; + } + } } return count; } @@ -3112,22 +3137,32 @@ uint8_t calcDlTtiReqPduCount(DlSchedInfo *dlInfo) * ********************************************************************/ uint8_t calcTxDataReqPduCount(DlSchedInfo *dlInfo) { - uint8_t count = 0; + uint8_t idx = 0, count = 0, ueIdx=0; if(dlInfo->isBroadcastPres && dlInfo->brdcstAlloc.sib1Trans) { count++; } - if(dlInfo->rarAlloc != NULLP) - { - count++; - } - if(dlInfo->dlMsgAlloc != NULLP) + + for(ueIdx=0; ueIdxrarAlloc[ueIdx] != NULLP) && \ + ((dlInfo->rarAlloc[ueIdx]->pduPres == BOTH) || (dlInfo->rarAlloc[ueIdx]->pduPres == PDSCH_PDU))) + count++; + + if(dlInfo->dlMsgAlloc[ueIdx] != NULLP) + { + for(idx=0; idxdlMsgAlloc[ueIdx]->numSchedInfo; idx++) + { + if(dlInfo->dlMsgAlloc[ueIdx]->dlMsgSchedInfo[idx].pduPres == BOTH || \ + dlInfo->dlMsgAlloc[ueIdx]->dlMsgSchedInfo[idx].pduPres == PDSCH_PDU) + count++; + } + } } return count; } + /*********************************************************************** * * @brief fills the SIB1 TX-DATA request message @@ -3146,37 +3181,45 @@ uint8_t calcTxDataReqPduCount(DlSchedInfo *dlInfo) * @return ROK * * ********************************************************************/ -uint8_t fillSib1TxDataReq(fapi_tx_pdu_desc_t *pduDesc,MacCellCfg *macCellCfg, - uint16_t pduIndex) +uint8_t fillSib1TxDataReq(fapi_tx_pdu_desc_t *pduDesc, uint16_t pduIndex, MacCellCfg *macCellCfg, + PdschCfg pdschCfg) { - uint32_t pduLen = 0; - uint8_t *sib1TxdataValue = NULLP; + uint32_t payloadSize = 0; + uint8_t *sib1Payload = NULLP; + fapi_api_queue_elem_t *payloadElem = NULLP; +#ifdef INTEL_WLS_MEM + void * wlsHdlr = NULLP; +#endif pduDesc[pduIndex].pdu_index = pduIndex; pduDesc[pduIndex].num_tlvs = 1; /* fill the TLV */ - /* as of now, memory is allocated from SSI, later WLS memory needs to be taken */ - pduDesc[pduIndex].tlvs[0].tl.tag = 1; /* pointer to be sent */ - pduDesc[pduIndex].tlvs[0].tl.length = macCellCfg->sib1Cfg.sib1PduLen; - LWR_MAC_ALLOC(sib1TxdataValue,macCellCfg->sib1Cfg.sib1PduLen); - if(sib1TxdataValue == NULLP) + payloadSize = pdschCfg.codeword[0].tbSize; + pduDesc[pduIndex].tlvs[0].tl.tag = ((payloadSize & 0xff0000) >> 8) | FAPI_TX_DATA_PTR_TO_PAYLOAD_64; + pduDesc[pduIndex].tlvs[0].tl.length = (payloadSize & 0x0000ffff); + LWR_MAC_ALLOC(sib1Payload, payloadSize); + if(sib1Payload == NULLP) { return RFAILED; } - memcpy(sib1TxdataValue,macCellCfg->sib1Cfg.sib1Pdu, - macCellCfg->sib1Cfg.sib1PduLen); - pduDesc[pduIndex].tlvs[0].value = sib1TxdataValue; + payloadElem = (fapi_api_queue_elem_t *)sib1Payload; + FILL_FAPI_LIST_ELEM(payloadElem, NULLP, FAPI_VENDOR_MSG_PHY_ZBC_BLOCK_REQ, 1, \ + macCellCfg->sib1Cfg.sib1PduLen); + memcpy(sib1Payload + TX_PAYLOAD_HDR_LEN, macCellCfg->sib1Cfg.sib1Pdu, macCellCfg->sib1Cfg.sib1PduLen); - /* The total length of the PDU description and PDU data */ - pduLen += 8; /* size of PDU length 2 bytes, PDU index 2 bytes, numTLV 4 bytes */ - pduLen += sizeof(fapi_uint8_ptr_tlv_t); /* only 1 TLV is present */ - pduDesc[pduIndex].pdu_length = pduLen; +#ifdef INTEL_WLS_MEM + mtGetWlsHdl(&wlsHdlr); + pduDesc[pduIndex].tlvs[0].value = WLS_VA2PA(wlsHdlr, sib1Payload); +#else + pduDesc[pduIndex].tlvs[0].value = sib1Payload; +#endif + pduDesc[pduIndex].pdu_length = payloadSize; #ifdef INTEL_WLS_MEM - addWlsBlockToFree(sib1TxdataValue, macCellCfg->sib1Cfg.sib1PduLen, (slotIndIdx-1)); + addWlsBlockToFree(sib1Payload, payloadSize, (lwrMacCb.phySlotIndCntr-1)); #else - LWR_MAC_FREE(sib1TxdataValue, macCellCfg->sib1Cfg.sib1PduLen); + LWR_MAC_FREE(sib1Payload, payloadSize); #endif return ROK; @@ -3200,41 +3243,44 @@ uint8_t fillSib1TxDataReq(fapi_tx_pdu_desc_t *pduDesc,MacCellCfg *macCellCfg, * @return ROK * * ********************************************************************/ -uint8_t fillRarTxDataReq(fapi_tx_pdu_desc_t *pduDesc, RarInfo *rarInfo, - uint16_t pduIndex) +uint8_t fillRarTxDataReq(fapi_tx_pdu_desc_t *pduDesc, uint16_t pduIndex, RarInfo *rarInfo, PdschCfg pdschCfg) { - uint32_t pduLen = 0; - uint8_t *rarTxdataValue = NULLP; + uint16_t payloadSize; + uint8_t *rarPayload = NULLP; + fapi_api_queue_elem_t *payloadElem = NULLP; +#ifdef INTEL_WLS_MEM + void * wlsHdlr = NULLP; +#endif pduDesc[pduIndex].pdu_index = pduIndex; pduDesc[pduIndex].num_tlvs = 1; /* fill the TLV */ - /* as of now, memory is allocated from SSI, later WLS memory needs to be taken */ - pduDesc[pduIndex].tlvs[0].tl.tag = 1; /* pointer to be sent */ - pduDesc[pduIndex].tlvs[0].tl.length = rarInfo->rarPduLen; - LWR_MAC_ALLOC(rarTxdataValue,rarInfo->rarPduLen); - if(rarTxdataValue == NULLP) + payloadSize = pdschCfg.codeword[0].tbSize; + pduDesc[pduIndex].tlvs[0].tl.tag = FAPI_TX_DATA_PTR_TO_PAYLOAD_64; + pduDesc[pduIndex].tlvs[0].tl.length = payloadSize; + LWR_MAC_ALLOC(rarPayload, payloadSize); + if(rarPayload == NULLP) { return RFAILED; } - memcpy(rarTxdataValue,rarInfo->rarPdu,rarInfo->rarPduLen); - pduDesc[pduIndex].tlvs[0].value = rarTxdataValue; + payloadElem = (fapi_api_queue_elem_t *)rarPayload; + FILL_FAPI_LIST_ELEM(payloadElem, NULLP, FAPI_VENDOR_MSG_PHY_ZBC_BLOCK_REQ, 1, rarInfo->rarPduLen); + memcpy(rarPayload + TX_PAYLOAD_HDR_LEN, rarInfo->rarPdu, rarInfo->rarPduLen); - /* The total length of the PDU description and PDU data */ - pduLen += 8; /* size of PDU length 2 bytes, PDU index 2 bytes, numTLV 4 bytes */ - pduLen += sizeof(fapi_uint8_ptr_tlv_t); /* only 1 TLV is present */ - pduDesc[pduIndex].pdu_length = pduLen; - - /* TODO: The pointer value which was stored, needs to be free-ed at PHY * - * But since we did not implement WLS, this has to be done here - */ -#ifdef INTEL_WLS_MEM - addWlsBlockToFree(rarTxdataValue, rarInfo->rarPduLen, (slotIndIdx-1)); +#ifdef INTEL_WLS_MEM + mtGetWlsHdl(&wlsHdlr); + pduDesc[pduIndex].tlvs[0].value = WLS_VA2PA(wlsHdlr, rarPayload); #else - LWR_MAC_FREE(rarTxdataValue, rarInfo->rarPduLen); + pduDesc[pduIndex].tlvs[0].value = rarPayload; #endif + pduDesc[pduIndex].pdu_length = payloadSize; +#ifdef INTEL_WLS_MEM + addWlsBlockToFree(rarPayload, payloadSize, (lwrMacCb.phySlotIndCntr-1)); +#else + LWR_MAC_FREE(rarPayload, payloadSize); +#endif return ROK; } @@ -3256,46 +3302,49 @@ uint8_t fillRarTxDataReq(fapi_tx_pdu_desc_t *pduDesc, RarInfo *rarInfo, * @return ROK * * ********************************************************************/ -uint8_t fillDlMsgTxDataReq(fapi_tx_pdu_desc_t *pduDesc, DlMsgInfo *dlMsgInfo, - uint16_t pduIndex) +uint8_t fillDlMsgTxDataReq(fapi_tx_pdu_desc_t *pduDesc, uint16_t pduIndex, DlMsgInfo *dlMsgInfo, PdschCfg pdschCfg) { - uint32_t pduLen = 0; - uint8_t *dedMsgTxDataValue = NULLP; + uint16_t payloadSize; + uint8_t *dlMsgPayload = NULLP; + fapi_api_queue_elem_t *payloadElem = NULLP; +#ifdef INTEL_WLS_MEM + void * wlsHdlr = NULLP; +#endif pduDesc[pduIndex].pdu_index = pduIndex; pduDesc[pduIndex].num_tlvs = 1; /* fill the TLV */ - /* as of now, memory is allocated from SSI, later WLS memory needs to be taken */ - pduDesc[pduIndex].tlvs[0].tl.tag = 1; /* pointer to be sent */ - pduDesc[pduIndex].tlvs[0].tl.length = dlMsgInfo->dlMsgPduLen; - LWR_MAC_ALLOC(dedMsgTxDataValue, dlMsgInfo->dlMsgPduLen); - if(dedMsgTxDataValue == NULLP) + payloadSize = pdschCfg.codeword[0].tbSize; + pduDesc[pduIndex].tlvs[0].tl.tag = FAPI_TX_DATA_PTR_TO_PAYLOAD_64; + pduDesc[pduIndex].tlvs[0].tl.length = payloadSize; + LWR_MAC_ALLOC(dlMsgPayload, payloadSize); + if(dlMsgPayload == NULLP) { return RFAILED; } - memcpy(dedMsgTxDataValue, dlMsgInfo->dlMsgPdu, dlMsgInfo->dlMsgPduLen); - pduDesc[pduIndex].tlvs[0].value = dedMsgTxDataValue; - - /* The total length of the PDU description and PDU data */ - pduLen += 8; /* size of PDU length 2 bytes, PDU index 2 bytes, numTLV 4 bytes */ - pduLen += sizeof(fapi_uint8_ptr_tlv_t); /* only 1 TLV is present */ - pduDesc[pduIndex].pdu_length = pduLen; + payloadElem = (fapi_api_queue_elem_t *)dlMsgPayload; + FILL_FAPI_LIST_ELEM(payloadElem, NULLP, FAPI_VENDOR_MSG_PHY_ZBC_BLOCK_REQ, 1, dlMsgInfo->dlMsgPduLen); + memcpy(dlMsgPayload + TX_PAYLOAD_HDR_LEN, dlMsgInfo->dlMsgPdu, dlMsgInfo->dlMsgPduLen); - /* TODO: The pointer value which was stored, needs to be free-ed at PHY * - * But since we did not implement WLS, this has to be done here - */ -#ifdef INTEL_WLS_MEM - addWlsBlockToFree(dedMsgTxDataValue, dlMsgInfo->dlMsgPduLen, (slotIndIdx-1)); +#ifdef INTEL_WLS_MEM + mtGetWlsHdl(&wlsHdlr); + pduDesc[pduIndex].tlvs[0].value = WLS_VA2PA(wlsHdlr, dlMsgPayload); #else - LWR_MAC_FREE(dedMsgTxDataValue, dlMsgInfo->dlMsgPduLen); + pduDesc[pduIndex].tlvs[0].value = dlMsgPayload; #endif + pduDesc[pduIndex].pdu_length = payloadSize; +#ifdef INTEL_WLS_MEM + addWlsBlockToFree(dlMsgPayload, payloadSize, (lwrMacCb.phySlotIndCntr-1)); +#else + LWR_MAC_FREE(dlMsgPayload, payloadSize); +#endif return ROK; } - #endif /* FAPI */ + /******************************************************************* * * @brief Sends DL TTI Request to PHY @@ -3312,16 +3361,21 @@ uint8_t fillDlMsgTxDataReq(fapi_tx_pdu_desc_t *pduDesc, DlMsgInfo *dlMsgInfo, * RFAILED - failure * * ****************************************************************/ -uint16_t fillDlTtiReq(SlotIndInfo currTimingInfo) +uint16_t fillDlTtiReq(SlotTimingInfo currTimingInfo) { +#ifdef CALL_FLOW_DEBUG_LOG + DU_LOG("\nCall Flow: ENTMAC -> ENTLWRMAC : DL_TTI_REQUEST\n"); +#endif + #ifdef INTEL_FAPI uint8_t idx =0; uint8_t nPdu = 0; uint8_t numPduEncoded = 0; + uint8_t ueIdx; uint16_t cellIdx =0; uint16_t pduIndex = 0; - SlotIndInfo dlTtiReqTimingInfo; + SlotTimingInfo dlTtiReqTimingInfo; MacDlSlot *currDlSlot = NULLP; MacCellCfg macCellCfg; RntiType rntiType; @@ -3329,168 +3383,237 @@ uint16_t fillDlTtiReq(SlotIndInfo currTimingInfo) fapi_msg_header_t *msgHeader = NULLP; p_fapi_api_queue_elem_t dlTtiElem; p_fapi_api_queue_elem_t headerElem; + p_fapi_api_queue_elem_t prevElem; if(lwrMacCb.phyState == PHY_STATE_RUNNING) { GET_CELL_IDX(currTimingInfo.cellId, cellIdx); /* consider phy delay */ - ADD_DELTA_TO_TIME(currTimingInfo,dlTtiReqTimingInfo,PHY_DELTA); + ADD_DELTA_TO_TIME(currTimingInfo,dlTtiReqTimingInfo,PHY_DELTA_DL); + dlTtiReqTimingInfo.cellId = currTimingInfo.cellId; macCellCfg = macCb.macCell[cellIdx]->macCellCfg; currDlSlot = &macCb.macCell[cellIdx]->dlSlot[dlTtiReqTimingInfo.slot]; - nPdu = calcDlTtiReqPduCount(&currDlSlot->dlInfo); LWR_MAC_ALLOC(dlTtiElem, (sizeof(fapi_api_queue_elem_t) + sizeof(fapi_dl_tti_req_t))); if(dlTtiElem) { FILL_FAPI_LIST_ELEM(dlTtiElem, NULLP, FAPI_DL_TTI_REQUEST, 1, \ - sizeof(fapi_dl_tti_req_t)); + sizeof(fapi_dl_tti_req_t)); - /* Fill message header */ - LWR_MAC_ALLOC(headerElem, (sizeof(fapi_api_queue_elem_t) + sizeof(fapi_msg_header_t))); - if(!headerElem) - { - DU_LOG("\nERROR --> LWR_MAC: Memory allocation failed for header in DL TTI req"); - LWR_MAC_FREE(dlTtiElem, (sizeof(fapi_api_queue_elem_t) + sizeof(fapi_dl_tti_req_t))); - return RFAILED; - } - FILL_FAPI_LIST_ELEM(headerElem, dlTtiElem, FAPI_VENDOR_MSG_HEADER_IND, 1, \ - sizeof(fapi_msg_header_t)); - msgHeader = (fapi_msg_header_t *)(headerElem + 1); - msgHeader->num_msg = 1; - msgHeader->handle = 0; + /* Fill message header */ + LWR_MAC_ALLOC(headerElem, (sizeof(fapi_api_queue_elem_t) + sizeof(fapi_msg_header_t))); + if(!headerElem) + { + DU_LOG("\nERROR --> LWR_MAC: Memory allocation failed for header in DL TTI req"); + LWR_MAC_FREE(dlTtiElem, (sizeof(fapi_api_queue_elem_t) + sizeof(fapi_dl_tti_req_t))); + return RFAILED; + } + FILL_FAPI_LIST_ELEM(headerElem, dlTtiElem, FAPI_VENDOR_MSG_HEADER_IND, 1, \ + sizeof(fapi_msg_header_t)); + msgHeader = (fapi_msg_header_t *)(headerElem + 1); + msgHeader->num_msg = 1; + msgHeader->handle = 0; /* Fill Dl TTI Request */ - dlTtiReq = (fapi_dl_tti_req_t *)(dlTtiElem +1); - memset(dlTtiReq, 0, sizeof(fapi_dl_tti_req_t)); - fillMsgHeader(&dlTtiReq->header, FAPI_DL_TTI_REQUEST, sizeof(fapi_dl_tti_req_t)); - - dlTtiReq->sfn = dlTtiReqTimingInfo.sfn; - dlTtiReq->slot = dlTtiReqTimingInfo.slot; - dlTtiReq->nPdus = calcDlTtiReqPduCount(&currDlSlot->dlInfo); /* get total Pdus */ - nPdu = dlTtiReq->nPdus; - dlTtiReq->nGroup = 0; - - if(dlTtiReq->nPdus > 0) - { - if(currDlSlot->dlInfo.isBroadcastPres) - { - if(currDlSlot->dlInfo.brdcstAlloc.ssbTrans) - { - if(dlTtiReq->pdus != NULLP) - { - for(idx = 0; idx < currDlSlot->dlInfo.brdcstAlloc.ssbIdxSupported; idx++) - { - fillSsbPdu(&dlTtiReq->pdus[numPduEncoded], &macCellCfg,\ - currDlSlot, idx, dlTtiReq->sfn); - numPduEncoded++; - } - } - DU_LOG("\033[1;31m"); - DU_LOG("\nDEBUG --> LWR_MAC: MIB sent.."); - DU_LOG("\033[0m"); - } - if(currDlSlot->dlInfo.brdcstAlloc.sib1Trans) - { - /* Filling SIB1 param */ - if(numPduEncoded != nPdu) - { - rntiType = SI_RNTI_TYPE; - fillPdcchPdu(&dlTtiReq->pdus[numPduEncoded],&currDlSlot->dlInfo,\ - rntiType, CORESET_TYPE0); - numPduEncoded++; - fillPdschPdu(&dlTtiReq->pdus[numPduEncoded], - &currDlSlot->dlInfo.brdcstAlloc.sib1Alloc.sib1PdschCfg, - currDlSlot->dlInfo.brdcstAlloc.sib1Alloc.bwp, - pduIndex); - pduIndex++; - numPduEncoded++; - } - DU_LOG("\033[1;34m"); + dlTtiReq = (fapi_dl_tti_req_t *)(dlTtiElem +1); + memset(dlTtiReq, 0, sizeof(fapi_dl_tti_req_t)); + fillMsgHeader(&dlTtiReq->header, FAPI_DL_TTI_REQUEST, sizeof(fapi_dl_tti_req_t)); + + dlTtiReq->sfn = dlTtiReqTimingInfo.sfn; + dlTtiReq->slot = dlTtiReqTimingInfo.slot; + dlTtiReq->nPdus = calcDlTtiReqPduCount(&currDlSlot->dlInfo); /* get total Pdus */ + nPdu = dlTtiReq->nPdus; + dlTtiReq->nGroup = 0; + if(dlTtiReq->nPdus > 0) + { + if(currDlSlot->dlInfo.isBroadcastPres) + { + if(currDlSlot->dlInfo.brdcstAlloc.ssbTrans) + { + if(dlTtiReq->pdus != NULLP) + { + for(idx = 0; idx < currDlSlot->dlInfo.brdcstAlloc.ssbIdxSupported; idx++) + { + fillSsbPdu(&dlTtiReq->pdus[numPduEncoded], &macCellCfg,\ + currDlSlot, idx, dlTtiReq->sfn); + numPduEncoded++; + } + } + DU_LOG("\033[1;31m"); + DU_LOG("\nDEBUG --> LWR_MAC: MIB sent.."); + DU_LOG("\033[0m"); + } + + if(currDlSlot->dlInfo.brdcstAlloc.sib1Trans) + { + /* Filling SIB1 param */ + if(numPduEncoded != nPdu) + { + rntiType = SI_RNTI_TYPE; + fillPdcchPdu(&dlTtiReq->pdus[numPduEncoded], &currDlSlot->dlInfo, -1, \ + rntiType, CORESET_TYPE0, MAX_NUM_UE); + numPduEncoded++; + fillPdschPdu(&dlTtiReq->pdus[numPduEncoded], + &currDlSlot->dlInfo.brdcstAlloc.sib1Alloc.sib1PdschCfg, + currDlSlot->dlInfo.brdcstAlloc.sib1Alloc.bwp, + pduIndex); + dlTtiReq->ue_grp_info[dlTtiReq->nGroup].pduIdx[pduIndex] = pduIndex; + pduIndex++; + numPduEncoded++; + } + DU_LOG("\033[1;34m"); DU_LOG("\nDEBUG --> LWR_MAC: SIB1 sent..."); - DU_LOG("\033[0m"); - } - } - if(currDlSlot->dlInfo.rarAlloc != NULLP) - { - /* Filling RAR param */ - rntiType = RA_RNTI_TYPE; - fillPdcchPdu(&dlTtiReq->pdus[numPduEncoded], \ - &currDlSlot->dlInfo, rntiType, CORESET_TYPE0); - numPduEncoded++; - fillPdschPdu(&dlTtiReq->pdus[numPduEncoded], - &currDlSlot->dlInfo.rarAlloc->rarPdschCfg, - currDlSlot->dlInfo.rarAlloc->bwp, - pduIndex); - numPduEncoded++; - pduIndex++; - - DU_LOG("\033[1;32m"); - DU_LOG("\nDEBUG --> LWR_MAC: RAR sent..."); - DU_LOG("\033[0m"); - } - if(currDlSlot->dlInfo.dlMsgAlloc != NULLP) - { - if(currDlSlot->dlInfo.dlMsgAlloc->dlMsgInfo.dlMsgPdu != NULLP) - { - /* Filling Msg4 param */ - DU_LOG("\033[1;32m"); - if(currDlSlot->dlInfo.dlMsgAlloc->dlMsgInfo.isMsg4Pdu) - { - rntiType = TC_RNTI_TYPE; - fillPdcchPdu(&dlTtiReq->pdus[numPduEncoded], \ - &currDlSlot->dlInfo, rntiType, CORESET_TYPE0); - DU_LOG("\nDEBUG --> LWR_MAC: MSG4 sent..."); - } - else - { - /* Filling other DL msg params */ - rntiType = C_RNTI_TYPE; - fillPdcchPdu(&dlTtiReq->pdus[numPduEncoded], \ - &currDlSlot->dlInfo, rntiType, CORESET_TYPE1); - DU_LOG("\nDEBUG --> LWR_MAC: DL MSG sent..."); + DU_LOG("\033[0m"); + } + } + + for(ueIdx=0; ueIdxdlInfo.rarAlloc[ueIdx] != NULLP) + { + /* Filling RAR param */ + rntiType = RA_RNTI_TYPE; + if((currDlSlot->dlInfo.rarAlloc[ueIdx]->pduPres == BOTH) || \ + (currDlSlot->dlInfo.rarAlloc[ueIdx]->pduPres == PDCCH_PDU)) + { + fillPdcchPdu(&dlTtiReq->pdus[numPduEncoded], \ + &currDlSlot->dlInfo, -1, rntiType, CORESET_TYPE0, ueIdx); + numPduEncoded++; } - DU_LOG("\033[0m"); - - numPduEncoded++; - fillPdschPdu(&dlTtiReq->pdus[numPduEncoded], - &currDlSlot->dlInfo.dlMsgAlloc->dlMsgPdschCfg, - currDlSlot->dlInfo.dlMsgAlloc->bwp, - pduIndex); - numPduEncoded++; - pduIndex++; - } - else - { - MAC_FREE(currDlSlot->dlInfo.dlMsgAlloc, sizeof(DlMsgAlloc)); - currDlSlot->dlInfo.dlMsgAlloc = NULLP; - } - } + if((currDlSlot->dlInfo.rarAlloc[ueIdx]->pduPres == BOTH) || \ + (currDlSlot->dlInfo.rarAlloc[ueIdx]->pduPres == PDSCH_PDU)) + { + fillPdschPdu(&dlTtiReq->pdus[numPduEncoded], + &currDlSlot->dlInfo.rarAlloc[ueIdx]->rarPdschCfg, + currDlSlot->dlInfo.rarAlloc[ueIdx]->bwp, + pduIndex); + numPduEncoded++; + pduIndex++; + + DU_LOG("\033[1;32m"); + DU_LOG("\nDEBUG --> LWR_MAC: RAR sent..."); + DU_LOG("\033[0m"); + } + } + + if(currDlSlot->dlInfo.dlMsgAlloc[ueIdx] != NULLP) + { + for(idx=0; idxdlInfo.dlMsgAlloc[ueIdx]->numSchedInfo; idx++) + { + /* Filling Msg4 param */ + if((currDlSlot->dlInfo.dlMsgAlloc[ueIdx]->dlMsgSchedInfo[idx].pduPres == BOTH) || \ + (currDlSlot->dlInfo.dlMsgAlloc[ueIdx]->dlMsgSchedInfo[idx].pduPres == PDCCH_PDU)) + { + if(currDlSlot->dlInfo.dlMsgAlloc[ueIdx]->dlMsgSchedInfo[idx].dlMsgInfo.isMsg4Pdu) + { + rntiType = TC_RNTI_TYPE; + fillPdcchPdu(&dlTtiReq->pdus[numPduEncoded], \ + &currDlSlot->dlInfo, idx, rntiType, CORESET_TYPE0, ueIdx); + } + else + { + /* Filling other DL msg params */ + rntiType = C_RNTI_TYPE; + fillPdcchPdu(&dlTtiReq->pdus[numPduEncoded], \ + &currDlSlot->dlInfo, idx, rntiType, CORESET_TYPE1, ueIdx); + } + numPduEncoded++; + } + + if(currDlSlot->dlInfo.dlMsgAlloc[ueIdx]->dlMsgSchedInfo[idx].dlMsgInfo.dlMsgPdu != NULLP) + { + if((currDlSlot->dlInfo.dlMsgAlloc[ueIdx]->dlMsgSchedInfo[idx].pduPres == BOTH) || \ + (currDlSlot->dlInfo.dlMsgAlloc[ueIdx]->dlMsgSchedInfo[idx].pduPres == PDSCH_PDU)) + { + fillPdschPdu(&dlTtiReq->pdus[numPduEncoded], \ + &currDlSlot->dlInfo.dlMsgAlloc[ueIdx]->dlMsgSchedInfo[idx].dlMsgPdschCfg,\ + currDlSlot->dlInfo.dlMsgAlloc[ueIdx]->dlMsgSchedInfo[idx].bwp, pduIndex); + numPduEncoded++; + pduIndex++; + + DU_LOG("\033[1;32m"); + if(currDlSlot->dlInfo.dlMsgAlloc[ueIdx]->dlMsgSchedInfo[idx].dlMsgInfo.isMsg4Pdu) + { + DU_LOG("\nDEBUG --> LWR_MAC: MSG4 sent..."); + } + else + { + DU_LOG("\nDEBUG --> LWR_MAC: DL MSG sent..."); + } + DU_LOG("\033[0m"); + } + + } + /* else + { + MAC_FREE(currDlSlot->dlInfo.dlMsgAlloc[ueIdx], sizeof(DlMsgAlloc)); + currDlSlot->dlInfo.dlMsgAlloc[ueIdx] = NULLP; + } + */ + } + } + } + + dlTtiReq->ue_grp_info[dlTtiReq->nGroup].nUe = MAX_NUM_UE_PER_TTI; + dlTtiReq->nGroup++; #ifdef ODU_SLOT_IND_DEBUG_LOG - DU_LOG("\nDEBUG --> LWR_MAC: Sending DL TTI Request"); + DU_LOG("\nDEBUG --> LWR_MAC: Sending DL TTI Request"); #endif - LwrMacSendToL1(headerElem); - /* send Tx-DATA req message */ - sendTxDataReq(currTimingInfo, &currDlSlot->dlInfo); - } - else - { + /* Intel L1 expects UL_TTI.request following DL_TTI.request */ + fillUlTtiReq(currTimingInfo, dlTtiElem); + msgHeader->num_msg++; + + /* Intel L1 expects UL_DCI.request following DL_TTI.request */ + fillUlDciReq(dlTtiReqTimingInfo, dlTtiElem->p_next); + msgHeader->num_msg++; + + /* send Tx-DATA req message */ + sendTxDataReq(dlTtiReqTimingInfo, &currDlSlot->dlInfo, dlTtiElem->p_next->p_next); + if(dlTtiElem->p_next->p_next->p_next) + { + msgHeader->num_msg++; + prevElem = dlTtiElem->p_next->p_next->p_next; + } + else + prevElem = dlTtiElem->p_next->p_next; + } + else + { #ifdef ODU_SLOT_IND_DEBUG_LOG - DU_LOG("\nDEBUG --> LWR_MAC: Sending DL TTI Request"); + DU_LOG("\nDEBUG --> LWR_MAC: Sending DL TTI Request"); #endif - LwrMacSendToL1(headerElem); - } - memset(currDlSlot, 0, sizeof(MacDlSlot)); - return ROK; + + /* Intel L1 expects UL_TTI.request following DL_TTI.request */ + fillUlTtiReq(currTimingInfo, dlTtiElem); + msgHeader->num_msg++; + + /* Intel L1 expects UL_DCI.request following DL_TTI.request */ + fillUlDciReq(dlTtiReqTimingInfo, dlTtiElem->p_next); + msgHeader->num_msg++; + + prevElem = dlTtiElem->p_next->p_next; + } + + if(macCb.macCell[cellIdx]->state == CELL_TO_BE_STOPPED) + { + /* Intel L1 expects UL_DCI.request following DL_TTI.request */ + lwr_mac_procStopReqEvt(currTimingInfo, prevElem); + msgHeader->num_msg++; + macCb.macCell[cellIdx]->state = CELL_STOP_IN_PROGRESS; + } + LwrMacSendToL1(headerElem); + memset(currDlSlot, 0, sizeof(MacDlSlot)); + return ROK; } else { - DU_LOG("\nERROR --> LWR_MAC: Failed to allocate memory for DL TTI Request"); - memset(currDlSlot, 0, sizeof(MacDlSlot)); - return RFAILED; + DU_LOG("\nERROR --> LWR_MAC: Failed to allocate memory for DL TTI Request"); + memset(currDlSlot, 0, sizeof(MacDlSlot)); + return RFAILED; } } else @@ -3518,16 +3641,20 @@ uint16_t fillDlTtiReq(SlotIndInfo currTimingInfo) * RFAILED - failure * * ****************************************************************/ -uint16_t sendTxDataReq(SlotIndInfo currTimingInfo, DlSchedInfo *dlInfo) +uint16_t sendTxDataReq(SlotTimingInfo currTimingInfo, DlSchedInfo *dlInfo, p_fapi_api_queue_elem_t prevElem) { #ifdef INTEL_FAPI - uint8_t nPdu = 0; - uint16_t cellIdx; +#ifdef CALL_FLOW_DEBUG_LOG + DU_LOG("\nCall Flow: ENTMAC -> ENTLWRMAC : TX_DATA_REQ\n"); +#endif + + uint8_t nPdu = 0; + uint8_t ueIdx=0; + uint8_t schInfoIdx = 0; + uint16_t cellIdx=0; uint16_t pduIndex = 0; fapi_tx_data_req_t *txDataReq =NULLP; - fapi_msg_header_t *msgHeader =NULLP; p_fapi_api_queue_elem_t txDataElem = 0; - p_fapi_api_queue_elem_t headerElem =0; GET_CELL_IDX(currTimingInfo.cellId, cellIdx); @@ -3538,12 +3665,12 @@ uint16_t sendTxDataReq(SlotIndInfo currTimingInfo, DlSchedInfo *dlInfo) LWR_MAC_ALLOC(txDataElem, (sizeof(fapi_api_queue_elem_t) + sizeof(fapi_tx_data_req_t))); if(txDataElem == NULLP) { - DU_LOG("\nERROR --> LWR_MAC: Failed to allocate memory for TX data Request"); - return RFAILED; + DU_LOG("\nERROR --> LWR_MAC: Failed to allocate memory for TX data Request"); + return RFAILED; } FILL_FAPI_LIST_ELEM(txDataElem, NULLP, FAPI_TX_DATA_REQUEST, 1, \ - sizeof(fapi_tx_data_req_t)); + sizeof(fapi_tx_data_req_t)); txDataReq = (fapi_tx_data_req_t *)(txDataElem +1); memset(txDataReq, 0, sizeof(fapi_tx_data_req_t)); fillMsgHeader(&txDataReq->header, FAPI_TX_DATA_REQUEST, sizeof(fapi_tx_data_req_t)); @@ -3552,50 +3679,50 @@ uint16_t sendTxDataReq(SlotIndInfo currTimingInfo, DlSchedInfo *dlInfo) txDataReq->slot = currTimingInfo.slot; if(dlInfo->brdcstAlloc.sib1Trans) { - fillSib1TxDataReq(txDataReq->pdu_desc, - &macCb.macCell[cellIdx]->macCellCfg, pduIndex); - pduIndex++; - txDataReq->num_pdus++; - } - if(dlInfo->rarAlloc != NULLP) - { - fillRarTxDataReq(txDataReq->pdu_desc, &dlInfo->rarAlloc->rarInfo, pduIndex); - pduIndex++; - txDataReq->num_pdus++; - - MAC_FREE(dlInfo->rarAlloc,sizeof(RarAlloc)); - dlInfo->rarAlloc = NULLP; - } - if(dlInfo->dlMsgAlloc != NULLP) - { - fillDlMsgTxDataReq(txDataReq->pdu_desc, \ - &dlInfo->dlMsgAlloc->dlMsgInfo, pduIndex); + fillSib1TxDataReq(txDataReq->pdu_desc, pduIndex, &macCb.macCell[cellIdx]->macCellCfg, \ + dlInfo->brdcstAlloc.sib1Alloc.sib1PdschCfg); pduIndex++; txDataReq->num_pdus++; - - MAC_FREE(dlInfo->dlMsgAlloc->dlMsgInfo.dlMsgPdu,\ - dlInfo->dlMsgAlloc->dlMsgInfo.dlMsgPduLen); - dlInfo->dlMsgAlloc->dlMsgInfo.dlMsgPdu = NULLP; - MAC_FREE(dlInfo->dlMsgAlloc, sizeof(DlMsgAlloc)); - dlInfo->dlMsgAlloc = NULLP; } - /* Fill message header */ - LWR_MAC_ALLOC(headerElem, (sizeof(fapi_api_queue_elem_t) + sizeof(fapi_msg_header_t))); - if(!headerElem) + for(ueIdx=0; ueIdx LWR_MAC: Memory allocation failed for TxDataReq header"); - LWR_MAC_FREE(txDataElem, (sizeof(fapi_api_queue_elem_t) + sizeof(fapi_tx_data_req_t))); - return RFAILED; + if(dlInfo->rarAlloc[ueIdx] != NULLP) + { + if((dlInfo->rarAlloc[ueIdx]->pduPres == BOTH) || (dlInfo->rarAlloc[ueIdx]->pduPres == PDSCH_PDU)) + { + fillRarTxDataReq(txDataReq->pdu_desc, pduIndex, &dlInfo->rarAlloc[ueIdx]->rarInfo,\ + dlInfo->rarAlloc[ueIdx]->rarPdschCfg); + pduIndex++; + txDataReq->num_pdus++; + } + MAC_FREE(dlInfo->rarAlloc[ueIdx],sizeof(RarAlloc)); + } + + if(dlInfo->dlMsgAlloc[ueIdx] != NULLP) + { + for(schInfoIdx=0; schInfoIdx < dlInfo->dlMsgAlloc[ueIdx]->numSchedInfo; schInfoIdx++) + { + if((dlInfo->dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx].pduPres == BOTH) || \ + (dlInfo->dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx].pduPres == PDSCH_PDU)) + { + fillDlMsgTxDataReq(txDataReq->pdu_desc, pduIndex, \ + &dlInfo->dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx].dlMsgInfo, \ + dlInfo->dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx].dlMsgPdschCfg); + pduIndex++; + txDataReq->num_pdus++; + } + MAC_FREE(dlInfo->dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx].dlMsgInfo.dlMsgPdu, \ + dlInfo->dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx].dlMsgInfo.dlMsgPduLen); + dlInfo->dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx].dlMsgInfo.dlMsgPdu = NULLP; + } + MAC_FREE(dlInfo->dlMsgAlloc[ueIdx], sizeof(DlMsgAlloc)); + } } - FILL_FAPI_LIST_ELEM(headerElem, txDataElem, FAPI_VENDOR_MSG_HEADER_IND, 1, \ - sizeof(fapi_msg_header_t)); - msgHeader = (fapi_msg_header_t *)(headerElem + 1); - msgHeader->num_msg = 1; - msgHeader->handle = 0; + /* Fill message header */ DU_LOG("\nDEBUG --> LWR_MAC: Sending TX DATA Request"); - LwrMacSendToL1(headerElem); + prevElem->p_next = txDataElem; } #endif return ROK; @@ -3881,18 +4008,20 @@ void fillPucchPdu(fapi_ul_tti_req_pdu_t *ulTtiReqPdu, MacCellCfg *macCellCfg,\ * RFAILED - failure * ******************************************************************/ -uint16_t fillUlTtiReq(SlotIndInfo currTimingInfo) +uint16_t fillUlTtiReq(SlotTimingInfo currTimingInfo, p_fapi_api_queue_elem_t prevElem) { +#ifdef CALL_FLOW_DEBUG_LOG + DU_LOG("\nCall Flow: ENTMAC -> ENTLWRMAC : UL_TTI_REQUEST\n"); +#endif + #ifdef INTEL_FAPI uint16_t cellIdx =0; uint8_t pduIdx = -1; - SlotIndInfo ulTtiReqTimingInfo; + SlotTimingInfo ulTtiReqTimingInfo; MacUlSlot *currUlSlot = NULLP; MacCellCfg macCellCfg; fapi_ul_tti_req_t *ulTtiReq = NULLP; - fapi_msg_header_t *msgHeader = NULLP; p_fapi_api_queue_elem_t ulTtiElem; - p_fapi_api_queue_elem_t headerElem; if(lwrMacCb.phyState == PHY_STATE_RUNNING) { @@ -3900,8 +4029,8 @@ uint16_t fillUlTtiReq(SlotIndInfo currTimingInfo) macCellCfg = macCb.macCell[cellIdx]->macCellCfg; /* add PHY delta */ - ADD_DELTA_TO_TIME(currTimingInfo,ulTtiReqTimingInfo,PHY_DELTA); - currUlSlot = &macCb.macCell[cellIdx]->ulSlot[ulTtiReqTimingInfo.slot % MAX_SLOT_SUPPORTED]; + ADD_DELTA_TO_TIME(currTimingInfo,ulTtiReqTimingInfo,PHY_DELTA_UL); + currUlSlot = &macCb.macCell[cellIdx]->ulSlot[ulTtiReqTimingInfo.slot % MAX_SLOTS]; LWR_MAC_ALLOC(ulTtiElem, (sizeof(fapi_api_queue_elem_t) + sizeof(fapi_ul_tti_req_t))); if(ulTtiElem) @@ -3938,23 +4067,10 @@ uint16_t fillUlTtiReq(SlotIndInfo currTimingInfo) } } - /* Fill message header */ - LWR_MAC_ALLOC(headerElem, (sizeof(fapi_api_queue_elem_t) + sizeof(fapi_msg_header_t))); - if(!headerElem) - { - DU_LOG("\nERROR --> LWR_MAC: Memory allocation failed for UL TTI req header"); - LWR_MAC_FREE(ulTtiElem, (sizeof(fapi_api_queue_elem_t) + sizeof(fapi_ul_tti_req_t))); - return RFAILED; - } - FILL_FAPI_LIST_ELEM(headerElem, ulTtiElem, FAPI_VENDOR_MSG_HEADER_IND, 1, \ - sizeof(fapi_msg_header_t)); - msgHeader = (fapi_msg_header_t *)(headerElem + 1); - msgHeader->num_msg = 1; - msgHeader->handle = 0; #ifdef ODU_SLOT_IND_DEBUG_LOG DU_LOG("\nDEBUG --> LWR_MAC: Sending UL TTI Request"); #endif - LwrMacSendToL1(headerElem); + prevElem->p_next = ulTtiElem; memset(currUlSlot, 0, sizeof(MacUlSlot)); return ROK; @@ -3993,6 +4109,9 @@ uint16_t fillUlTtiReq(SlotIndInfo currTimingInfo) ******************************************************************/ void fillUlDciPdu(fapi_dl_dci_t *ulDciPtr, DciInfo *schDciInfo) { +#ifdef CALL_FLOW_DEBUG_LOG + DU_LOG("\nCall Flow: ENTMAC -> ENTLWRMAC : UL_DCI_REQUEST\n"); +#endif if(ulDciPtr != NULLP) { uint8_t numBytes =0; @@ -4187,26 +4306,22 @@ uint8_t fillUlDciPdcchPdu(fapi_dci_pdu_t *ulDciReqPdu, DlSchedInfo *dlInfo, uint * RFAILED - failure * ******************************************************************/ -uint16_t fillUlDciReq(SlotIndInfo currTimingInfo) +uint16_t fillUlDciReq(SlotTimingInfo currTimingInfo, p_fapi_api_queue_elem_t prevElem) { #ifdef INTEL_FAPI uint8_t cellIdx =0; uint8_t numPduEncoded = 0; - SlotIndInfo ulDciReqTimingInfo ={0}; + SlotTimingInfo ulDciReqTimingInfo ={0}; MacDlSlot *currDlSlot = NULLP; fapi_ul_dci_req_t *ulDciReq =NULLP; - fapi_msg_header_t *msgHeader =NULLP; p_fapi_api_queue_elem_t ulDciElem; - p_fapi_api_queue_elem_t headerElem; if(lwrMacCb.phyState == PHY_STATE_RUNNING) { GET_CELL_IDX(currTimingInfo.cellId, cellIdx); - memcpy(&ulDciReqTimingInfo, &currTimingInfo, sizeof(SlotIndInfo)); - currDlSlot = &macCb.macCell[cellIdx]->dlSlot[ulDciReqTimingInfo.slot % MAX_SLOT_SUPPORTED]; + memcpy(&ulDciReqTimingInfo, &currTimingInfo, sizeof(SlotTimingInfo)); + currDlSlot = &macCb.macCell[cellIdx]->dlSlot[ulDciReqTimingInfo.slot % MAX_SLOTS]; - if(currDlSlot->dlInfo.ulGrant != NULLP) - { LWR_MAC_ALLOC(ulDciElem, (sizeof(fapi_api_queue_elem_t) + sizeof(fapi_ul_dci_req_t))); if(ulDciElem) { @@ -4218,6 +4333,8 @@ uint16_t fillUlDciReq(SlotIndInfo currTimingInfo) ulDciReq->sfn = ulDciReqTimingInfo.sfn; ulDciReq->slot = ulDciReqTimingInfo.slot; + if(currDlSlot->dlInfo.ulGrant != NULLP) + { ulDciReq->numPdus = 1; // No. of PDCCH PDUs if(ulDciReq->numPdus > 0) { @@ -4226,33 +4343,12 @@ uint16_t fillUlDciReq(SlotIndInfo currTimingInfo) numPduEncoded++; /* free UL GRANT at SCH */ MAC_FREE(currDlSlot->dlInfo.ulGrant, sizeof(DciInfo)); - currDlSlot->dlInfo.ulGrant = NULLP; - - /* Fill message header */ - LWR_MAC_ALLOC(headerElem, (sizeof(fapi_api_queue_elem_t) + sizeof(fapi_msg_header_t))); - if(!headerElem) - { - DU_LOG("\nERROR --> LWR_MAC: Memory allocation failed for UL DCI req header"); - LWR_MAC_FREE(ulDciElem, (sizeof(fapi_api_queue_elem_t) + sizeof(fapi_ul_dci_req_t))); - return RFAILED; - } - FILL_FAPI_LIST_ELEM(headerElem, ulDciElem, FAPI_VENDOR_MSG_HEADER_IND, 1, \ - sizeof(fapi_msg_header_t)); - msgHeader = (fapi_msg_header_t *)(headerElem + 1); - msgHeader->num_msg = 1; - msgHeader->handle = 0; + } #ifdef ODU_SLOT_IND_DEBUG_LOG DU_LOG("\nDEBUG --> LWR_MAC: Sending UL DCI Request"); #endif - LwrMacSendToL1(headerElem); - } } - else - { - DU_LOG("\nERROR --> LWR_MAC: Failed to allocate memory for UL DCI Request"); - memset(currDlSlot, 0, sizeof(MacDlSlot)); - return RFAILED; - } + prevElem->p_next = ulDciElem; } } else @@ -4299,7 +4395,7 @@ lwrMacFsmHdlr fapiEvtHdlr[MAX_STATE][MAX_EVENT] = lwr_mac_procConfigReqEvt, lwr_mac_procConfigRspEvt, lwr_mac_procInvalidEvt, - lwr_mac_procStopReqEvt, + lwr_mac_procInvalidEvt, } };