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

📄 cf_ifc.h

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