2 * PROJECT: ReactOS Kernel
3 * COPYRIGHT: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/io/pnpmgr/pnpdma.c
5 * PURPOSE: PnP manager DMA routines
6 * PROGRAMMERS: Filip Navara (xnavara@volny.cz)
9 /* INCLUDES ******************************************************************/
16 /* PUBLIC FUNCTIONS **********************************************************/
23 IoGetDmaAdapter(IN PDEVICE_OBJECT PhysicalDeviceObject
,
24 IN PDEVICE_DESCRIPTION DeviceDescription
,
25 IN OUT PULONG NumberOfMapRegisters
)
29 BUS_INTERFACE_STANDARD BusInterface
;
30 IO_STATUS_BLOCK IoStatusBlock
;
31 IO_STACK_LOCATION Stack
;
32 DEVICE_DESCRIPTION PrivateDeviceDescription
;
33 PDMA_ADAPTER Adapter
= NULL
;
35 DPRINT("IoGetDmaAdapter called\n");
38 /* Try to create DMA adapter through bus driver */
39 if (PhysicalDeviceObject
)
41 if (DeviceDescription
->InterfaceType
== PNPBus
||
42 DeviceDescription
->InterfaceType
== InterfaceTypeUndefined
)
44 RtlCopyMemory(&PrivateDeviceDescription
,
46 sizeof(DEVICE_DESCRIPTION
));
48 Status
= IoGetDeviceProperty(PhysicalDeviceObject
,
49 DevicePropertyLegacyBusType
,
50 sizeof(INTERFACE_TYPE
),
51 &PrivateDeviceDescription
.InterfaceType
,
54 if (!NT_SUCCESS(Status
))
55 PrivateDeviceDescription
.InterfaceType
= Internal
;
57 DeviceDescription
= &PrivateDeviceDescription
;
60 Stack
.Parameters
.QueryInterface
.Size
= sizeof(BUS_INTERFACE_STANDARD
);
61 Stack
.Parameters
.QueryInterface
.Version
= 1;
62 Stack
.Parameters
.QueryInterface
.Interface
= (PINTERFACE
)&BusInterface
;
63 Stack
.Parameters
.QueryInterface
.InterfaceType
=
64 &GUID_BUS_INTERFACE_STANDARD
;
66 Status
= IopInitiatePnpIrp(PhysicalDeviceObject
,
68 IRP_MN_QUERY_INTERFACE
,
71 if (NT_SUCCESS(Status
))
73 Adapter
= BusInterface
.GetDmaAdapter(BusInterface
.Context
,
75 NumberOfMapRegisters
);
77 BusInterface
.InterfaceDereference(BusInterface
.Context
);
78 if (Adapter
) return Adapter
;
82 /* Fall back to HAL */
83 return HalGetDmaAdapter(PhysicalDeviceObject
,
85 NumberOfMapRegisters
);