- Implement IPortWaveCyclic::NewMasterDmaChannel, IPortWaveCyclic::NewDmaChannelSlave...
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Tue, 6 Jan 2009 00:44:16 +0000 (00:44 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Tue, 6 Jan 2009 00:44:16 +0000 (00:44 +0000)
svn path=/trunk/; revision=38595

reactos/drivers/wdm/audio/backpln/portcls/api.c
reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c
reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c
reactos/drivers/wdm/audio/backpln/portcls/private.h

index eb6e04d..6993ac3 100644 (file)
@@ -74,7 +74,9 @@ PcUnregisterIoTimeout(
     return STATUS_SUCCESS;
 }
 
-
+/*
+ * @implemented
+ */
 NTSTATUS
 NTAPI
 PcDmaMasterDescription(
@@ -104,7 +106,9 @@ PcDmaMasterDescription(
 
     return STATUS_SUCCESS;
 }
-
+/*
+ * @implemented
+ */
 NTSTATUS
 NTAPI
 PcDmaSlaveDescription(
@@ -112,7 +116,7 @@ PcDmaSlaveDescription(
     IN ULONG DmaIndex,
     IN BOOL DemandMode,
     IN ULONG AutoInitialize,
-    IN DMA_SPEED DmaSpeed
+    IN DMA_SPEED DmaSpeed,
     IN ULONG MaximumLength,
     IN ULONG DmaPort,
     OUT PDEVICE_DESCRIPTION DeviceDescription)
@@ -127,4 +131,4 @@ PcDmaSlaveDescription(
     DeviceDescription->DmaPort = DmaPort;
 
     return STATUS_SUCCESS;
-}
\ No newline at end of file
+}
index 6d3e159..31b0420 100644 (file)
@@ -26,6 +26,7 @@ const GUID IID_IUnknown;
 const GUID IID_IIrpTarget;
 const GUID IID_IPinCount;
 const GUID IID_IPowerNotify;
+const GUID IID_IDmaChannelSlave;
 
 const GUID GUID_DEVCLASS_SOUND; //FIXME
 //---------------------------------------------------------------
@@ -250,14 +251,30 @@ IPortWaveCyclic_fnNewMasterDmaChannel(
     IN  DMA_WIDTH DmaWidth,
     IN  DMA_SPEED DmaSpeed)
 {
-    return STATUS_UNSUCCESSFUL;
+    NTSTATUS Status;
+    DEVICE_DESCRIPTION DeviceDescription;
+    IPortWaveCyclicImpl * This = (IPortWaveCyclicImpl*)iface;
+
+    if (!This->bInitialized)
+    {
+        DPRINT("IPortWaveCyclic_fnNewSlaveDmaChannel called w/o initialized\n");
+        return STATUS_UNSUCCESSFUL;
+    }
+
+    Status = PcDmaMasterDescription(ResourceList, (Dma32BitAddresses | Dma64BitAddresses), Dma32BitAddresses, 0, Dma64BitAddresses, DmaWidth, DmaSpeed, MaximumLength, 0, &DeviceDescription);
+    if (NT_SUCCESS(Status))
+    {
+        return PcNewDmaChannel(DmaChannel, OuterUnknown, NonPagedPool, &DeviceDescription, This->pDeviceObject);
+    }
+
+    return Status;
 }
 
 NTSTATUS
 NTAPI
 IPortWaveCyclic_fnNewSlaveDmaChannel(
     IN IPortWaveCyclic * iface,
-    OUT PDMACHANNELSLAVE* DmaChannel,
+    OUT PDMACHANNELSLAVE* OutDmaChannel,
     IN  PUNKNOWN OuterUnknown,
     IN  PRESOURCELIST ResourceList OPTIONAL,
     IN  ULONG DmaIndex,
@@ -265,12 +282,9 @@ IPortWaveCyclic_fnNewSlaveDmaChannel(
     IN  BOOL DemandMode,
     IN  DMA_SPEED DmaSpeed)
 {
-    DEVICE_DESCRIPTION DeviceDesc;
-    INTERFACE_TYPE BusType;
-    ULONG ResultLength;
+    DEVICE_DESCRIPTION DeviceDescription;
+    PDMACHANNEL DmaChannel;
     NTSTATUS Status;
-    ULONG MapRegisters;
-    PDMA_ADAPTER Adapter;
 
     IPortWaveCyclicImpl * This = (IPortWaveCyclicImpl*)iface;
 
@@ -280,34 +294,22 @@ IPortWaveCyclic_fnNewSlaveDmaChannel(
         return STATUS_UNSUCCESSFUL;
     }
 
-    Status = IoGetDeviceProperty(This->pDeviceObject, DevicePropertyLegacyBusType, sizeof(BusType), (PVOID)&BusType, &ResultLength);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT("IoGetDeviceProperty failed with %x\n", Status);
-        return Status;
-    }
+    // FIXME
+    // Check for F-Type DMA Support
+    //
 
-    RtlZeroMemory(&DeviceDesc, sizeof(DeviceDesc));
-    DeviceDesc.Version = DEVICE_DESCRIPTION_VERSION;
-    DeviceDesc.Master = FALSE;
-    DeviceDesc.InterfaceType = BusType;
-    DeviceDesc.MaximumLength = MaximumLength;
-    DeviceDesc.DemandMode = DemandMode;
-    DeviceDesc.DmaSpeed = DmaSpeed;
-    DeviceDesc.DmaChannel = DmaIndex;
-
-    Adapter = IoGetDmaAdapter(This->pDeviceObject, &DeviceDesc, &MapRegisters);
-    if (!Adapter)
+    Status = PcDmaSlaveDescription(ResourceList, DmaIndex, DemandMode, TRUE, DmaSpeed, MaximumLength, 0, &DeviceDescription);
+    if (NT_SUCCESS(Status))
     {
-        DPRINT("IoGetDmaAdapter failed\n");
-        return STATUS_INSUFFICIENT_RESOURCES;
+        Status = PcNewDmaChannel(&DmaChannel, OuterUnknown, NonPagedPool, &DeviceDescription, This->pDeviceObject);
+        if (NT_SUCCESS(Status))
+        {
+            Status = DmaChannel->lpVtbl->QueryInterface(DmaChannel, &IID_IDmaChannelSlave, (PVOID*)OutDmaChannel);
+            DmaChannel->lpVtbl->Release(DmaChannel);
+        }
     }
 
-    return NewDmaChannelSlave(&DeviceDesc, Adapter, MapRegisters, DmaChannel);
-
-
-
-    return STATUS_UNSUCCESSFUL;
+    return Status;
 }
 
 VOID
index f04c39b..b10aaea 100644 (file)
@@ -275,19 +275,30 @@ NTSTATUS
 NTAPI
 IPortWavePci_fnNewMasterDmaChannel(
     IN IPortWavePci * iface,
-    OUT PDMACHANNEL* DmaChannel,
-    IN  PUNKNOWN OuterUnknown,
-    IN  POOL_TYPE PoolType,
-    IN  PRESOURCELIST ResourceList OPTIONAL,
-    IN  BOOL ScatterGather,
-    IN  BOOL Dma32BitAddresses,
-    IN  BOOL Dma64BitAddresses,
-    IN  DMA_WIDTH DmaWidth,
-    IN  DMA_SPEED DmaSpeed,
-    IN  ULONG MaximumLength,
-    IN  ULONG DmaPort)
+    OUT PDMACHANNEL *DmaChannel,
+    IN PUNKNOWN OuterUnknown OPTIONAL,
+    IN POOL_TYPE PoolType,
+    IN PRESOURCELIST ResourceList OPTIONAL,
+    IN BOOLEAN ScatterGather,
+    IN BOOLEAN Dma32BitAddresses,
+    IN BOOLEAN Dma64BitAddresses,
+    IN BOOLEAN IgnoreCount,
+    IN DMA_WIDTH DmaWidth,
+    IN DMA_SPEED DmaSpeed,
+    IN ULONG  MaximumLength,
+    IN ULONG  DmaPort)
 {
-    return STATUS_UNSUCCESSFUL;
+    NTSTATUS Status;
+    DEVICE_DESCRIPTION DeviceDescription;
+    IPortWavePciImpl * This = (IPortWavePciImpl*)iface;
+
+    Status = PcDmaMasterDescription(ResourceList, ScatterGather, Dma32BitAddresses, IgnoreCount, Dma64BitAddresses, DmaWidth, DmaSpeed, MaximumLength, DmaPort, &DeviceDescription);
+    if (NT_SUCCESS(Status))
+    {
+        return PcNewDmaChannel(DmaChannel, OuterUnknown, PoolType, &DeviceDescription, This->pDeviceObject);
+    }
+
+    return Status;
 }
 
 VOID
index 677f438..46ab79d 100644 (file)
@@ -106,7 +106,31 @@ typedef struct
 } PCExtension;
 
 
+NTSTATUS
+NTAPI
+PcDmaMasterDescription(
+    IN PRESOURCELIST ResourceList OPTIONAL,
+    IN BOOLEAN ScatterGather,
+    IN BOOLEAN Dma32BitAddresses,
+    IN BOOLEAN IgnoreCount,
+    IN BOOLEAN Dma64BitAddresses,
+    IN DMA_WIDTH DmaWidth,
+    IN DMA_SPEED DmaSpeed,
+    IN ULONG MaximumLength,
+    IN ULONG DmaPort,
+    OUT PDEVICE_DESCRIPTION DeviceDescription);
 
+NTSTATUS
+NTAPI
+PcDmaSlaveDescription(
+    IN PRESOURCELIST  ResourceList OPTIONAL,
+    IN ULONG DmaIndex,
+    IN BOOL DemandMode,
+    IN ULONG AutoInitialize,
+    IN DMA_SPEED DmaSpeed,
+    IN ULONG MaximumLength,
+    IN ULONG DmaPort,
+    OUT PDEVICE_DESCRIPTION DeviceDescription);