/******************************************************************************* ################################################################################ # Copyright (c) [2017-2019] [Radisys] # # # # Licensed under the Apache License, Version 2.0 (the "License"); # # you may not use this file except in compliance with the License. # # You may obtain a copy of the License at # # # # http://www.apache.org/licenses/LICENSE-2.0 # # # # Unless required by applicable law or agreed to in writing, software # # distributed under the License is distributed on an "AS IS" BASIS, # # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # # See the License for the specific language governing permissions and # # limitations under the License. # ################################################################################ *******************************************************************************/ /************************************************************************ Name: LTE-MAC layer Type: C source file Desc: C source code for Entry point fucntions File: rg_lim.c **********************************************************************/ /** @file rg_lim.c. @brief It has APIs exposed by Lower Interface Modulue of MAC. It acts as an Interface handler for lower interface APIs. */ /* header include files -- defines (.h) */ #include "common_def.h" #include "rgu.h" /* RGU defines */ #include "tfu.h" /* RGU defines */ #include "lrg.h" /* layer management defines for LTE-MAC */ #include "crg.h" /* layer management defines for LTE-MAC */ #include "rg_sch_inf.h" /* layer management defines for LTE-MAC */ #include "rg_env.h" /* customisable defines and macros for MAC */ #include "rg.h" /* defines and macros for MAC */ /* header/extern include files (.x) */ #include "rgu.x" /* RGU types */ #include "tfu.x" /* RGU types */ #include "lrg.x" /* layer management typedefs for MAC */ #include "crg.x" /* layer management typedefs for MAC */ #include "rg_sch_inf.x" /* SCH interface typedefs */ #include "rg_prg.x" /* PRG interface typedefs */ #include "rg.x" /* typedefs for MAC */ /* local externs */ #ifdef UNUSED_FUNC static S16 rgLIMValidateSap ARGS((Inst inst,SuId suId)); #endif static Void rgLIMUtlFreeDatIndEvnt ARGS((TfuDatIndInfo *datInd, Bool error)); #ifdef RG_UNUSED static Void rgLIMUtlFreeDatReqEvnt ARGS((TfuDatReqInfo *datReq, Bool error)); #endif /* forward references */ /** * @brief Bind confirm API for TFU SAP * * @details * * Function : RgLiTfuBndCfm * * This API is invoked by PHY to confirm TFU SAP bind. * * * @param[in] Pst *pst * @param[in] SuId suId * @param[in] uint8_t status * @return S16 * -# ROK * -# RFAILED **/ S16 RgLiTfuBndCfm ( Pst *pst, SuId suId, uint8_t status ) { Inst inst; S16 ret; RgLowSapCb *tfuSap; RG_IS_INST_VALID(pst->dstInst); inst = pst->dstInst - RG_INST_START; /* Lets validate suId first */ /* CA_Change */ tfuSap = &(rgCb[inst].tfuSap); if (suId != tfuSap->sapCfg.suId) { DU_LOG("\nERROR --> MAC : Incorrect SuId. Configured (%d) Recieved (%d)", tfuSap->sapCfg.suId, suId); return RFAILED; } ret = rgLMMBndCfm (pst, suId, status); return (ret); } /* RgLiTfuBndCfm */ /** @brief This function Validates the SAP information received along with the * primitive from the lower layer. * Function: * Validates SAP information. * @param[in] Inst inst * @param suId The SAP Id * @return * -# ROK * -# RFAILED */ #ifdef UNUSED_FUNC static S16 rgLIMValidateSap(Inst inst,SuId suId) { RgLowSapCb *tfuSap; tfuSap = &(rgCb[inst].tfuSap); /* First lets check the suId */ if( suId != tfuSap->sapCfg.suId) { DU_LOG("\nERROR --> MAC : Incorrect SuId. Configured (%d) Recieved (%d)", tfuSap->sapCfg.suId, suId); return RFAILED; } if (tfuSap->sapSta.sapState != LRG_BND) { DU_LOG("\nERROR --> MAC : Lower SAP not enabled SuId (%d)", tfuSap->sapCfg.suId); return RFAILED; } return ROK; } /* end of rgLIMValidateSap */ #endif /** @brief This function frees up the TfuDatIndInfo structure * * @details * * Function: rgLIMUtlFreeDatIndEvnt * - Function frees up the TfuDatIndInfo structure, in case of error it shall * free up the buffer's present in the datIndLst. * * Processing steps: * @param [in] TfuDatIndInfo *datInd * @param [in] Bool *error * @return */ static Void rgLIMUtlFreeDatIndEvnt(TfuDatIndInfo *datInd,Bool error) { TfuDatInfo *datInfo; CmLList *node; /* Steps of freeing up the TfuDatInd. * 1. loop through the datIndLst and free up all the buffers. * 2. free up the whole event */ if ((error == TRUE) && (datInd->datIndLst.count > 0)) { node = datInd->datIndLst.first; while (node) { datInfo = (TfuDatInfo*)node->node; RG_FREE_MSG(datInfo->mBuf); node = node->next; } } RG_FREE_MEM(datInd); return; } /* end of rgLIMUtlFreeDatIndEvnt*/ /** * @brief Downlink data indication from PHY. * * @details * * Function : RgLiTfuDatInd * * This API is invoked by PHY to send data indication to MAC on * recieving data from UEs. * * @param[in] Pst *pst * @param[in] SuId suId * @param[in] TfuDatIndInfo *datInd * @return S16 * -# ROK * -# RFAILED **/ S16 RgLiTfuDatInd ( Pst *pst, SuId suId, TfuDatIndInfo *datInd ) { Inst inst; S16 ret; volatile uint32_t startTime=0; // DU_LOG("5GTF:: DatindRcvd\n"); RG_IS_INST_VALID(pst->dstInst); inst = pst->dstInst - RG_INST_START; /*starting Task*/ SStartTask(&startTime, PID_MAC_TFU_DATIND); #ifndef NO_ERRCLS if ((ret = rgLIMValidateSap (inst,suId)) != ROK) { DU_LOG("\nERROR --> MAC : SAP Validation failed"); rgLIMUtlFreeDatIndEvnt(datInd, TRUE); return (ret); } #endif /* Now call the TOM (Tfu ownership module) primitive to process further */ rgCb[inst].tfuSap.sapSts.numPduRcvd += datInd->datIndLst.count; ret = rgTOMDatInd(inst,datInd); /* Fix: sriky memory corruption precautions */ /* Free up the memory for the request structure */ if (ret == ROK) { rgLIMUtlFreeDatIndEvnt(datInd, FALSE); } else { rgLIMUtlFreeDatIndEvnt(datInd, TRUE); } /*stoping Task*/ SStopTask(startTime, PID_MAC_TFU_DATIND); return (ret); } /* RgLiTfuDatInd*/ #ifdef RG_UNUSED /** @brief This function frees up the TfuDatReqInfo structure. * * @details * * Function: rgLIMUtlFreeDatReqEvnt * - Function frees up the TfuDatReqInfo structure, in case of error it shall * free up the buffer's present in the PDUs list. * * Processing steps: * @param [in] TfuDatReqInfo *datReq * @param [in] Bool *error * @return */ static Void rgLIMUtlFreeDatReqEvnt(TfuDatReqInfo *datReq,Bool error) { TfuDatReqPduInfo *datInfo; CmLList *node; uint8_t i; /* Steps of freeing up the TfuDatReq. * 1. Free the bch buffer. * 2. loop through the pdus list and free up all the buffers. * 3. free up the whole event */ if (error) { if (datReq->bchDat.pres == PRSNT_NODEF) { RG_FREE_MSG(datReq->bchDat.val); } if (datReq->pdus.count > 0) { node = datReq->pdus.first; while (node) { datInfo = (TfuDatReqPduInfo*)node->node; for (i=0; inmbOfTBs; i++) { if (datInfo->mBuf[i] != NULLP) { RG_FREE_MSG(datInfo->mBuf[i]); } } node = node->next; } } } RG_FREE_MEM(datReq); return; } /* end of rgLIMUtlFreeDatReqEvnt*/ #endif #ifdef L2_OPTMZ /** * @brief This API is invoked to send Data to PHY. * * @details * * Function : rgLIMTfuDelDatReq * * This API is invoked to send Data to PHY. It * fills in the Pst structure, spId value and invokes Data * request primitive at TFU. * * @param[in] Inst inst * @param[in] TfuDelDatReqInfo *datReq * @return S16 * -# ROK * -# RFAILED **/ S16 rgLIMTfuDelDatReq(Inst inst,TfuDelDatReqInfo *delDatReq) { S16 ret; RgLowSapCb *tfuSap; /* Get the lower SAP control block from the layer control block. */ tfuSap = &(rgCb[inst].tfuSap); #ifndef NO_ERRCLS if (tfuSap->sapSta.sapState != LRG_BND) { DU_LOG("\nERROR --> MAC : Lower SAP not bound (%d)", tfuSap->sapSta.sapState); return RFAILED; } #endif if((ret = RgLiTfuDelDatReq (&tfuSap->sapCfg.sapPst, tfuSap->sapCfg.spId, delDatReq)) != ROK) { DU_LOG("\nERROR --> MAC : Call to RgLiTfuDelDatReq() failed"); } return (ret); } /* rgLIMTfuDatReq*/ #endif /*L2_OPTMZ */ #if defined(TENB_T2K3K_SPECIFIC_CHANGES) && defined(LTE_TDD) /** * @brief Transmission of non-rt indication from CL. * * @details * * Function : RgLiTfuNonRtInd * * This API is invoked by CL to indicate non-rt processing indication to MAC for a cell. * * @param[in] Pst *pst * @param[in] SuId suId * @return S16 * -# ROK * -# RFAILED **/ S16 RgLiTfuNonRtInd(Pst *pst,SuId suId) { #ifdef NO_ERRCLS if (rgLIMValidateSap (pst->dstInst - RG_INST_START, suId) != ROK) { DU_LOG("\nERROR --> MAC : RgLiTfuNonRtInd() SAP Validation failed.\n"); return RFAILED; } #endif rgDHMFreeTbBufs(pst->dstInst - RG_INST_START); return ROK; } /* RgLiTfuNonRtInd */ #endif /********************************************************************** End of file **********************************************************************/