⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ssx31bdrv.c

📁 海思KEY驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
    }
    else
    {
        ulSaID = ulINextSaID;
    }
    
    * (pulPtr + 1) = ulSaID;
/*toyendian*/    
    //* (pulPtr + 1) = SWAP32( * (pulPtr + 1) );
/*	SWAP32_LP(pulPtr+1);*/

    ulSliceNum = SSX31B_GetMbufSlice(pMBuf);

    ulTotalLen = MBUF_GET_TOTAL_DATA_LENGTH(pMBuf);

    pCurBD->ulInputLength  = ulTotalLen + SSX31B_PE_HEADER_LEHGTN;
    pCurBD->ulID = ulSaID;

    pCurBD->ulGatherEnable = CD_GATHER_ENABLE;

    pCurBD->ulReserve  = 0;
    
    pCurBD->ulInputNum = ulSliceNum + 1;

    pCurBD->ulOpCode = SSX31B_OPER_IPSEC_WITHOUT_CTRL;
    pCurBD->ulMBufPtr = (ULONG)pMBuf ;

    pGatherDesc ++;
    pTmpGatherDesc = pGatherDesc;

    ulTbdNum = MBUF_GET_DATA_BLOCK_NUMBER(pMBuf);

    pDataBlkDesc = MBUF_GET_DATA_BLOCK_DESC(pMBuf);

    ulRealNum = 0;
    for (ulTmp = 0; ulTmp < ulTbdNum; ulTmp ++)
    {

       MBUF_GET_DATA_BLOCK_DESC_INFO(pDataBlkDesc,
                                     pucData,
                                     ulDataLen,
                                     pNextDataBlkDesc);

       if (ulDataLen)
       {
 
           pTmpGatherDesc = pGatherDesc + ulRealNum;
	    pucData_dma_phys=ssx31_dma_virt_mapping_findByVirt((ULONG) pucData, &ultmpBufLen);
#ifdef HI_DBG
	//printk("SetIPSecBDSrc: ulInputPtr=%08x,DataLen(%ld)=%ld\n",pucData_dma_phys,ulDataLen,ultmpBufLen);
#endif
           pTmpGatherDesc->ulInputPtr = pucData_dma_phys; 
		   
           pTmpGatherDesc->ulInputLen = ulDataLen;
           pTmpGatherDesc->ulInputAttrib = 0;
   

           ulRealNum ++;


           if (ulRealNum == ulSliceNum)
           {
               pTmpGatherDesc->ulInputAttrib = ICD_LAST_SLICE;
               break;
           }
       }
       pDataBlkDesc =  pNextDataBlkDesc;

    }

    return OK;
}


