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