📄 cf_ifc.h
字号:
//-------------------------------------------------------------------------------
// Write out the packet length to the device.
//-------------------------------------------------------------------------------
NdisRawWritePortUshort(
pCf -> ulMrvDrvVirtualIoBase + CFMACREG_HCR_IO_WRITE_LEN,
totalPacketLengthInBytes );
return IX_STATUS_SUCCESS;
}
//************************************************************************************
//* Function: cf_TxBlock
//* Description: Transmits a block of data to the device.
//* Returns void
//* Date: 04/08/2003
//************************************************************************************
__inline void cf_TxBlock
(
PCF_OBJECT pCf, // Pointer to our interface object.
UCHAR *packetBuf, // Pointer to packet to transmit.
USHORT packetSizeBytes // size in bytes of current packet.
)
{
USHORT leftOverByte = packetSizeBytes % sizeof(USHORT); // see if we divide evenly.
USHORT cmdSizeWords = packetSizeBytes/sizeof(USHORT); // get the whole number of words.
int ii;
DBGPRINT(DBG_HWIF,("Sending packet size %d from %x\n",packetSizeBytes,packetBuf));
//-------------------------------------------------------------------------------
// Debug assertions from specifciation.
//-------------------------------------------------------------------------------
ASSERT( pCf != NULL );
ASSERT( pCf -> ulSignatureTop == CF_Signature );
ASSERT( pCf -> ulSignatureBottom == CF_Signature );
ASSERT( pCf -> bTxPacketOpen);
ASSERT( pCf -> ulMrvDrvVirtualIoBase != 0);
ASSERT( packetSizeBytes != 0 );
ASSERT( pCf -> ulTxPacketByteCount + packetSizeBytes <= MRVDRV_ETH_TX_PACKET_BUFFER_SIZE);
//-------------------------------------------------------------------------------
// Download command words.
//-------------------------------------------------------------------------------
for( ii = 0; ii < (int)cmdSizeWords; ii++ )
{
NdisRawWritePortUshort(
pCf -> ulMrvDrvVirtualIoBase + CFMACREG_HCR_IO_WRITE_PORT,
*((PUSHORT)packetBuf));
packetBuf+=2;
}
//-------------------------------------------------------------------------------
// If cmd was not even number of bytes write the leftover byte to the device.
//-------------------------------------------------------------------------------
if ( leftOverByte )
{
NdisRawWritePortUchar(
pCf -> ulMrvDrvVirtualIoBase + CFMACREG_HCR_IO_WRITE_PORT,
(UCHAR)*((UCHAR *)packetBuf));
}
// PDM: first flush the fifo to make sure all data is transfered to
// device memory.
// don't do it here! wait till packet is complete
// cf_UshortRegSetBits(pCf, CFMACREG_HCR_HOST_STATUS, CFMACREG_HCR_HS_FlushDataFifo );
pCf -> ulTxPacketByteCount += packetSizeBytes; // keep running total.
DBGPRINT(DBG_HWIF,("Sent size %d from 0x%x, total %d bytes\n",
packetSizeBytes,packetBuf, pCf -> ulTxPacketByteCount));
}
//************************************************************************************
//* Function: cf_TxEndPacket
//* Description: Ends transmit of current packet to the device.
//* Block is ended by setting the download complete bit in the
//* host status register and by signaling a download complete
//* interrupt cause to the device in the card interrupt cause
//* register.
//* Returns void
//* Date: 04/08/2003
//************************************************************************************
__inline void cf_TxEndPacket
(
PCF_OBJECT pCf // Pointer to our interface object.
)
{
//USHORT usRegVal;
//-------------------------------------------------------------------------------
// Debug assertions from specifciation.
//-------------------------------------------------------------------------------
ASSERT( pCf != NULL );
ASSERT( pCf -> ulSignatureTop == CF_Signature );
ASSERT( pCf -> ulSignatureBottom == CF_Signature );
ASSERT( pCf -> bTxPacketOpen );
ASSERT( pCf -> ulMrvDrvVirtualIoBase != 0 );
ASSERT( pCf -> ulTxPacketByteCount == pCf -> ulTxPacketSize );
#if DBG
if ( pCf -> ulTxPacketByteCount != pCf -> ulTxPacketSize )
{
DBGPRINT(DBG_ERROR,("TxPacket ENDS with wrong size: tx count %d, open size %d\n",pCf -> ulTxPacketByteCount,pCf -> ulTxPacketSize));
}
#endif
// PDM: first flush the fifo to make sure all data is transfered to
// device memory.
//cf_UshortRegSetBits(pCf, CFMACREG_HCR_HOST_STATUS, CFMACREG_HCR_HS_FlushDataFifo );
//-------------------------------------------------------------------------------
// Set the CFMACREG_HCR_HS_TxDnLdOvr bit in the host status register.
//-------------------------------------------------------------------------------
cf_UshortRegSetBits(pCf, CFMACREG_HCR_HOST_STATUS, CFMACREG_HCR_HS_TxDnLdOvr );
//-------------------------------------------------------------------------------
// Set the CFMACREG_HCR_CIC_TxDnLdOvr bit in the interrupt cause register.
// This triggers an interrupt in the card FW.
//-------------------------------------------------------------------------------
cf_UshortRegSetBits(pCf, CFMACREG_HCR_CARD_INT_CAUSE, CFMACREG_HCR_CIC_TxDnLdOvr );
pCf -> ulTxPacketSize = 0; // reset transmit packet size.
pCf -> ulTxPacketByteCount = 0; // reset the byte accumulator.
pCf -> bTxPacketOpen = FALSE; // close out the packet.
// clean mask bit to allow FW to interrupt us when its done
// cf_UshortRegClearBits(pCf, CFMACREG_HCR_HOST_INT_MASK,CFMACREG_HCR_HIM_TxDnLdRdy);
DBGPRINT(DBG_HWIF,("Finalizing TX packet\n"));
}
//************************************************************************************
//* Function: cf_TxPacket
//* Description: Transmits a packet to the device.
//* Returns IX_STATUS_SUCCESS if packet transmit ok, IX_STATUS_DEVICE_BUSY
//* if device is busy.
//* Date: 04/02/2003
//************************************************************************************
__inline IX_STATUS cf_TxPacket
(
PVOID iface, // Pointer to our interface object.
UCHAR *packet, // Pointer to packet to transmit.
USHORT packetSizeBytes // size in bytes of current packet.
)
{
PCF_OBJECT pCf = (PCF_OBJECT)iface;
IX_STATUS ixStatus = IX_STATUS_SUCCESS; // return code status.
//-------------------------------------------------------------------------------
// Debug assertions from specifciation.
//-------------------------------------------------------------------------------
ASSERT( pCf != NULL );
ASSERT(!pCf -> bTxPacketOpen ); // This fails if start packet hasn't been called
ASSERT( pCf -> ulSignatureTop == CF_Signature );
ASSERT( pCf -> ulSignatureBottom == CF_Signature );
ASSERT( pCf -> ulMrvDrvVirtualIoBase != 0 );
ASSERT( packetSizeBytes != 0 );
ASSERT( packet != NULL );
ASSERT( packetSizeBytes <= MRVDRV_ETH_TX_PACKET_BUFFER_SIZE );
//-------------------------------------------------------------------------------
// Set transmit packet length to start tx packet.
//-------------------------------------------------------------------------------
if ( !IX_SUCCESS( ixStatus = cf_TxStartPacket( pCf, packetSizeBytes)))
{
DBGPRINT(DBG_WARNING,("cf_TxStartPacket: Device is not ready for data"));
return ixStatus;
}
//-------------------------------------------------------------------------------
// Transmit block of data that makes up this packet to the device.
//-------------------------------------------------------------------------------
cf_TxBlock ( pCf, packet, packetSizeBytes);
//-------------------------------------------------------------------------------
// Signal end of packet to device and indicate interrupt for card
//-------------------------------------------------------------------------------
cf_TxEndPacket ( pCf );
return IX_STATUS_SUCCESS;
}
//************************************************************************************
//* Function: cf_KickstartRX
//* Description: Fire off bogus int to start up RX in firmware
//*
//* Returns void
//* Date: 05/19/2003
//************************************************************************************
__inline void cf_KickstartRX
(
PCF_OBJECT pCf
)
{
//-------------------------------------------------------------------------------
// Set the CFMACREG_HCR_HS_RxUpLdOvr bit in the host status register.
//-------------------------------------------------------------------------------
cf_UshortRegSetBits(pCf, CFMACREG_HCR_HOST_STATUS, CFMACREG_HCR_HS_RxUpLdOvr );
//-------------------------------------------------------------------------------
// Set the CFMACREG_HCR_CIC_RxUpLdOvr bit in the interrupt cause register.
// This triggers an interrupt in the card FW.
//-------------------------------------------------------------------------------
cf_UshortRegSetBits(pCf, CFMACREG_HCR_CARD_INT_CAUSE, CFMACREG_HCR_CIC_RxUpLdOvr );
}
//*************************************************************************
//* Function: cf_RxStartPacket
//* Description: Verifies packet is available and then reads and returns packet
//* length.
//* Returns IX_STATUS_DEVICE_BUSY if device busy, IX_STATUS_SUCCESS otherwise
//* Date: 04/08/2003
//*************************************************************************
__inline IX_STATUS cf_RxStartPacket(PCF_OBJECT pCf, USHORT *rxPacketLength )
{
//-------------------------------------------------------------------------------
// Debug assertions from specifciation.
//-------------------------------------------------------------------------------
ASSERT( pCf != NULL );
ASSERT(!pCf -> bRxPacketOpen );
ASSERT( pCf -> ulSignatureTop == CF_Signature );
ASSERT( pCf -> ulSignatureBottom == CF_Signature );
ASSERT( pCf -> ulMrvDrvVirtualIoBase != 0 );
//-------------------------------------------------------------------------------
// First check if there is data available. If not then return status indicationg so.
//-------------------------------------------------------------------------------
if ( !IX_SUCCESS(cf_IsRxUploadReady(pCf)) )
{
DBGPRINT(DBG_ERROR,("cf_RxStartPacket: ERROR: Device has no data waiting\n"));
return IX_STATUS_NO_DATA;
}
//-------------------------------------------------------------------------------
// Read the receive packet length: This tells device we are getting ready to read
// the current packet.
//-------------------------------------------------------------------------------
NdisRawReadPortUshort(
pCf -> ulMrvDrvVirtualIoBase + CFMACREG_CCR_IO_READ_LEN,
rxPacketLength );
#if DBG // PJG: optimize - this data is only used in debug build.
pCf -> bRxPacketOpen = TRUE; // indicate rx packet is open.
pCf -> ulRxPacketSize = *rxPacketLength; // and remember the length.
#endif
DBGPRINT(DBG_HWIF,("cf_RxStartPacket: Will transfer %d bytes\n",*rxPacketLength));
return IX_STATUS_SUCCESS;
}
//************************************************************************************
//* Function: cf_RxBlock
//* Description: Receives a block of data from the device.
//* Returns void
//* Date: 04/08/2003
//************************************************************************************
__inline void cf_RxBlock
(
PCF_OBJECT pCf, // Pointer to our interface object.
UCHAR *packetBuf, // Pointer to packet to transmit.
USHORT packetSizeBytes // size in bytes of current packet.
)
{
int ii;
PUSHORT packetPtr = (PUSHORT)packetBuf; // Word pointer to our packet.
USHORT packetSizeWords = packetSizeBytes / sizeof(USHORT); // get the whole number of words.
USHORT leftOverByte = packetSizeBytes % sizeof(USHORT); // see if we divide evenly.
//-------------------------------------------------------------------------------
// Debug assertions from specifciation.
//-------------------------------------------------------------------------------
ASSERT( pCf != NULL );
ASSERT( pCf -> ulSignatureTop == CF_Signature );
ASSERT( pCf -> ulSignatureBottom == CF_Signature );
ASSERT( pCf -> bRxPacketOpen);
ASSERT( pCf -> ulMrvDrvVirtualIoBase != 0);
ASSERT( packetSizeBytes != 0 );
//-------------------------------------------------------------------------------
// Download packet from the device.
//-------------------------------------------------------------------------------
for( ii = 0; ii < (int)packetSizeWords; ii++ )
{
NdisRawReadPortUshort(
pCf -> ulMrvDrvVirtualIoBase + CFMACREG_HCR_IO_READ_PORT,
packetPtr);
packetPtr++;
}
//-------------------------------------------------------------------------------
// If cmd was not even number of bytes write the leftover byte to the device.
//-------------------------------------------------------------------------------
if ( leftOverByte )
{
NdisRawReadPortUchar(
pCf -> ulMrvDrvVirtualIoBase + CFMACREG_HCR_IO_READ_PORT,
((UCHAR *)packetPtr));
}
pCf -> ulRxPacketByteCount += packetSizeBytes; // accumulate the total bytes.
DBGPRINT(DBG_HWIF,("cf_RxBlock: Transfered %d bytes\n",packetSizeBytes));
}
//*************************************************************************
//* Function: cf_RxEndPacket
//* Description: Ends download of current packet by setting the host status
//* RxUpLdOver bit and and setting the card interrupt cause fo RxUpLdOver
//* so card can generate internal interrupt.
//* NOTE: This routine can be called at anytime on an open packet to either
//* end a packet whose data has been read, or to discard packet
//* data without actually reading in any or all of the receive packet.
//* Returns void
//* Date: 04/10/2003
//*************************************************************************
__inline void cf_RxEndPacket(PCF_OBJECT pCf )
{
static ULONG rxPacketCnt = 0;
//-------------------------------------------------------------------------------
// Debug assertions from specifciation.
//-------------------------------------------------------------------------------
ASSERT( pCf != NULL );
ASSERT( pCf -> ulSignatureTop == CF_Signature );
ASSERT( pCf -> ulSignatureBottom == CF_Signature );
// ASSERT( pCf -> bRxPacketOpen); // not legitmate assert we have to call this to acknowlege false ints from devcie.
ASSERT( pCf -> ulMrvDrvVirtualIoBase != 0);
rxPacketCnt++;
#if 0
if ( pCf->ulRxPacketByteCount != pCf->ulRxPacketSize )
{
DBGPRINT(DBG_WARNING,(" cf_RxEndPacket: WARNING - packet ended with wrong size: size %d, read %d \n", pCf->ulRxPacketSize, pCf->ulRxPacketByteCount));
}
#endif
DBGPRINT(DBG_HWIF,("cf_RxEndPacket: Packet %d Transfered %d bytes\n",
rxPacketCnt,pCf->ulRxPacketByteCount));
//-------------------------------------------------------------------------------
// Set the CFMACREG_HCR_HS_RxUpLdOvr bit in the host status register.
//-------------------------------------------------------------------------------
cf_UshortRegSetBits(pCf, CFMACREG_HCR_HOST_STATUS, CFMACREG_HCR_HS_RxUpLdOvr );
//-------------------------------------------------------------------------------
// Set the CFMACREG_HCR_CIC_TxDnLdOvr bit in the interrupt cause register.
// This triggers an interrupt in the card FW.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -