mirror of
https://github.com/reactos/reactos.git
synced 2024-07-06 12:45:16 +00:00
[NDIS]
- Implement NdisMDeregisterIoPortRange [PCNET] - Don't call NdisMFreeMapRegisters if no map registers were allocated - Call MiFreeSharedMemory before freeing map registers to avoid a crash because freeing map registers deallocates the adapter object svn path=/trunk/; revision=53147
This commit is contained in:
parent
b2cedb10b3
commit
6276b33958
|
@ -844,7 +844,7 @@ MiniportInitialize(
|
|||
UINT i = 0;
|
||||
PADAPTER Adapter = 0;
|
||||
NDIS_STATUS Status = NDIS_STATUS_FAILURE;
|
||||
BOOLEAN InterruptRegistered = FALSE;
|
||||
BOOLEAN InterruptRegistered = FALSE, MapRegistersAllocated = FALSE;
|
||||
NDIS_HANDLE ConfigurationHandle;
|
||||
UINT *RegNetworkAddress = 0;
|
||||
UINT RegNetworkAddressLength = 0;
|
||||
|
@ -912,6 +912,8 @@ MiniportInitialize(
|
|||
break;
|
||||
}
|
||||
|
||||
MapRegistersAllocated = TRUE;
|
||||
|
||||
/* set up the interrupt */
|
||||
Status = NdisMRegisterInterrupt(&Adapter->InterruptObject, Adapter->MiniportAdapterHandle, Adapter->InterruptVector,
|
||||
Adapter->InterruptVector, TRUE, TRUE, NdisInterruptLevelSensitive);
|
||||
|
@ -928,7 +930,7 @@ MiniportInitialize(
|
|||
if(Status != NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
Status = NDIS_STATUS_RESOURCES;
|
||||
DPRINT1("MiAllocateSharedMemory failed", Status);
|
||||
DPRINT1("MiAllocateSharedMemory failed\n", Status);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -969,7 +971,10 @@ MiniportInitialize(
|
|||
{
|
||||
DPRINT("Error; freeing stuff\n");
|
||||
|
||||
NdisMFreeMapRegisters(Adapter->MiniportAdapterHandle); /* doesn't hurt to free if we never alloc'd? */
|
||||
MiFreeSharedMemory(Adapter);
|
||||
|
||||
if(MapRegistersAllocated)
|
||||
NdisMFreeMapRegisters(Adapter->MiniportAdapterHandle);
|
||||
|
||||
if(Adapter->PortOffset)
|
||||
NdisMDeregisterIoPortRange(Adapter->MiniportAdapterHandle, Adapter->IoBaseAddress, NUMBER_OF_PORTS, (PVOID)Adapter->PortOffset);
|
||||
|
@ -977,8 +982,6 @@ MiniportInitialize(
|
|||
if(InterruptRegistered)
|
||||
NdisMDeregisterInterrupt(&Adapter->InterruptObject);
|
||||
|
||||
MiFreeSharedMemory(Adapter);
|
||||
|
||||
NdisFreeMemory(Adapter, 0, 0);
|
||||
}
|
||||
|
||||
|
|
|
@ -523,26 +523,3 @@ NdisPacketPoolUsage(
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
VOID
|
||||
EXPORT
|
||||
NdisMDeregisterIoPortRange(
|
||||
IN NDIS_HANDLE MiniportAdapterHandle,
|
||||
IN UINT InitialPort,
|
||||
IN UINT NumberOfPorts,
|
||||
IN PVOID PortOffset)
|
||||
/*
|
||||
* FUNCTION: Releases a register mapping to I/O ports
|
||||
* ARGUMENTS:
|
||||
* MiniportAdapterHandle = Specifies handle input to MiniportInitialize
|
||||
* InitialPort = Bus-relative base port address of a range to be mapped
|
||||
* NumberOfPorts = Specifies number of ports to be mapped
|
||||
* PortOffset = Pointer to mapped base port address
|
||||
*/
|
||||
{
|
||||
UNIMPLEMENTED
|
||||
}
|
||||
|
|
|
@ -898,6 +898,51 @@ NdisMRegisterIoPortRange(
|
|||
return NDIS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
VOID
|
||||
EXPORT
|
||||
NdisMDeregisterIoPortRange(IN NDIS_HANDLE MiniportAdapterHandle,
|
||||
IN UINT InitialPort,
|
||||
IN UINT NumberOfPorts,
|
||||
IN PVOID PortOffset)
|
||||
/*
|
||||
* FUNCTION: Releases a register mapping to I/O ports
|
||||
* ARGUMENTS:
|
||||
* MiniportAdapterHandle = Specifies handle input to MiniportInitialize
|
||||
* InitialPort = Bus-relative base port address of a range to be mapped
|
||||
* NumberOfPorts = Specifies number of ports to be mapped
|
||||
* PortOffset = Pointer to mapped base port address
|
||||
*/
|
||||
{
|
||||
PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle;
|
||||
PHYSICAL_ADDRESS PortAddress = RtlConvertUlongToLargeInteger(InitialPort);
|
||||
PHYSICAL_ADDRESS TranslatedAddress;
|
||||
ULONG AddressSpace = 1;
|
||||
|
||||
NDIS_DbgPrint(MAX_TRACE, ("Called - InitialPort 0x%x, NumberOfPorts 0x%x, Port Offset 0x%x\n", InitialPort, NumberOfPorts, PortOffset));
|
||||
|
||||
/* Translate the initial port again to find the address space of the translated address */
|
||||
if(!HalTranslateBusAddress(Adapter->NdisMiniportBlock.BusType, Adapter->NdisMiniportBlock.BusNumber,
|
||||
PortAddress, &AddressSpace, &TranslatedAddress))
|
||||
{
|
||||
NDIS_DbgPrint(MIN_TRACE, ("Unable to translate address\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Make sure we got the same translation as last time */
|
||||
ASSERT(TranslatedAddress.QuadPart == (ULONG_PTR)PortOffset);
|
||||
|
||||
/* Check if we're in memory space */
|
||||
if (!AddressSpace)
|
||||
{
|
||||
NDIS_DbgPrint(MAX_TRACE, ("Calling MmUnmapIoSpace\n"));
|
||||
|
||||
/* Unmap the memory */
|
||||
MmUnmapIoSpace(PortOffset, NumberOfPorts);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
|
|
Loading…
Reference in a new issue