📄 exitproc.c
字号:
/******************* ?Marvell Semiconductor, Inc., 2001-2004 *****************
*
* Purpose: This module provides NDIS shutdown routines
*
* $Author: cuizt $
*
* $Date: 2007/07/02 09:10:16 $
*
* $Revision: 1.3.2.4 $
*
*****************************************************************************/
/*
===============================================================================
INCLUDE FILES
===============================================================================
*/
#include "precomp.h"
#include "If.h"
#include "logmain.h"
extern DWORD g_AssociationDuration;
/*
===============================================================================
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
)
{
BOOLEAN timerStatus;
PMRVDRV_ADAPTER Adapter;
BOOLEAN bDoNotify = FALSE;
RETAILMSG(1,(L"MrvDrvReset,hd=0x%x\r\n",MiniportAdapterContext));
DBGPRINT(DBG_LOAD | DBG_WARNING,("WARNING: +MrvDrvReset()\n"));
//RETAILMSG(1,(TEXT("WARNING: +MrvDrvReset() \r\n")));
V5DbgMsg( (L"+ MrvDrvReset\n") );
//MrvPrintFile("\nMrvDrvReset");
Adapter = (PMRVDRV_ADAPTER)MiniportAdapterContext;
Adapter->bIsPendingReset = TRUE; // tt cetk_1
/* tt ra fail
Adapter->bIsPendingReset = TRUE;
*/
// Set AddressingReset indication
*AddressingReset = FALSE;
// report link status change
//ResetDisconnectStatus(Adapter);
if ( Adapter->MediaConnectStatus == NdisMediaStateConnected)
{
bDoNotify = TRUE;
Adapter->MediaConnectStatus = NdisMediaStateDisconnected;
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("NdisMediaStateDisconnected is caused by MrvDrvReset!...\n")));
#endif
WriteCommonLogFile(WIFI_LOG,"AP is disconnected(Reason=3) (MrvDrvReset)!...\r\n",
strlen("AP is disconnected(Reason=3) (MrvDrvReset)!...\r\n"));
if(g_AssociationDuration != 0)
{
char logstr[200];
sprintf(logstr,"Association Duration is %d seconds\r\n", (GetTickCount() - g_AssociationDuration)/1000);
WriteCommonLogFile(WIFI_LOG,logstr, strlen(logstr));
g_AssociationDuration = 0;
}
}
/* tt ra fail, msdn said: miniport need not call this
NdisMIndicateStatus(
Adapter->MrvDrvAdapterHdl,
NDIS_STATUS_MEDIA_DISCONNECT,
(PVOID)NULL,
0);
NdisMIndicateStatusComplete(Adapter->MrvDrvAdapterHdl);
*/
//tx
CleanUpSingleTxBuffer(Adapter);
// rx
ResetRxPDQ(Adapter);
// command
//ResetCmdBuffer(Adapter);
// reset the Adapter object
//ResetAdapterObject(Adapter);
// Enable interrupt
EnableInterrupt(Adapter);
//Adapter->bIsPendingReset = FALSE;
/*
#ifndef NDIS50_MINIPORT
// Check device removal status
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
*/
// tt cetk_1 ++
if (bDoNotify == TRUE)
{
NdisMCancelTimer(&Adapter->MrvDrvIndicateConnectStatusTimer, &timerStatus);
NdisMSetTimer(&Adapter->MrvDrvIndicateConnectStatusTimer, 10);
Adapter->DisconnectTimerSet = TRUE;
}
else
{
Adapter->bIsPendingReset = FALSE;
}
// tt --
/* tt ra fail
if (bDoNotify == TRUE)
{
NdisMSetTimer(&Adapter->MrvDrvIndicateConnectStatusTimer, 10);
Adapter->DisconnectTimerSet = TRUE;
}
*/
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;
RETAILMSG(1,(L"MrvDrvCheckForHang,hd=0x%x\r\n",MiniportAdapterContext));
DBGPRINT(DBG_LOAD|DBG_WARNING,("INIT - Enter MrvDrvCheckForHang\n"));
V5DbgMsg( (L"+ MrvDrvCheckForHang\n") );
return FALSE; //tt ra fail
Adapter = (PMRVDRV_ADAPTER)MiniportAdapterContext;
//lykao, 061505, test
// return FALSE;
//BugFix1
if ( (Adapter->psState != PS_STATE_FULL_POWER) &&
(Adapter->psState != PS_STATE_WAKEUP) )
{
DBGPRINT(DBG_LOAD, ("Not in wake mode \n"));
return FALSE;
}
#ifdef DEEP_SLEEP
// In Deep Sleep Mode no packet can be sent out
if (Adapter->IsDeepSleep)
{
return FALSE;
}
#endif
if ( Adapter->SurpriseRemoved == TRUE )
{
DBGPRINT(DBG_WARNING, ("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,
("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;
//dralee
//if ( (Adapter->psState == PS_STATE_SLEEP_PENDING) &&
if((Adapter->psState == PS_STATE_SLEEP) )
{
ULONG ulCurrentSystemUpTime, ulDiff;
NdisGetSystemUpTime(&ulCurrentSystemUpTime);
ulDiff = ulCurrentSystemUpTime - Adapter->ulAwakeTimeStamp;
if ( (Adapter->ulAwakeTimeStamp != 0) &&
(ulCurrentSystemUpTime > Adapter->ulAwakeTimeStamp) &&
(ulDiff > MRVL_MAX_TIME_BETWEEN_AWAKE) )
{
DBGPRINT(DBG_WARNING, ("Time since last awake time: %d(ms), "
"card probably removed!\n", ulDiff));
return TRUE;
}
}
else
{
// update the awake time stamp, sometimes, the FW can stay awake
// due to hi traffic
NdisGetSystemUpTime(&Adapter->ulAwakeTimeStamp);
}
#endif // under_ce
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;
#if 0
// 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);
#endif
}
/*
// 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
)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -