diff --git a/reactos/drivers/wdm/audio/backpln/portcls/api.c b/reactos/drivers/wdm/audio/backpln/portcls/api.c index eb6e04d3c91..6993ac3ef9b 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/api.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/api.c @@ -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 +} diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c b/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c index 6d3e159910f..31b042065f7 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c @@ -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)) + // FIXME + // Check for F-Type DMA Support + // + + Status = PcDmaSlaveDescription(ResourceList, DmaIndex, DemandMode, TRUE, DmaSpeed, MaximumLength, 0, &DeviceDescription); + if (NT_SUCCESS(Status)) { - DPRINT("IoGetDeviceProperty failed with %x\n", Status); - return Status; + 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); + } } - 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) - { - DPRINT("IoGetDmaAdapter failed\n"); - return STATUS_INSUFFICIENT_RESOURCES; - } - - return NewDmaChannelSlave(&DeviceDesc, Adapter, MapRegisters, DmaChannel); - - - - return STATUS_UNSUCCESSFUL; + return Status; } VOID diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c b/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c index f04c39b164c..b10aaeae710 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c @@ -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 diff --git a/reactos/drivers/wdm/audio/backpln/portcls/private.h b/reactos/drivers/wdm/audio/backpln/portcls/private.h index 677f438d8bd..46ab79d0837 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/private.h +++ b/reactos/drivers/wdm/audio/backpln/portcls/private.h @@ -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);