📄 ssx31bdrv.c
字号:
}
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 + -