Merge aicom-network-fixes up to r36496

- We now call the MiniportCheckForHang handler every two seconds
 - We reset the miniport if it has detected a hang
 - Added some IRQL checks

svn path=/trunk/; revision=36497
This commit is contained in:
Cameron Gutman 2008-09-24 23:39:17 +00:00
parent ef2bb65235
commit 564e5b5a2c
8 changed files with 185 additions and 66 deletions

View file

@ -56,12 +56,14 @@ extern ULONG DebugTraceLevel;
#endif /* NASSERT */
#endif
#define ASSERT_IRQL(x) ASSERT(KeGetCurrentIrql() <= (x))
#define ASSERT_IRQL_EQUAL(x) ASSERT(KeGetCurrentIrql() == (x))
#else /* DBG */
#define NDIS_DbgPrint(_t_, _x_)
#define ASSERT_IRQL(x)
#define ASSERT_IRQL_EQUAL(x)
/* #define ASSERT(x) */ /* ndis.h */
#endif /* DBG */

View file

@ -62,8 +62,7 @@ DRIVER_INFORMATION DriverInfo = {0};
NDIS_PHYSICAL_ADDRESS HighestAcceptableMax = NDIS_PHYSICAL_ADDRESS_CONST(-1, -1);
#if 0
static BOOLEAN MiniportCheckForHang(
static BOOLEAN STDCALL MiniportCheckForHang(
IN NDIS_HANDLE MiniportAdapterContext)
/*
* FUNCTION: Examines if an adapter has hung
@ -77,7 +76,6 @@ static BOOLEAN MiniportCheckForHang(
return FALSE;
}
#endif
static VOID STDCALL MiniportDisableInterrupt(
@ -120,6 +118,8 @@ static VOID STDCALL MiniportHalt(
{
PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext;
ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
#ifndef NOCARD
/* Stop the NIC */
@ -225,6 +225,8 @@ static NDIS_STATUS STDCALL MiniportInitialize(
NDIS_STATUS Status;
PNIC_ADAPTER Adapter;
ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
NDIS_DbgPrint(MAX_TRACE, ("Called (Adapter %X).\n", MiniportAdapterHandle));
/* Search for 802.3 media which is the only one we support */
@ -472,6 +474,8 @@ static NDIS_STATUS STDCALL MiniportQueryInformation(
NDIS_MEDIUM Medium = NdisMedium802_3;
PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext;
ASSERT_IRQL_EQUAL(DISPATCH_LEVEL);
NDIS_DbgPrint(MAX_TRACE, ("Called. Oid (0x%X).\n", Oid));
Status = NDIS_STATUS_SUCCESS;
@ -638,6 +642,8 @@ static NDIS_STATUS STDCALL MiniportReset(
* Status of operation
*/
{
ASSERT_IRQL_EQUAL(DISPATCH_LEVEL);
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
return NDIS_STATUS_FAILURE;
@ -661,6 +667,8 @@ static NDIS_STATUS STDCALL MiniportSend(
{
PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext;
ASSERT_IRQL_EQUAL(DISPATCH_LEVEL);
NDIS_DbgPrint(MID_TRACE, ("Queueing packet.\n"));
#ifdef NOCARD
@ -710,6 +718,8 @@ static NDIS_STATUS STDCALL MiniportSetInformation(
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext;
ASSERT_IRQL_EQUAL(DISPATCH_LEVEL);
NDIS_DbgPrint(MAX_TRACE, ("Called. Oid (0x%X).\n", Oid));
switch (Oid) {
@ -819,6 +829,8 @@ static NDIS_STATUS STDCALL MiniportTransferData(
UINT RecvStop;
PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext;
ASSERT_IRQL_EQUAL(DISPATCH_LEVEL);
NDIS_DbgPrint(MAX_TRACE, ("Called. Packet (0x%X) ByteOffset (0x%X) BytesToTransfer (%d).\n",
Packet, ByteOffset, BytesToTransfer));
@ -903,7 +915,7 @@ DriverEntry(
NdisZeroMemory(&Miniport, sizeof(Miniport));
Miniport.MajorNdisVersion = DRIVER_NDIS_MAJOR_VERSION;
Miniport.MinorNdisVersion = DRIVER_NDIS_MINOR_VERSION;
Miniport.CheckForHangHandler = NULL; //MiniportCheckForHang;
Miniport.CheckForHangHandler = MiniportCheckForHang;
Miniport.DisableInterruptHandler = MiniportDisableInterrupt;
Miniport.EnableInterruptHandler = MiniportEnableInterrupt;
Miniport.HaltHandler = MiniportHalt;
@ -922,6 +934,11 @@ DriverEntry(
RegistryPath,
NULL);
if (!NdisWrapperHandle) {
NDIS_DbgPrint(MIN_TRACE, ("NdisMInitializeWrapper() failed\n"));
return STATUS_UNSUCCESSFUL;
}
DriverInfo.NdisWrapperHandle = NdisWrapperHandle;
DriverInfo.NdisMacHandle = NULL;
InitializeListHead(&DriverInfo.AdapterListHead);

View file

@ -69,6 +69,8 @@ MiniportHandleInterrupt(
DPRINT("Called\n");
ASSERT_IRQL_EQUAL(DISPATCH_LEVEL);
NdisDprAcquireSpinLock(&Adapter->Lock);
NdisRawWritePortUshort(Adapter->PortOffset + RAP, CSR0);
@ -624,6 +626,8 @@ MiniportMediaDetectionTimer(
{
PADAPTER Adapter = (PADAPTER)FunctionContext;
ASSERT_IRQL_EQUAL(DISPATCH_LEVEL);
if (NdisMSynchronizeWithInterrupt(&Adapter->InterruptObject,
MiSyncMediaDetection,
FunctionContext))
@ -812,6 +816,8 @@ MiniportInitialize(
NDIS_STATUS Status = NDIS_STATUS_FAILURE;
BOOLEAN InterruptRegistered = FALSE;
ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
/* Pick a medium */
for(i = 0; i < MediumArraySize; i++)
if(MediumArray[i] == NdisMedium802_3)
@ -1023,6 +1029,8 @@ MiniportReset(
{
DPRINT("Called\n");
ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
/* MiniportReset doesn't do anything at the moment... perhaps this should be fixed. */
*AddressingReset = FALSE;
@ -1072,6 +1080,8 @@ MiniportSend(
DPRINT("Called\n");
ASSERT_IRQL_EQUAL(DISPATCH_LEVEL);
NdisDprAcquireSpinLock(&Adapter->Lock);
/* Check if we have free entry in our circular buffer. */

View file

@ -141,8 +141,10 @@ MiGetMediaState(PADAPTER Adapter);
#if DBG
#define BREAKPOINT DbgBreakPoint();
#define ASSERT_IRQL_EQUAL(x) ASSERT(KeGetCurrentIrql() == x)
#else
#define BREAKPOINT
#define ASSERT_IRQL_EQUAL(x)
#endif
#ifndef TAG

View file

@ -103,7 +103,7 @@ MiniportQueryInformation(
* RETURNS:
* NDIS_STATUS_SUCCESS on all queries
* NOTES:
* - Called by NDIS at PASSIVE_LEVEL
* - Called by NDIS at DISPATCH_LEVEL
* - If InformationBufferLength is insufficient to store the results, return the amount
* needed in BytesNeeded and return NDIS_STATUS_INVALID_LENGTH
* TODO:
@ -118,9 +118,11 @@ MiniportQueryInformation(
DPRINT("Called. OID 0x%x\n", Oid);
ASSERT_IRQL_EQUAL(DISPATCH_LEVEL);
ASSERT(Adapter);
NdisAcquireSpinLock(&Adapter->Lock);
NdisDprAcquireSpinLock(&Adapter->Lock);
Status = NDIS_STATUS_SUCCESS;
CopyFrom = (PVOID)&GenericULONG;
@ -361,7 +363,7 @@ MiniportQueryInformation(
}
}
NdisReleaseSpinLock(&Adapter->Lock);
NdisDprReleaseSpinLock(&Adapter->Lock);
DPRINT("Leaving. Status is 0x%x\n", Status);
@ -390,7 +392,7 @@ MiniportSetInformation(
* RETURNS:
* NDIS_STATUS_SUCCESS on all requests
* NOTES:
* - Called by NDIS at PASSIVE_LEVEL
* - Called by NDIS at DISPATCH_LEVEL
* - verify buffer space as mentioned in previous function notes
*/
{
@ -400,9 +402,11 @@ MiniportSetInformation(
ASSERT(Adapter);
ASSERT_IRQL_EQUAL(DISPATCH_LEVEL);
DPRINT("Called, OID 0x%x\n", Oid);
NdisAcquireSpinLock(&Adapter->Lock);
NdisDprAcquireSpinLock(&Adapter->Lock);
switch (Oid)
{
@ -501,7 +505,7 @@ MiniportSetInformation(
*BytesNeeded = 0;
}
NdisReleaseSpinLock(&Adapter->Lock);
NdisDprReleaseSpinLock(&Adapter->Lock);
DPRINT("Leaving. Status (0x%X).\n", Status);

View file

@ -268,7 +268,7 @@ NdisMAllocateMapRegisters(
UINT MapRegistersPerBaseRegister = 0;
ULONG AvailableMapRegisters;
NTSTATUS NtStatus;
PNDIS_MINIPORT_BLOCK Adapter = 0;
PLOGICAL_ADAPTER Adapter;
PDEVICE_OBJECT DeviceObject = 0;
KEVENT AllocationEvent;
KIRQL OldIrql;
@ -278,19 +278,19 @@ NdisMAllocateMapRegisters(
memset(&Description,0,sizeof(Description));
Adapter = (PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle;
Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle;
ASSERT(Adapter);
/* only bus masters may call this routine */
ASSERT(Adapter->Flags & NDIS_ATTRIBUTE_BUS_MASTER);
if(!(Adapter->Flags & NDIS_ATTRIBUTE_BUS_MASTER))
ASSERT(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER);
if(!(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER))
return NDIS_STATUS_SUCCESS;
DeviceObject = Adapter->DeviceObject;
DeviceObject = Adapter->NdisMiniportBlock.DeviceObject;
KeInitializeEvent(&AllocationEvent, NotificationEvent, FALSE);
Adapter->AllocationEvent = &AllocationEvent;
Adapter->NdisMiniportBlock.AllocationEvent = &AllocationEvent;
/*
* map registers correlate to physical pages. ndis documents a
@ -310,12 +310,12 @@ NdisMAllocateMapRegisters(
Description.Master = TRUE; /* implied by calling this function */
Description.ScatterGather = TRUE; /* XXX UNTRUE: All BM DMA are S/G (ms seems to do this) */
Description.Dma32BitAddresses = DmaSize;
Description.BusNumber = Adapter->BusNumber;
Description.InterfaceType = Adapter->BusType;
Description.BusNumber = Adapter->NdisMiniportBlock.BusNumber;
Description.InterfaceType = Adapter->NdisMiniportBlock.BusType;
Description.DmaChannel = DmaChannel;
Description.MaximumLength = MaximumBufferSize;
if(Adapter->AdapterType == Isa)
if(Adapter->NdisMiniportBlock.AdapterType == Isa)
{
/* system dma */
if(DmaChannel < 4)
@ -325,7 +325,7 @@ NdisMAllocateMapRegisters(
Description.DmaSpeed = Compatible;
}
else if(Adapter->AdapterType == PCIBus)
else if(Adapter->NdisMiniportBlock.AdapterType == PCIBus)
{
if(DmaSize == NDIS_DMA_64BITS)
Description.Dma64BitAddresses = TRUE;
@ -339,7 +339,7 @@ NdisMAllocateMapRegisters(
}
AdapterObject = IoGetDmaAdapter(
Adapter->PhysicalDeviceObject, &Description, &AvailableMapRegisters);
Adapter->NdisMiniportBlock.PhysicalDeviceObject, &Description, &AvailableMapRegisters);
if(!AdapterObject)
{
@ -347,7 +347,7 @@ NdisMAllocateMapRegisters(
return NDIS_STATUS_RESOURCES;
}
Adapter->SystemAdapterObject = AdapterObject;
Adapter->NdisMiniportBlock.SystemAdapterObject = AdapterObject;
if(AvailableMapRegisters < MapRegistersPerBaseRegister)
{
@ -358,22 +358,22 @@ NdisMAllocateMapRegisters(
}
/* allocate & zero space in the miniport block for the registers */
Adapter->MapRegisters = ExAllocatePool(NonPagedPool, BaseMapRegistersNeeded * sizeof(MAP_REGISTER_ENTRY));
if(!Adapter->MapRegisters)
Adapter->NdisMiniportBlock.MapRegisters = ExAllocatePool(NonPagedPool, BaseMapRegistersNeeded * sizeof(MAP_REGISTER_ENTRY));
if(!Adapter->NdisMiniportBlock.MapRegisters)
{
NDIS_DbgPrint(MIN_TRACE, ("insufficient resources.\n"));
return NDIS_STATUS_RESOURCES;
}
memset(Adapter->MapRegisters, 0, BaseMapRegistersNeeded * sizeof(MAP_REGISTER_ENTRY));
Adapter->BaseMapRegistersNeeded = (USHORT)BaseMapRegistersNeeded;
memset(Adapter->NdisMiniportBlock.MapRegisters, 0, BaseMapRegistersNeeded * sizeof(MAP_REGISTER_ENTRY));
Adapter->NdisMiniportBlock.BaseMapRegistersNeeded = (USHORT)BaseMapRegistersNeeded;
while(BaseMapRegistersNeeded)
{
NDIS_DbgPrint(MAX_TRACE, ("iterating, basemapregistersneeded = %d\n", BaseMapRegistersNeeded));
BaseMapRegistersNeeded--;
Adapter->CurrentMapRegister = (USHORT)BaseMapRegistersNeeded;
Adapter->NdisMiniportBlock.CurrentMapRegister = (USHORT)BaseMapRegistersNeeded;
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
{
NtStatus = AdapterObject->DmaOperations->AllocateAdapterChannel(
@ -385,7 +385,7 @@ NdisMAllocateMapRegisters(
if(!NT_SUCCESS(NtStatus))
{
NDIS_DbgPrint(MIN_TRACE, ("IoAllocateAdapterChannel failed: 0x%x\n", NtStatus));
ExFreePool(Adapter->MapRegisters);
ExFreePool(Adapter->NdisMiniportBlock.MapRegisters);
return NDIS_STATUS_RESOURCES;
}
@ -396,7 +396,7 @@ NdisMAllocateMapRegisters(
if(!NT_SUCCESS(NtStatus))
{
NDIS_DbgPrint(MIN_TRACE, ("KeWaitForSingleObject failed: 0x%x\n", NtStatus));
ExFreePool(Adapter->MapRegisters);
ExFreePool(Adapter->NdisMiniportBlock.MapRegisters);
return NDIS_STATUS_RESOURCES;
}
@ -439,7 +439,7 @@ NdisMStartBufferPhysicalMapping(
* - The caller supplies storage for the physical address array.
*/
{
PNDIS_MINIPORT_BLOCK Adapter;
PLOGICAL_ADAPTER Adapter;
PVOID CurrentVa;
ULONG TotalLength;
PHYSICAL_ADDRESS ReturnedAddress;
@ -448,7 +448,7 @@ NdisMStartBufferPhysicalMapping(
ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
ASSERT(MiniportAdapterHandle && Buffer && PhysicalAddressArray && ArraySize);
Adapter = (PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle;
Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle;
CurrentVa = MmGetMdlVirtualAddress(Buffer);
TotalLength = MmGetMdlByteCount(Buffer);
@ -456,12 +456,12 @@ NdisMStartBufferPhysicalMapping(
{
ULONG Length = TotalLength;
ReturnedAddress = Adapter->SystemAdapterObject->DmaOperations->MapTransfer(
Adapter->SystemAdapterObject, Buffer,
Adapter->MapRegisters[PhysicalMapRegister].MapRegister,
ReturnedAddress = Adapter->NdisMiniportBlock.SystemAdapterObject->DmaOperations->MapTransfer(
Adapter->NdisMiniportBlock.SystemAdapterObject, Buffer,
Adapter->NdisMiniportBlock.MapRegisters[PhysicalMapRegister].MapRegister,
CurrentVa, &Length, WriteToDevice);
Adapter->MapRegisters[PhysicalMapRegister].WriteToDevice = WriteToDevice;
Adapter->NdisMiniportBlock.MapRegisters[PhysicalMapRegister].WriteToDevice = WriteToDevice;
PhysicalAddressArray[LoopCount].PhysicalAddress = ReturnedAddress;
PhysicalAddressArray[LoopCount].Length = Length;
@ -495,22 +495,22 @@ NdisMCompleteBufferPhysicalMapping(
* - May be called at IRQL <= DISPATCH_LEVEL
*/
{
PNDIS_MINIPORT_BLOCK Adapter;
PLOGICAL_ADAPTER Adapter;
VOID *CurrentVa;
ULONG Length;
ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
ASSERT(MiniportAdapterHandle && Buffer);
Adapter = (PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle;
Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle;
CurrentVa = MmGetMdlVirtualAddress(Buffer);
Length = MmGetMdlByteCount(Buffer);
Adapter->SystemAdapterObject->DmaOperations->FlushAdapterBuffers(
Adapter->SystemAdapterObject, Buffer,
Adapter->MapRegisters[PhysicalMapRegister].MapRegister,
Adapter->NdisMiniportBlock.SystemAdapterObject->DmaOperations->FlushAdapterBuffers(
Adapter->NdisMiniportBlock.SystemAdapterObject, Buffer,
Adapter->NdisMiniportBlock.MapRegisters[PhysicalMapRegister].MapRegister,
CurrentVa, Length,
Adapter->MapRegisters[PhysicalMapRegister].WriteToDevice);
Adapter->NdisMiniportBlock.MapRegisters[PhysicalMapRegister].WriteToDevice);
}
@ -582,7 +582,7 @@ NdisMFreeMapRegisters(
*/
{
KIRQL OldIrql;
PNDIS_MINIPORT_BLOCK Adapter = (PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle;
PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle;
PDMA_ADAPTER AdapterObject;
UINT MapRegistersPerBaseRegister;
UINT i;
@ -592,31 +592,31 @@ NdisMFreeMapRegisters(
ASSERT(Adapter);
/* only bus masters may call this routine */
ASSERT(Adapter->Flags & NDIS_ATTRIBUTE_BUS_MASTER);
if(!(Adapter->Flags & NDIS_ATTRIBUTE_BUS_MASTER) ||
Adapter->SystemAdapterObject == NULL)
ASSERT(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER);
if(!(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER) ||
Adapter->NdisMiniportBlock.SystemAdapterObject == NULL)
return;
MapRegistersPerBaseRegister = ((Adapter->MaximumPhysicalMapping - 2) / PAGE_SIZE) + 2;
MapRegistersPerBaseRegister = ((Adapter->NdisMiniportBlock.MaximumPhysicalMapping - 2) / PAGE_SIZE) + 2;
AdapterObject = Adapter->SystemAdapterObject;
AdapterObject = Adapter->NdisMiniportBlock.SystemAdapterObject;
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
{
for(i = 0; i < Adapter->BaseMapRegistersNeeded; i++)
for(i = 0; i < Adapter->NdisMiniportBlock.BaseMapRegistersNeeded; i++)
{
AdapterObject->DmaOperations->FreeMapRegisters(
Adapter->SystemAdapterObject,
Adapter->MapRegisters[i].MapRegister,
Adapter->NdisMiniportBlock.SystemAdapterObject,
Adapter->NdisMiniportBlock.MapRegisters[i].MapRegister,
MapRegistersPerBaseRegister);
}
}
KeLowerIrql(OldIrql);
AdapterObject->DmaOperations->PutDmaAdapter(AdapterObject);
Adapter->SystemAdapterObject = NULL;
Adapter->NdisMiniportBlock.SystemAdapterObject = NULL;
ExFreePool(Adapter->MapRegisters);
ExFreePool(Adapter->NdisMiniportBlock.MapRegisters);
}
@ -752,7 +752,7 @@ NdisMRegisterInterrupt(
ULONG MappedIRQ;
KIRQL DIrql;
KAFFINITY Affinity;
PNDIS_MINIPORT_BLOCK Adapter = (PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle;
PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle;
NDIS_DbgPrint(MAX_TRACE, ("Called. InterruptVector (0x%X) InterruptLevel (0x%X) "
"SharedInterrupt (%d) InterruptMode (0x%X)\n",
@ -768,9 +768,9 @@ NdisMRegisterInterrupt(
Interrupt->SharedInterrupt = SharedInterrupt;
Adapter->Interrupt = Interrupt;
Adapter->NdisMiniportBlock.Interrupt = Interrupt;
MappedIRQ = HalGetInterruptVector(Adapter->BusType, Adapter->BusNumber,
MappedIRQ = HalGetInterruptVector(Adapter->NdisMiniportBlock.BusType, Adapter->NdisMiniportBlock.BusNumber,
InterruptLevel, InterruptVector, &DIrql,
&Affinity);
@ -818,7 +818,7 @@ NdisMRegisterIoPortRange(
*/
{
PHYSICAL_ADDRESS PortAddress, TranslatedAddress;
PNDIS_MINIPORT_BLOCK Adapter = (PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle;
PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle;
ULONG AddressSpace = 1; /* FIXME The HAL handles this wrong atm */
*PortOffset = 0;
@ -840,7 +840,7 @@ NdisMRegisterIoPortRange(
NDIS_DbgPrint(MAX_TRACE, ("Translating address 0x%x 0x%x\n", PortAddress.u.HighPart, PortAddress.u.LowPart));
if(!HalTranslateBusAddress(Adapter->BusType, Adapter->BusNumber,
if(!HalTranslateBusAddress(Adapter->NdisMiniportBlock.BusType, Adapter->NdisMiniportBlock.BusNumber,
PortAddress, &AddressSpace, &TranslatedAddress))
{
NDIS_DbgPrint(MIN_TRACE, ("Unable to translate address\n"));

View file

@ -189,12 +189,12 @@ NdisMAllocateSharedMemory(
* - Cached is ignored; we always allocate non-cached
*/
{
PNDIS_MINIPORT_BLOCK Adapter = (PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle;
PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle;
NDIS_DbgPrint(MAX_TRACE,("Called.\n"));
*VirtualAddress = Adapter->SystemAdapterObject->DmaOperations->AllocateCommonBuffer(
Adapter->SystemAdapterObject, Length, PhysicalAddress, Cached);
*VirtualAddress = Adapter->NdisMiniportBlock.SystemAdapterObject->DmaOperations->AllocateCommonBuffer(
Adapter->NdisMiniportBlock.SystemAdapterObject, Length, PhysicalAddress, Cached);
}
@ -267,7 +267,7 @@ NdisMFreeSharedMemory(
*/
{
HANDLE ThreadHandle;
PNDIS_MINIPORT_BLOCK Adapter = (PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle;
PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle;
PMINIPORT_SHARED_MEMORY Memory;
NDIS_DbgPrint(MAX_TRACE,("Called.\n"));
@ -283,7 +283,7 @@ NdisMFreeSharedMemory(
return;
}
Memory->AdapterObject = Adapter->SystemAdapterObject;
Memory->AdapterObject = Adapter->NdisMiniportBlock.SystemAdapterObject;
Memory->Length = Length;
Memory->PhysicalAddress = PhysicalAddress;
Memory->VirtualAddress = VirtualAddress;

View file

@ -583,6 +583,76 @@ MiniQueryInformation(
return NdisStatus;
}
BOOLEAN
MiniCheckForHang( PLOGICAL_ADAPTER Adapter )
/*
* FUNCTION: Checks to see if the miniport is hung
* ARGUMENTS:
* Adapter = Pointer to the logical adapter object
* RETURNS:
* TRUE if the miniport is hung
* FALSE if the miniport is not hung
*/
{
BOOLEAN Ret = FALSE;
KIRQL OldIrql;
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
if (Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.CheckForHangHandler)
Ret = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.CheckForHangHandler)(
Adapter->NdisMiniportBlock.MiniportAdapterContext);
KeLowerIrql(OldIrql);
return Ret;
}
NDIS_STATUS
MiniReset(
PLOGICAL_ADAPTER Adapter,
PBOOLEAN AddressingReset)
/*
* FUNCTION: Resets the miniport
* ARGUMENTS:
* Adapter = Pointer to the logical adapter object
* AddressingReset = Set to TRUE if we need to call MiniportSetInformation later
* RETURNS:
* Status of the operation
*/
{
NDIS_STATUS Status = NDIS_STATUS_FAILURE;
KIRQL OldIrql;
/* FIXME: What should we return if there isn't a reset handler? */
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
if (Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)
Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)(
Adapter->NdisMiniportBlock.MiniportAdapterContext,
AddressingReset);
KeLowerIrql(OldIrql);
return Status;
}
VOID STDCALL
MiniportHangDpc(
PKDPC Dpc,
PVOID DeferredContext,
PVOID SystemArgument1,
PVOID SystemArgument2)
{
PLOGICAL_ADAPTER Adapter = DeferredContext;
BOOLEAN AddressingReset = FALSE;
if (MiniCheckForHang(Adapter)) {
NDIS_DbgPrint(MIN_TRACE, ("Miniport detected adapter hang\n"));
MiniReset(Adapter, &AddressingReset);
}
/* FIXME: We should call MiniportSetInformation if AddressingReset is TRUE */
}
NDIS_STATUS
FASTCALL
@ -1370,7 +1440,8 @@ NdisIPnPStartDevice(
PNDIS_CONFIGURATION_PARAMETER ConfigParam;
NDIS_HANDLE ConfigHandle;
ULONG Size;
/* FIXME - KIRQL OldIrql; */
LARGE_INTEGER Timeout;
/* FIXME - KIRQL OldIrql; */
/*
* Prepare wrapper context used by HW and configuration routines.
@ -1582,9 +1653,18 @@ NdisIPnPStartDevice(
return (NTSTATUS)NdisStatus;
}
/* Check for a hang every two seconds if it wasn't set in MiniportInitialize */
if (Adapter->NdisMiniportBlock.CheckForHangSeconds == 0)
Adapter->NdisMiniportBlock.CheckForHangSeconds = 2;
Adapter->NdisMiniportBlock.OldPnPDeviceState = Adapter->NdisMiniportBlock.PnPDeviceState;
Adapter->NdisMiniportBlock.PnPDeviceState = NdisPnPDeviceStarted;
Timeout.QuadPart = (LONGLONG)Adapter->NdisMiniportBlock.CheckForHangSeconds * -1000000;
KeSetTimerEx(&Adapter->NdisMiniportBlock.WakeUpDpcTimer.Timer, Timeout,
Adapter->NdisMiniportBlock.CheckForHangSeconds * 1000,
&Adapter->NdisMiniportBlock.WakeUpDpcTimer.Dpc);
/* Put adapter in adapter list for this miniport */
ExInterlockedInsertTailList(&Adapter->NdisMiniportBlock.DriverHandle->DeviceList, &Adapter->MiniportListEntry, &Adapter->NdisMiniportBlock.DriverHandle->Lock);
@ -1640,6 +1720,8 @@ NdisIPnPStopDevice(
Adapter->NdisMiniportBlock.OldPnPDeviceState = Adapter->NdisMiniportBlock.PnPDeviceState;
Adapter->NdisMiniportBlock.PnPDeviceState = NdisPnPDeviceStopped;
KeCancelTimer(&Adapter->NdisMiniportBlock.WakeUpDpcTimer.Timer);
return STATUS_SUCCESS;
}
@ -1826,7 +1908,9 @@ NdisIAddDevice(
Adapter->NdisMiniportBlock.OldPnPDeviceState = 0;
Adapter->NdisMiniportBlock.PnPDeviceState = NdisPnPDeviceAdded;
KeInitializeDpc(&Adapter->NdisMiniportBlock.DeferredDpc, MiniportDpc, (PVOID)Adapter);
KeInitializeTimer(&Adapter->NdisMiniportBlock.WakeUpDpcTimer.Timer);
KeInitializeDpc(&Adapter->NdisMiniportBlock.WakeUpDpcTimer.Dpc, MiniportHangDpc, Adapter);
KeInitializeDpc(&Adapter->NdisMiniportBlock.DeferredDpc, MiniportDpc, Adapter);
DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
@ -2078,8 +2162,6 @@ NdisMSetAttributesEx(
* AdapterType = Specifies the I/O bus interface of the caller's NIC
*/
{
/* TODO: Take CheckForHandTimeInSeconds into account! */
PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(MiniportAdapterHandle);
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
@ -2087,6 +2169,8 @@ NdisMSetAttributesEx(
Adapter->NdisMiniportBlock.MiniportAdapterContext = MiniportAdapterContext;
Adapter->NdisMiniportBlock.Flags = AttributeFlags;
Adapter->NdisMiniportBlock.AdapterType = AdapterType;
if (CheckForHangTimeInSeconds > 0)
Adapter->NdisMiniportBlock.CheckForHangSeconds = CheckForHangTimeInSeconds;
if (AttributeFlags & NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER)
NDIS_DbgPrint(MAX_TRACE, ("Intermediate drivers not supported yet.\n"));
}