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

📄 cf_ifc.h

📁 marvell wifi driver CF-8385PN-NDIS-ARM4-WINCE50-5.24.17.p5-27.p11.src.zip
💻 H
📖 第 1 页 / 共 3 页
字号:
/******************* (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 + -