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

📄 miscproc.c

📁 marvell wifi driver CF-8385PN-NDIS-ARM4-WINCE50-5.24.17.p5-27.p11.src.zip
💻 C
📖 第 1 页 / 共 5 页
字号:
/******************* ?Marvell Semiconductor, Inc., 2001-2004 *****************
 *
 *  Purpose:    This module provides the implementation of power managment 
 *              and timer routines
 *
 *	$Author: schiu $
 *
 *	$Date: 2004/12/15 $
 *
 *	$Revision: #12 $
 *
 *****************************************************************************/
#include "precomp.h"

/******************************************************************************
 *
 *  Name: MrvDrvPMCallback()
 *
 *  Description: Timer that will be fired after initialize routine is done
 *				 to indicate disconnect
 *
 *  Return Value: None
 * 
 *  Notes:               
 *
 *****************************************************************************/
VOID
MrvDrvPMCallback(
    	IN struct _NDIS_WORK_ITEM *pWorkItem,
    	IN PVOID  Context
	)
{
	// get the adpater context
	PMRVDRV_ADAPTER Adapter = (PMRVDRV_ADAPTER) Context;

	//--------------------------------------------------------------------------------
	// Reinitialize all config parameters.
	//--------------------------------------------------------------------------------
    	PostFwDownload( Adapter );

	//--------------------------------------------------------------------------------
    	//      Update and report link status
	//--------------------------------------------------------------------------------
    	Adapter->MediaConnectStatus = NdisMediaStateDisconnected;
    	Adapter->LinkSpeed = MRVDRV_LINK_SPEED_1mbps;

    	Adapter->ulNumOfBSSIDs = 0;
    	Adapter->ulPSNumOfBSSIDs = 0;
    
	//--------------------------------------------------------------------------------
    	//      Report link status change
	//--------------------------------------------------------------------------------
//	RETAILMSG(1, (TEXT("indicate NDIS_STATUS_MEDIA_DISCONNECT  2\r\n")));
  	NdisMIndicateStatus(
				Adapter->MrvDrvAdapterHdl,
    				NDIS_STATUS_MEDIA_DISCONNECT,
				(PVOID)NULL,
				0);
    	NdisMIndicateStatusComplete(Adapter->MrvDrvAdapterHdl);

#ifdef MRVL_GUI_INTERFACE
	MrvlNotifyApplication(
		COMMAND_EVENT_DISCONNECT,
		NULL,
		0);
#endif // MRVL_GUI_INTERFACE
}

#ifdef WHQL_FIX
/******************************************************************************
 *
 *  Name: MrvDrvIndicateConnectStatusTimer()
 *
 *  Description: (1) Timer that will be fired after initialize routine is done to indicate disconnect  
 *                    (2) when NDIS call the reset functuion the timer used for indicate connect when reset completely 
 *
 *  Arguments:           
 *	    IN PVOID SystemSpecific1
 *	    IN PVOID FunctionContext
 *	    IN PVOID SystemSpecific2
 *	    IN PVOID SystemSpecific3
 *    
 *  Return Value: None
 * 
 *  Notes:               
 *
 *****************************************************************************/
VOID
MrvDrvIndicateConnectStatusTimer(
	IN PVOID SystemSpecific1,
	IN NDIS_HANDLE MiniportAdapterContext,
	IN PVOID SystemSpecific2,
	IN PVOID SystemSpecific3
	)
{

	PMRVDRV_ADAPTER Adapter = (PMRVDRV_ADAPTER) MiniportAdapterContext;

	if  (Adapter->bIsPendingReset == TRUE)  //  used for rest 
	{
		Adapter->MediaConnectStatus = NdisMediaStateConnected ;
		
		//NdisMIndicateStatus(
		//				Adapter->MrvDrvAdapterHdl,
		//				NDIS_STATUS_MEDIA_CONNECT,
		//				(PVOID)NULL,
		//				0);

		//NdisMIndicateStatusComplete(Adapter->MrvDrvAdapterHdl);
		Adapter->bIsPendingReset = FALSE;
	}
/*	
	else   // used for initialize
	{
		if ( Adapter->MediaConnectStatus == NdisMediaStateDisconnected )
		{
			// Need to indicate media status because initially, the card is always
			// at disconnected state
			NdisMIndicateStatus(
						Adapter->MrvDrvAdapterHdl,
						NDIS_STATUS_MEDIA_DISCONNECT,
						(PVOID)NULL,
						0);

			NdisMIndicateStatusComplete(Adapter->MrvDrvAdapterHdl);
              	DBGPRINT(DBG_CMDRESP, ("IndicateDisconnectTimer: Indicated disconnect\n"));

#ifdef MRVL_GUI_INTERFACE
			MrvlNotifyApplication(
					COMMAND_EVENT_DISCONNECT,
					NULL,
					0);
#endif 

		}
	}	
*/
	Adapter->DisconnectTimerSet = FALSE;
}

#endif

/******************************************************************************
 *
 *  Name: MrvDrvAvoidScanAfterConnectedTimer()
 *
 *  Description: Timer that will be fired after initialize routine is done
 *				 to indicate connected
 *
 *
 *  Arguments:           
 *	    IN PVOID SystemSpecific1
 *	    IN PVOID FunctionContext
 *	    IN PVOID SystemSpecific2
 *	    IN PVOID SystemSpecific3
 *    
 *  Return Value: None
 * 
 *  Notes:               
 *
 *****************************************************************************/
VOID
MrvDrvAvoidScanAfterConnectedTimer(
	IN PVOID SystemSpecific1,
	IN NDIS_HANDLE MiniportAdapterContext,
	IN PVOID SystemSpecific2,
	IN PVOID SystemSpecific3
	)
{

	PMRVDRV_ADAPTER Adapter = (PMRVDRV_ADAPTER) MiniportAdapterContext;

       Adapter->bAvoidScanAfterConnectedforMSecs = FALSE;
}

/******************************************************************************
 *
 *  Name: MrvDrvTxPktTimerFunction()
 *
 *  Description: Tx Timer routine
 *
 *  Conditions for Use: (Not used in the current verison of driver)
 *
 *  Arguments:           
 *	    IN PVOID SystemSpecific1
 *	    IN PVOID FunctionContext
 *	    IN PVOID SystemSpecific2
 *	    IN PVOID SystemSpecific3
 *    
 *  Return Value: None
 * 
 *  Notes:               
 *
 *****************************************************************************/
VOID MrvDrvTxPktTimerFunction(
	IN PVOID SystemSpecific1,
	IN PVOID FunctionContext,
	IN PVOID SystemSpecific2,
	IN PVOID SystemSpecific3
	)
{
       USHORT usLOCAL_INTCause;
	   
	PMRVDRV_ADAPTER Adapter = (PMRVDRV_ADAPTER) FunctionContext;

	DBGPRINT(DBG_TIMERS | DBG_WARNING,("- TX Pkt timeout, Tx Done does not response \n"));
       ///RETAILMSG(1, (TEXT("- TX Pkt timeout, Tx Done does not response \r\n")));

    	usLOCAL_INTCause = 0;
    	NdisRawReadPortUshort(
       	 	Adapter->ulMrvDrvVirtualIoBase + CFMACREG_CCR_HOST_INT_CAUSE,
        		&usLOCAL_INTCause);
       
       ///RETAILMSG(1, (TEXT("usLOCAL_INTCause = %x \r\n"),usLOCAL_INTCause));

   
       if (usLOCAL_INTCause & CFMACREG_CCR_HIC_RxUpLdRdy )
       {    	
             HandleRxReadyEvent(Adapter);
       }

	if (( Adapter->SentPacket !=NULL ) ||(usLOCAL_INTCause & CFMACREG_CCR_HIC_TxDnLdRdy ))
	{
      		DBGPRINT(DBG_TXDATA,("Tx Timeout: #%d pkts in Queue\n\r",Adapter->TxPacketCount));

		// clean up the timed out pkt
 		HandleTxSingleDoneEvent(Adapter);	 				
	}
       Adapter->bIsDoingTx = FALSE;

       NdisRawWritePortUshort(
       Adapter->ulMrvDrvVirtualIoBase + CFMACREG_CCR_HOST_INT_CAUSE,
       				 usLOCAL_INTCause);

   	Adapter->TxPktTimerIsSet = FALSE;
	   
       return;
    	
}

