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

📄 exitproc.c

📁 marvell wifi driver CF-8385PN-NDIS-ARM4-WINCE50-5.24.17.p5-27.p11.src.zip
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************* ?Marvell Semiconductor, Inc., 2001-2004 *****************
 *
 *  Purpose:    This module provides NDIS shutdown routines
 *
 *	$Author: schiu $
 *
 *	$Date: 2004/12/15 $
 *
 *	$Revision: #16 $
 *
 *****************************************************************************/

/*
===============================================================================
            INCLUDE FILES
===============================================================================
*/
#include "precomp.h"

      extern NDIS_HANDLE gNdisWrapperHandle;

/*
===============================================================================
            CODED PUBLIC PROCEDURES
===============================================================================

/******************************************************************************
 *
 *  Name: MrvDrvReset()
 *
 *  Description: 
 *      NDIS miniport reset routine.
 *
 *  Conditions for Use:   
 *      Will be called by NDIS wrapper to reset the device
 *
 *  Arguments:            
 *	    OUT PBOOLEAN AddressingReset
 *	    IN  NDIS_HANDLE MiniportAdapterContext
 *    
 *  Return Value:         
 * 
 *  Notes:                
 *
 *****************************************************************************/
NDIS_STATUS
MrvDrvReset(
	OUT PBOOLEAN AddressingReset,
	IN  NDIS_HANDLE MiniportAdapterContext
	)
{
	
	PMRVDRV_ADAPTER Adapter;
	BOOLEAN  bDoNotify = FALSE;
	//int i;
	//CmdCtrlNode *TempCmdArray;
	
       DBGPRINT(DBG_LOAD | DBG_WARNING,("WARNING: -MrvDrvReset()\n"));

	Adapter = (PMRVDRV_ADAPTER)MiniportAdapterContext;

	Adapter->bIsPendingReset = TRUE;

	// Set AddressingReset indication
	*AddressingReset = FALSE;
	
	// report link status change
	//ResetDisconnectStatus(Adapter);

       if ( Adapter->MediaConnectStatus == NdisMediaStateConnected)
       {
		bDoNotify = TRUE;
		Adapter->MediaConnectStatus = NdisMediaStateDisconnected;
       }
       
	/*
       NdisMIndicateStatus(
			Adapter->MrvDrvAdapterHdl,
			NDIS_STATUS_MEDIA_DISCONNECT,
			(PVOID)NULL,
			0); 	
       NdisMIndicateStatusComplete(Adapter->MrvDrvAdapterHdl);
	*/

	// clean BSSID List
	// Adapter->ulPSNumOfBSSIDs = 0;

	EnterCriticalSection(&Adapter->TxCriticalSection);
	
	Adapter->TxPacketCount = 0;              
    	Adapter->TxPacketPut = 0;                  
    	Adapter->TxPacketGet = 0;                  
    	Adapter->TxPacketComplete = 0;
    	Adapter->TxPacketSend = 0;
    	Adapter->TxPacketSendComplete = 0;
	Adapter->SentPacket =NULL;

	if (Adapter->TxPktTimerIsSet==TRUE)
	{		
		//BOOLEAN  timerStatus;
		
		//NdisMCancelTimer(&Adapter->MrvDrvTxPktTimer, &timerStatus);	
		Adapter->TxPktTimerIsSet=FALSE;
	}
	
	LeaveCriticalSection(&Adapter->TxCriticalSection);  



	CleanUpSingleTxBuffer(Adapter);


	/*
  	NdisAcquireSpinLock(&Adapter->FreeQSpinLock);
	for (i=0; i<MRVDRV_NUM_OF_CMD_BUFFER; i++)
	{
		TempCmdArray = (CmdCtrlNode*)(&(Adapter->CmdArray[i]));

		// Clean up node content
		TempCmdArray->Next = NULL;

		CleanUpCmdCtrlNode(TempCmdArray);
    
		// Append node to the end of CmdFreeQ
		InsertQNodeAtTail(&Adapter->CmdFreeQ, (PQ_NODE)(TempCmdArray));
	}
	NdisReleaseSpinLock(&Adapter->FreeQSpinLock);
       */
	{
		PPENDING_OID pPending;
		pPending = &(Adapter->PendingSetSssidOid);
		if (pPending->bIsPendingOID)
		{	
			pPending->bIsPendingOID = FALSE;
		}	

		pPending = &(Adapter->PendingGetBssidOid);
		if (pPending->bIsPendingOID)
		{	
			pPending->bIsPendingOID = FALSE;
		}	
	}
       // rx
       //ResetRxPDQ(Adapter);
	
       // command 
       //ResetCmdBuffer(Adapter);
	/*
	{
		PPENDING_OID pPending;
		
    		// return pending OIDs 
    		pPending = &(Adapter->PendingSetSssidOid);
		if (pPending->bIsPendingOID)
		{	
			pPending->bIsPendingOID = FALSE;
                	*(pPending->BytesReadWrite) = 0;
			NdisMSetInformationComplete(
						Adapter->MrvDrvAdapterHdl,
						NDIS_STATUS_SUCCESS);
		}

		pPending = &(Adapter->PendingGetBssidOid);
		if (pPending->bIsPendingOID)
		{	
			pPending->bIsPendingOID = FALSE;
	        	*(pPending->BytesReadWrite) = 0;	

			NdisMSetInformationComplete(
						Adapter->MrvDrvAdapterHdl,
						NDIS_STATUS_SUCCESS);
		}
	}
	*/	   
	// reset the Adapter object
       // ResetAdapterObject(Adapter);

	// Enable interrupt
	//EnableInterrupt(Adapter);

	// Check device removal status
	//
       //#ifndef NDIS50_MINIPORT
       //	if (Adapter->SurpriseRemoved == TRUE) 
       //		return NDIS_STATUS_ADAPTER_REMOVED;
       //#else
       //	if ( cf_IsFirmwareLoaded(Adapter->hwIface) == IX_STATUS_FAILURE )
       //	{
       //		DBGPRINT(DBG_LOAD,("card removed!"));
       //		return NDIS_STATUS_ADAPTER_REMOVED;				
       //	}		
       //#endif 
       //      
  
       if (bDoNotify == TRUE)
       {
		NdisMSetTimer(&Adapter->MrvDrvIndicateConnectStatusTimer, 10);
       	Adapter->DisconnectTimerSet = TRUE;
		//NdisMSleep(1000);
       }
	else
	{
		Adapter->bIsPendingReset = FALSE;
	}
	//Adapter->MediaConnectStatus = NdisMediaStateConnected;
    
    	//NdisMIndicateStatus(
	//		Adapter->MrvDrvAdapterHdl,
	//		NDIS_STATUS_MEDIA_CONNECT,
	//		(PVOID)NULL,
	//		0); 	
       //NdisMIndicateStatusComplete(Adapter->MrvDrvAdapterHdl);
	
	//Adapter->bIsPendingReset = FALSE;
	
	return NDIS_STATUS_SUCCESS;
}

/******************************************************************************
 *
 *  Name: MrvDrvCheckForHang()
 *
 *  Description:
 *      NDIS miniport check for hang routine. 
 *
 *  Conditions for Use:
 *      Will be called by NDIS wrapper to determine current station operation status.
 *      If the station is not responding, NDIS wrapper will call MrvDrvReset() to reset 
 *      the station. Driver first check and use current HW status stored in device 
 *      object to report system then update the status and send command to query HW status.
 *
 *  Arguments:
 *	    IN NDIS_HANDLE MiniportAdapterContext
 *    
 *  Return Value:
 *		TRUE if the NIC HW is not operating properly
 *		FALSE if the NIC HW is OK
 * 
 *  Notes: According to Microsoft NDIS document, this function is normally called 
 *         by NDIS wrapper approximately every 2 seconds.
 *
 *****************************************************************************/
BOOLEAN
MrvDrvCheckForHang(
	IN NDIS_HANDLE MiniportAdapterContext
	)
{
	PMRVDRV_ADAPTER  Adapter;

    	DBGPRINT(DBG_LOAD,("INIT - Enter MrvDrvCheckForHang\n"));
		
	Adapter = (PMRVDRV_ADAPTER)MiniportAdapterContext;

	if ( (Adapter->psState != PS_STATE_FULL_POWER) &&
            (Adapter->psState != PS_STATE_WAKEUP) )
    	{
		DBGPRINT(DBG_LOAD, ("Not in wake mode \n"));
		return FALSE;
	}

       if (Adapter->IsDeepSleep || Adapter->IsDeepSleepRequired)
       {
		DBGPRINT(DBG_LOAD, ("Now in deepsleep mode \n"));
		return FALSE;
       }
	
       return FALSE;
	
#ifdef DEEP_SLEEP 
    	// In Deep Sleep Mode no packet can be sent out 
    	if (Adapter->IsDeepSleep)
    	{ 
    		return FALSE;
    	}
#endif

    	/// check card removed 
    	if ( Adapter->SurpriseRemoved == TRUE )
    	{
       	DBGPRINT(DBG_WARNING |DBG_TXDATA, ("Adapter is removed, return TRUE in CheckForHang\n"));
        	return TRUE;
    	}

#ifdef UNDER_CE

    	/// when D3 don't check for hang 
    	if ( Adapter->CurPowerState != NdisDeviceStateD0 )
    	{
       	return FALSE;
    	}

    	/// check the timeout times , may be we need to set the bigger number than '2' in longer check for hang period 
    	if ( Adapter->ucNumCmdTimeOut > 2 )
    	{
       	DBGPRINT(DBG_LOAD | DBG_WARNING |DBG_TXDATA, 
                        ("CheckForHang: %d cmd time out in last period, reset!\n", 
                        Adapter->ucNumCmdTimeOut));
        	// more than 2 cmd time out in the last period, something is wrong
        	Adapter->ucNumCmdTimeOut = 0;

        	return TRUE;
    	}
    	Adapter->ucNumCmdTimeOut = 0;
	/*	
    	/// read the card to check for hang
    	if ( (Adapter->psState == PS_STATE_FULL_POWER) ||
            (Adapter->psState == PS_STATE_WAKEUP) )
    	{
       	USHORT  usVal;
       	NdisRawReadPortUshort(
            		((PCF_OBJECT)Adapter->hwIface)->ulMrvDrvVirtualIoBase + CFMACREG_CCR_SCRATCH_PORT-1,
            		&usVal);
        	DBGPRINT(DBG_LOAD, ("CheckForHang Read back 0x%x\n", usVal));

        	if ( usVal == 0x0 )
        	{
            		DBGPRINT(DBG_LOAD | DBG_WARNING, 
                			("CheckForHang read back 0x0 from scratch port! reset the queues\n"));
            		return TRUE;
        	}
    	} 
	*/
#endif 

       /*
       ///  driver background scan  
    	if ( Adapter->MediaConnectStatus == NdisMediaStateConnected )
    	{
       	Adapter->usTimeElapsedSinceLastScan += MRVL_CHECK_FOR_HANG_TIME;

        	if ( (Adapter->ulTxByteInLastPeriod + Adapter->ulRxByteInLastPeriod) < 
             			MRVL_SCAN_ALLOW_THRESHOLD )
        	{

            		if ( Adapter->usTimeElapsedSinceLastScan > MRVL_BACKGOUND_SCAN_TIME )
            		{
              		Adapter->usTimeElapsedSinceLastScan = 0;

				if (!Adapter->bIsAssociateInProgress && !Adapter->bIsScanInProgress) 
				{
					DBGPRINT(DBG_OID, ("period scan in MrvDrvCheckForHang()"));

					Adapter->bIsScanWhileConnect = TRUE;

                			// scan
                			PrepareAndSendCommand(
		            				    	Adapter,
		  						HostCmd_CMD_802_11_SCAN,
		                				0,
		                				HostCmd_OPTION_USE_INT,
		                				(NDIS_OID)0,
		                				HostCmd_PENDING_ON_NONE,
		                				0, 
		                				FALSE, 
		                				NULL, 
		                				NULL, 
		                				NULL, 
		                				NULL);	
				}
				
            			// update RSSI value
            			PrepareAndSendCommand(
		        	   		 Adapter,
		           	 		 HostCmd_CMD_802_11_RSSI,
		            			 0,
		            			 HostCmd_OPTION_USE_INT,
		            			 (NDIS_OID)0,
		            			 HostCmd_PENDING_ON_NONE,
		            			 0, 
		            			 FALSE, 
		            			 NULL, 
		            			 NULL, 
		            			 NULL, 
		            			 NULL);    	
            		}
        	}

        	Adapter->ulTxByteInLastPeriod =
        	Adapter->ulRxByteInLastPeriod = 0;
    	}
	*/
    	return FALSE;
   
}