ULONG SSX31B_SetIPSecBDSrc_Basic(SSX31BDRV_CTRL  *  pDrvCtrl, 
                                  SSX31B_IPSEC_BD *  pCurBD, 
                                  MBUF_S * pMBuf)
{
    SSX31B_ICD* pGatherDesc;
    SSX31B_ICD* pTmpGatherDesc;

    MBUF_DATABLOCKDESCRIPTOR_S * pDataBlkDesc;
    MBUF_DATABLOCKDESCRIPTOR_S * pNextDataBlkDesc;

    UCHAR* pucData;
    ULONG   pucData_dma_phys,ultmpBufLen;
    ULONG* pulPtr;

    ULONG ulTbdNum, ulTotalLen, ulTmp;
    ULONG ulRealNum, ulDataLen, ulSaID, ulINextSaID;
    ULONG ulSliceNum, ulPacketType;
    USHORT usPacketMode; 

//    pGatherDesc = (SSX31B_ICD*)pCurBD->ulInputContext_virtaddr;
    pGatherDesc = (SSX31B_ICD*)SSX31DRV_DMA2VIRT(pCurBD->ulInputContext, pDrvCtrl->pstGather,pDrvCtrl->pstGather_dmaaddr);
//    pulPtr = (ULONG*)pGatherDesc->ulInputPtr_virtaddr;
    pulPtr = (ULONG*)SSX31DRV_DMA2VIRT(pGatherDesc->ulInputPtr,pDrvCtrl->ulCtrlWordMemBase,pDrvCtrl->ulCtrlWordMemBase_dmaaddr);

    MBUF_GET_SECP_PKT_TYPE(ulPacketType, pMBuf);

/*for basic processing */
    * pulPtr= 0;

    if ( ulPacketType == PACKET_TYPE_OUTBOUND )
    {
        *pulPtr |= SSX31B_PE_CTRLWORD_OUTBOUND;
    }
    MBUF_GET_SECP_PKT_PROCMODE (usPacketMode, pMBuf);
    if ( usPacketMode > IPSEC_SECP_PKT_MODE_AHESP  )
    {
        PRINT ( "\r\nMBUF_GET_SECP_PKT_PROCMODE error: %d", usPacketMode );
	
        return ERR;
    }    
    *pulPtr |= (usPacketMode << SSX31B_PE_CTRLWORD_PROCMODE);
    
    
/*    * pulPtr = SWAP32 (* pulPtr);*/
/*toyendian*/
 	//SWAP32_LP(pulPtr);


    MBUF_GET_SECP_INEXT_SAID(ulINextSaID, pMBuf);

    if (ulINextSaID == 0xFFFFFFFF)
    {
        MBUF_GET_SECP_SAID(ulSaID, pMBuf);
    }
    else
    {
        ulSaID = ulINextSaID;
    }
    
    * (pulPtr + 1) = ulSaID;
/*    * (pulPtr + 1) = SWAP32( * (pulPtr + 1) );*/
/*toyendian*/
	//SWAP32_LP(pulPtr+1);

//#ifdef HI_DBG
#if 0
	printk("PE ControlWord: %08X \n",*pulPtr);
	printk("PE SAID: %08X \n",*(pulPtr+1));
#endif

    ulSliceNum = SSX31B_GetMbufSlice(pMBuf);

    ulTotalLen = MBUF_GET_TOTAL_DATA_LENGTH(pMBuf);

    pCurBD->ulInputLength  = ulTotalLen + SSX31B_PE_HEADER_LEHGTN;
    pCurBD->ulID = ulSaID;

    pCurBD->ulGatherEnable = CD_GATHER_ENABLE;

    pCurBD->ulReserve  = 0;
    
    pCurBD->ulInputNum = ulSliceNum + 1;

    pCurBD->ulOpCode = SSX31B_OPER_IPSEC_WITHOUT_CTRL;
    pCurBD->ulMBufPtr = (ULONG)pMBuf ;

    pGatherDesc ++;
    pTmpGatherDesc = pGatherDesc;

    ulTbdNum = MBUF_GET_DATA_BLOCK_NUMBER(pMBuf);

    pDataBlkDesc = MBUF_GET_DATA_BLOCK_DESC(pMBuf);

    ulRealNum = 0;
    for (ulTmp = 0; ulTmp < ulTbdNum; ulTmp ++)
    {

       MBUF_GET_DATA_BLOCK_DESC_INFO(pDataBlkDesc,
                                     pucData,
                                     ulDataLen,
                                     pNextDataBlkDesc);

       if (ulDataLen)
       {
 
           pTmpGatherDesc = pGatherDesc + ulRealNum;
   	    pucData_dma_phys=ssx31_dma_virt_mapping_findByVirt((ULONG) pucData, &ultmpBufLen);
//#ifdef HI_DBG
#if 0
	printk("SetIPSecBDSrc_Basic: ulInputPtr=%08x,DataLen(%ld)=%ld\n",pucData_dma_phys,ulDataLen,ultmpBufLen);
#endif

           pTmpGatherDesc->ulInputPtr = pucData_dma_phys; 

           pTmpGatherDesc->ulInputLen = ulDataLen;
           pTmpGatherDesc->ulInputAttrib = 0;
   

           ulRealNum ++;


           if (ulRealNum == ulSliceNum)
           {
               pTmpGatherDesc->ulInputAttrib = ICD_LAST_SLICE;
               break;
           }
       }
       pDataBlkDesc =  pNextDataBlkDesc;

    }

    return OK;
}


