📄 exitproc.c
字号:
DBGPRINT(DBG_UNLOAD,("EXIT - Enter MrvDrvHalt\n"));
RETAILMSG(1,(TEXT("EXIT - Enter MrvDrvHalt \r\n")));
//dralee
Adapter->SurpriseRemoved = TRUE;
// Disable interrupt
If_DisableInterrupt(Adapter);
Adapter->INTCause =0;
FreeAdapterObject(Adapter);
return;
}
/******************************************************************************
*
* Name: MrvDrvShutdownHandler()
*
* Description: NDIS miniport shutdown event handler
*
*
* Arguments: IN NDIS_HANDLE MiniportAdapterContext
* Miniport context
*
* Return Value: None
*
*
* Notes:
*
*****************************************************************************/
VOID
MrvDrvShutdownHandler(
IN NDIS_HANDLE MiniportAdapterContext
)
{
PMRVDRV_ADAPTER Adapter;
RETAILMSG(1,(L"+MrvDrvShutdownHandler()\n"));
DBGPRINT(DBG_UNLOAD,("+MrvDrvShutdownHandler()\n"));
Adapter = (PMRVDRV_ADAPTER)MiniportAdapterContext;
// Shutdown the NIC
//
PrepareAndSendCommand(
Adapter,
HostCmd_CMD_802_11_RESET,
HostCmd_ACT_HALT,
HostCmd_OPTION_NO_INT,
(NDIS_OID)0,
HostCmd_PENDING_ON_NONE,
0,
FALSE,
NULL,
NULL,
NULL,
NULL);
return;
}
/*
===============================================================================
CODED LOCAL PROCEDURES
===============================================================================
*/
VOID CleanUpTimers(PMRVDRV_ADAPTER Adapter)
{
BOOLEAN timerStatus;
// Cancel and reset NDIS Tiemr variables
//RETAILMSG(1,(TEXT("Exit: CleanUPTimers \r\n")));
if ( Adapter->CommandTimerSet == TRUE )
{
NdisMCancelTimer(&Adapter->MrvDrvCommandTimer, &timerStatus);
Adapter->CommandTimerSet = FALSE;
}
//dralee
if(Adapter->TxPktTimerIsSet == TRUE)
{
NdisMCancelTimer(&Adapter->MrvDrvTxPktTimer, &timerStatus);
Adapter->TxPktTimerIsSet = FALSE;
}
if ( Adapter->DisconnectTimerSet )
{
NdisMCancelTimer(&Adapter->MrvDrvIndicateConnectStatusTimer, &timerStatus);
Adapter->DisconnectTimerSet = FALSE;
}
//dralee
if( Adapter->MrvDrvSdioCheckFWReadyTimerIsSet == TRUE )
{
NdisMCancelTimer(&Adapter->MrvDrvSdioCheckFWReadyTimer, &timerStatus);
Adapter->MrvDrvSdioCheckFWReadyTimerIsSet = FALSE;
}
#ifdef REASSOCIATE
if ( Adapter->ReConnectTimerIsSet == TRUE )
{
NdisMCancelTimer(&Adapter->MrvReConnectTimer, &timerStatus);
Adapter->ReConnectTimerIsSet = FALSE;
}
#endif //REASSOCIATE
#ifdef AvoidOidSetScan
if(Adapter->bAvoidScanAfterConnectedforMSecs == TRUE)
{
NdisMCancelTimer(&Adapter->MrvDrvAvoidScanAfterConnectedTimer, &timerStatus);
Adapter->bAvoidScanAfterConnectedforMSecs=FALSE;
}
#endif
#ifdef ACTIVE_ROAMING
if ( Adapter->ActiveRoamingTimerIsSet == TRUE )
{
NdisMCancelTimer(&Adapter->MrvActiveRoamingTimer, &timerStatus);
Adapter->ActiveRoamingTimerIsSet = FALSE;
}
#ifdef BG_SCAN
if (Adapter->BGActiveRoamingTimerIsSet == TRUE )
{
NdisMCancelTimer(&Adapter->MrvBGActiveRoamingTimer, &timerStatus);
Adapter->BGActiveRoamingTimerIsSet = FALSE;
}
#endif
#endif
}
/******************************************************************************
*
* Name: ResetAdapterObject()
*
* Description: Reset all the variables in the Adapter object
*
* Arguments:
*
* Return Value: None
*
* Notes:
*
*****************************************************************************/
VOID
ResetAdapterObject(PMRVDRV_ADAPTER Adapter)
{
// Disable interrupt, reset INTCause
If_DisableInterrupt(Adapter);
Adapter->INTCause =0;
CleanUpTimers(Adapter);
Adapter->TimerInterval = MRVDRV_DEFAULT_TIMER_INTERVAL;
// Tx-related variables
CleanUpSingleTxBuffer(Adapter);
// Rx-related variables
ResetRxPDQ(Adapter);
// Command-related variables
ResetCmdBuffer(Adapter);
// Operation characteristics
Adapter->CurrentLookAhead = (ULONG)MRVDRV_MAXIMUM_ETH_PACKET_SIZE - MRVDRV_ETH_HEADER_SIZE;
// 9/19/02: cannot set ProtocolOption to 0
// Adapter->ProtocolOptions = 0;
Adapter->MACOptions = (ULONG)NDIS_MAC_OPTION_NO_LOOPBACK;
Adapter->MediaConnectStatus = NdisMediaStateDisconnected;
Adapter->MediaInUse = NdisMedium802_3;
Adapter->LinkSpeed = MRVDRV_LINK_SPEED_0mbps;
// Status variables
Adapter->HardwareStatus = NdisHardwareStatusReady;
// 802.11 specific
// need to keep WEPStatus, AuthenticationMode, InfrastructureMode
//Adapter->WEPStatus = Ndis802_11WEPDisabled;
//Adapter->AuthenticationMode = Ndis802_11AuthModeOpen;
//Adapter->InfrastructureMode = Ndis802_11Infrastructure;
Adapter->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;
Adapter->ulNumOfBSSIDs =0;
Adapter->ulCurrentBSSIDIndex =0;
Adapter->ulAttemptedBSSIDIndex =0;
///Adapter->bAutoAssociation = FALSE;
Adapter->bIsAssociateInProgress = FALSE;
Adapter->bIsScanInProgress = FALSE;
Adapter->ulLastScanRequestTime =0;
// Memorize the previous SSID and BSSID
if ( Adapter->CurrentSSID.SsidLength != 0 )
{
NdisMoveMemory( &(Adapter->PreviousSSID), &(Adapter->CurrentSSID), sizeof(NDIS_802_11_SSID));
NdisMoveMemory( Adapter->PreviousBSSID, Adapter->CurrentBSSID, MRVDRV_ETH_ADDR_LEN);
}
NdisZeroMemory(&(Adapter->CurrentSSID), sizeof(NDIS_802_11_SSID));
NdisZeroMemory(Adapter->CurrentBSSID, MRVDRV_ETH_ADDR_LEN);
NdisZeroMemory( &(Adapter->CurrentBSSIDDesciptor),
sizeof(NDIS_WLAN_BSSID_EX));
NdisZeroMemory( &(Adapter->CurrentBssDesciptor),
sizeof(BSS_DESCRIPTION_SET_ALL_FIELDS));
NdisZeroMemory( Adapter->BSSIDList,
sizeof(NDIS_WLAN_BSSID_EX) * MRVDRV_MAX_BSSID_LIST);
NdisZeroMemory( Adapter->PSBSSIDList,
sizeof(NDIS_WLAN_BSSID_EX) * MRVDRV_MAX_BSSID_LIST);
NdisZeroMemory(Adapter->BssDescList,
sizeof(BSS_DESCRIPTION_SET_ALL_FIELDS) * MRVDRV_MAX_BSSID_LIST);
NdisZeroMemory(Adapter->PSBssDescList,
sizeof(BSS_DESCRIPTION_SET_ALL_FIELDS) * MRVDRV_MAX_BSSID_LIST);
NdisZeroMemory(&Adapter->CurrentConfiguration,sizeof(NDIS_802_11_CONFIGURATION));
// Initialize RSSI-related variables
Adapter->LastRSSI = MRVDRV_RSSI_DEFAULT_NOISE_VALUE;
Adapter->RSSITriggerValue = MRVDRV_RSSI_TRIGGER_DEFAULT;
Adapter->RSSITriggerCounter = 0;
Adapter->CurPowerState = NdisDeviceStateD0;
Adapter->SupportTxPowerLevel = MRVDRV_TX_POWER_LEVEL_TOTAL;
Adapter->CurrentTxPowerLevel = HostCmd_ACT_TX_POWER_INDEX_MID;
// Clean up current WEP key
NdisZeroMemory(&(Adapter->CurrentWEPKey), sizeof(MRVL_WEP_KEY));
Adapter->SoftwareFilterOn = FALSE;
/* dralee, 072905
#ifdef IF_SDIO
Adapter->hISRThread = NULL;
Adapter->hTimerThread = NULL;
#endif ///IF_SDIO
*/
#ifdef REASSOCIATE
Adapter->bIsReconnectEnable = FALSE;
#endif //REASSOCIATE
#ifdef ACTIVE_ROAMING
Adapter->bIsActiveRoaming = FALSE;
#endif //ACTIVE_ROAMING
return;
}
/******************************************************************************
*
* Name: FreeAdapterObject()
*
* Description: Device object clean-up routine
*
*
* Arguments: IN NDIS_HANDLE MiniportAdapterContext
* Miniport context
*
* Return Value: None
*
* Notes:
*
*****************************************************************************/
VOID
FreeAdapterObject(PMRVDRV_ADAPTER Adapter)
{
//BOOLEAN timerStatus;
//RETAILMSG(1,(TEXT("Free Adaptor Objects \r\n")));
CleanUpTimers(Adapter);
//free TX Q
CleanUpSingleTxBuffer(Adapter);
// Free Rx Q
FreeRxQ(Adapter);
#ifdef CCX
wlan_ccx_free();
#endif
// Relase command buffer
FreeCmdBuffer(Adapter);
#ifdef AUTO_REASSOCIATION
if ( Adapter->bIsSendCmdImterSet )
{
NdisMCancelTimer( &Adapter->MrvDrvSendCmdTimer, &timerStatus );
Adapter->bIsSendCmdImterSet = 0;
}
#endif
CleanUpStationHW(Adapter);
if ( Adapter->InitializationStatus & MRVDRV_INIT_STATUS_MAP_REGISTER_ALLOCATED )
{
// Release map registers
NdisMFreeMapRegisters(Adapter->MrvDrvAdapterHdl);
}
// Free the adapter object itself
MRVDRV_FREE_MEM((PVOID)Adapter, sizeof(MRVDRV_ADAPTER));
return;
}
/******************************************************************************
*
* Name: CleanUpStationHW()
*
* Description: Clean up HW memory mapping and other system resource
*
* Arguments: Miniport context
*
* Return Value: None
*
*
* Notes:
*
*****************************************************************************/
VOID
CleanUpStationHW(IN PMRVDRV_ADAPTER Adapter)
{
//RETAILMSG(1,(TEXT("Exit: CleanUPSync.Lock \r\n")));
DeleteCriticalSection(&Adapter->TxCriticalSection);
DeleteCriticalSection(&Adapter->IntCriticalSection);
DeleteCriticalSection(&Adapter->CmdQueueExeSection);
NdisFreeSpinLock(&Adapter->RxQueueSpinLock);
NdisFreeSpinLock(&Adapter->FreeQSpinLock);
//dralee_1108
//NdisFreeSpinLock(&Adapter->PriorityQSpinLock);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -