- Check for miniport hangs at the appropriate time

- Call MiniReset if required

svn path=/branches/aicom-network-fixes/; revision=36441
This commit is contained in:
Cameron Gutman 2008-09-23 20:54:02 +00:00
parent be3ff9cec9
commit 0cabe4ffdb

View file

@ -634,6 +634,27 @@ MiniReset(
return Status;
}
VOID STDCALL
HangTimer( PVOID Context )
{
PLOGICAL_ADAPTER Adapter = Context;
BOOLEAN AddressingReset;
while (Adapter->NdisMiniportBlock.PnPDeviceState == NdisPnPDeviceStarted)
{
AddressingReset = FALSE;
NdisMSleep(Adapter->NdisMiniportBlock.CheckForHangSeconds * 1000000);
if (MiniCheckForHang(Adapter))
MiniReset(Adapter, &AddressingReset);
/* FIXME: We should call MiniportSetInformation if AddressingReset is TRUE */
}
PsTerminateSystemThread(STATUS_SUCCESS);
}
NDIS_STATUS
FASTCALL
@ -1421,6 +1442,8 @@ NdisIPnPStartDevice(
PNDIS_CONFIGURATION_PARAMETER ConfigParam;
NDIS_HANDLE ConfigHandle;
ULONG Size;
HANDLE HangTimerHandle;
/* FIXME - KIRQL OldIrql; */
/*
@ -1640,6 +1663,10 @@ NdisIPnPStartDevice(
Adapter->NdisMiniportBlock.OldPnPDeviceState = Adapter->NdisMiniportBlock.PnPDeviceState;
Adapter->NdisMiniportBlock.PnPDeviceState = NdisPnPDeviceStarted;
PsCreateSystemThread(&HangTimerHandle, THREAD_ALL_ACCESS, 0, 0, 0,
HangTimer, Adapter);
ZwClose(HangTimerHandle);
/* Put adapter in adapter list for this miniport */
ExInterlockedInsertTailList(&Adapter->NdisMiniportBlock.DriverHandle->DeviceList, &Adapter->MiniportListEntry, &Adapter->NdisMiniportBlock.DriverHandle->Lock);