VOID MrvDrvReConnectTimerFunction(
	IN PVOID SystemSpecific1,
	IN PVOID FunctionContext,
	IN PVOID SystemSpecific2,
	IN PVOID SystemSpecific3
	)
{

//    	NDIS_STATUS Status;
	
	PMRVDRV_ADAPTER Adapter = (PMRVDRV_ADAPTER) FunctionContext;

	DBGPRINT(DBG_TIMERS | DBG_ALLEN,("++ MrvDrvReConnectTimerFunction\n"));

    	ReConnectHandler(Adapter);
	
	//Adapter->ReConnectTimerIsSet = FALSE;
	
	DBGPRINT(DBG_TIMERS | DBG_ALLEN,("-- MrvDrvReConnectTimerFunction\n"));
	
	return;
}

#ifdef ACTIVE_ROAMING
VOID MrvDrvActiveRoamingTimerFunction(
	IN PVOID SystemSpecific1,
	IN PVOID FunctionContext,
	IN PVOID SystemSpecific2,
	IN PVOID SystemSpecific3
	)
{

	PMRVDRV_ADAPTER Adapter = (PMRVDRV_ADAPTER) FunctionContext;
	
	ActiveRoamingHandler(Adapter);
	
	return;
}

#ifdef BG_SCAN
VOID MrvDrvBGActiveRoamingTimerFunction(
	IN PVOID SystemSpecific1,
	IN PVOID FunctionContext,
	IN PVOID SystemSpecific2,
	IN PVOID SystemSpecific3
	)
{
       BOOLEAN  timerStatus;
	PMRVDRV_ADAPTER Adapter = (PMRVDRV_ADAPTER) FunctionContext;
	
	//ActiveRoamingHandler(Adapter);
	   	
       if ( Adapter->MediaConnectStatus == NdisMediaStateConnected )
       {
		//preset	
           	if ((Adapter->bBgScanEnabled==TRUE) )
           	{
           		EnableBgScan(Adapter,FALSE);
		}
		SetupBgScanCurrentSSID(Adapter,Adapter->ulScanInterval);   
	 
		EnableBgScan(Adapter,TRUE);
       }
		
       NdisMCancelTimer(&Adapter->MrvBGActiveRoamingTimer, &timerStatus);
	Adapter->BGActiveRoamingTimerIsSet = FALSE;

	return;
}
#endif  //BG_SCAN
#endif  //ACTIVE_ROAMING
/******************************************************************************
 *
 *  Name: MrvDrvCommandTimerFunction()
 *
 *  Description: Command time-out routine
 *
 *  Conditions for Use: When current command exceeds expected execution time limit,
 *                      commad will expire and call the command time-out ruotine
 *
 *  Arguments:           
 *	    IN PVOID SystemSpecific1
 *	    IN PVOID FunctionContext
 *	    IN PVOID SystemSpecific2
 *	    IN PVOID SystemSpecific3
 *    
 *  Return Value: None
 * 
 *  Notes:               
 *
 *****************************************************************************/
