From 13d610f832e38acf37f158bf133a949e7be674eb Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 22 May 2009 01:26:18 +0000 Subject: [PATCH] - Fix our DMA implementation to use documented structs svn path=/trunk/; revision=41039 --- reactos/drivers/network/ndis/ndis/io.c | 51 +++++++++++++------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/reactos/drivers/network/ndis/ndis/io.c b/reactos/drivers/network/ndis/ndis/io.c index da465539f72..7ea14b4c814 100644 --- a/reactos/drivers/network/ndis/ndis/io.c +++ b/reactos/drivers/network/ndis/ndis/io.c @@ -503,14 +503,17 @@ NdisMCompleteBufferPhysicalMapping( VOID EXPORT NdisMDeregisterDmaChannel( - IN PNDIS_HANDLE MiniportDmaHandle) + IN NDIS_HANDLE MiniportDmaHandle) { - PNDIS_MINIPORT_BLOCK NdisMiniportBlock = (PNDIS_MINIPORT_BLOCK)MiniportDmaHandle; - PDMA_ADAPTER AdapterObject = NdisMiniportBlock->SystemAdapterObject; + PNDIS_DMA_BLOCK DmaBlock = MiniportDmaHandle; + PDMA_ADAPTER AdapterObject = (PDMA_ADAPTER)DmaBlock->SystemAdapterObject; + + if (AdapterObject == ((PLOGICAL_ADAPTER)DmaBlock->Miniport)->NdisMiniportBlock.SystemAdapterObject) + ((PLOGICAL_ADAPTER)DmaBlock->Miniport)->NdisMiniportBlock.SystemAdapterObject = NULL; AdapterObject->DmaOperations->PutDmaAdapter(AdapterObject); - NdisMiniportBlock->SystemAdapterObject = NULL; + ExFreePool(DmaBlock); } @@ -650,14 +653,11 @@ EXPORT NdisMReadDmaCounter( IN NDIS_HANDLE MiniportDmaHandle) { - PNDIS_MINIPORT_BLOCK MiniportBlock = (PNDIS_MINIPORT_BLOCK)MiniportDmaHandle; - PDMA_ADAPTER AdapterObject = MiniportBlock->SystemAdapterObject; + PNDIS_DMA_BLOCK DmaBlock = MiniportDmaHandle; + PDMA_ADAPTER AdapterObject = (PDMA_ADAPTER)DmaBlock->SystemAdapterObject; NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - if (AdapterObject == NULL) - return 0; - return AdapterObject->DmaOperations->ReadDmaCounter(AdapterObject); } @@ -670,14 +670,11 @@ EXPORT NdisMGetDmaAlignment( IN NDIS_HANDLE MiniportDmaHandle) { - PNDIS_MINIPORT_BLOCK MiniportBlock = (PNDIS_MINIPORT_BLOCK)MiniportDmaHandle; - PDMA_ADAPTER AdapterObject = MiniportBlock->SystemAdapterObject; + PNDIS_DMA_BLOCK DmaBlock = MiniportDmaHandle; + PDMA_ADAPTER AdapterObject = (PDMA_ADAPTER)DmaBlock->SystemAdapterObject; NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - if (AdapterObject == NULL) - return 0; - return AdapterObject->DmaOperations->GetDmaAlignment(AdapterObject); } @@ -698,16 +695,10 @@ NdisMRegisterDmaChannel( PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle; DEVICE_DESCRIPTION DeviceDesc; ULONG MapRegisters; + PNDIS_DMA_BLOCK DmaBlock; NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - if (Adapter->NdisMiniportBlock.SystemAdapterObject) - { - NDIS_DbgPrint(MIN_TRACE,("Using existing DMA adapter\n")); - *MiniportDmaHandle = &Adapter->NdisMiniportBlock; - return NDIS_STATUS_SUCCESS; - } - RtlZeroMemory(&DeviceDesc, sizeof(DEVICE_DESCRIPTION)); DeviceDesc.Version = DEVICE_DESCRIPTION_VERSION; @@ -724,13 +715,23 @@ NdisMRegisterDmaChannel( DeviceDesc.DmaSpeed = DmaDescription->DmaSpeed; DeviceDesc.MaximumLength = MaximumLength; - Adapter->NdisMiniportBlock.SystemAdapterObject = - IoGetDmaAdapter(Adapter->NdisMiniportBlock.PhysicalDeviceObject, &DeviceDesc, &MapRegisters); - if (!Adapter->NdisMiniportBlock.SystemAdapterObject) + DmaBlock = ExAllocatePool(NonPagedPool, sizeof(NDIS_DMA_BLOCK)); + if (!DmaBlock) return NDIS_STATUS_RESOURCES; - *MiniportDmaHandle = &Adapter->NdisMiniportBlock; + DmaBlock->SystemAdapterObject = (PVOID)IoGetDmaAdapter(Adapter->NdisMiniportBlock.PhysicalDeviceObject, &DeviceDesc, &MapRegisters); + + if (!DmaBlock->SystemAdapterObject) { + ExFreePool(DmaBlock); + return NDIS_STATUS_RESOURCES; + } + + Adapter->NdisMiniportBlock.SystemAdapterObject = (PDMA_ADAPTER)DmaBlock->SystemAdapterObject; + + DmaBlock->Miniport = Adapter; + + *MiniportDmaHandle = DmaBlock; return NDIS_STATUS_SUCCESS; }