ULONG SSX31B_SetIPSecBDSrc_ForPormance(SSX31BDRV_CTRL  *  pDrvCtrl, 
                                  SSX31B_IPSEC_BD *  pCurBD, 
                                  MBUF_S * pMBuf, CHAR cIpsec /* 0 ipsec, 1 basic */)
{
    SSX31B_ICD* pGatherDesc;
    SSX31B_ICD* pTmpGatherDesc;

    MBUF_DATABLOCKDESCRIPTOR_S * pDataBlkDesc;
    MBUF_DATABLOCKDESCRIPTOR_S * pNextDataBlkDesc;

    UCHAR* pucData;
	ULONG pucData_dma_phys,ultmpBufLen;
    ULONG* pulPtr;

    ULONG ulTbdNum, ulTotalLen, ulTmp;
    ULONG ulRealNum, ulDataLen, ulSaID, ulINextSaID;
    ULONG ulSliceNum, ulPacketType;
    USHORT usPacketMode; 

//    pGatherDesc = (SSX31B_ICD*)pCurBD->ulInputContext_virtaddr;
    pGatherDesc = (SSX31B_ICD*)SSX31DRV_DMA2VIRT(pCurBD->ulInputContext, pDrvCtrl->pstGather,pDrvCtrl->pstGather_dmaaddr);
//    pulPtr = (ULONG*)pGatherDesc->ulInputPtr_virtaddr;
    pulPtr = (ULONG*)SSX31DRV_DMA2VIRT(pGatherDesc->ulInputPtr,pDrvCtrl->ulCtrlWordMemBase,pDrvCtrl->ulCtrlWordMemBase_dmaaddr);

    MBUF_GET_SECP_PKT_TYPE(ulPacketType, pMBuf);
    *pulPtr= SSX31B_PE_CTRLWORD;
   
    if (cIpsec == 1)
		*pulPtr = (ULONG)0;		/*basic process*/
   
    if ( ulPacketType == PACKET_TYPE_OUTBOUND )
    {
        * pulPtr |= SSX31B_PE_CTRLWORD_OUTBOUND;
    }
    MBUF_GET_SECP_PKT_PROCMODE (usPacketMode, pMBuf);
    if ( usPacketMode > IPSEC_SECP_PKT_MODE_AHESP  )
    {
        PRINT ( "\r\nMBUF_GET_SECP_PKT_PROCMODE error: %d", usPacketMode );
        return ERR;
    }    
    * pulPtr |= (usPacketMode << SSX31B_PE_CTRLWORD_PROCMODE);
    

/*toyendian*/    
    //* pulPtr = SWAP32 (* pulPtr);
 

    MBUF_GET_SECP_INEXT_SAID(ulINextSaID, pMBuf);

    if (ulINextSaID == 0xFFFFFFFF)
    {
        MBUF_GET_SECP_SAID(ulSaID, pMBuf);
    }
    else
    {
        ulSaID = ulINextSaID;
    }
    
    * (pulPtr + 1) = ulSaID;
/*toyendian*/    
    //* (pulPtr + 1) = SWAP32( * (pulPtr + 1) );


    ulSliceNum = SSX31B_GetMbufSlice(pMBuf);

    ulTotalLen = MBUF_GET_TOTAL_DATA_LENGTH(pMBuf);

    pCurBD->ulInputLength  = ulTotalLen + SSX31B_PE_HEADER_LEHGTN;
    pCurBD->ulID = ulSaID;

    pCurBD->ulGatherEnable = CD_GATHER_ENABLE;

    pCurBD->ulReserve  = 0;
    
    pCurBD->ulInputNum = ulSliceNum + 1;

    pCurBD->ulOpCode = SSX31B_OPER_IPSEC_WITHOUT_CTRL;
    pCurBD->ulMBufPtr = (ULONG)pMBuf ;

    pGatherDesc ++;
    pTmpGatherDesc = pGatherDesc;

    ulTbdNum = MBUF_GET_DATA_BLOCK_NUMBER(pMBuf);

    pDataBlkDesc = MBUF_GET_DATA_BLOCK_DESC(pMBuf);

    ulRealNum = 0;
    for (ulTmp = 0; ulTmp < ulTbdNum; ulTmp ++)
    {

       MBUF_GET_DATA_BLOCK_DESC_INFO(pDataBlkDesc,
                                     pucData,
                                     ulDataLen,
                                     pNextDataBlkDesc);

       if (ulDataLen)
       {
 
           pTmpGatherDesc = pGatherDesc + ulRealNum;
      	    pucData_dma_phys=ssx31_dma_virt_mapping_findByVirt((ULONG) pucData, &ultmpBufLen);
#ifdef HI_DBG
	printk("SetIPSecBDSrc_ForPormance: ulInputPtr=%08x,DataLen(%ld)=%ld\n",pucData_dma_phys,ulDataLen,ultmpBufLen);
#endif

           pTmpGatherDesc->ulInputPtr = pucData_dma_phys; 

           pTmpGatherDesc->ulInputLen = ulDataLen;
           pTmpGatherDesc->ulInputAttrib = 0;
   

           ulRealNum ++;


           if (ulRealNum == ulSliceNum)
           {
               pTmpGatherDesc->ulInputAttrib = ICD_LAST_SLICE;
               break;
           }
       }
       pDataBlkDesc =  pNextDataBlkDesc;

    }

    return OK;
}