VOID MrvDrvCommandTimerFunction(
	IN PVOID SystemSpecific1,
	IN PVOID FunctionContext,
	IN PVOID SystemSpecific2,
	IN PVOID SystemSpecific3
	)
{
	CmdCtrlNode *pTempNode;
	PHostCmd_DS_GEN pRetPtr;
 	USHORT  usLOCAL_INTCause;

	// get the adpater context
	PMRVDRV_ADAPTER Adapter = (PMRVDRV_ADAPTER) FunctionContext;

	if( !Adapter->CurCmd )
	{
    	        DBGPRINT(DBG_TIMERS,("MrvDrvCommandTimerFunction() Timer fired, but no current command.\n"));
	        return;
	}

       Adapter->ucNumCmdTimeOut++;
	
	DBGPRINT(DBG_TIMERS | DBG_CMDRESP | DBG_ERROR,("MISC - Command TIME OUT !! \n"));
	pTempNode = Adapter->CurCmd;
	pRetPtr = (PHostCmd_DS_GEN)(pTempNode->BufVirtualAddr);

///	RETAILMSG(1, (TEXT("MrvDrvCommandTimerFunction  %02x \r\n "),  pRetPtr->Command ));
	DBGPRINT(DBG_TIMERS | DBG_CMDRESP | DBG_ERROR,("pRetPtr->Command 0x%x !! \n", pRetPtr->Command));

       usLOCAL_INTCause = 0;
       NdisRawReadPortUshort(
           		Adapter->ulMrvDrvVirtualIoBase + CFMACREG_CCR_HOST_INT_CAUSE,
           		&usLOCAL_INTCause);

///	RETAILMSG(1, (TEXT("CMDTimer: Int cause read: 0x%x \r\n "),  usLOCAL_INTCause ));   
       DBGPRINT(DBG_CMDRESP | DBG_ERROR, ("CMDTimer: Int cause read: 0x%x\n", 
                						   usLOCAL_INTCause));
	if ( CFMACREG_CCR_HIC_CmdRspRdy & usLOCAL_INTCause )
       {
               if (Adapter->ucNumCmdTimeOut > 2)
               {
                       DBGPRINT(DBG_CMDRESP, ("Cmd Timer: More than 2 time out! set AdapterRemoved To TRUE!\n"));
                       //Adapter->SurpriseRemoved = TRUE;
               }
       }

       EnableInterrupt(Adapter);      

	// if the current command uses NO_INT option and is already finished
	if ((pRetPtr->Command & HostCmd_RET_NONE) != 0  )
	{
	       DBGPRINT(DBG_CMDRESP,("NO INT COMMAND: calling HandleCommand FinishedEvent from timeout\n"));
///		RETAILMSG(1, (TEXT("NO INT COMMAND: calling HandleCommand FinishedEvent from timeout \r\n ")));   
		HandleCommandFinishedEvent(Adapter);
		return;
	}


	if ((pRetPtr->Command == HostCmd_CMD_802_11_SCAN ) 
	    // && (Adapter->CurCmd->Pad[2] |= MRVDRV_SCAN_CMD_END)
	)
	{
              NdisMSendResourcesAvailable(Adapter->MrvDrvAdapterHdl); 

		Adapter->bIsScanInProgress = FALSE;
              Adapter->bIsAssociationBlockedByScan = FALSE;
		 
	       if (Adapter->PendingGetBssidOid.bIsPendingOID)
		{
		       Adapter->PendingGetBssidOid.bIsPendingOID = FALSE;
	       	*(Adapter->PendingGetBssidOid.BytesReadWrite) = 0;	

		        NdisMQueryInformationComplete(
						Adapter->MrvDrvAdapterHdl,
					NDIS_STATUS_SUCCESS);	
	        }
	}	
       else if ((pRetPtr->Command == HostCmd_CMD_802_11_ASSOCIATE)   ||
	   	     (pRetPtr->Command == HostCmd_CMD_802_11_ASSOCIATE_EXT) ||	
	    	     (pRetPtr->Command == HostCmd_CMD_802_11_REASSOCIATE) ||
	            (pRetPtr->Command == HostCmd_CMD_802_11_AD_HOC_START))
       {
///		 RETAILMSG(1, (TEXT("HostCmd_CMD_802_11_ASSOCIATE_EXT timeout \r\n ")));   
	        Adapter->bIsAssociateInProgress = FALSE;
               Adapter->bIsAssociationBlockedByScan = FALSE;
		
		 if (Adapter->PendingSetSssidOid.bIsPendingOID)
		 {
		         Adapter->PendingSetSssidOid.bIsPendingOID = FALSE;
	       	 *(Adapter->PendingSetSssidOid.BytesReadWrite) = 0;	

			 NdisMSetInformationComplete(
						Adapter->MrvDrvAdapterHdl,
					NDIS_STATUS_SUCCESS);	
		 }
        }
        else
        {
		if ( pTempNode->PendingInfo == HostCmd_PENDING_ON_GET_OID )
       	{
	       	NdisMQueryInformationComplete(
					Adapter->MrvDrvAdapterHdl,
					NDIS_STATUS_NOT_ACCEPTED );
			 
                	DBGPRINT(DBG_CMDRESP, ("Call NdisMQueryInformationComplete With FAILURE\n"));
		}
		else if( pTempNode->PendingInfo == HostCmd_PENDING_ON_SET_OID )
       	{
			NdisMSetInformationComplete(
					Adapter->MrvDrvAdapterHdl,
					NDIS_STATUS_SUCCESS	);
		 	DBGPRINT(DBG_ALLEN, ("return NDIS_STATUS_SUCCESS\n"));
               	DBGPRINT(DBG_CMDRESP, ("Call NdisMSetInformationComplete With FAILURE\n"));
		}
        }
		
	// set the timer state variable to TRUE
	Adapter->isCommandTimerExpired = TRUE;

	Adapter->bIsDoingCmd = FALSE;

	// Clean up 

⌨️ 快捷键说明

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