X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrrlc%2Fkw_tmm_dl.c;h=55cc0b80212f57ec15b0b4f37f130ae1b85bf8f6;hb=3330932565e15a749fd5dd5039cdea2862ca51cc;hp=e8d5df576ba3ae54eb1c283b25c967be1dc47fc4;hpb=d10b52519198632f93deae9574adc69c7ce12efa;p=o-du%2Fl2.git diff --git a/src/5gnrrlc/kw_tmm_dl.c b/src/5gnrrlc/kw_tmm_dl.c index e8d5df576..55cc0b802 100755 --- a/src/5gnrrlc/kw_tmm_dl.c +++ b/src/5gnrrlc/kw_tmm_dl.c @@ -18,42 +18,28 @@ /********************************************************************** - Name: LTE-RLC Layer + Name: NR RLC Layer Type: C file Desc: Source code for RLC Transparent mode assembly and reassembly.This file contains following functions - --kwTmmQSdu - --kwTmmSndToLi - --kwTmmRcvFrmLi + --rlcTmmQSdu + --rlcTmmSendToMac + --rlcTmmRcvFrmMac --kwTmmReEstablish File: kw_tmm_dl.c **********************************************************************/ -static const char* RLOG_MODULE_NAME="TMM"; -static int RLOG_MODULE_ID=2048; -static int RLOG_FILE_ID=200; /** * @file kw_tmm_dl.c * @brief RLC Transparent Mode module */ /* header (.h) include files */ -#include "envopt.h" /* environment options */ -#include "envdep.h" /* environment dependent */ -#include "envind.h" /* environment independent */ - -#include "gen.h" /* general */ -#include "ssi.h" /* system services */ -#include "cm5.h" /* common timer defines */ -#include "cm_tkns.h" /* common tokens defines */ -#include "cm_mblk.h" /* common memory allocation library defines */ -#include "cm_llist.h" /* common link list defines */ -#include "cm_hash.h" /* common hash list defines */ -#include "cm_lte.h" /* common LTE defines */ +#include "common_def.h" #include "lkw.h" /* LKW defines */ #include "ckw.h" /* CKW defines */ #include "kwu.h" /* KWU defines */ @@ -66,16 +52,6 @@ static int RLOG_FILE_ID=200; #include "kw_dl.h" /* extern (.x) include files */ -#include "gen.x" /* general */ -#include "ssi.x" /* system services */ - -#include "cm5.x" /* common timer library */ -#include "cm_tkns.x" /* common tokens */ -#include "cm_mblk.x" /* common memory allocation */ -#include "cm_llist.x" /* common link list */ -#include "cm_hash.x" /* common hash list */ -#include "cm_lte.x" /* common LTE includes */ -#include "cm_lib.x" /* common memory allocation library */ #include "lkw.x" /* LKW */ #include "ckw.x" /* CKW */ #include "kwu.x" /* KWU */ @@ -84,12 +60,15 @@ static int RLOG_FILE_ID=200; #include "kw.x" #include "kw_udx.x" #include "kw_dl.x" +#include "rlc_utils.h" +#include "rlc_mac_inf.h" +#include "rlc_lwr_inf_api.h" -#define KW_MODULE (KW_DBGMASK_TM | KW_DBGMASK_DL) +#define RLC_MODULE (RLC_DBGMASK_TM | RLC_DBGMASK_DL) -PRIVATE Void kwTmmSndStaRsp ARGS((KwCb *gCb, KwDlRbCb *rbCb, - MsgLen bo, KwuDatReqInfo *datReqInfo)); -extern U32 rgMacGT ; +static Void rlcTmmSendBoSta ARGS((RlcCb *gCb, RlcDlRbCb *rbCb, + MsgLen bo, RlcDatReqInfo *datReqInfo)); +uint32_t rgMacGT ; /** @addtogroup tmmode */ /*@{*/ @@ -111,36 +90,23 @@ extern U32 rgMacGT ; * -# ROK * -# RFAILED */ -#ifdef ANSI -PUBLIC Void kwTmmQSdu +Void rlcTmmQSdu ( -KwCb *gCb, -KwDlRbCb *rbCb, -KwuDatReqInfo *datReqInfo, +RlcCb *gCb, +RlcDlRbCb *rbCb, +RlcDatReqInfo *datReqInfo, Buffer *mBuf ) -#else -PUBLIC Void kwTmmQSdu(gCb,rbCb,datReqInfo,mBuf) -KwCb *gCb; -KwDlRbCb *rbCb; -KwuDatReqInfo *datReqInfo; -Buffer *mBuf; -#endif { - KwSdu *sdu; + RlcSdu *sdu; - TRC2(kwTmmQSdu) - - - KW_ALLOC(gCb,sdu,sizeof(KwSdu)); + RLC_ALLOC(gCb,sdu,sizeof(RlcSdu)); #if (ERRCLASS & ERRCLS_ADD_RES) if ( sdu == NULLP ) { - RLOG_ARG2(L_FATAL,DBG_RBID,rbCb->rlcId.rbId, - "Memory Allocation failed UEID:%d CELLID:%d", - rbCb->rlcId.ueId, - rbCb->rlcId.cellId); - RETVOID; + DU_LOG("\nERROR --> RLC_DL : Memory Allocation failed UEID:%d CELLID:%d", + rbCb->rlcId.ueId, rbCb->rlcId.cellId); + return; } #endif /* ERRCLASS & ERRCLS_ADD_RES */ #ifdef CCPU_OPT @@ -148,7 +114,7 @@ Buffer *mBuf; rbCb->lch.lChType == CM_LTE_LCH_PCCH ) { sdu->mode.tm.sfn = datReqInfo->tm.tmg.sfn; - sdu->mode.tm.subframe = datReqInfo->tm.tmg.subframe; + sdu->mode.tm.slot = datReqInfo->tm.tmg.slot; #ifdef EMTC_ENABLE if(rbCb->lch.lChType == CM_LTE_LCH_PCCH) { @@ -168,8 +134,8 @@ Buffer *mBuf; cmLListAdd2Tail(&(rbCb->m.tm.sduQ), &(sdu->lstEnt)); sdu->lstEnt.node = (PTR)sdu; - kwTmmSndStaRsp(gCb, rbCb, sdu->sduSz, datReqInfo); - RETVOID; + rlcTmmSendBoSta(gCb, rbCb, sdu->sduSz, datReqInfo); + return; } /** @@ -188,63 +154,49 @@ Buffer *mBuf; * -# ROK * -# RFAILED */ -#ifdef ANSI -PUBLIC Void kwTmmSndToLi -( -KwCb *gCb, -SuId suId, -KwDlRbCb *rbCb, -RguCStaIndInfo *staInd -) -#else -PUBLIC Void kwTmmSndToLi(gCb, suId, rbCb, staInd) -KwCb *gCb; -SuId suId; -KwDlRbCb *rbCb; -RguCStaIndInfo *staInd; -#endif +void rlcTmmSendToMac(RlcCb *gCb, SuId suId, RlcDlRbCb *rbCb, RguCStaIndInfo *staInd) { + Pst pst; CmLList *node; /* Current Link List Node */ - KwSdu *sdu; /* SDU */ - RlcMacData *dlData; - S16 timeDiff = 0; - Ticks curTime = 0; - - TRC2(kwTmmSndToLi) - + RlcSdu *sdu; /* SDU */ + RlcData *dlData; + uint16_t pduLen; + uint16_t copyLen; + int16_t timeDiff = 0; + Ticks curTime = 0; CM_LLIST_FIRST_NODE(&(rbCb->m.tm.sduQ), node); - /* (Sfn,subframe) at which the message should be transmitted is - * validated with alloted (sfn,subframe)in the MAC layer */ + /* (Sfn,slot) at which the message should be transmitted is + * validated with alloted (sfn,slot)in the MAC layer */ while (node != NULLP) { - sdu = (KwSdu *)(node->node); + sdu = (RlcSdu *)(node->node); if ( rbCb->lch.lChType == CM_LTE_LCH_BCCH || rbCb->lch.lChType == CM_LTE_LCH_PCCH ) { - U16 sfn, subframe; + uint16_t sfn, slot; /* MS_FIX: syed sfn is of 10 bytes rather than 8 */ #ifdef EMTC_ENABLE - /* As part of CATM feature cross subframe scheduling is implemented , so there is some delta(currently 2) + /* As part of CATM feature cross slot scheduling is implemented , so there is some delta(currently 2) between MPDCCH and PDSCH,RLC expects cell crntTime of transmission of control dlsf, so one extra - information is provided in staInd, so that sfn,subframe should calculate from paging Timing information + information is provided in staInd, so that sfn,slot should calculate from paging Timing information in case of EMTC paging, instead of transId */ if(staInd->isEmtcPaging) { sfn = staInd->pagingTimingInfo.sfn; - subframe = staInd->pagingTimingInfo.subframe; + slot = staInd->pagingTimingInfo.slot; } else #endif { sfn = (staInd->transId >> 8) & 0x3FF; - subframe = staInd->transId & 0xFF; + slot = staInd->transId & 0xFF; } /* Table - * tm.subframe - current subframe + * tm.slot - current slot * 0,sfn 7,sfn-1 * 4,sfn 1,sfn * 5,sfn 2,sfn @@ -254,30 +206,23 @@ RguCStaIndInfo *staInd; * Take care of SFN wraparound. TODO: It is better for RLC * not to be aware of SCH DELTAs. So we should look for * sending actual transmission time to RLC. */ - if ((subframe + TFU_DELTA) >= 10) + if ((slot + TFU_DELTA) >= 10) { sfn = (sfn + 1)%1024; } if ((sdu->mode.tm.sfn != sfn) || - (sdu->mode.tm.subframe != ((subframe+TFU_DELTA)%10))) + (sdu->mode.tm.slot != ((slot+TFU_DELTA)%10))) { node = node->next; - RLOG_ARG4(L_DEBUG,DBG_RBID,rbCb->rlcId.rbId, - "Releasing SDU of RNTI = %d for RNTI = %d UEID:%d CELLID:%d", - sdu->mode.tm.rnti, - staInd->rnti, - rbCb->rlcId.ueId, - rbCb->rlcId.cellId); - RLOG_ARG4(L_DEBUG,DBG_RBID,rbCb->rlcId.rbId, - "sfn %d subframe %d UEID:%d CELLID:%d", - sfn, - subframe, - rbCb->rlcId.ueId, - rbCb->rlcId.cellId); + DU_LOG("\nINFO --> RLC_DL : rlcTmmSendToMac: Releasing SDU of RNTI = %d for RNTI = %d \ + UEID:%d CELLID:%d", sdu->mode.tm.rnti, staInd->rnti, rbCb->rlcId.ueId, + rbCb->rlcId.cellId); + DU_LOG("\nINFO --> RLC_DL : rlcTmmSendToMac: sfn %d slot %d UEID:%d CELLID:%d", + sfn, slot, rbCb->rlcId.ueId, rbCb->rlcId.cellId); cmLListDelFrm(&(rbCb->m.tm.sduQ), &sdu->lstEnt); - KW_FREE_BUF(sdu->mBuf); - KW_FREE(gCb, sdu, sizeof(KwSdu)); + ODU_PUT_MSG_BUF(sdu->mBuf); + RLC_FREE(gCb, sdu, sizeof(RlcSdu)); } else { @@ -295,33 +240,22 @@ RguCStaIndInfo *staInd; { timeDiff = curTime - sdu->arrTime; } - RLOG_ARG4(L_DEBUG, DBG_RBID,rbCb->rlcId.rbId, - "TMM: TmSdu Sta Indication received for Rnti %d Sdu Rnti %d " - " UEID:%d CELLID:%d", - staInd->rnti, - sdu->mode.tm.rnti, - rbCb->rlcId.ueId, - rbCb->rlcId.cellId); - RLOG_ARG4(L_DEBUG, DBG_RBID,rbCb->rlcId.rbId, - "TMM: TmSdu Sta Indication received : timeDiff %d SduQCnt %lu" - " UEID:%d CELLID:%d", - timeDiff, - rbCb->m.tm.sduQ.count, - rbCb->rlcId.ueId, - rbCb->rlcId.cellId); + DU_LOG("\nDEBUG --> RLC_DL : rlcTmmSendToMac: TMM: TmSdu Sta Indication received \ + for Rnti %d Sdu Rnti %d UEID:%d CELLID:%d", staInd->rnti, + sdu->mode.tm.rnti, rbCb->rlcId.ueId, rbCb->rlcId.cellId); + DU_LOG("\nDEBUG --> RLC_DL : rlcTmmSendToMac: TMM: TmSdu Sta Indication received : \ + timeDiff %d SduQCnt %d UEID:%d CELLID:%d", timeDiff, rbCb->m.tm.sduQ.count, + rbCb->rlcId.ueId, rbCb->rlcId.cellId); if (timeDiff > 40) { /* Memory leak needs to be fixed */ node = node->next; - RLOG_ARG3(L_DEBUG, DBG_RBID,rbCb->rlcId.rbId, - " timeDiff greater than 40, so deleting the Sdu %u " - " UEID:%d CELLID:%d", - sdu->mode.tm.rnti, - rbCb->rlcId.ueId, - rbCb->rlcId.cellId); + DU_LOG("\nERROR --> RLC_DL : rlcTmmSendToMac: timeDiff greater than 40, so deleting\ + the Sdu %u UEID:%d CELLID:%d", sdu->mode.tm.rnti, rbCb->rlcId.ueId, + rbCb->rlcId.cellId); cmLListDelFrm(&(rbCb->m.tm.sduQ), &sdu->lstEnt); - KW_FREE_BUF(sdu->mBuf); - KW_FREE(gCb, sdu, sizeof(KwSdu)); + ODU_PUT_MSG_BUF(sdu->mBuf); + RLC_FREE(gCb, sdu, sizeof(RlcSdu)); continue; } @@ -329,36 +263,20 @@ RguCStaIndInfo *staInd; { /* Memory leak needs to be fixed */ node = node->next; - RLOG_ARG4(L_DEBUG,DBG_RBID,rbCb->rlcId.rbId, - "TMM: Searching for Rnti %d Skipping Sdu for Rnti %d" - " UEID:%d CELLID:%d", - staInd->rnti, - sdu->mode.tm.rnti, - rbCb->rlcId.ueId, - rbCb->rlcId.cellId); - RLOG_ARG4(L_DEBUG,DBG_RBID,rbCb->rlcId.rbId, - " timeDiff %d sdu->arrTime %d" - " UEID:%d CELLID:%d", - timeDiff, - sdu->arrTime, - rbCb->rlcId.ueId, - rbCb->rlcId.cellId); - RLOG_ARG4(L_DEBUG,DBG_RBID,rbCb->rlcId.rbId, - "curTime %d SduQCnt %lu and continuing" - " UEID:%d CELLID:%d", - curTime, - rbCb->m.tm.sduQ.count, - rbCb->rlcId.ueId, - rbCb->rlcId.cellId); + DU_LOG("\nDEBUG --> RLC_DL : rlcTmmSendToMac: TMM: Searching for Rnti %d Skipping \ + Sdu for Rnti %d UEID:%d CELLID:%d", staInd->rnti, sdu->mode.tm.rnti, + rbCb->rlcId.ueId, rbCb->rlcId.cellId); + DU_LOG("\nINFO --> RLC_DL : rlcTmmSendToMac: timeDiff %d sdu->arrTime %d UEID:%d CELLID:%d", + timeDiff, sdu->arrTime, rbCb->rlcId.ueId, rbCb->rlcId.cellId); + DU_LOG("\nINFO --> RLC_DL : rlcTmmSendToMac: curTime %d SduQCnt %d and continuing" + " UEID:%d CELLID:%d", curTime, rbCb->m.tm.sduQ.count, rbCb->rlcId.ueId, + rbCb->rlcId.cellId); continue; } else { - RLOG_ARG3(L_DEBUG, DBG_RBID,rbCb->rlcId.rbId, - "TMM: TmSdu found %u UEID:%d CELLID:%d", - sdu->mode.tm.rnti, - rbCb->rlcId.ueId, - rbCb->rlcId.cellId); + DU_LOG("\nDEBUG --> RLC_DL : rlcTmmSendToMac: TMM: TmSdu found %u UEID:%d CELLID:%d", + sdu->mode.tm.rnti, rbCb->rlcId.ueId, rbCb->rlcId.cellId); break; } } @@ -366,60 +284,72 @@ RguCStaIndInfo *staInd; } if ( node == NULLP ) { - RLOG_ARG2(L_ERROR,DBG_RBID,rbCb->rlcId.rbId, - "SDU not found TM Queue is empty UEID:%d CELLID:%d", - rbCb->rlcId.ueId, - rbCb->rlcId.cellId); - RETVOID; + DU_LOG("\nERROR --> RLC_DL : rlcTmmSendToMac: SDU not found TM Queue is empty UEID:%d CELLID:%d", + rbCb->rlcId.ueId, rbCb->rlcId.cellId); + return; } - sdu = (KwSdu *)node->node; + sdu = (RlcSdu *)node->node; - KW_ALLOC_SHRABL_BUF(gCb->u.dlCb->rguDlSap[suId].pst.region, - gCb->u.dlCb->rguDlSap[suId].pst.pool, - dlData,(Size)sizeof(RlcMacData)); + RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_DL, RLC_POOL, + dlData,(Size)sizeof(RlcData)); #if (ERRCLASS & ERRCLS_ADD_RES) if ( dlData == NULLP ) { - RLOG_ARG2(L_FATAL,DBG_RBID,rbCb->rlcId.rbId, - "Memory Allocation failed UEID:%d CELLID:%d", - rbCb->rlcId.ueId, - rbCb->rlcId.cellId); - RETVOID; + DU_LOG("\nERROR --> RLC_DL : rlcTmmSendToMac: Memory Allocation failed UEID:%d CELLID:%d", + rbCb->rlcId.ueId, rbCb->rlcId.cellId); + return; } #endif /* ERRCLASS & ERRCLS_ADD_RES */ - dlData->timeToTx.sfn = sdu->mode.tm.sfn; - dlData->timeToTx.subframe = sdu->mode.tm.subframe; + dlData->slotInfo.sfn = sdu->mode.tm.sfn; + dlData->slotInfo.slot = sdu->mode.tm.slot; dlData->cellId = rbCb->rlcId.cellId; dlData->rnti = sdu->mode.tm.rnti; - dlData->nmbPdu = 1; + dlData->numPdu = 1; dlData->pduInfo[0].commCh = TRUE; dlData->pduInfo[0].lcId = rbCb->lch.lChId; - dlData->pduInfo[0].pduBuf = sdu->mBuf; + + /* Copy Message to fixed buffer to send */ + ODU_GET_MSG_LEN(sdu->mBuf, (MsgLen *)&pduLen); + RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_DL, RLC_POOL, + dlData->pduInfo[0].pduBuf, pduLen); + if (dlData->pduInfo[0].pduBuf == NULLP ) + { + DU_LOG("\nERROR --> RLC_DL : Memory allocation failed"); + return; + } + ODU_COPY_MSG_TO_FIX_BUF(sdu->mBuf, 0, pduLen, \ + dlData->pduInfo[0].pduBuf, (MsgLen *)©Len); + dlData->pduInfo[0].pduLen = pduLen; + + /* Free message */ + ODU_PUT_MSG_BUF(sdu->mBuf); /* kw005.201 ccpu00117318, updating the statistics */ gCb->genSts.bytesSent += sdu->sduSz; gCb->genSts.pdusSent++; - kwUtlIncrementKwuStsSduTx(gCb->u.dlCb->kwuDlSap + rbCb->kwuSapId); + rlcUtlIncrementKwuStsSduTx(gCb->u.dlCb->rlcKwuDlSap + rbCb->k1wuSapId); /* remove SDU from queue */ sdu->mBuf = NULLP; cmLListDelFrm(&(rbCb->m.tm.sduQ), &sdu->lstEnt); - KW_FREE(gCb,sdu, sizeof(KwSdu)); + RLC_FREE(gCb,sdu, sizeof(RlcSdu)); - /* If trace flag is enabled send the trace indication */ - if(gCb->init.trc == TRUE) + /* Fill Pst structure. Copying rguSap->pst to pst to avoid any + * changes in rguSap->pst */ + memset(&pst, 0, sizeof(Pst)); + FILL_PST_RLC_TO_MAC(pst, RLC_DL_INST, EVENT_DL_DATA_TO_MAC); + + if(RlcSendDlDataToMac(&pst, dlData) != ROK) { - /* Populate the trace params */ - kwLmmSendTrc(gCb,EVTRLCDLDAT, NULLP); - } - - RlcMacSendDlData(&(gCb->u.dlCb->rguDlSap[suId].pst), - gCb->u.dlCb->rguDlSap[suId].spId, - dlData); - RETVOID; + RLC_FREE_SHRABL_BUF(pst.region, pst.pool, dlData->pduInfo[0].pduBuf, \ + dlData->pduInfo[0].pduLen); + RLC_FREE_SHRABL_BUF(pst.region, pst.pool, dlData, sizeof(RlcData)); + } + + return; } /** @@ -437,28 +367,20 @@ RguCStaIndInfo *staInd; * @return S16 * -# ROK */ -#ifdef ANSI -PUBLIC Void kwDlTmmReEstablish +Void rlcDlTmmReEstablish ( -KwCb *gCb, -KwDlRbCb *rbCb +RlcCb *gCb, +RlcDlRbCb *rbCb ) -#else -PUBLIC Void kwDlTmmReEstablish(gCb,rbCb) -KwCb *gCb; -KwDlRbCb *rbCb; -#endif { - TRC2(kwDlTmmReEstablish) - #ifdef LTE_L2_MEAS_RLC - kwUtlEmptySduQ(gCb, rbCb, &rbCb->m.tm.sduQ); + rlcUtlEmptySduQ(gCb, rbCb, &rbCb->m.tm.sduQ); #else - kwUtlEmptySduQ(gCb,&rbCb->m.tm.sduQ); + rlcUtlEmptySduQ(gCb,&rbCb->m.tm.sduQ); #endif - RETVOID; + return; } /** * @@ -479,47 +401,22 @@ KwDlRbCb *rbCb; * -# RFAILED */ -#ifdef ANSI -PRIVATE Void kwTmmSndStaRsp -( -KwCb *gCb, -KwDlRbCb *rbCb, -MsgLen bo, -KwuDatReqInfo *datReqInfo -) -#else -PRIVATE Void kwTmmSndStaRsp(rbCb,bo,datReqInfo) -KwCb *gCb; -KwDlRbCb *rbCb; -MsgLen bo; -KwuDatReqInfo *datReqInfo; -#endif +static void rlcTmmSendBoSta(RlcCb *gCb, RlcDlRbCb *rbCb, MsgLen bo, RlcDatReqInfo *datReqInfo) { -// RguCStaRspInfo *staRspInfo; /* Status Response Information */ - RlcMacBOStatus *boStatus; /* Buffer occupancy status information */ - KwRguSapCb *rguSap; /* SAP Information */ - - TRC3(kwTmmSndStaRsp) - - - rguSap = &(gCb->u.dlCb->rguDlSap[rbCb->rguSapId]); + Pst pst; /* Post structure */ + RlcBoStatus *boStatus; /* Buffer occupancy status information */ - KW_ALLOC_SHRABL_BUF(gCb->u.dlCb->rguDlSap[rbCb->rguSapId].pst.region, - gCb->u.dlCb->rguDlSap[rbCb->rguSapId].pst.pool, - boStatus, sizeof(RguCStaRspInfo)); -#if (ERRCLASS & ERRCLS_ADD_RES) + RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_DL, RLC_POOL, + boStatus, sizeof(RlcBoStatus)); if ( boStatus == NULLP ) { - RLOG_ARG2(L_FATAL,DBG_RBID,rbCb->rlcId.rbId, - "Memory Allocation failed UEID:%d CELLID:%d", - rbCb->rlcId.ueId, - rbCb->rlcId.cellId); - RETVOID; + DU_LOG("\nERROR --> RLC_DL : Memory Allocation failed UEID:%d CELLID:%d",\ + rbCb->rlcId.ueId, rbCb->rlcId.cellId); + return; } -#endif /* ERRCLASS & ERRCLS_ADD_RES */ boStatus->cellId = rbCb->rlcId.cellId; - boStatus->rnti = rbCb->rlcId.ueId; + boStatus->ueIdx = rbCb->rlcId.ueId; boStatus->commCh = TRUE; boStatus->lcId = rbCb->lch.lChId; boStatus->bo = bo; @@ -528,12 +425,20 @@ KwuDatReqInfo *datReqInfo; if(gCb->init.trc == TRUE) { /* Populate the trace params */ - kwLmmSendTrc(gCb, EVTRLCBOSTA, NULLP); + rlcLmmSendTrc(gCb, EVENT_BO_STATUS_TO_MAC, NULLP); } - RlcMacSendBOStatus(&rguSap->pst, rguSap->spId, boStatus); + /* Fill Pst structure. Copying rguSap->pst to pst to avoid any + * changes in rguSap->pst */ + memset(&pst, 0, sizeof(Pst)); + FILL_PST_RLC_TO_MAC(pst, RLC_DL_INST, EVENT_DL_DATA_TO_MAC); + + if(RlcSendBoStatusToMac(&pst, boStatus) != ROK) + { + RLC_FREE_SHRABL_BUF(pst.region, pst.pool, boStatus, sizeof(RlcBoStatus)); + } - RETVOID; + return; } #ifdef _cplusplus