📄 exitproc.c
字号:
/******************* ?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 + -