[ros-diffs] [cgutman] 40109: - Implement NdisMRegisterDmaChannel and NdisMInitializeScatterGatherDma

cgutman at svn.reactos.org cgutman at svn.reactos.org
Fri Mar 20 01:26:54 CET 2009


Author: cgutman
Date: Fri Mar 20 03:26:53 2009
New Revision: 40109

URL: http://svn.reactos.org/svn/reactos?rev=40109&view=rev
Log:
 - Implement NdisMRegisterDmaChannel and NdisMInitializeScatterGatherDma

Modified:
    trunk/reactos/drivers/network/ndis/ndis/io.c
    trunk/reactos/drivers/network/ndis/ndis/stubs.c

Modified: trunk/reactos/drivers/network/ndis/ndis/io.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/ndis/ndis/io.c?rev=40109&r1=40108&r2=40109&view=diff
==============================================================================
--- trunk/reactos/drivers/network/ndis/ndis/io.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/ndis/ndis/io.c [iso-8859-1] Fri Mar 20 03:26:53 2009
@@ -722,7 +722,7 @@
 
 
 /*
- * @unimplemented
+ * @implemented
  */
 NDIS_STATUS
 EXPORT
@@ -734,9 +734,44 @@
     IN  PNDIS_DMA_DESCRIPTION   DmaDescription,
     IN  ULONG                   MaximumLength)
 {
-    UNIMPLEMENTED
-
-  return NDIS_STATUS_FAILURE;
+  PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle;
+  DEVICE_DESCRIPTION DeviceDesc;
+  ULONG MapRegisters;
+
+  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;
+  DeviceDesc.Master = (Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER);
+  DeviceDesc.ScatterGather = FALSE; //Is this correct?
+  DeviceDesc.DemandMode = DmaDescription->DemandMode;
+  DeviceDesc.AutoInitialize = DmaDescription->AutoInitialize;
+  DeviceDesc.Dma32BitAddresses = Dma32BitAddresses;
+  DeviceDesc.Dma64BitAddresses = !Dma32BitAddresses; //Is this correct?
+  DeviceDesc.BusNumber = Adapter->NdisMiniportBlock.BusNumber;
+  DeviceDesc.DmaChannel = DmaDescription->DmaChannel;
+  DeviceDesc.InterfaceType = Adapter->NdisMiniportBlock.BusType;
+  DeviceDesc.DmaWidth = DmaDescription->DmaWidth;
+  DeviceDesc.DmaSpeed = DmaDescription->DmaSpeed;
+  DeviceDesc.MaximumLength = MaximumLength;
+
+  Adapter->NdisMiniportBlock.SystemAdapterObject = 
+         IoGetDmaAdapter(Adapter->NdisMiniportBlock.PhysicalDeviceObject, &DeviceDesc, &MapRegisters);
+
+  if (!Adapter->NdisMiniportBlock.SystemAdapterObject)
+      return NDIS_STATUS_RESOURCES;
+
+  *MiniportDmaHandle = &Adapter->NdisMiniportBlock;
+
+  return NDIS_STATUS_SUCCESS;
 }
 
 
@@ -922,5 +957,56 @@
   MmUnmapIoSpace(VirtualAddress, Length);
 }
 
+/*
+ * @implemented
+ */
+NDIS_STATUS
+EXPORT
+NdisMInitializeScatterGatherDma(
+    IN  NDIS_HANDLE MiniportAdapterHandle,
+    IN  BOOLEAN     Dma64BitAddresses,
+    IN  ULONG       MaximumPhysicalMapping)
+/*
+ * FUNCTION:
+ * ARGUMENTS:
+ * NOTES:
+ *    NDIS 5.0
+ */
+{
+    PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle;
+    ULONG MapRegisters;
+    DEVICE_DESCRIPTION DeviceDesc;
+
+    NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
+
+    if (!(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER))
+        return NDIS_STATUS_NOT_SUPPORTED;
+
+    if (Adapter->NdisMiniportBlock.SystemAdapterObject)
+    {
+        NDIS_DbgPrint(MIN_TRACE,("Using existing DMA adapter\n"));
+        return NDIS_STATUS_SUCCESS;
+    }
+
+    RtlZeroMemory(&DeviceDesc, sizeof(DEVICE_DESCRIPTION));
+
+    DeviceDesc.Version = DEVICE_DESCRIPTION_VERSION;
+    DeviceDesc.Master = TRUE;
+    DeviceDesc.ScatterGather = TRUE;
+    DeviceDesc.Dma32BitAddresses = !Dma64BitAddresses;
+    DeviceDesc.Dma64BitAddresses = Dma64BitAddresses;
+    DeviceDesc.BusNumber = Adapter->NdisMiniportBlock.BusNumber;
+    DeviceDesc.InterfaceType = Adapter->NdisMiniportBlock.BusType;
+    DeviceDesc.MaximumLength = MaximumPhysicalMapping;
+
+    Adapter->NdisMiniportBlock.SystemAdapterObject = 
+         IoGetDmaAdapter(Adapter->NdisMiniportBlock.PhysicalDeviceObject, &DeviceDesc, &MapRegisters);
+
+    if (!Adapter->NdisMiniportBlock.SystemAdapterObject)
+        return NDIS_STATUS_RESOURCES;
+
+    return NDIS_STATUS_SUCCESS;
+}
+
 /* EOF */
 

Modified: trunk/reactos/drivers/network/ndis/ndis/stubs.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/ndis/ndis/stubs.c?rev=40109&r1=40108&r2=40109&view=diff
==============================================================================
--- trunk/reactos/drivers/network/ndis/ndis/stubs.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/ndis/ndis/stubs.c [iso-8859-1] Fri Mar 20 03:26:53 2009
@@ -675,28 +675,6 @@
  */
 NDIS_STATUS
 EXPORT
-NdisMInitializeScatterGatherDma(
-    IN  NDIS_HANDLE MiniportAdapterHandle,
-    IN  BOOLEAN     Dma64BitAddresses,
-    IN  ULONG       MaximumPhysicalMapping)
-/*
- * FUNCTION:
- * ARGUMENTS:
- * NOTES:
- *    NDIS 5.0
- */
-{
-    UNIMPLEMENTED
-
-    return NDIS_STATUS_FAILURE;
-}
-
-
-/*
- * @unimplemented
- */
-NDIS_STATUS
-EXPORT
 NdisMPromoteMiniport(
     IN  NDIS_HANDLE MiniportAdapterHandle)
 /*



More information about the Ros-diffs mailing list