/******************************************************************************
 *
 *  Name: MrvDrvHalt()
 *
 *  Description:	NDIS miniport halt event handler
 *
 *
 *  Arguments:		IN NDIS_HANDLE MiniportAdapterContext
 *					Miniport context
 *    
 *  Return Value:   None
 *
 *  Notes: 
 *
 *****************************************************************************/

VOID
MrvDrvHalt(
	IN NDIS_HANDLE MiniportAdapterContext
	)
{
	PMRVDRV_ADAPTER	Adapter = (PMRVDRV_ADAPTER)MiniportAdapterContext;

	DBGPRINT(DBG_UNLOAD |DBG_SP,(">>> EXIT - Enter MrvDrvHalt\n"));
//RETAILMSG(1, (TEXT("EXIT - Enter MrvDrvHalt>>> ")));	


       if (Adapter->MediaConnectStatus == NdisMediaStateConnected)
       {
            	USHORT usCommand;
            	// Adapter is connected and there is a mode change
            	// Disconnect first

            	if ( Adapter->InfrastructureMode == Ndis802_11Infrastructure )
              	usCommand = HostCmd_CMD_802_11_DEAUTHENTICATE;
            	else
                	usCommand = HostCmd_CMD_802_11_AD_HOC_STOP;

//RETAILMSG(1, (TEXT("usCommand = %d \r\n "), usCommand));	

            	// completely clean up

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -