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

📄 ssx31bdrv.c

📁 海思KEY驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
		virtAddr=ssx31_dma_virt_mapping_findByDmaPhys(pCurBD->ulOutputContext, &ultmpBufLen);
		if(virtAddr) ssx31_consistent_free((void*)virtAddr,ultmpBufLen, (dma_addr_t)(pCurBD->ulOutputContext));
		pCurBD->ulOutputContext = 0;
        }
    }
*/
    SplX(lIntMask);
    return ERR;
}



ULONG SSX31B_SendData_Basic(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);

	MBUF_Destroy_2(pMBuf);
	if(pucBuf!=NULL)	ssx31_consistent_free((void*)pucBuf,ulBufLen,pucBuf_dma_phys);
        return ERR;
    }

    SplImp(&lIntMask);

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

    if (SSX31B_SetIPSecBDSrc_Basic(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 ++;
    SplX(lIntMask);

	if(pucBuf!=NULL)	ssx31_consistent_free((void*)pucBuf,ulBufLen,pucBuf_dma_phys);

	MBUF_Destroy_2(pMBuf);

	/* OCDs  free in underlying funtion, toy */  

//  SplX(lIntMask);
    return ERR;
}


ULONG SSX31B_IPSec_Perf_PreSendData(SSX31BDRV_CTRL * pDrvCtrl, MBUF_S * pMBuf, UCHAR* pucBuf, dma_addr_t pucBuf_dma_phys, ULONG ulBufLen, CHAR cIpsec /* 0 ipsec, 1 basic */)
{
    SSX31B_IPSEC_BD* pCurBD;
    SSX31B_IPSEC_BD* pCurBDTmp;
    ULONG ulTotalLen ;
    LONG  lIntMask;
    ULONG i;
    
    if (pDrvCtrl->ulCurrIPSecBdReadPtr == ((pDrvCtrl->ulCurrIPSecBdWritePtr + 1) & (SSX31B_IPSEC_BDQUEUE_LEN - 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_ForPormance(pDrvCtrl, pCurBD, pMBuf, cIpsec) == ERR)
        goto error;

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



    for (i=1; i<SSX31B_IPSEC_BDQUEUE_LEN; i++)
    {
    	pCurBDTmp = &((SSX31B_IPSEC_BD*)(pDrvCtrl->ulIPSecBDMemBase))[ (pDrvCtrl->ulCurrIPSecBdWritePtr+i)&(SSX31B_IPSEC_BDQUEUE_LEN - 1) ];
	memcpy (pCurBDTmp, pCurBD, sizeof (SSX31B_IPSEC_BD) );
    }




    SplX(lIntMask);

    return OK;

error:
    pDrvCtrl->ulTmtErr ++;

/*
    if (pCurBD->ulScatterEnable == CD_SCATTER_ENABLE)
    {
        if (pCurBD->ulOutputContext)
        {
        	ULONG virtAddr,ultmpBufLen;
		virtAddr=ssx31_dma_virt_mapping_findByDmaPhys(pCurBD->ulOutputContext, &ultmpBufLen);
		ssx31_consistent_free((void*)virtAddr,	ultmpBufLen, (dma_addr_t)(pCurBD->ulOutputContext));	
            pCurBD->ulOutputContext = 0;
        }
    }
*/    
    SplX(lIntMask);
    return ERR;
}



ULONG SSX31B_Transmit(ULONG ulPhyLink, MBUF_S *pMBuf, UCHAR* pucBuf, dma_addr_t pucBuf_dma_phys, ULONG ulBufLen)
{

    SSX31BDRV_CTRL *  pDrvCtrl;
    ULONG ulPacketType = 0;

    pDrvCtrl = (SSX31BDRV_CTRL *)ulPhyLink;

    pDrvCtrl->ulTmtCall ++;      


    MBUF_GET_SECP_PKT_TYPE(ulPacketType, pMBuf);

    if ((ulPacketType != PACKET_TYPE_INBOUND) &&
        (ulPacketType != PACKET_TYPE_OUTBOUND))
    {
        pDrvCtrl->ulTmtTypeErr ++;
        /* MBUF_Destroy(pMBuf); */
        return ERR;
    }

    if (SSX31B_SendData(pDrvCtrl, pMBuf, pucBuf, pucBuf_dma_phys,ulBufLen) == ERR)
    {
        /* MBUF_Destroy(pMBuf); */
	return ERR;
    }

    
    return (OK);

}




ULONG SSX31B_Transmit_Basic(ULONG ulPhyLink, MBUF_S *pMBuf, UCHAR* pucBuf, dma_addr_t pucBuf_dma_phys, ULONG ulBufLen)
{

    SSX31BDRV_CTRL *  pDrvCtrl;
    ULONG ulPacketType = 0;

    pDrvCtrl = (SSX31BDRV_CTRL *)ulPhyLink;

    pDrvCtrl->ulTmtCall ++;      


    MBUF_GET_SECP_PKT_TYPE(ulPacketType, pMBuf);

    if ((ulPacketType != PACKET_TYPE_INBOUND) &&
        (ulPacketType != PACKET_TYPE_OUTBOUND))
    {
        pDrvCtrl->ulTmtTypeErr ++;
        MBUF_Destroy_2(pMBuf);
	if(pucBuf!=NULL) 	
		ssx31_consistent_free((void*)pucBuf,ulBufLen,pucBuf_dma_phys);
        return ERR;
    }

    if (SSX31B_SendData_Basic(pDrvCtrl, pMBuf, pucBuf, pucBuf_dma_phys,ulBufLen) == ERR)
    {
        /* MBUF_Destroy(pMBuf); */
	return ERR;
    }

    
    return (OK);

}


ULONG SSX31B_HandleError(SSX31BDRV_CTRL *  pDrvCtrl, SSX31B_IPSEC_RD* pRdDesc)
{
    USHORT usEngineErr;
    USHORT usPacketErr;
    ULONG tmpDmaAddr,ultmpBufLen;
	
    usEngineErr = ((pRdDesc->ulStatus & DMA3_ENGING_ERR_MASK) >> DMA3_ENGING_ERR_BITS);
    usPacketErr = pRdDesc->ulStatus & DMA3_ERR_MASK;


    if (usPacketErr)
    {
        switch (usPacketErr)
        {
            case DMA3_ERR_INVALID_SA:
 
                pDrvCtrl->ulInvalidSAErr ++;
 
                break;
            case DMA3_ERR_BYTE_HARD_TIMEOUT:
 
                pDrvCtrl->ulHwFlowExpireErr ++;
 
                break;

             case DMA3_ERR_BYTE_SOFT_TIMEOUT:
#if 0		

                SSX31B_IPSecGetRD(pDrvCtrl, pRdDesc);
                pDrvCtrl->ulSoftFlowExpireErr ++;

                SSX31B_FreeBDDesc(pDrvCtrl, pRdDesc);
#endif	
                return OK;
                
            case DMA3_ERR_IP_FRAG:

                pDrvCtrl->ulPktFrgSegErr ++;     
                break;

            case DMA3_ERR_PACK_STRUCTURE:

                pDrvCtrl->ulPktStuctErr ++;
                break;

            case DMA3_ERR_EXTHEAD:

                pDrvCtrl->ulPktUnkownIPHeadErr ++;
                break;

            case DMA3_ERR_SPI_FAIL:

                pDrvCtrl->ulPktSPIErr ++;
                break;

            case DMA3_ERR_SEQNUM_FAIL:

                pDrvCtrl->ulPktSeqNumErr ++;
                break;

            case DMA3_ERR_ALIGN:

                pDrvCtrl->ulAlignErr ++;
                break;

            case  DMA3_ERR_ICV_FAIL:

                pDrvCtrl->ulPktICVErr ++;
                break;            

            case  DMA3_ERR_PADDING:

                pDrvCtrl->ulPktPadErr ++;                
                break;

            default:       
                break;
        }
 
    }
    else if (usEngineErr)
    {
        switch (usEngineErr)
        {
            case DMA3_ENGING_ERR_OPER_CODE:
 
                pDrvCtrl->ulOperCodeErr ++;
                break;
    
            case DMA3_ENGING_ERR_LEN:
 
                pDrvCtrl->ulPktBDLengErr ++;
                break;
                
            case DMA3_ENGING_ERR_LEN_NOTMATCH:
 
                pDrvCtrl->ulPktLenDismatchErr ++;
                break;
                
            case DMA3_ENGING_ERR_PROC_TIMEOUT:
 
                pDrvCtrl->ulPktProcTimeoutErr ++;
                break;
    
            default:
                break;
        
        }
    }
    else
    {
        PRINT("Wrong status for RD 0x%04x\r\n", pRdDesc->ulStatus);    
    }
 
//    Free(pRdDesc->ulOrigBuf); 
	tmpDmaAddr=ssx31_dma_virt_mapping_PreDelByVirt(pRdDesc->ulOrigBuf, &ultmpBufLen);

	/*toynote, keep pMBuf for up layer use */
	MBUF_Destroy_Child_2P(pRdDesc->ulMBufPtr);
  
	SSX31B_PreFreeBDDesc(pDrvCtrl, pRdDesc);

    return OK;
}


ULONG SSX31B_PreFreeBDDesc(SSX31BDRV_CTRL *  pDrvCtrl, SSX31B_IPSEC_RD* pRdDesc)
{
	if (pRdDesc == NULL)
	{
		PRINT ("pRdDesc NULL");
		return OK;
	}
    
    if ( pRdDesc->ulScatterEnable && pRdDesc->ulOutputContext !=0)
    {
        	ULONG virtAddr, ultmpBufLen;
		virtAddr=ssx31_dma_virt_mapping_PreDelByDmaPhys(pRdDesc->ulOutputContext, &ultmpBufLen);
		pRdDesc->ulOutputContext=0;
		//printk("PreFreeBDDesc: V(%08x),D(%08x),L(%ld)==========\n",virtAddr,pRdDesc->ulOutputContext,ultmpBufLen);		
    }

    return OK;
}


ULONG SSX31B_FreeBDDesc(SSX31BDRV_CTRL *  pDrvCtrl, SSX31B_IPSEC_RD* pRdDesc)
{
	if (pRdDesc == NULL)
	{
		PRINT ("pRdDesc NULL");
		return OK;
	}
    
    if ( pRdDesc->ulScatterEnable && pRdDesc->ulOutputContext !=0)
    {
        	ULONG virtAddr, ultmpBufLen;
		virtAddr=ssx31_dma_virt_mapping_findByDmaPhys(pRdDesc->ulOutputContext, &ultmpBufLen);
		if(virtAddr){
			//printk("FreeBDDesc: gona ssx31_consistent_free=V(%08x),D(%08x),L(%ld)==========\n",virtAddr,pRdDesc->ulOutputContext,ultmpBufLen);
			memset(virtAddr,0,ultmpBufLen);
			//printk("TEXT: %08x, %04x, %04x\n",((SSX31B_OCD*)virtAddr)->ulOutputPtr,((SSX31B_OCD*)virtAddr)->ulOutputAttrib,((SSX31B_OCD*)virtAddr)->ulOutputLen);
			//printk("TEXT: %08x, %04x, %04x\n",((SSX31B_OCD*)virtAddr+1)->ulOutputPtr,((SSX31B_OCD*)virtAddr+1)->ulOutputAttrib,((SSX31B_OCD*)virtAddr+1)->ulOutputLen);
			ssx31_consistent_free((void *)virtAddr,ultmpBufLen,(dma_addr_t)(pRdDesc->ulOutputContext));
			//printk("FreeBDDesc: pre-done ssx31_consistent_free==========\n");
		}
		pRdDesc->ulOutputContext=0;
    }

    return OK;
}


VOID SSX31B_IPSecGetRD(SSX31BDRV_CTRL *  pDrvCtrl, SSX31B_IPSEC_RD* pRdDesc, UCHAR** ppucSrc )
{
    SSX31B_OCD * pScatterDesc;
    MBUF_S * pSourceMBuf;
    
    ULONG ulBufAddr, ulBufLen, ulTotalLen;
    ULONG tmpDmaAddr,ultmpBufLen;
	
    pSourceMBuf = pRdDesc->ulMBufPtr; 

⌨️ 快捷键说明

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