mirror of
https://github.com/reactos/reactos.git
synced 2024-09-30 14:37:45 +00:00
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:
parent
ef2bb65235
commit
564e5b5a2c
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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"));
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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"));
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue