mirror of
https://github.com/reactos/reactos.git
synced 2024-08-04 18:40:59 +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;
|
UINT i = 0;
|
||||||
PADAPTER Adapter = 0;
|
PADAPTER Adapter = 0;
|
||||||
NDIS_STATUS Status = NDIS_STATUS_FAILURE;
|
NDIS_STATUS Status = NDIS_STATUS_FAILURE;
|
||||||
BOOLEAN InterruptRegistered = FALSE;
|
BOOLEAN InterruptRegistered = FALSE, MapRegistersAllocated = FALSE;
|
||||||
NDIS_HANDLE ConfigurationHandle;
|
NDIS_HANDLE ConfigurationHandle;
|
||||||
UINT *RegNetworkAddress = 0;
|
UINT *RegNetworkAddress = 0;
|
||||||
UINT RegNetworkAddressLength = 0;
|
UINT RegNetworkAddressLength = 0;
|
||||||
|
@ -912,6 +912,8 @@ MiniportInitialize(
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MapRegistersAllocated = TRUE;
|
||||||
|
|
||||||
/* set up the interrupt */
|
/* set up the interrupt */
|
||||||
Status = NdisMRegisterInterrupt(&Adapter->InterruptObject, Adapter->MiniportAdapterHandle, Adapter->InterruptVector,
|
Status = NdisMRegisterInterrupt(&Adapter->InterruptObject, Adapter->MiniportAdapterHandle, Adapter->InterruptVector,
|
||||||
Adapter->InterruptVector, TRUE, TRUE, NdisInterruptLevelSensitive);
|
Adapter->InterruptVector, TRUE, TRUE, NdisInterruptLevelSensitive);
|
||||||
|
@ -928,7 +930,7 @@ MiniportInitialize(
|
||||||
if(Status != NDIS_STATUS_SUCCESS)
|
if(Status != NDIS_STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
Status = NDIS_STATUS_RESOURCES;
|
Status = NDIS_STATUS_RESOURCES;
|
||||||
DPRINT1("MiAllocateSharedMemory failed", Status);
|
DPRINT1("MiAllocateSharedMemory failed\n", Status);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -969,7 +971,10 @@ MiniportInitialize(
|
||||||
{
|
{
|
||||||
DPRINT("Error; freeing stuff\n");
|
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)
|
if(Adapter->PortOffset)
|
||||||
NdisMDeregisterIoPortRange(Adapter->MiniportAdapterHandle, Adapter->IoBaseAddress, NUMBER_OF_PORTS, (PVOID)Adapter->PortOffset);
|
NdisMDeregisterIoPortRange(Adapter->MiniportAdapterHandle, Adapter->IoBaseAddress, NUMBER_OF_PORTS, (PVOID)Adapter->PortOffset);
|
||||||
|
@ -977,8 +982,6 @@ MiniportInitialize(
|
||||||
if(InterruptRegistered)
|
if(InterruptRegistered)
|
||||||
NdisMDeregisterInterrupt(&Adapter->InterruptObject);
|
NdisMDeregisterInterrupt(&Adapter->InterruptObject);
|
||||||
|
|
||||||
MiFreeSharedMemory(Adapter);
|
|
||||||
|
|
||||||
NdisFreeMemory(Adapter, 0, 0);
|
NdisFreeMemory(Adapter, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -523,26 +523,3 @@ NdisPacketPoolUsage(
|
||||||
|
|
||||||
return 0;
|
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;
|
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
|
* @implemented
|
||||||
|
|
Loading…
Reference in a new issue