- Implement IPortWaveCyclic::NewMasterDmaChannel, IPortWaveCyclic::NewDmaChannelSlave, IPortWavePci_fnNewMasterDmaChannel

svn path=/trunk/; revision=38595
This commit is contained in:
Johannes Anderwald 2009-01-06 00:44:16 +00:00
parent 4cfef4b794
commit 86f06a0ebe
4 changed files with 89 additions and 48 deletions

View file

@ -74,7 +74,9 @@ PcUnregisterIoTimeout(
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
/*
* @implemented
*/
NTSTATUS NTSTATUS
NTAPI NTAPI
PcDmaMasterDescription( PcDmaMasterDescription(
@ -104,7 +106,9 @@ PcDmaMasterDescription(
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
/*
* @implemented
*/
NTSTATUS NTSTATUS
NTAPI NTAPI
PcDmaSlaveDescription( PcDmaSlaveDescription(
@ -112,7 +116,7 @@ PcDmaSlaveDescription(
IN ULONG DmaIndex, IN ULONG DmaIndex,
IN BOOL DemandMode, IN BOOL DemandMode,
IN ULONG AutoInitialize, IN ULONG AutoInitialize,
IN DMA_SPEED DmaSpeed IN DMA_SPEED DmaSpeed,
IN ULONG MaximumLength, IN ULONG MaximumLength,
IN ULONG DmaPort, IN ULONG DmaPort,
OUT PDEVICE_DESCRIPTION DeviceDescription) OUT PDEVICE_DESCRIPTION DeviceDescription)
@ -127,4 +131,4 @@ PcDmaSlaveDescription(
DeviceDescription->DmaPort = DmaPort; DeviceDescription->DmaPort = DmaPort;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }

View file

@ -26,6 +26,7 @@ const GUID IID_IUnknown;
const GUID IID_IIrpTarget; const GUID IID_IIrpTarget;
const GUID IID_IPinCount; const GUID IID_IPinCount;
const GUID IID_IPowerNotify; const GUID IID_IPowerNotify;
const GUID IID_IDmaChannelSlave;
const GUID GUID_DEVCLASS_SOUND; //FIXME const GUID GUID_DEVCLASS_SOUND; //FIXME
//--------------------------------------------------------------- //---------------------------------------------------------------
@ -250,14 +251,30 @@ IPortWaveCyclic_fnNewMasterDmaChannel(
IN DMA_WIDTH DmaWidth, IN DMA_WIDTH DmaWidth,
IN DMA_SPEED DmaSpeed) 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 NTSTATUS
NTAPI NTAPI
IPortWaveCyclic_fnNewSlaveDmaChannel( IPortWaveCyclic_fnNewSlaveDmaChannel(
IN IPortWaveCyclic * iface, IN IPortWaveCyclic * iface,
OUT PDMACHANNELSLAVE* DmaChannel, OUT PDMACHANNELSLAVE* OutDmaChannel,
IN PUNKNOWN OuterUnknown, IN PUNKNOWN OuterUnknown,
IN PRESOURCELIST ResourceList OPTIONAL, IN PRESOURCELIST ResourceList OPTIONAL,
IN ULONG DmaIndex, IN ULONG DmaIndex,
@ -265,12 +282,9 @@ IPortWaveCyclic_fnNewSlaveDmaChannel(
IN BOOL DemandMode, IN BOOL DemandMode,
IN DMA_SPEED DmaSpeed) IN DMA_SPEED DmaSpeed)
{ {
DEVICE_DESCRIPTION DeviceDesc; DEVICE_DESCRIPTION DeviceDescription;
INTERFACE_TYPE BusType; PDMACHANNEL DmaChannel;
ULONG ResultLength;
NTSTATUS Status; NTSTATUS Status;
ULONG MapRegisters;
PDMA_ADAPTER Adapter;
IPortWaveCyclicImpl * This = (IPortWaveCyclicImpl*)iface; IPortWaveCyclicImpl * This = (IPortWaveCyclicImpl*)iface;
@ -280,34 +294,22 @@ IPortWaveCyclic_fnNewSlaveDmaChannel(
return STATUS_UNSUCCESSFUL; return STATUS_UNSUCCESSFUL;
} }
Status = IoGetDeviceProperty(This->pDeviceObject, DevicePropertyLegacyBusType, sizeof(BusType), (PVOID)&BusType, &ResultLength); // FIXME
if (!NT_SUCCESS(Status)) // 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); Status = PcNewDmaChannel(&DmaChannel, OuterUnknown, NonPagedPool, &DeviceDescription, This->pDeviceObject);
return Status; if (NT_SUCCESS(Status))
{
Status = DmaChannel->lpVtbl->QueryInterface(DmaChannel, &IID_IDmaChannelSlave, (PVOID*)OutDmaChannel);
DmaChannel->lpVtbl->Release(DmaChannel);
}
} }
RtlZeroMemory(&DeviceDesc, sizeof(DeviceDesc)); return Status;
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;
} }
VOID VOID

View file

@ -275,19 +275,30 @@ NTSTATUS
NTAPI NTAPI
IPortWavePci_fnNewMasterDmaChannel( IPortWavePci_fnNewMasterDmaChannel(
IN IPortWavePci * iface, IN IPortWavePci * iface,
OUT PDMACHANNEL* DmaChannel, OUT PDMACHANNEL *DmaChannel,
IN PUNKNOWN OuterUnknown, IN PUNKNOWN OuterUnknown OPTIONAL,
IN POOL_TYPE PoolType, IN POOL_TYPE PoolType,
IN PRESOURCELIST ResourceList OPTIONAL, IN PRESOURCELIST ResourceList OPTIONAL,
IN BOOL ScatterGather, IN BOOLEAN ScatterGather,
IN BOOL Dma32BitAddresses, IN BOOLEAN Dma32BitAddresses,
IN BOOL Dma64BitAddresses, IN BOOLEAN Dma64BitAddresses,
IN DMA_WIDTH DmaWidth, IN BOOLEAN IgnoreCount,
IN DMA_SPEED DmaSpeed, IN DMA_WIDTH DmaWidth,
IN ULONG MaximumLength, IN DMA_SPEED DmaSpeed,
IN ULONG DmaPort) 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 VOID

View file

@ -106,7 +106,31 @@ typedef struct
} PCExtension; } 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);