📄 cf_ifc.h
字号:
/******************* (c) Marvell Semiconductor, Inc., 2004 ********************
*
*
* Purpose:
*
* header file for the compact flash interface.
* Contains data definitions and prototypes that define one instance of
* the compact flash interface.
*
*
* $Author: schiu $
*
* $Date: 2004/11/19 $
*
* $Revision: #4 $
*
*****************************************************************************/
#define CF_Signature 0xDEADBEEF
//------------------------------------------------------------------------------------
// This structure defines a compact flash interface object. An instance of this structure
// will be passed to all calls in the CF interace.
//------------------------------------------------------------------------------------
typedef struct
{
ULONG ulSignatureTop; // CF object top signature. Nothing above this data.
ULONG ulMrvDrvVirtualIoBase;
USHORT cfHostIntMask; // Current device interrupt mask.
//----------------------------------------------------
// Transmit related members
//----------------------------------------------------
BOOLEAN bTxPacketOpen; // Set if TX packet is open.
ULONG ulTxPacketSize; // size in bytes of current packet.
ULONG ulTxPacketByteCount; // number of bytes transmitted in current tx packet.
//----------------------------------------------------
// Receive related members
//----------------------------------------------------
BOOLEAN bRxPacketOpen; // Set if RX packet is open.
ULONG ulRxPacketSize; // size of current receive packet.
ULONG ulRxPacketByteCount; // number of bytes transmitted in current RX packet.
ULONG ulSignatureBottom; // CF object bottom signature. Nothing below this.
} CF_OBJECT, *PCF_OBJECT;
//-------------------------------------------------------------------------------------
// Interface definition function prototypes. (Cf_IFC.c)
//-------------------------------------------------------------------------------------
IX_STATUS cf_CreateIface( PVOID *iface, ULONG ioVirtRegBaseAddress );
IX_STATUS cf_DestroyIface( PVOID *iface );
IX_STATUS cf_SendCmd ( PVOID iface, USHORT *cmdBuf, USHORT cmdSizeBytes );
IX_STATUS cf_TxStartPacket(PCF_OBJECT pCf, USHORT totalPacketLengthInBytes );
IX_STATUS cf_TxPacket ( PVOID iface, UCHAR *packet, USHORT packetSizeBytes );
IX_STATUS cf_RxPacket(PVOID iface,UCHAR *packet,PUSHORT bytesRead,BOOLEAN discard);
IX_STATUS cf_IsFirmwareLoaded ( PVOID iface );
IX_STATUS cf_FirmwareDownload( PCF_OBJECT pCf,IN PMRVDRV_ADAPTER Adapter);
VOID cf_ReadCommandResponse(PMRVDRV_ADAPTER Adapter, PUCHAR buffer);
BOOLEAN cf_UseAndLockCfDownloadPath(PMRVDRV_ADAPTER Adapter);
VOID cf_ReleaseCfDownloadPath(PMRVDRV_ADAPTER Adapter);
VOID cf_WriteDeepSleepExit( PMRVDRV_ADAPTER Adapter, PVOID iface);
#if DBG
void DumpMrvDrvRegs( PCF_OBJECT pCf, char *msg );
#else
#define DumpMrvDrvRegs(x,y)
#endif
//-------------------------------------------------------------------------------------
// Utility routine function prototypes. (CF_util.c)
//-------------------------------------------------------------------------------------
IX_STATUS cf_InitInterface( PCF_OBJECT pCf );
IX_STATUS cf_EnableHostInterrupts( PCF_OBJECT pCf , USHORT mask );
IX_STATUS cf_DisableHostInterrupts( PCF_OBJECT pCf , USHORT mask );
IX_STATUS cf_HostBootFirmwareDownload(PCF_OBJECT pCf, IN PMRVDRV_ADAPTER Adapter);
//-------------------------------------------------------------------------------------
// Inlines for speed.
//-------------------------------------------------------------------------------------
/******************************************************************************
*
* Name: DisableInterrupt()
*
*
* Description:
* This routine disables interrupts
*
* Arguments:
* DriverObject - Pointer to driver object created by the system.
*
* Return Value:
*
* Notes:
*
*****************************************************************************/
__inline
VOID
DisableInterrupt(
IN PMRVDRV_ADAPTER Adapter
)
{
DBGPRINT(DBG_SP,("DisableInterrupt() \n"));
NdisRawWritePortUshort(
Adapter -> ulMrvDrvVirtualIoBase + CFMACREG_HCR_HOST_INT_MASK, CFMACREG_HCR_HIM_MASK);
}
/******************************************************************************
*
* Name: EnableInterrupt()
*
*
* Description:
* This routine enables interrupts
*
* Arguments:
* DriverObject - Pointer to driver object created by the system.
*
* Return Value:
*
* Notes:
*
*****************************************************************************/
__inline
VOID
EnableInterrupt(
IN PMRVDRV_ADAPTER Adapter
)
{
NDIS_STATUS Status;
DBGPRINT(DBG_SP,("EnableInterrupt() \n"));
//----------------------------------------------------------------------------
// Make sure our interrupt is registerd.
//----------------------------------------------------------------------------
if ( !Adapter->bIntRegistered )
{
DBGPRINT(DBG_ISR,("EnableInterrupt: Reregistering interupt\n"));
Status = NdisMRegisterInterrupt(
&Adapter->hMrvDrvINT,
Adapter->MrvDrvAdapterHdl,
Adapter->MrvDrvINTVector,
Adapter->MrvDrvINTLevel,
TRUE, // ISR should be called for each interrupt
Adapter->IntShared, // Do what ever resource manager tells us to do
Adapter->tMrvDrvINTMode); // In Windows CE.Net, this parameter is now ignored
Adapter -> bIntRegistered = TRUE; // our interrupt has been registerd.
}
//DBGPRINT(DBG_WARNING,("Interrupt Enabled.\n"));
// PJG: fixed isr - can now enable tx.
// allow all interrupts except tx dnload ready. This will unmasked
// after we send a packet.
NdisRawWritePortUshort(
Adapter -> ulMrvDrvVirtualIoBase + CFMACREG_HCR_HOST_INT_MASK, 0);
// CFMACREG_HCR_HIM_TxDnLdRdy);
}
//*************************************************************************
//* Function: cf_UshortRegSetBits
//* Description: Sets bits set in mask passed in the USHORT register specified
//* by offset passed in.
//* Returns IX_STATUS_SUCCESS if device is ready. IX_STATUS_DEVICE_BUSY if not.
//* Date: 04/10/2003
//*************************************************************************
__inline void cf_UshortRegSetBits( PCF_OBJECT pCf, USHORT regOffset, USHORT mask )
{
USHORT usRegVal;
NdisRawReadPortUshort(
pCf -> ulMrvDrvVirtualIoBase + regOffset,
&usRegVal );
usRegVal |= mask; // set the bit(s).
//-------------------------------------------------------------------------------
// Set the bit in host status to indicate host cmd download is complete.
//-------------------------------------------------------------------------------
NdisRawWritePortUshort(
pCf -> ulMrvDrvVirtualIoBase + regOffset,
usRegVal );
}
//*************************************************************************
//* Function: cf_UshortRegClearBits
//* Description: clears bits set in mask passed in the USHORT register specified
//* by offset passed in.
//* Returns IX_STATUS_SUCCESS if device is ready. IX_STATUS_DEVICE_BUSY if not.
//* Date: 04/10/2003
//*************************************************************************
__inline void cf_UshortRegClearBits( PCF_OBJECT pCf, USHORT regOffset, USHORT mask )
{
USHORT usRegVal;
NdisRawReadPortUshort(
pCf -> ulMrvDrvVirtualIoBase + regOffset,
&usRegVal );
usRegVal &= ~mask; // set the bit(s).
//-------------------------------------------------------------------------------
// Set the bit in host status to indicate host cmd download is complete.
//-------------------------------------------------------------------------------
NdisRawWritePortUshort(
pCf -> ulMrvDrvVirtualIoBase + regOffset,
usRegVal );
}
//*************************************************************************
//* Function: cf_IsCmdReady
//* Description: Polls device cmd ready bit to see if the device is really ready.
//* Returns IX_STATUS_SUCCESS if device is ready. IX_STATUS_DEVICE_BUSY if not.
//* Date: 04/02/2003
//*************************************************************************
__inline IX_STATUS cf_IsCmdReady(PCF_OBJECT pCf )
{
// Set command length
USHORT usval;
ASSERT( pCf != NULL );
NdisRawReadPortUshort( pCf->ulMrvDrvVirtualIoBase + CFMACREG_CCR_CARD_STATUS,
&usval);
DBGPRINT(DBG_HWIF,("cf_IsCmdReady: CFMACREG_CCR_CARD_STATUS = %x\n",(ULONG)usval));
return (usval & CFMACREG_HCR_HIM_CmdDnLdRdy) ? IX_STATUS_SUCCESS : IX_STATUS_DEVICE_BUSY;
}
//*************************************************************************
//* Function: cf_IsRespReady
//* Description: Polls device to see if the device has a cmd response waiting.
//* Returns IX_STATUS_SUCCESS if device has response ready.
//* IX_STATUS_NO_RESP if not.
//* Date: 04/02/2003
//*************************************************************************
__inline IX_STATUS cf_IsRespReady(PCF_OBJECT pCf )
{
// Set command length
USHORT usval;
ASSERT( pCf != NULL );
NdisRawReadPortUshort( pCf -> ulMrvDrvVirtualIoBase + CFMACREG_CCR_CARD_STATUS,
&usval);
return (usval & CFMACREG_HCR_HIM_CmdRspRdy) ? IX_STATUS_SUCCESS : IX_STATUS_NO_RESP;
}
//*************************************************************************
//* Function: cf_IsTxDownloadReady
//* Description: Polls device to see if TxDnLdRdy is set.
//* Returns IX_STATUS_SUCCESS if device is ready for transmit download.
//* IX_STATUS_DEVICE_BUSY if not.
//* Date: 04/02/2003
//*************************************************************************
__inline IX_STATUS cf_IsTxDownloadReady(PCF_OBJECT pCf )
{
USHORT usval;
ASSERT( pCf != NULL );
// Set command length
NdisRawReadPortUshort( pCf -> ulMrvDrvVirtualIoBase + CFMACREG_CCR_CARD_STATUS,
&usval);
#if DBG
if ( !(usval & CFMACREG_CCR_CS_TxDnLdRdy) )
DBGPRINT(DBG_HWIF,("Download not ready %x\n",usval));
#endif // end of DBG>0
return (usval & CFMACREG_CCR_CS_TxDnLdRdy) ? IX_STATUS_SUCCESS : IX_STATUS_DEVICE_BUSY;
}
//*************************************************************************
//* Function: cf_IsRxUploadReady
//* Description: Polls device to see if RxUpLdRdy bit is set.
//* Returns IX_STATUS_SUCCESS if device is ready for a receive data transfer.
//* IX_STATUS_DEVICE_BUSY if not.
//* Date: 04/02/2003
//*************************************************************************
__inline IX_STATUS cf_IsRxUploadReady(PCF_OBJECT pCf )
{
// Set command length
USHORT usval;
ASSERT( pCf != NULL );
NdisRawReadPortUshort( pCf -> ulMrvDrvVirtualIoBase + CFMACREG_CCR_CARD_STATUS,
&usval);
return usval & CFMACREG_HCR_HIM_RxUpLdRdy ? IX_STATUS_SUCCESS : IX_STATUS_NO_DATA;
}
//*************************************************************************
//* Function: cf_TxStartPacket
//* Description: Sets transmit packet write length.
//* packet is transmitted by first setting the packet length
//* in the device, then downloading all the data, then
//* setting the txDnLdOvr bit.
//* Starting a packet is just a matter of programming the total
//* length of the packet.
//* Returns IX_STATUS_DEVICE_BUSY if device busy, IX_STATUS_SUCCESS otherwise
//* Date: 04/08/2003
//*************************************************************************
__inline IX_STATUS cf_TxStartPacket(PCF_OBJECT pCf, USHORT totalPacketLengthInBytes )
{
//-------------------------------------------------------------------------------
// Debug assertions from specifciation.
//-------------------------------------------------------------------------------
ASSERT( pCf != NULL );
// ASSERT(!pCf -> bTxPacketOpen );
ASSERT( pCf -> ulSignatureTop == CF_Signature );
ASSERT( pCf -> ulSignatureBottom == CF_Signature );
ASSERT( pCf -> ulMrvDrvVirtualIoBase != 0 );
ASSERT( totalPacketLengthInBytes != 0 );
ASSERT( totalPacketLengthInBytes <= MRVDRV_ETH_TX_PACKET_BUFFER_SIZE );
#if DBG
if ( totalPacketLengthInBytes > MRVDRV_ETH_TX_PACKET_BUFFER_SIZE )
{
DBGPRINT(DBG_ERROR,("ERORR: max packet exceeded: max %d, packet size %d",MRVDRV_ETH_TX_PACKET_BUFFER_SIZE,totalPacketLengthInBytes));
}
#endif
//-------------------------------------------------------------------------------
// First check if device is ready. If not then wait return BUSY status.
// upper layer must block on and wait or reschedule for device on Device Busy status.
// PDM: Also check for a packet in progress and return same if so.
//-------------------------------------------------------------------------------
if ( !IX_SUCCESS(cf_IsTxDownloadReady(pCf)) || pCf->bTxPacketOpen )
{
DBGPRINT(DBG_WARNING,("cf_TxStartPacket: Device is not ready for data\n"));
return IX_STATUS_DEVICE_BUSY;
}
DBGPRINT(DBG_HWIF | DBG_TXDATA,("Starting TX packet, size %d\n",
totalPacketLengthInBytes));
pCf -> ulTxPacketSize = totalPacketLengthInBytes; // remember our packet size.
pCf -> bTxPacketOpen = TRUE; // set that we have packet open.
pCf -> ulTxPacketByteCount = 0; // initialize our byte accumulator.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -