From 4517f7f992ecb96866e04c99d1b81c77f62bb2d4 Mon Sep 17 00:00:00 2001 From: Vizzini Date: Thu, 4 Sep 2003 07:01:51 +0000 Subject: [PATCH] added NdisMAllocateSharedMemory and NdisMFreeSharedMemory and fixed a couple minor bugs svn path=/trunk/; revision=5980 --- reactos/drivers/net/ndis/ndis/memory.c | 124 +++++++++++++++++++++---- 1 file changed, 108 insertions(+), 16 deletions(-) diff --git a/reactos/drivers/net/ndis/ndis/memory.c b/reactos/drivers/net/ndis/ndis/memory.c index 9ee7f062fdf..96e8c44ba2b 100644 --- a/reactos/drivers/net/ndis/ndis/memory.c +++ b/reactos/drivers/net/ndis/ndis/memory.c @@ -4,11 +4,13 @@ * FILE: ndis/memory.c * PURPOSE: Memory management routines * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) + * Vizzini (vizzini@plasmic.com) * REVISIONS: * CSH 01/08-2000 Created + * 8/15/2003 Vizzini - DMA support */ #include - +#include /* * @implemented @@ -25,19 +27,22 @@ NdisAllocateMemoryWithTag( * VirtualAddress = a pointer to the returned memory block * Length = the number of requested bytes * Tag = 32-bit pool tag - * NOTES: - * NDIS 5.0 + * RETURNS: + * NDIS_STATUS_SUCCESS on success + * NDIS_STATUS_FAILURE on failure */ { - PVOID Block; + PVOID Block; - /* Plain nonpaged memory with tag */ - Block = ExAllocatePoolWithTag(NonPagedPool, Length, Tag); - *VirtualAddress = Block; - if (!Block) - return NDIS_STATUS_FAILURE; + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - return NDIS_STATUS_SUCCESS; + Block = ExAllocatePoolWithTag(NonPagedPool, Length, Tag); + *VirtualAddress = Block; + + if (!Block) + return NDIS_STATUS_FAILURE; + + return NDIS_STATUS_SUCCESS; } @@ -125,7 +130,7 @@ NdisMUpdateSharedMemory( /* - * @unimplemented + * @implemented */ NDIS_STATUS EXPORT @@ -142,8 +147,13 @@ NdisAllocateMemory( * Length = Size of the memory block to allocate * MemoryFlags = Flags to specify special restrictions * HighestAcceptableAddress = Specifies -1 + * RETURNS: + * NDIS_STATUS_SUCCESS on success + * NDIS_STATUS_FAILURE on failure */ { + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + if (MemoryFlags & NDIS_MEMORY_NONCACHED) { *VirtualAddress = MmAllocateNonCachedMemory(Length); @@ -172,7 +182,7 @@ NdisAllocateMemory( /* - * @unimplemented + * @implemented */ VOID EXPORT @@ -188,6 +198,8 @@ NdisFreeMemory( * MemoryFlags = Memory flags passed to NdisAllocateMemory */ { + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + if (MemoryFlags & NDIS_MEMORY_NONCACHED) { MmFreeNonCachedMemory(VirtualAddress, Length); @@ -235,7 +247,7 @@ NdisImmediateWriteSharedMemory( /* - * @unimplemented + * @implemented */ VOID EXPORT @@ -245,8 +257,23 @@ NdisMAllocateSharedMemory( IN BOOLEAN Cached, OUT PVOID *VirtualAddress, OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress) +/* + * FUNCTION: Allocate a common buffer for DMA + * ARGUMENTS: + * MiniportAdapterHandle: Handle passed into MiniportInitialize + * Length: Number of bytes to allocate + * Cached: Whether or not the memory can be cached + * VirtualAddress: Pointer to memory is returned here + * PhysicalAddress: Physical address corresponding to virtual address + * NOTES: + * - Cached is ignored; we always allocate non-cached + */ { - UNIMPLEMENTED + PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle; + + NDIS_DbgPrint(MAX_TRACE,("Called.\n")); + + *VirtualAddress = HalAllocateCommonBuffer(Adapter->AdapterObject, Length, PhysicalAddress, Cached); } @@ -261,14 +288,42 @@ NdisMAllocateSharedMemoryAsync( IN BOOLEAN Cached, IN PVOID Context) { + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); UNIMPLEMENTED return NDIS_STATUS_FAILURE; } +/* + * @implemented + */ +VOID +STDCALL +NdisMFreeSharedMemoryPassive( + PVOID Context) +/* + * FUNCTION: Free a common buffer + * ARGUMENTS: + * Context: Pointer to a miniport shared memory context + * NOTES: + * - Called by NdisMFreeSharedMemory to do the actual work + */ +{ + PMINIPORT_SHARED_MEMORY Memory = (PMINIPORT_SHARED_MEMORY)Context; + + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + + ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); + + HalFreeCommonBuffer(Memory->AdapterObject, Memory->Length, Memory->PhysicalAddress, + Memory->VirtualAddress, Memory->Cached); + + ExFreePool(Memory); +} + /* - * @unimplemented + * @implemented */ VOID EXPORT @@ -278,8 +333,45 @@ NdisMFreeSharedMemory( IN BOOLEAN Cached, IN PVOID VirtualAddress, IN NDIS_PHYSICAL_ADDRESS PhysicalAddress) +/* + * FUNCTION: Free a shared memory block + * ARGUMENTS: + * MiniportAdapterHandle: Handle passed into MiniportInitialize + * Length: Number of bytes in the block to free + * Cached: Whether or not the memory was cached + * VirtualAddress: Address to free + * PhysicalAddress: corresponding physical addres + * NOTES: + * - This function can be called at dispatch_level or passive_level. + * Therefore we have to do this in a worker thread. + */ { - UNIMPLEMENTED + HANDLE ThreadHandle; + PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle; + PMINIPORT_SHARED_MEMORY Memory; + + NDIS_DbgPrint(MAX_TRACE,("Called.\n")); + + ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL); + + /* Must be NonpagedPool because by definition we're at DISPATCH_LEVEL */ + Memory = ExAllocatePool(NonPagedPool, sizeof(MINIPORT_SHARED_MEMORY)); + + if(!Memory) + { + NDIS_DbgPrint(MID_TRACE, ("Insufficient resources\n")); + return; + } + + Memory->AdapterObject = Adapter->AdapterObject; + Memory->Length = Length; + Memory->PhysicalAddress = PhysicalAddress; + Memory->VirtualAddress = VirtualAddress; + Memory->Cached = Cached; + + PsCreateSystemThread(&ThreadHandle, THREAD_ALL_ACCESS, 0, 0, 0, NdisMFreeSharedMemoryPassive, Memory); + ZwClose(ThreadHandle); } /* EOF */ +