]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - keystone-rtos/netapi.git/blobdiff - ti/runtime/netapi/src/pktio.c
Fix in netapi_pktioOpen when calling Qmss_queueOpen
[keystone-rtos/netapi.git] / ti / runtime / netapi / src / pktio.c
index ea558ae8644fa93191ee2cb76a17d024a31c0bf7..cbe802e79bb036d5b03565923a010e8bc975f85d 100755 (executable)
 #include <unistd.h>
 #include "netapi.h"
 #include "pktio.h"
-
+#include <ti/csl/csl_qm_queue.h>
 
 
 
 /*This defines the maximum number of packets to receive in one pktio poll */
 #define PKTIO_MAX_RECV  (TUNE_NETAPI_MAX_BURST_RCV)
 
-static hplib_spinLock_T netapi_pktio_lock = hplib_spinLock_UNLOCKED_INITIALIZER;
+extern NETAPI_SHM_T* pnetapiShm;
 
 
 /* Utilites*/
 static PKTIO_HANDLE_T * netapip_pktioGetFreeChannelSlot(NETAPI_T n)
 {
+    NETAPI_HANDLE_T *p_handle;
     PKTIO_HANDLE_T ** pp = (PKTIO_HANDLE_T **) netapi_get_pktio_list(n);
     int i;
-    hplib_mSpinLockLock(&netapi_pktio_lock);
+    p_handle = (NETAPI_HANDLE_T*) n;
+    p_handle->spinLock.lock(&pnetapiShm->netapi_pktio_lock);
     for(i=0;i<NETAPI_MAX_PKTIO;i++)
     {
         if (pp[i]->inuse != PKTIO_INUSE)
         {
             pp[i]->inuse = PKTIO_INUSE;
-            hplib_mSpinLockUnlock(&netapi_pktio_lock);
+            p_handle->spinLock.unlock(&pnetapiShm->netapi_pktio_lock);
             return  pp[i];
         }
     }
-    hplib_mSpinLockUnlock(&netapi_pktio_lock);
+    p_handle->spinLock.unlock(&pnetapiShm->netapi_pktio_lock);
     return NULL;
 }
 
