- 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)

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)
{ {
NTSTATUS Status;
DEVICE_DESCRIPTION DeviceDescription;
IPortWaveCyclicImpl * This = (IPortWaveCyclicImpl*)iface;
if (!This->bInitialized)
{
DPRINT("IPortWaveCyclic_fnNewSlaveDmaChannel called w/o initialized\n");
return STATUS_UNSUCCESSFUL; 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);
if (NT_SUCCESS(Status))
{
Status = DmaChannel->lpVtbl->QueryInterface(DmaChannel, &IID_IDmaChannelSlave, (PVOID*)OutDmaChannel);
DmaChannel->lpVtbl->Release(DmaChannel);
}
}
return Status; return Status;
}
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;
} }
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 BOOLEAN IgnoreCount,
IN DMA_WIDTH DmaWidth, IN DMA_WIDTH DmaWidth,
IN DMA_SPEED DmaSpeed, IN DMA_SPEED DmaSpeed,
IN ULONG MaximumLength, IN ULONG MaximumLength,
IN ULONG DmaPort) 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);