--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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. #
+################################################################################
+ *******************************************************************************/
+#include "common_def.h"
+#include "tfu.h"
+#include "lrg.h"
+#include "tfu.x"
+#include "lrg.x"
+#include "du_log.h"
+#include "du_app_mac_inf.h"
+#include "mac_sch_interface.h"
+#include "sch.h"
+#include "sch_utils.h"
+typedef struct schCellCb SchCellCb;
+typedef struct schUeCb SchUeCb;
+void schUlHqEntReset(SchCellCb *cellCb, SchUeCb *ueCb, SchUlHqEnt *hqE);
+void schUlHqAddToFreeList(SchUlHqProcCb *hqP);
+/**
+ * @brief UL Harq entity intialization
+ *
+ * @details
+ *
+ * Function : schUlHqEntInit
+ *
+ * This function intialize UL Harq entity
+ *
+ * @param[in] SchCellCb *cellCb, cell cb pointer
+ * @param[in] SchUeCb *ueCb, ue cb pointer
+ * @return
+ * -# void
+ **/
+void schUlHqEntInit(SchCellCb *cellCb, SchUeCb *ueCb)
+{
+ ueCb->ulHqEnt.numHqPrcs = SCH_MAX_NUM_UL_HQ_PROC;
+ ueCb->ulHqEnt.maxHqTx = cellCb->cellCfg.schHqCfg.maxUlDataHqTx;
+ ueCb->ulHqEnt.cell = cellCb;
+ ueCb->ulHqEnt.ue =ueCb;
+ schUlHqEntReset(cellCb, ueCb, &ueCb->ulHqEnt);
+}
+/**
+ * @brief UL Harq entity Reset
+ *
+ * @details
+ *
+ * Function : schUlHqEntReset
+ *
+ * This function Reset UL Harq entity
+ *
+ * @param[in] SchCellCb *cellCb, cell cb pointer
+ * @param[in] SchUeCb *ueCb, ue cb pointer
+ * @param[in] SchUlHqEnt *hqE, Ul Harq entity pointer
+ * @return
+ * -# void
+ **/
+void schUlHqEntReset(SchCellCb *cellCb, SchUeCb *ueCb, SchUlHqEnt *hqE)
+{
+ uint8_t count = 0;
+ SchUlHqProcCb *hqP = NULL;
+ cmLListInit(&hqE->free);
+ cmLListInit(&hqE->inUse);
+ for(count=0; count < hqE->numHqPrcs; count++)
+ {
+ hqP = &(hqE->procs[count]);
+ hqP->procId = count;
+ hqP->hqEnt = hqE;
+ hqP->maxHqTxPerHqP = hqE->maxHqTx;
+ hqP->ulHqEntLnk.node = (PTR)hqP;
+ hqP->ulHqProcLink.node = (PTR)hqP;
+ hqP->ulSlotLnk.node = (PTR)hqP;
+ schUlHqAddToFreeList(hqP);
+ }
+}
+/**
+ * @brief Add hq process to free list of UL Harq entity
+ *
+ * @details
+ *
+ * Function : schUlHqAddToFreeList
+ *
+ * This function adds hq process to free list of UL Harq entity
+ *
+ * @param[in] SchUlHqProcCb *hqP, UL harq process pointer
+ * @return
+ * -# void
+ **/
+void schUlHqAddToFreeList(SchUlHqProcCb *hqP)
+{
+ cmLListAdd2Tail(&(hqP->hqEnt->free), &hqP->ulHqEntLnk);
+}
+/**
+ * @brief Delete hq process from free list of UL Harq entity
+ *
+ * @details
+ *
+ * Function : schUlHqDeleteFromFreeList
+ *
+ * This function deletes hq process to free list of UL Harq entity
+ *
+ * @param[in] SchUlHqProcCb *hqP, UL harq process pointer
+ * @return
+ * -# void
+ **/
+void schUlHqDeleteFromFreeList(SchUlHqProcCb *hqP)
+{
+ if(hqP->hqEnt->free.count == 0)
+ {
+ DU_LOG("\n ERROR schUlHqDeleteFromInUseList no proc in in free\n");
+ }
+ cmLListDelFrm(&(hqP->hqEnt->free), &hqP->ulHqEntLnk);
+}
+/**
+ * @brief Add hq process to in use list of UL Harq entity
+ *
+ * @details
+ *
+ * Function : schUlHqAddToInUseList
+ *
+ * This function adds hq process to in use list of UL Harq entity
+ *
+ * @param[in] SchUlHqProcCb *hqP, UL harq process pointer
+ * @return
+ * -# void
+ **/
+void schUlHqAddToInUseList(SchUlHqProcCb *hqP)
+{
+ cmLListAdd2Tail(&(hqP->hqEnt->inUse), &hqP->ulHqEntLnk);
+}
+/**
+ * @brief Delete hq process from in use list of UL Harq entity
+ *
+ * @details
+ *
+ * Function : schUlHqDeleteFromInUseList
+ *
+ * This function deletes hq process to in use list of UL Harq entity
+ *
+ * @param[in] SchUlHqProcCb *hqP, UL harq process pointer
+ * @return
+ * -# void
+ **/
+void schUlHqDeleteFromInUseList(SchUlHqProcCb *hqP)
+{
+ if(hqP->hqEnt->inUse.count == 0)
+ {
+ DU_LOG("\n ERROR schUlHqDeleteFromInUseList no proc in in use\n");
+ }
+ cmLListDelFrm(&(hqP->hqEnt->inUse), &hqP->ulHqEntLnk);
+}
+/**
+ * @brief Get available Harq process from Harq entity
+ *
+ * @details
+ *
+ * Function : schUlGetAvlHqProcess
+ *
+ * This function fetches hq process from free list and puts in in use list
+ *
+ * @param[in] SchCellCb *cellCb, cell cb pointer
+ * @param[in] SchUeCb *ueCb, ue cb pointer
+ * @param[in] SchUlHqProcCb **hqP, Address of UL harq process pointer
+ * @return
+ * -# ROK
+ * -# RFAILED
+ **/
+uint8_t schUlGetAvlHqProcess(SchCellCb *cellCb, SchUeCb *ueCb, SchUlHqProcCb **hqP)
+{
+ SchUlHqProcCb *tmp;
+ if (ueCb->ulHqEnt.free.count == 0)
+ {
+ return RFAILED;
+ }
+ tmp = (SchUlHqProcCb*)(cmLListFirst(&(ueCb->ulHqEnt.free))->node);
+ if (NULLP == tmp)
+ {
+ return RFAILED;
+ }
+ schUlHqDeleteFromFreeList(tmp);
+ schUlHqAddToInUseList(tmp);
+ *hqP = tmp;
+ (*hqP)->maxHqTxPerHqP = ueCb->ulHqEnt.maxHqTx;
+ return ROK;
+}
+/**
+ * @brief Release Harq process from the UL Harq entity
+ *
+ * @details
+ *
+ * Function : schUlReleaseHqProcess
+ *
+ * This function releases Harq process from UL Harq entity
+ *
+ * @param[in] SchUlHqProcCb *hqP, UL harq process pointer
+ * @param[in] Bool togNdi, indication to togle NDI bit
+ * @return
+ * -# void
+ **/
+void schUlReleaseHqProcess(SchUlHqProcCb *hqP, Bool togNdi)
+{
+ if (togNdi == TRUE)
+ {
+ hqP->tbInfo.ndi ^= 1;
+ }
+ cmLListDeleteLList(&hqP->ulLcPrbEst.dedLcList);
+ cmLListDeleteLList(&hqP->ulLcPrbEst.defLcList);
+ schUlHqDeleteFromInUseList(hqP);
+ schUlHqAddToFreeList(hqP);
+}
+/**
+ * @brief Handles NACK for UL Harq process
+ *
+ * @details
+ *
+ * Function : schUlHqProcessNack
+ *
+ * This function handle NACK for UL Harq process
+ *
+ * @param[in] SchUlHqProcCb *hqP, UL harq process pointer
+ * @return
+ * -# void
+ **/
+void schUlHqProcessNack(SchUlHqProcCb *hqP)
+{
+ if (hqP->tbInfo.txCntr < hqP->maxHqTxPerHqP)
+ {
+ cmLListAdd2Tail(&(hqP->hqEnt->ue->ulRetxHqList), &hqP->ulHqProcLink);
+ addUeToBeScheduled(hqP->hqEnt->cell, hqP->hqEnt->ue->ueId);
+ }
+ else
+ {
+ schUlReleaseHqProcess(hqP, TRUE);
+ }
+}
+/**
+ * @brief Handles ACK for UL Harq process
+ *
+ * @details
+ *
+ * Function : schUlHqProcessAck
+ *
+ * This function handles ACK for UL Harq process
+ *
+ * @param[in] SchUlHqProcCb *hqP, UL harq process pointer
+ * @return
+ * -# void
+ **/
+void schUlHqProcessAck(SchUlHqProcCb *hqP)
+{
+ schUlReleaseHqProcess(hqP, TRUE);
+}
+/**********************************************************************
+ End of file
+ **********************************************************************/
\ No newline at end of file