@@ -97,7 +99,6 @@ static int netapip_pktioSendL4CkSumCryptPort(struct PKTIO_HANDLE_tag * pp,
     uint32_t swInfo0, swInfo1;
 
     NETCP_CFG_SA_T tunnel_id = (NETCP_CFG_SA_T) m->sa_handle;
-
     if (netapip_netcpCfgGetSaInflowInfo(&netapi_get_global()->nwal_context, tunnel_id, &swInfo0, &swInfo1))
     {
         nwal_mCmdSetL4CkSumCrypPort(pkt,
@@ -109,10 +110,10 @@ static int netapip_pktioSendL4CkSumCryptPort(struct PKTIO_HANDLE_tag * pp,
                                     pTxPktInfo->saPayloadLen, 
                                     swInfo0, 
                                     swInfo1,
-                                    0);
+                                    pTxPktInfo->enetPort);
 
         pPloadDesc = Pktlib_getDescFromPacket(pkt);
-        pPloadDesc = Qmss_osalConvertDescVirtToPhy(pPloadDesc);
+        pPloadDesc = Osal_qmssConvertDescVirtToPhy(0, pPloadDesc);
         Qmss_queuePushDescSizeRaw(p->tx_psCmdInfo.txQueue,
                                   pPloadDesc,
                                   NWAL_DESC_SIZE);
@@ -145,20 +146,70 @@ static int netapip_pktioSendCryptPort(struct PKTIO_HANDLE_tag * pp,
     Cppi_HostDesc*          pPloadDesc;
     uint32_t swInfo0, swInfo1;
 
+
     NETCP_CFG_SA_T tunnel_id = (NETCP_CFG_SA_T) m->sa_handle;
 
     if (netapip_netcpCfgGetSaInflowInfo(&netapi_get_global()->nwal_context, tunnel_id, &swInfo0, &swInfo1))
     {
         nwal_mCmdSetCrypPort(pkt,
                              &p->tx_psCmdInfo,
-                              pTxPktInfo->saOffBytes, 
-                              pTxPktInfo->saPayloadLen, 
-                              swInfo0, 
+                              pTxPktInfo->saOffBytes,
+                              pTxPktInfo->saPayloadLen,
+                              swInfo0,
                               swInfo1,
-                              0);
+                              pTxPktInfo->enetPort);
+
+        pPloadDesc = Pktlib_getDescFromPacket(pkt);
+        pPloadDesc = Osal_qmssConvertDescVirtToPhy(0, pPloadDesc);
+        Qmss_queuePushDescSizeRaw(p->tx_psCmdInfo.txQueue,
+                                  pPloadDesc,
+                                  NWAL_DESC_SIZE);
+    }
+    else
+    {
+          *err=NETAPI_ERR_BAD_INPUT;
+          return -1;
+    }
+
+    return 1;
+}
+
+
+/********************************************************************
+ * FUNCTION PURPOSE: Send packet via low level NWAL API's
+ * with updates for L3 checksum, ESP Crypto and outgoing EMAC port
+ * to NetCP command.
+ ********************************************************************
+ * DESCRIPTION: Send packet via low level NWAL API's
+ * with updates for L3 checksum, ESP Crypto and outgoing EMAC port
+ * to NetCP command.
+ ********************************************************************/
+static int netapip_pktioSendL3CkSumCryptPort(struct PKTIO_HANDLE_tag * pp,
+                                     Ti_Pkt *pkt,
+                                     PKTIO_METADATA_T *m,
+                                     int * err)
+{
+    PKTIO_HANDLE_T *p=(PKTIO_HANDLE_T*) pp;
+    nwalTxPktInfo_t *pTxPktInfo = m->u.tx_meta;
+    Cppi_HostDesc*          pPloadDesc;
+    uint32_t swInfo0, swInfo1;
+
+    NETCP_CFG_SA_T tunnel_id = (NETCP_CFG_SA_T) m->sa_handle;
+
+
+    if (netapip_netcpCfgGetSaInflowInfo(&netapi_get_global()->nwal_context, tunnel_id, &swInfo0, &swInfo1))
+    {
+        nwal_mCmdSetL3CkSumCrypPort(pkt,
+                                    &p->tx_psCmdInfo,
+                                    pTxPktInfo->saOffBytes,
+                                    pTxPktInfo->saPayloadLen,
+                                    swInfo0,
+                                    swInfo1,
+                                    pTxPktInfo->enetPort);
 
         pPloadDesc = Pktlib_getDescFromPacket(pkt);
-        pPloadDesc = Qmss_osalConvertDescVirtToPhy(pPloadDesc);
+        pPloadDesc = Osal_qmssConvertDescVirtToPhy(0, pPloadDesc);
+
         Qmss_queuePushDescSizeRaw(p->tx_psCmdInfo.txQueue,
                                   pPloadDesc,
                                   NWAL_DESC_SIZE);
@@ -172,6 +223,11 @@ static int netapip_pktioSendCryptPort(struct PKTIO_HANDLE_tag * pp,
     return 1;
 }
 
+
+
+
+
+
 /********************************************************************
  * FUNCTION PURPOSE: Send packet via low level NWAL API's
  * with updates for L4 checksum,AH Crypto and outgoing EMAC port 
@@ -209,7 +265,8 @@ static int netapip_pktioSendL4CkSumAHCryptPort(struct PKTIO_HANDLE_tag * pp,
                                 pTxPktInfo->enetPort);
 
         pPloadDesc = Pktlib_getDescFromPacket(pkt);
-        pPloadDesc = Qmss_osalConvertDescVirtToPhy(pPloadDesc);
+        pPloadDesc = Osal_qmssConvertDescVirtToPhy(0, pPloadDesc);
+
         Qmss_queuePushDescSizeRaw(p->tx_psCmdInfo.txQueue,
                                   pPloadDesc,
                                   NWAL_DESC_SIZE);
@@ -242,22 +299,24 @@ static int netapip_pktioSendAHCryptPort(struct PKTIO_HANDLE_tag * pp,
     Cppi_HostDesc*          pPloadDesc;
     uint32_t swInfo0, swInfo1;
 
+
     NETCP_CFG_SA_T tunnel_id = (NETCP_CFG_SA_T) m->sa_handle;
 
     if (netapip_netcpCfgGetSaInflowInfo(&netapi_get_global()->nwal_context, tunnel_id, &swInfo0, &swInfo1))
     {
         nwal_mCmdSetAHCrypPort(pkt,
-                                &p->tx_psCmdInfo,
-                                pTxPktInfo->saOffBytes, 
-                                pTxPktInfo->saPayloadLen, 
-                                swInfo0, 
-                                swInfo1,
-                                pTxPktInfo->saAhIcvOffBytes,
-                                pTxPktInfo->saAhMacSize,
-                                pTxPktInfo->enetPort);
+                               &p->tx_psCmdInfo,
+                               pTxPktInfo->saOffBytes, 
+                               pTxPktInfo->saPayloadLen, 
+                               swInfo0, 
+                               swInfo1,
+                               pTxPktInfo->saAhIcvOffBytes,
+                               pTxPktInfo->saAhMacSize,
+                               pTxPktInfo->enetPort);
         
         pPloadDesc = Pktlib_getDescFromPacket(pkt);
-        pPloadDesc = Qmss_osalConvertDescVirtToPhy(pPloadDesc);
+        pPloadDesc = Osal_qmssConvertDescVirtToPhy(0, pPloadDesc);
+
         Qmss_queuePushDescSizeRaw(p->tx_psCmdInfo.txQueue,
                                   pPloadDesc,
                                   NWAL_DESC_SIZE);
@@ -290,6 +349,7 @@ static int netapip_pktioSendL4CkSumPort(struct PKTIO_HANDLE_tag * pp,
     PKTIO_HANDLE_T *p=(PKTIO_HANDLE_T*) pp;
     nwalTxPktInfo_t *pTxPktInfo = m->u.tx_meta;
     Cppi_HostDesc*          pPloadDesc;
+
     nwal_mCmdSetL4CkSumPort(pkt,
                             &p->tx_psCmdInfo,
                             pTxPktInfo->l4OffBytes,
@@ -298,10 +358,11 @@ static int netapip_pktioSendL4CkSumPort(struct PKTIO_HANDLE_tag * pp,
                             pTxPktInfo->enetPort);
 
     pPloadDesc = Pktlib_getDescFromPacket(pkt);
-    pPloadDesc = Qmss_osalConvertDescVirtToPhy(pPloadDesc);
+    pPloadDesc = Osal_qmssConvertDescVirtToPhy(0, pPloadDesc);
     Qmss_queuePushDescSizeRaw(p->tx_psCmdInfo.txQueue,
                                   pPloadDesc,
                                   NWAL_DESC_SIZE);
+    return 1;
 }
 
 
@@ -320,11 +381,13 @@ static int netapip_pktioSendPort(struct PKTIO_HANDLE_tag * pp,
     PKTIO_HANDLE_T *p=(PKTIO_HANDLE_T*) pp;
     nwalTxPktInfo_t *pTxPktInfo = m->u.tx_meta;
     Cppi_HostDesc*          pPloadDesc;
+    
     nwal_mCmdSetPort(pkt,
-                                &p->tx_psCmdInfo,
-                                 pTxPktInfo->enetPort);
+                     &p->tx_psCmdInfo,
+                     pTxPktInfo->enetPort);
     pPloadDesc = Pktlib_getDescFromPacket(pkt);
-    pPloadDesc = Qmss_osalConvertDescVirtToPhy(pPloadDesc);
+    pPloadDesc = Osal_qmssConvertDescVirtToPhy(0, pPloadDesc);
+
     Qmss_queuePushDescSizeRaw(p->tx_psCmdInfo.txQueue,
                                   pPloadDesc,
                                   NWAL_DESC_SIZE);
@@ -370,6 +433,9 @@ static int netapip_pktioSendNwal(struct PKTIO_HANDLE_tag * pp,
     return 1;
 }
 
+
+
+
 /********************************************************************
  * FUNCTION PURPOSE: Send packet to SA via NWAL
  ********************************************************************
@@ -388,6 +454,7 @@ static int netapip_pktioSendSb(struct PKTIO_HANDLE_tag * pp,
     Cppi_HostDesc*          pPloadDesc;
     PKTIO_HANDLE_T *p=(PKTIO_HANDLE_T*) pp;
     nwalLocCxtInfo_t      info;
+    void* virtAddr = NULL;
     nwalDmTxPayloadInfo_t *pPktInfoSB =  m->u.tx_sb_meta;
 
     NETCP_CFG_SA_T tunnel_id = (NETCP_CFG_SA_T) m->sa_handle;
@@ -417,7 +484,26 @@ static int netapip_pktioSendSb(struct PKTIO_HANDLE_tag * pp,
             pPktInfoSB->aadSize,
             pPktInfoSB->pAad);
         pPloadDesc = Pktlib_getDescFromPacket(pkt);
-        pPloadDesc = Qmss_osalConvertDescVirtToPhy(pPloadDesc);
+
+#if 0
+        printf("netapip_pktioSendSb: dumping descriptor begin\n");
+        PKTIO_dump_buf_32bit(pPloadDesc, 128);
+        printf("netapip_pktioSendSb: dumping descriptor end\n");
+        
+                virtAddr= hplib_mVMPhyToVirt(pPloadDesc->softwareInfo1);
+
+                printf("phy Addr: 0x%x\n", pPloadDesc->softwareInfo1);
+                printf("virtAddr: 0x%x\n", virtAddr);
+
+                printf("netapip_pktioSendSb: dumping security context begin\n");
+                PKTIO_dump_buf((uint8_t*)virtAddr, 128);
+                PKTIO_dump_buf((uint8_t*)virtAddr+128, 128);
+                printf("netapip_pktioSendSb: dumping security context end\n");
+#endif
+
+
+        pPloadDesc = Osal_qmssConvertDescVirtToPhy(0, pPloadDesc);
+
         Qmss_queuePushDescSizeRaw(dmPSCmdInfo->txQueue,
                                              pPloadDesc,
                                              NWAL_DESC_SIZE); 
@@ -448,7 +534,8 @@ static int netapip_pktioSendIfdma(struct PKTIO_HANDLE_tag * pp,
         tag.srcTagLo = m->u.tx_ifdma_dest;
         Cppi_setTag (Cppi_DescType_HOST, (Cppi_Desc *)pkt, &tag);
         pPloadDesc = Pktlib_getDescFromPacket(pkt);
-        pPloadDesc = Qmss_osalConvertDescVirtToPhy(pPloadDesc);
+        pPloadDesc = Osal_qmssConvertDescVirtToPhy(0, pPloadDesc);
+
         Qmss_queuePushDescSizeRaw(p->q,
                                   pPloadDesc,
                                   NWAL_DESC_SIZE);
@@ -625,8 +712,18 @@ PKTIO_HANDLE_T * netapi_pktioCreate(NETAPI_T n,
     uint8_t         isAllocated;
 
     *err=0;
-    int q= QMSS_PARAM_NOT_SPECIFIED;
-    int qtype=Qmss_QueueType_GENERAL_PURPOSE_QUEUE;
+    int q = QMSS_PARAM_NOT_SPECIFIED;
+
+    int qtype = Qmss_QueueType_GENERAL_PURPOSE_QUEUE;
+
+    if(p_cfg == NULL)
+    {
+        *err = NETAPI_ERR_BAD_INPUT;
+        return NULL;
+    }
+    /* over-ride only for Qmss_QueueType_GIC400_QUEUE */
+    if (p_cfg->queueType == Qmss_QueueType_GIC400_QUEUE)
+        qtype = p_cfg->queueType;
 
     if ((!p_cfg)||(!name)) {*err=NETAPI_ERR_BAD_INPUT; return NULL;}
     if ((p_cfg->flags2 & PKTIO_PKT) &&(p_cfg->flags1& PKTIO_TX)) { *err=NETAPI_ERR_BAD_INPUT; return NULL;};
@@ -659,14 +756,16 @@ PKTIO_HANDLE_T * netapi_pktioCreate(NETAPI_T n,
      p->q  = Qmss_queueOpen(qtype,
                                 q, 
                                 &isAllocated);
-    if (p->q == (Qmss_QueueHnd) NULL)
+    if (p->q < 0)
     {
         netapi_Log("netapi_pktioCreate:  queueOpen failed\n");
         p->inuse=0;
         *err= NETAPI_ERR_QLLD;  ///queue lld error
         return NULL;
     }
+
     p->qInfo = Qmss_getQueueNumber(p->q);
+
     if (p_cfg->flags2 & PKTIO_PKT)
     {
         p->use_nwal = PKTIO_4_ADJ_NWAL;
@@ -718,9 +817,9 @@ PKTIO_HANDLE_T * netapi_pktioCreate(NETAPI_T n,
         (p_cfg->flags1 & PKTIO_GLOBAL))
     {
          //todo: make sure this succeeds..
-        hplib_mSpinLockLock(&netapi_pktio_lock);
+        hplib_mSpinLockLock(&pnetapiShm->netapi_pktio_lock);
         r=netapip_addGlobalPktio(n, name, &p->qInfo);
-        hplib_mSpinLockUnlock(&netapi_pktio_lock);
+        hplib_mSpinLockUnlock(&pnetapiShm->netapi_pktio_lock);
     }
 
   ((NETAPI_HANDLE_T *)n )->n_pktios+=1;
@@ -792,7 +891,7 @@ PKTIO_HANDLE_T * netapi_pktioOpen(NETAPI_T  n,
     }
     else
     {
-        hplib_mSpinLockLock(&netapi_pktio_lock); 
+        hplib_mSpinLockLock(&pnetapiShm->netapi_pktio_lock);
         /* Find queue in global list 
            Note names like "QUEUE:%d" or IFDMA:%d cause general purpose or
            IFDMA queues of that number to be opened */
@@ -801,7 +900,7 @@ PKTIO_HANDLE_T * netapi_pktioOpen(NETAPI_T  n,
             qtype= Qmss_QueueType_INFRASTRUCTURE_QUEUE;
         }
 
-        hplib_mSpinLockUnlock(&netapi_pktio_lock);
+        hplib_mSpinLockUnlock(&pnetapiShm->netapi_pktio_lock);
         p_qnum = netapip_findGlobalPktio(n, name);
 
         if (!p_qnum ) 
@@ -812,9 +911,10 @@ PKTIO_HANDLE_T * netapi_pktioOpen(NETAPI_T  n,
             return NULL;
       }
 
-     /* open a general queue (for now). use qnum that was just found */
+        /* open a general queue (for now). use qnum that was just found */
          p->q  = Qmss_queueOpen(qtype,
-                           p_qnum->qNum , &isAllocated);
+                           (p_qnum->qNum&0xfff)| (p_qnum->qMgr<<12),
+                           &isAllocated);
         if (p->q == (Qmss_QueueHnd) NULL)
         {
             netapi_Log("netapi_pktioCreate:  queueOpen failed\n");
@@ -829,7 +929,6 @@ PKTIO_HANDLE_T * netapi_pktioOpen(NETAPI_T  n,
            p->use_nwal = PKTIO_4_ADJ_NWAL;  //additonal RX q for nwal
            p->_poll = netapip_pktioPollNwalAdj;
            p->nwalInstanceHandle = netapip_returnNwalInstanceHandle(n); 
-           netapi_Log("netapi_pktioOpen: nwalInstanceHandle 0x%x\n", p->nwalInstanceHandle);
         } 
         else if (p_cfg->flags2 & PKTIO_SB)
         {
@@ -912,6 +1011,9 @@ void netapi_pktioControl(PKTIO_HANDLE_T * p,
                             case (PKTIO_FP_ESP_PORT):
                                 p->_send = netapip_pktioSendCryptPort;
                                 break;
+                            case (PKTIO_FP_ESP_L3CKSUM_PORT):
+                                p->_send = netapip_pktioSendL3CkSumCryptPort;
+                                break;
                             case (PKTIO_FP_AH_PORT):
                                 p->_send = netapip_pktioSendAHCryptPort;
                                 break;
@@ -1000,9 +1102,9 @@ void netapi_pktioDelete(PKTIO_HANDLE_T * p,
     }
 
         /* remove from name list */
-    hplib_mSpinLockLock(&netapi_pktio_lock);
+    hplib_mSpinLockLock(&pnetapiShm->netapi_pktio_lock);
         netapi_del_global_pktio((NETAPI_HANDLE_T *)p->back, p->name);
-    hplib_mSpinLockUnlock(&netapi_pktio_lock);
+    hplib_mSpinLockUnlock(&pnetapiShm->netapi_pktio_lock);
         if((p->use_nwal != PKTIO_DEF_NWAL) && (p->use_nwal != PKTIO_DEF_SB)) 
     {
                 netapip_zapQ(p->q);   //since we are deleting, zap the queue