ULONG SSX31B_SendData(SSX31BDRV_CTRL * pDrvCtrl, MBUF_S * pMBuf, UCHAR* pucBuf, dma_addr_t pucBuf_dma_phys, ULONG ulBufLen)
{
    SSX31B_IPSEC_BD* pCurBD;
    ULONG ulTotalLen ;
    LONG  lIntMask;
    
    if (pDrvCtrl->ulCurrIPSecBdReadPtr == ((pDrvCtrl->ulCurrIPSecBdWritePtr + 1) & (SSX31B_IPSEC_BDQUEUE_LEN - 1)))  /* 发送队列写指针加1取模 */
    {
        PRINT("Queue full:BD Read:%d write %d\r\n",
            pDrvCtrl->ulCurrIPSecBdReadPtr,
            pDrvCtrl->ulCurrIPSecBdWritePtr);
        return ERR;
    }

    SplImp(&lIntMask);

    pCurBD = &((SSX31B_IPSEC_BD*)(pDrvCtrl->ulIPSecBDMemBase))[pDrvCtrl->ulCurrIPSecBdWritePtr];

    if (SSX31B_SetIPSecBDSrc(pDrvCtrl, pCurBD, pMBuf) == ERR)
        goto error;
    
    if (SSX31B_IPSecSetBDDst(pDrvCtrl, pCurBD, pMBuf, pucBuf, pucBuf_dma_phys,ulBufLen) == ERR)
        goto error;
	

#if 0
{
	ULONG* pulTmp = NULL;
	ULONG* pulTmp1 = NULL;
	int i;
	
	pulTmp = (ULONG*)pCurBD;
	
	PRINT ("\r\nBD: %08x %08x %08x %08x %08x %08x ", pulTmp[0], pulTmp[1], pulTmp[2], pulTmp[3], pulTmp[4], pulTmp[5]); 
	
	pulTmp1 = (ULONG*)((ULONG)bus_to_virt ( pulTmp[1] ));
	for (i=0; i<2; i++)
	{
		PRINT ("\r\nicd %d: %08x %08x", i, pulTmp1[0], pulTmp1[1]);
		pulTmp = (ULONG*)((ULONG)bus_to_virt ( pulTmp1[0] ));
		PRINT ("\r\n buf: %08x", pulTmp[0]);
		
		pulTmp1 += 2;
	}
	
}
#endif




    pDrvCtrl->ulCurrIPSecBdWritePtr = (pDrvCtrl->ulCurrIPSecBdWritePtr + 1) & (SSX31B_IPSEC_BDQUEUE_LEN - 1);
    PciWrite32(SSX31B_REG_BQWP3, pDrvCtrl->ulCurrIPSecBdWritePtr);
    
    
    pDrvCtrl->ulFreeIPSecBDs --;
    
    ulTotalLen = MBUF_GET_TOTAL_DATA_LENGTH(pMBuf);

    pDrvCtrl->ulInSSX31BBytes += ulTotalLen;
    pDrvCtrl->ulInSSX31BPkts ++;
    
    pDrvCtrl->ulTmtDone ++;

    SplX(lIntMask);

    return OK;

error:

    pDrvCtrl->ulTmtErr ++;

/*
    if (pCurBD->ulScatterEnable == CD_SCATTER_ENABLE)
    {
        if (pCurBD->ulOutputContext)
        {
        	ULONG virtAddr,ultmpBufLen;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -