WLS code changes at Lower Mac - PHY inteface
[o-du/l2.git] / src / 5gnrmac / lwr_mac_phy.c
index 1ca8e80..7a1052e 100644 (file)
 #include <stdint.h>
 
 #include "envdep.h"
+#include "gen.h"
 #include "ssi.h"
+#include "gen.x"
+#include "rg.h"
+#include "lwr_mac_phy.h"
+#include "lwr_mac_fsm.h"
 
-#include "rg_cl_phy.h"
-#ifdef FAPI
-#include "fapi.h"
+#ifdef INTEL_WLS
+#include "wls_lib.h"
 #endif
 
 EXTERN S16 rgClHndlCfgReq ARGS((void *msg));
 EXTERN void processFapiRequest ARGS((uint8_t msgType, uint32_t msgLen, void *msg));
 
+#ifdef INTEL_WLS
+
 /*******************************************************************
  *
- * @brief Sends message to PHY
+ * @brief Enqueues memory blocks for use by L1
  *
  * @details
  *
- *    Function : sendToPhy
+ *    Function : LwrMacEnqueueWlsBlock
  *
  *    Functionality:
- *         -Sends message to PHY
- *
- * @params[in] Message Type
- *             Message Length
- *             Messaga Pointer
+ *      Enqueues memory blocks for use by L1
  *
+ * @params[in] 
  * @return void
  *
-******************************************************************/
+ * ****************************************************************/
+void LwrMacEnqueueWlsBlock()
+{
+   void *memPtr;
+   void *wlsHdlr;
+
+   WLS_MEM_ALLOC(memPtr, LWR_MAC_WLS_BUF_SIZE);
+   if(memPtr) 
+   {
+      wlsHdlr = mtGetWlsHdl();
+      
+      /* allocate blocks for UL transmittion */
+      while(WLS_EnqueueBlock(wlsHdlr, WLS_VA2PA(wlsHdlr, memPtr)))
+      {
+         WLS_MEM_ALLOC(memPtr, LWR_MAC_WLS_BUF_SIZE);
+         if(!memPtr)
+           break;
+      }
+      // free not enqueued block
+      if(memPtr)
+      {
+         WLS_MEM_FREE(memPtr, LWR_MAC_WLS_BUF_SIZE);
+      }
+   }
+}/* LwrMacEnqueueWlsBlock */
+
+/*******************************************************************
+ *
+ * @brief Enqueue N number of blocks
+ *
+ * @details
+ *
+ *    Function : enqueueNBlocks
+ *
+ *    Functionality:
+ *      Enqueue N number of memory blocks
+ *
+ * @params[in] Number of blocks
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+uint16_t enqueueNBlocks(uint32_t numBlocks)
+{
+   void    *memPtr;
+   void    *wlsHdlr;       /* WLS handler */
+   wlsHdlr = mtGetWlsHdl();   
+   while(numBlocks)
+   {
+      numBlocks--;
+
+      memPtr = (void *)NULL;
+      WLS_MEM_ALLOC(memPtr, LWR_MAC_WLS_BUF_SIZE);
+      if(memPtr)
+      {
+         WLS_EnqueueBlock(wlsHdlr, WLS_VA2PA(wlsHdlr, memPtr));
+      }
+   }
+   RETVALUE(ROK);
+}/* enqueueNBlocks */
+
+/*******************************************************************
+ *
+ * @brief Add memory block (to be freed later) to list
+ *
+ * @details
+ *
+ *    Function : addWlsBlockToFree 
+ *
+ *    Functionality:
+ *       Add memory block (to be freed later) to list
+ *
+ * @params[in] 
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+void addWlsBlockToFree(void *msg, uint32_t msgLen, uint8_t idx)
+{
+   CmLList         *node;
+   WlsBlockToFree  *block;
+   MAC_ALLOC(block, sizeof(WlsBlockToFree));
+   if(block)
+   {
+      MAC_ALLOC(node, sizeof(CmLList));
+      if(node)
+      {
+         block->ptr = msg;
+         block->size = msgLen;
+
+         node->node = (PTR)block;
+         cmLListAdd2Tail(&wlsBlockToFreeList[idx], node);
+      }
+   }
+}/* addWlsBlockToFree */
+
+void freeWlsBlockList(uint8_t idx)
+{
+   CmLList         *node;
+   WlsBlockToFree  *block;
+   if(wlsBlockToFreeList[idx].count)
+   {
+      CM_LLIST_FIRST_NODE(&wlsBlockToFreeList[idx], node);
+      while(node)
+      {
+         block = (WlsBlockToFree *)node->node;
+         cmLListDelFrm(&wlsBlockToFreeList[idx], node);
+         WLS_MEM_FREE(block->ptr, block->size);
+         MAC_FREE(block, sizeof(WlsBlockToFree));
+         MAC_FREE(node, sizeof(CmLList));
+         node = NULL;
+         CM_LLIST_FIRST_NODE(&wlsBlockToFreeList[idx], node);
+      }
+   }
+}
 
-PUBLIC void sendToPhy(uint8_t msgType, uint32_t msgLen, void *msg)
+/*******************************************************************
+ *
+ * @brief Receives msg from L1 
+ *
+ * @details
+ *
+ *    Function :LwrMacRecvPhyMsg 
+ *
+ *    Functionality:
+ *      Receives L1 Msg and enqueues memort for UL msg
+ *
+ * @params[in] 
+ * @return 
+ * ****************************************************************/
+void LwrMacRecvPhyMsg()
 {
-#ifdef WLS_MEM
-   S8 ret;
-   void *pMsg;
+   uint32_t numL1Msg;   /* Number of L1 messaes received */
+   uint32_t numToGet;   /* Number of Memory blocks to get */
+   void     *wlsHdlr;       /* WLS handler */
+   uint64_t l1Msg;         /* Message received */
+   void     *l1MsgPtr;
+   uint32_t msgSize;
+   uint16_t msgType;
+   uint16_t flag;
 
-   pMsg = (void *)WLS_VA2PA(mtGetWlsHdl(), msg);
-   ret = WLS_put(mtGetWlsHdl(), (PTR)pMsg, msgLen, msgType, 0);
+   wlsHdlr = mtGetWlsHdl();
+   if(WLS_Ready(wlsHdlr))
+   {
+      numToGet = WLS_Wait(wlsHdlr);
+      
+      numL1Msg = numToGet;
+
+      while(numToGet)
+      {
+         l1Msg = (uint64_t) NULL;
+         l1Msg = WLS_Get(wlsHdlr, &msgSize, &msgType, &flag);
+         if(l1Msg)
+         {
+            l1MsgPtr = WLS_PA2VA(wlsHdlr, l1Msg); 
+            handlePhyMessages(msgType, msgSize, l1MsgPtr);
+         }
+         numToGet--;
+      }
+      
+      if(numL1Msg)
+      {
+         enqueueNBlocks(numL1Msg);
+      }
+
+   }
+} /* LwrMacRecvPhyMsg */
+
+#endif /* INTEL_WLS */
+
+/*******************************************************************
+ * 
+ *  @brief Sends message to PHY
+ * 
+ *  @details
+ * 
+ *    Function : LwrMacSendToPhy
+ *    Functionality:
+ *         -Sends message to PHY
+ * 
+ *  @params[in] Message Type
+ *              Message Length
+ *              Messaga Pointer
+ * 
+ *  @return void
+ * 
+ * *****************************************************************/
+
+PUBLIC uint16_t LwrMacSendToPhy(uint8_t msgType, uint32_t msgLen, void *msg)
+{
+#ifdef INTEL_WLS
+   int ret;
+   unsigned long long pMsg;
+   pMsg = WLS_VA2PA(mtGetWlsHdl(), msg);
+   ret = WLS_Put(mtGetWlsHdl(), pMsg, msgLen, msgType, 0);
 
    if(ret != 0)
    {
       printf("\nFailure in sending message to PHY");
-      RETVALUE(RFAILED);
+          WLS_MEM_FREE(msg, msgLen);   
+      return RFAILED;
+   }
+   else
+   {
+      addWlsBlockToFree(msg, msgLen, (slotIndIdx-1));
    }
 #else
-
    processFapiRequest(msgType, msgLen, msg);
-
 #endif
-}
+   return ROK;
+} /* LwrMacSendToPhy */
 
 /**********************************************************************
          End of file