-# $Id: makefile,v 1.6 2001/08/21 20:13:10 chorns Exp $
+# $Id: makefile,v 1.7 2001/08/23 17:32:03 chorns Exp $
PATH_TO_TOP = ../../..
ospm/acpienum.o \
ospm/acpisys.o \
ospm/bn.o \
- ospm/osl.o
+ ospm/fdo.o \
+ ospm/osl.o \
+ ospm/pdo.o
OBJECTS_DISPATCHER = \
dispatcher/dsfield.o \
-/* $Id: acpienum.c,v 1.2 2001/05/05 19:15:44 chorns Exp $
+/* $Id: acpienum.c,v 1.3 2001/08/23 17:32:04 chorns Exp $
*
* PROJECT: ReactOS ACPI bus driver
* FILE: acpi/ospm/acpienum.c
NTSTATUS
ACPIEnumerateRootBusses(
- PACPI_DEVICE_EXTENSION DeviceExtension)
+ PFDO_DEVICE_EXTENSION DeviceExtension)
{
BM_HANDLE_LIST HandleList;
PACPI_DEVICE AcpiDevice;
if (ACPI_SUCCESS(AcpiStatus)) {
DPRINT("Got BM node information: (Node 0x%X)\n", Node);
bm_print1(Node, BM_PRINT_ALL - BM_PRINT_PRESENT);
-#if 0
+#if 1
for (j=0; j < 4*1000;j++)
KeStallExecutionProcessor(1000);
#endif
return STATUS_INSUFFICIENT_RESOURCES;
}
+ RtlZeroMemory(AcpiDevice, sizeof(ACPI_DEVICE));
+
AcpiDevice->Pdo = NULL;
AcpiDevice->BmHandle = HandleList.handles[i];
} else {
DPRINT("Got no devices (Status 0x%X)\n", AcpiStatus);
}
+ for (j=0; j < 4*10*1000;j++)
+ KeStallExecutionProcessor(1000);
return STATUS_SUCCESS;
}
NTSTATUS
ACPIEnumerateNamespace(
- PACPI_DEVICE_EXTENSION DeviceExtension)
+ PFDO_DEVICE_EXTENSION DeviceExtension)
{
+ BM_HANDLE_LIST HandleList;
+ PACPI_DEVICE AcpiDevice;
ACPI_STATUS AcpiStatus;
+ BM_HANDLE DeviceHandle;
BM_DEVICE_ID Criteria;
- BM_HANDLE_LIST HandleList;
- ULONG i;
-
BM_NODE *Node;
- ULONG j, q;
+ KIRQL OldIrql;
+ ULONG i;
DPRINT("Called\n");
if (ACPI_SUCCESS(AcpiStatus)) {
DPRINT("Got BM node information: (Node 0x%X)\n", Node);
#if 0
- bm_print1(Node, BM_PRINT_ALL - BM_PRINT_PRESENT);
- for (j=0; j < 4*1000;j++)
- KeStallExecutionProcessor(1000);*/
+ {
+ ULONG j;
+
+ bm_print1(Node, BM_PRINT_ALL - BM_PRINT_PRESENT);
+ for (j=0; j < 4*1000;j++)
+ KeStallExecutionProcessor(1000);
+ }
#endif
} else {
DPRINT("Could not get BM node\n");
}
+
+ AcpiDevice = (PACPI_DEVICE)ExAllocatePool(
+ NonPagedPool, sizeof(ACPI_DEVICE));
+ if (!AcpiDevice) {
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ RtlZeroMemory(AcpiDevice, sizeof(ACPI_DEVICE));
+
+ AcpiDevice->Pdo = NULL;
+ AcpiDevice->BmHandle = HandleList.handles[i];
+
+ KeAcquireSpinLock(&DeviceExtension->DeviceListLock, &OldIrql);
+ InsertHeadList(&DeviceExtension->DeviceListHead,
+ &AcpiDevice->DeviceListEntry);
+ DeviceExtension->DeviceListCount++;
+ KeReleaseSpinLock(&DeviceExtension->DeviceListLock, OldIrql);
}
} else {
DPRINT("Got no devices (Status 0x%X)\n", AcpiStatus);
-/* $Id: acpisys.c,v 1.2 2001/05/05 19:15:44 chorns Exp $
+/* $Id: acpisys.c,v 1.3 2001/08/23 17:32:04 chorns Exp $
*
* PROJECT: ReactOS ACPI bus driver
* FILE: acpi/ospm/acpisys.c
#endif /* ALLOC_PRAGMA */
-FADT_DESCRIPTOR_REV2 acpi_fadt;
-
NTSTATUS
STDCALL
}
-VOID ACPIPrintInfo(
- PACPI_DEVICE_EXTENSION DeviceExtension)
-{
- DbgPrint("ACPI: System firmware supports:\n");
-
- /*
- * Print out basic system information
- */
- DbgPrint("+------------------------------------------------------------\n");
- DbgPrint("| Sx states: %cS0 %cS1 %cS2 %cS3 %cS4 %cS5\n",
- (DeviceExtension->SystemStates[0]?'+':'-'),
- (DeviceExtension->SystemStates[1]?'+':'-'),
- (DeviceExtension->SystemStates[2]?'+':'-'),
- (DeviceExtension->SystemStates[3]?'+':'-'),
- (DeviceExtension->SystemStates[4]?'+':'-'),
- (DeviceExtension->SystemStates[5]?'+':'-'));
- DbgPrint("+------------------------------------------------------------\n");
-}
-
-
-NTSTATUS
-ACPIInitializeInternalDriver(
- PACPI_DEVICE_EXTENSION DeviceExtension,
- ACPI_DRIVER_FUNCTION Initialize,
- ACPI_DRIVER_FUNCTION Terminate)
-{
- ACPI_STATUS AcpiStatus;
- PACPI_DEVICE AcpiDevice;
-
- AcpiStatus = Initialize();
- if (!ACPI_SUCCESS(AcpiStatus)) {
- DPRINT("BN init status 0x%X\n", AcpiStatus);
- return STATUS_UNSUCCESSFUL;
- }
-#if 0
- AcpiDevice = (PACPI_DEVICE)ExAllocatePool(
- NonPagedPool, sizeof(ACPI_DEVICE));
- if (!AcpiDevice) {
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- AcpiDevice->Initialize = Initialize;
- AcpiDevice->Terminate = Terminate;
-
- /* FIXME: Create PDO */
-
- AcpiDevice->Pdo = NULL;
- //AcpiDevice->BmHandle = HandleList.handles[i];
-
- ExInterlockedInsertHeadList(&DeviceExtension->DeviceListHead,
- &AcpiDevice->ListEntry, &DeviceExtension->DeviceListLock);
-#endif
- return STATUS_SUCCESS;
-}
-
-
-NTSTATUS
-ACPIInitializeInternalDrivers(
- PACPI_DEVICE_EXTENSION DeviceExtension)
-{
- NTSTATUS Status;
-
- ULONG j;
-
- Status = ACPIInitializeInternalDriver(DeviceExtension,
- bn_initialize, bn_terminate);
-
- return STATUS_SUCCESS;
-}
-
-
-NTSTATUS
-ACPIStartDevice(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- PACPI_DEVICE_EXTENSION DeviceExtension;
- ACPI_PHYSICAL_ADDRESS rsdp;
- ACPI_SYSTEM_INFO SysInfo;
- ACPI_STATUS AcpiStatus;
- ACPI_BUFFER Buffer;
- UCHAR TypeA, TypeB;
- ULONG i;
-
- DPRINT("Called\n");
-
- DeviceExtension = (PACPI_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
- assert(DeviceExtension->State == dsStopped);
-
- AcpiStatus = acpi_initialize_subsystem();
- if (!ACPI_SUCCESS(AcpiStatus)) {
- DPRINT("acpi_initialize_subsystem() failed with status 0x%X\n", AcpiStatus);
- return STATUS_UNSUCCESSFUL;
- }
-
- AcpiStatus = acpi_find_root_pointer(&rsdp);
- if (!ACPI_SUCCESS(AcpiStatus)) {
- DPRINT("acpi_find_root_pointer() failed with status 0x%X\n", AcpiStatus);
- return STATUS_UNSUCCESSFUL;
- }
-
- /* From this point on, on error we must call acpi_terminate() */
-
- AcpiStatus = acpi_load_tables(rsdp);
- if (!ACPI_SUCCESS(AcpiStatus)) {
- DPRINT("acpi_load_tables() failed with status 0x%X\n", AcpiStatus);
- acpi_terminate();
- return STATUS_UNSUCCESSFUL;
- }
-
- Buffer.length = sizeof(SysInfo);
- Buffer.pointer = &SysInfo;
-
- AcpiStatus = acpi_get_system_info(&Buffer);
- if (!ACPI_SUCCESS(AcpiStatus)) {
- DPRINT("acpi_get_system_info() failed with status 0x%X\n", AcpiStatus);
- acpi_terminate();
- return STATUS_UNSUCCESSFUL;
- }
-
- DPRINT("ACPI CA Core Subsystem version 0x%X\n", SysInfo.acpi_ca_version);
-
- assert(SysInfo.num_table_types > ACPI_TABLE_FADT);
-
- RtlMoveMemory(&acpi_fadt,
- &SysInfo.table_info[ACPI_TABLE_FADT],
- sizeof(FADT_DESCRIPTOR_REV2));
-
- AcpiStatus = acpi_enable_subsystem(ACPI_FULL_INITIALIZATION);
- if (!ACPI_SUCCESS(AcpiStatus)) {
- DPRINT("acpi_enable_subsystem() failed with status 0x%X\n", AcpiStatus);
- acpi_terminate();
- return STATUS_UNSUCCESSFUL;
- }
-
- DPRINT("ACPI CA Core Subsystem enabled\n");
-
- /*
- * Sx States:
- * ----------
- * Figure out which Sx states are supported
- */
- for (i=0; i<=ACPI_S_STATES_MAX; i++) {
- AcpiStatus = acpi_hw_obtain_sleep_type_register_data(
- i,
- &TypeA,
- &TypeB);
- DPRINT("acpi_hw_obtain_sleep_type_register_data (%d) status 0x%X\n",
- i, AcpiStatus);
- if (ACPI_SUCCESS(AcpiStatus)) {
- DeviceExtension->SystemStates[i] = TRUE;
- }
- }
-
- ACPIPrintInfo(DeviceExtension);
-
- /* Initialize ACPI bus manager */
- AcpiStatus = bm_initialize();
- if (!ACPI_SUCCESS(AcpiStatus)) {
- DPRINT("bm_initialize() failed with status 0x%X\n", AcpiStatus);
- acpi_terminate();
- return STATUS_UNSUCCESSFUL;
- }
-
- InitializeListHead(&DeviceExtension->DeviceListHead);
- KeInitializeSpinLock(&DeviceExtension->DeviceListLock);
- DeviceExtension->DeviceListCount = 0;
-
- ACPIEnumerateNamespace(DeviceExtension);
-
- ACPIEnumerateRootBusses(DeviceExtension);
-
- ACPIInitializeInternalDrivers(DeviceExtension);
-
- DeviceExtension->State = dsStarted;
-
- return STATUS_SUCCESS;
-}
-
-
-NTSTATUS
-ACPIQueryBusRelations(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- PIO_STACK_LOCATION IrpSp)
-{
- PACPI_DEVICE_EXTENSION DeviceExtension;
- PDEVICE_RELATIONS Relations;
- PLIST_ENTRY CurrentEntry;
- PACPI_DEVICE Device;
- NTSTATUS Status;
- ULONG Size;
- ULONG i;
-
- DPRINT("Called\n");
-
- DeviceExtension = (PACPI_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
- Size = sizeof(DEVICE_RELATIONS) + sizeof(Relations->Objects) *
- (DeviceExtension->DeviceListCount - 1);
- Relations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, Size);
- if (!Relations)
- return STATUS_INSUFFICIENT_RESOURCES;
-
- Relations->Count = DeviceExtension->DeviceListCount;
-
- i = 0;
- CurrentEntry = DeviceExtension->DeviceListHead.Flink;
- while (CurrentEntry != &DeviceExtension->DeviceListHead) {
- Device = CONTAINING_RECORD(CurrentEntry, ACPI_DEVICE, DeviceListEntry);
-
- /* FIXME: For ACPI namespace devices on the motherboard create filter DOs
- and attach them just above the ACPI bus device object (PDO) */
-
- /* FIXME: For other devices in ACPI namespace, but not on motherboard,
- create PDOs */
-
- if (!Device->Pdo) {
- /* Create a physical device object for the
- device as it does not already have one */
- Status = IoCreateDevice(DeviceObject->DriverObject, 0,
- NULL, FILE_DEVICE_CONTROLLER, 0, FALSE, &Device->Pdo);
- if (!NT_SUCCESS(Status)) {
- DPRINT("IoCreateDevice() failed with status 0x%X\n", Status);
- ExFreePool(Relations);
- return Status;
- }
-
- Device->Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE;
- }
-
- /* Reference the physical device object. The PnP manager
- will dereference it again when it is no longer needed */
- ObReferenceObject(Device->Pdo);
-
- Relations->Objects[i] = Device->Pdo;
-
- i++;
-
- CurrentEntry = CurrentEntry->Flink;
- }
-
- Irp->IoStatus.Information = (ULONG)Relations;
-
- return Status;
-}
-
-
-NTSTATUS
-ACPIQueryDeviceRelations(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- PIO_STACK_LOCATION IrpSp)
-{
- NTSTATUS Status;
-
- DPRINT("Called\n");
-
- switch (IrpSp->Parameters.QueryDeviceRelations.Type) {
- case BusRelations:
- Status = ACPIQueryBusRelations(DeviceObject, Irp, IrpSp);
- break;
-
- default:
- Status = STATUS_NOT_IMPLEMENTED;
- }
-
- return Status;
-}
-
-
-NTSTATUS
-ACPIQueryId(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- PIO_STACK_LOCATION IrpSp)
-{
- NTSTATUS Status;
-
- DPRINT("Called\n");
-
- switch (IrpSp->Parameters.QueryId.IdType) {
- default:
- Status = STATUS_NOT_IMPLEMENTED;
- }
-
- return Status;
-}
-
-
-NTSTATUS
-ACPISetPower(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- PIO_STACK_LOCATION IrpSp)
-{
- PACPI_DEVICE_EXTENSION DeviceExtension;
- ACPI_STATUS AcpiStatus;
- NTSTATUS Status;
- ULONG AcpiState;
-
- DPRINT("Called\n");
-
- DeviceExtension = (PACPI_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
- if (IrpSp->Parameters.Power.Type == SystemPowerState) {
- Status = STATUS_SUCCESS;
- switch (IrpSp->Parameters.Power.State.SystemState) {
- case PowerSystemSleeping1:
- AcpiState = ACPI_STATE_S1;
- break;
- case PowerSystemSleeping2:
- AcpiState = ACPI_STATE_S2;
- break;
- case PowerSystemSleeping3:
- AcpiState = ACPI_STATE_S3;
- break;
- case PowerSystemHibernate:
- AcpiState = ACPI_STATE_S4;
- break;
- case PowerSystemShutdown:
- AcpiState = ACPI_STATE_S5;
- break;
- default:
- Status = STATUS_UNSUCCESSFUL;
- }
- if (!DeviceExtension->SystemStates[AcpiState]) {
- DPRINT("System sleep state S%d is not supported by hardware\n", AcpiState);
- Status = STATUS_UNSUCCESSFUL;
- }
-
- if (NT_SUCCESS(Status)) {
- DPRINT("Trying to enter sleep state %d\n", AcpiState);
-
- AcpiStatus = acpi_enter_sleep_state(AcpiState);
- if (!ACPI_SUCCESS(AcpiStatus)) {
- DPRINT("Failed to enter sleep state %d (Status 0x%X)\n",
- AcpiState, AcpiStatus);
- Status = STATUS_UNSUCCESSFUL;
- }
- }
- } else {
- Status = STATUS_UNSUCCESSFUL;
- }
-
- return Status;
-}
-
-
NTSTATUS
STDCALL
ACPIPnpControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
+/*
+ * FUNCTION: Handle Plug and Play IRPs
+ * ARGUMENTS:
+ * DeviceObject = Pointer to PDO or FDO
+ * Irp = Pointer to IRP that should be handled
+ * RETURNS:
+ * Status
+ */
{
- PIO_STACK_LOCATION IrpSp;
+ PCOMMON_DEVICE_EXTENSION DeviceExtension;
NTSTATUS Status;
DPRINT("Called\n");
- IrpSp = IoGetCurrentIrpStackLocation(Irp);
- switch (IrpSp->MinorFunction) {
- case IRP_MN_QUERY_DEVICE_RELATIONS:
- Status = ACPIQueryDeviceRelations(DeviceObject, Irp, IrpSp);
- break;
-
- case IRP_MN_QUERY_ID:
- Status = ACPIQueryId(DeviceObject, Irp, IrpSp);
- break;
-
- case IRP_MN_START_DEVICE:
- DPRINT("IRP_MN_START_DEVICE received\n");
- Status = ACPIStartDevice(DeviceObject, Irp);
- break;
-
- case IRP_MN_STOP_DEVICE:
- /* Currently not supported */
- //bm_terminate();
- Status = STATUS_UNSUCCESSFUL;
- break;
-
- default:
- DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction);
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
+ DeviceExtension = (PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- if (Status != STATUS_PENDING) {
- Irp->IoStatus.Status = Status;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ if (DeviceExtension->IsFDO) {
+ Status = FdoPnpControl(DeviceObject, Irp);
+ } else {
+ Status = FdoPnpControl(DeviceObject, Irp);
}
- DPRINT("Leaving. Status 0x%X\n", Status);
-
return Status;
}
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
- PIO_STACK_LOCATION IrpSp;
+ PCOMMON_DEVICE_EXTENSION DeviceExtension;
NTSTATUS Status;
DPRINT("Called\n");
- IrpSp = IoGetCurrentIrpStackLocation(Irp);
-
- switch (IrpSp->MinorFunction) {
- case IRP_MN_SET_POWER:
- Status = ACPISetPower(DeviceObject, Irp, IrpSp);
- break;
+ DeviceExtension = (PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- default:
- DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction);
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
-
- if (Status != STATUS_PENDING) {
- Irp->IoStatus.Status = Status;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ if (DeviceExtension->IsFDO) {
+ Status = FdoPowerControl(DeviceObject, Irp);
+ } else {
+ Status = PdoPowerControl(DeviceObject, Irp);
}
- DPRINT("Leaving. Status 0x%X\n", Status);
-
return Status;
}
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject)
{
- PACPI_DEVICE_EXTENSION DeviceExtension;
+ PFDO_DEVICE_EXTENSION DeviceExtension;
PDEVICE_OBJECT Fdo;
NTSTATUS Status;
DPRINT("Called\n");
- Status = IoCreateDevice(DriverObject, sizeof(ACPI_DEVICE_EXTENSION),
+ Status = IoCreateDevice(DriverObject, sizeof(FDO_DEVICE_EXTENSION),
NULL, FILE_DEVICE_ACPI, FILE_DEVICE_SECURE_OPEN, TRUE, &Fdo);
if (!NT_SUCCESS(Status)) {
DPRINT("IoCreateDevice() failed with status 0x%X\n", Status);
return Status;
}
- DeviceExtension = (PACPI_DEVICE_EXTENSION)Fdo->DeviceExtension;
+ DeviceExtension = (PFDO_DEVICE_EXTENSION)Fdo->DeviceExtension;
DeviceExtension->Pdo = PhysicalDeviceObject;
--- /dev/null
+/* $Id: fdo.c,v 1.1 2001/08/23 17:32:04 chorns Exp $
+ *
+ * PROJECT: ReactOS ACPI bus driver
+ * FILE: acpi/ospm/fdo.c
+ * PURPOSE: ACPI device object dispatch routines
+ * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
+ * UPDATE HISTORY:
+ * 08-08-2001 CSH Created
+ */
+#include <acpisys.h>
+#include <bm.h>
+#include <bn.h>
+
+#define NDEBUG
+#include <debug.h>
+
+/*** PRIVATE *****************************************************************/
+
+FADT_DESCRIPTOR_REV2 acpi_fadt;
+
+NTSTATUS
+FdoQueryBusRelations(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ PIO_STACK_LOCATION IrpSp)
+{
+ PPDO_DEVICE_EXTENSION PdoDeviceExtension;
+ PFDO_DEVICE_EXTENSION DeviceExtension;
+ PDEVICE_RELATIONS Relations;
+ PLIST_ENTRY CurrentEntry;
+ ANSI_STRING AnsiString;
+ ACPI_STATUS AcpiStatus;
+ PACPI_DEVICE Device;
+ NTSTATUS Status;
+ BM_NODE *Node;
+ ULONG Size;
+ ULONG i;
+
+ DPRINT("Called\n");
+
+ DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ Size = sizeof(DEVICE_RELATIONS) + sizeof(Relations->Objects) *
+ (DeviceExtension->DeviceListCount - 1);
+ Relations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, Size);
+ if (!Relations)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ Relations->Count = DeviceExtension->DeviceListCount;
+
+ i = 0;
+ CurrentEntry = DeviceExtension->DeviceListHead.Flink;
+ while (CurrentEntry != &DeviceExtension->DeviceListHead) {
+ Device = CONTAINING_RECORD(CurrentEntry, ACPI_DEVICE, DeviceListEntry);
+
+ /* FIXME: For ACPI namespace devices on the motherboard create filter DOs
+ and attach them just above the ACPI bus device object (PDO) */
+
+ /* FIXME: For other devices in ACPI namespace, but not on motherboard,
+ create PDOs */
+
+ if (!Device->Pdo) {
+ /* Create a physical device object for the
+ device as it does not already have one */
+ Status = IoCreateDevice(DeviceObject->DriverObject, 0,
+ NULL, FILE_DEVICE_CONTROLLER, 0, FALSE, &Device->Pdo);
+ if (!NT_SUCCESS(Status)) {
+ DPRINT("IoCreateDevice() failed with status 0x%X\n", Status);
+ /* FIXME: Cleanup all new PDOs created in this call */
+ ExFreePool(Relations);
+ return Status;
+ }
+
+ PdoDeviceExtension = ExAllocatePool(
+ NonPagedPool,
+ sizeof(PDO_DEVICE_EXTENSION));
+ if (!PdoDeviceExtension) {
+ /* FIXME: Cleanup all new PDOs created in this call */
+ ExFreePool(Relations);
+ }
+
+ RtlZeroMemory(
+ PdoDeviceExtension,
+ sizeof(PDO_DEVICE_EXTENSION));
+
+ Device->Pdo->DeviceExtension = PdoDeviceExtension;
+
+ Device->Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE;
+
+ PdoDeviceExtension->DeviceObject = Device->Pdo;
+
+ PdoDeviceExtension->DevicePowerState = PowerDeviceD0;
+
+ PdoDeviceExtension->Ldo = IoAttachDeviceToDeviceStack(
+ DeviceObject,
+ Device->Pdo);
+
+ RtlInitUnicodeString(&PdoDeviceExtension->HardwareIDs, NULL);
+ RtlInitUnicodeString(&PdoDeviceExtension->CompatibleIDs, NULL);
+
+ AcpiStatus = bm_get_node(Device->BmHandle, 0, &Node);
+ if (ACPI_SUCCESS(AcpiStatus)) {
+ if (Node->device.flags & BM_FLAGS_HAS_A_HID) {
+ RtlInitAnsiString(&AnsiString, Node->device.id.hid);
+ Status = RtlAnsiStringToUnicodeString(
+ &PdoDeviceExtension->HardwareIDs,
+ &AnsiString,
+ TRUE);
+ assert(NT_SUCCESS(Status));
+ }
+
+ if (Node->device.flags & BM_FLAGS_HAS_A_CID) {
+ RtlInitAnsiString(&AnsiString, Node->device.id.cid);
+ Status = RtlAnsiStringToUnicodeString(
+ &PdoDeviceExtension->CompatibleIDs,
+ &AnsiString,
+ TRUE);
+ assert(NT_SUCCESS(Status));
+ }
+ }
+ }
+
+ /* Reference the physical device object. The PnP manager
+ will dereference it again when it is no longer needed */
+ ObReferenceObject(Device->Pdo);
+
+ Relations->Objects[i] = Device->Pdo;
+
+ i++;
+
+ CurrentEntry = CurrentEntry->Flink;
+ }
+
+ Irp->IoStatus.Information = (ULONG)Relations;
+
+ return Status;
+}
+
+
+VOID ACPIPrintInfo(
+ PFDO_DEVICE_EXTENSION DeviceExtension)
+{
+ DbgPrint("ACPI: System firmware supports:\n");
+
+ /*
+ * Print out basic system information
+ */
+ DbgPrint("+------------------------------------------------------------\n");
+ DbgPrint("| Sx states: %cS0 %cS1 %cS2 %cS3 %cS4 %cS5\n",
+ (DeviceExtension->SystemStates[0]?'+':'-'),
+ (DeviceExtension->SystemStates[1]?'+':'-'),
+ (DeviceExtension->SystemStates[2]?'+':'-'),
+ (DeviceExtension->SystemStates[3]?'+':'-'),
+ (DeviceExtension->SystemStates[4]?'+':'-'),
+ (DeviceExtension->SystemStates[5]?'+':'-'));
+ DbgPrint("+------------------------------------------------------------\n");
+}
+
+NTSTATUS
+ACPIInitializeInternalDriver(
+ PFDO_DEVICE_EXTENSION DeviceExtension,
+ ACPI_DRIVER_FUNCTION Initialize,
+ ACPI_DRIVER_FUNCTION Terminate)
+{
+ ACPI_STATUS AcpiStatus;
+ PACPI_DEVICE AcpiDevice;
+
+ AcpiStatus = Initialize();
+ if (!ACPI_SUCCESS(AcpiStatus)) {
+ DPRINT("BN init status 0x%X\n", AcpiStatus);
+ return STATUS_UNSUCCESSFUL;
+ }
+#if 0
+ AcpiDevice = (PACPI_DEVICE)ExAllocatePool(
+ NonPagedPool, sizeof(ACPI_DEVICE));
+ if (!AcpiDevice) {
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ AcpiDevice->Initialize = Initialize;
+ AcpiDevice->Terminate = Terminate;
+
+ /* FIXME: Create PDO */
+
+ AcpiDevice->Pdo = NULL;
+ //AcpiDevice->BmHandle = HandleList.handles[i];
+
+ ExInterlockedInsertHeadList(&DeviceExtension->DeviceListHead,
+ &AcpiDevice->ListEntry, &DeviceExtension->DeviceListLock);
+#endif
+ return STATUS_SUCCESS;
+}
+
+
+NTSTATUS
+ACPIInitializeInternalDrivers(
+ PFDO_DEVICE_EXTENSION DeviceExtension)
+{
+ NTSTATUS Status;
+
+ ULONG j;
+
+ Status = ACPIInitializeInternalDriver(DeviceExtension,
+ bn_initialize, bn_terminate);
+
+ return STATUS_SUCCESS;
+}
+
+
+NTSTATUS
+FdoStartDevice(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PFDO_DEVICE_EXTENSION DeviceExtension;
+ ACPI_PHYSICAL_ADDRESS rsdp;
+ ACPI_SYSTEM_INFO SysInfo;
+ ACPI_STATUS AcpiStatus;
+ ACPI_BUFFER Buffer;
+ UCHAR TypeA, TypeB;
+ ULONG i;
+
+ DPRINT("Called\n");
+
+ DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ assert(DeviceExtension->State == dsStopped);
+
+ AcpiStatus = acpi_initialize_subsystem();
+ if (!ACPI_SUCCESS(AcpiStatus)) {
+ DPRINT("acpi_initialize_subsystem() failed with status 0x%X\n", AcpiStatus);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ AcpiStatus = acpi_find_root_pointer(&rsdp);
+ if (!ACPI_SUCCESS(AcpiStatus)) {
+ DPRINT("acpi_find_root_pointer() failed with status 0x%X\n", AcpiStatus);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ /* From this point on, on error we must call acpi_terminate() */
+
+ AcpiStatus = acpi_load_tables(rsdp);
+ if (!ACPI_SUCCESS(AcpiStatus)) {
+ DPRINT("acpi_load_tables() failed with status 0x%X\n", AcpiStatus);
+ acpi_terminate();
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ Buffer.length = sizeof(SysInfo);
+ Buffer.pointer = &SysInfo;
+
+ AcpiStatus = acpi_get_system_info(&Buffer);
+ if (!ACPI_SUCCESS(AcpiStatus)) {
+ DPRINT("acpi_get_system_info() failed with status 0x%X\n", AcpiStatus);
+ acpi_terminate();
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ DPRINT("ACPI CA Core Subsystem version 0x%X\n", SysInfo.acpi_ca_version);
+
+ assert(SysInfo.num_table_types > ACPI_TABLE_FADT);
+
+ RtlMoveMemory(&acpi_fadt,
+ &SysInfo.table_info[ACPI_TABLE_FADT],
+ sizeof(FADT_DESCRIPTOR_REV2));
+
+ AcpiStatus = acpi_enable_subsystem(ACPI_FULL_INITIALIZATION);
+ if (!ACPI_SUCCESS(AcpiStatus)) {
+ DPRINT("acpi_enable_subsystem() failed with status 0x%X\n", AcpiStatus);
+ acpi_terminate();
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ DPRINT("ACPI CA Core Subsystem enabled\n");
+
+ /*
+ * Sx States:
+ * ----------
+ * Figure out which Sx states are supported
+ */
+ for (i=0; i<=ACPI_S_STATES_MAX; i++) {
+ AcpiStatus = acpi_hw_obtain_sleep_type_register_data(
+ i,
+ &TypeA,
+ &TypeB);
+ DPRINT("acpi_hw_obtain_sleep_type_register_data (%d) status 0x%X\n",
+ i, AcpiStatus);
+ if (ACPI_SUCCESS(AcpiStatus)) {
+ DeviceExtension->SystemStates[i] = TRUE;
+ }
+ }
+
+ ACPIPrintInfo(DeviceExtension);
+
+ /* Initialize ACPI bus manager */
+ AcpiStatus = bm_initialize();
+ if (!ACPI_SUCCESS(AcpiStatus)) {
+ DPRINT("bm_initialize() failed with status 0x%X\n", AcpiStatus);
+ acpi_terminate();
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ InitializeListHead(&DeviceExtension->DeviceListHead);
+ KeInitializeSpinLock(&DeviceExtension->DeviceListLock);
+ DeviceExtension->DeviceListCount = 0;
+
+ ACPIEnumerateNamespace(DeviceExtension);
+
+ //ACPIEnumerateRootBusses(DeviceExtension);
+
+ ACPIInitializeInternalDrivers(DeviceExtension);
+
+ DeviceExtension->State = dsStarted;
+
+ return STATUS_SUCCESS;
+}
+
+
+NTSTATUS
+FdoSetPower(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ PIO_STACK_LOCATION IrpSp)
+{
+ PFDO_DEVICE_EXTENSION DeviceExtension;
+ ACPI_STATUS AcpiStatus;
+ NTSTATUS Status;
+ ULONG AcpiState;
+
+ DPRINT("Called\n");
+
+ DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ if (IrpSp->Parameters.Power.Type == SystemPowerState) {
+ Status = STATUS_SUCCESS;
+ switch (IrpSp->Parameters.Power.State.SystemState) {
+ case PowerSystemSleeping1:
+ AcpiState = ACPI_STATE_S1;
+ break;
+ case PowerSystemSleeping2:
+ AcpiState = ACPI_STATE_S2;
+ break;
+ case PowerSystemSleeping3:
+ AcpiState = ACPI_STATE_S3;
+ break;
+ case PowerSystemHibernate:
+ AcpiState = ACPI_STATE_S4;
+ break;
+ case PowerSystemShutdown:
+ AcpiState = ACPI_STATE_S5;
+ break;
+ default:
+ Status = STATUS_UNSUCCESSFUL;
+ }
+ if (!DeviceExtension->SystemStates[AcpiState]) {
+ DPRINT("System sleep state S%d is not supported by hardware\n", AcpiState);
+ Status = STATUS_UNSUCCESSFUL;
+ }
+
+ if (NT_SUCCESS(Status)) {
+ DPRINT("Trying to enter sleep state %d\n", AcpiState);
+
+ AcpiStatus = acpi_enter_sleep_state(AcpiState);
+ if (!ACPI_SUCCESS(AcpiStatus)) {
+ DPRINT("Failed to enter sleep state %d (Status 0x%X)\n",
+ AcpiState, AcpiStatus);
+ Status = STATUS_UNSUCCESSFUL;
+ }
+ }
+ } else {
+ Status = STATUS_UNSUCCESSFUL;
+ }
+
+ return Status;
+}
+
+
+/*** PUBLIC ******************************************************************/
+
+NTSTATUS
+STDCALL
+FdoPnpControl(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp)
+/*
+ * FUNCTION: Handle Plug and Play IRPs for the ACPI device
+ * ARGUMENTS:
+ * DeviceObject = Pointer to functional device object of the ACPI driver
+ * Irp = Pointer to IRP that should be handled
+ * RETURNS:
+ * Status
+ */
+{
+ PIO_STACK_LOCATION IrpSp;
+ NTSTATUS Status;
+
+ DPRINT("Called\n");
+
+ IrpSp = IoGetCurrentIrpStackLocation(Irp);
+ switch (IrpSp->MinorFunction) {
+ case IRP_MN_CANCEL_REMOVE_DEVICE:
+ Status = STATUS_NOT_IMPLEMENTED;
+ break;
+
+ case IRP_MN_CANCEL_STOP_DEVICE:
+ Status = STATUS_NOT_IMPLEMENTED;
+ break;
+
+ case IRP_MN_DEVICE_USAGE_NOTIFICATION:
+ Status = STATUS_NOT_IMPLEMENTED;
+ break;
+
+ case IRP_MN_FILTER_RESOURCE_REQUIREMENTS:
+ Status = STATUS_NOT_IMPLEMENTED;
+ break;
+
+ case IRP_MN_QUERY_DEVICE_RELATIONS:
+ Status = FdoQueryBusRelations(DeviceObject, Irp, IrpSp);
+ break;
+
+ case IRP_MN_QUERY_PNP_DEVICE_STATE:
+ Status = STATUS_NOT_IMPLEMENTED;
+ break;
+
+ case IRP_MN_QUERY_REMOVE_DEVICE:
+ Status = STATUS_NOT_IMPLEMENTED;
+ break;
+
+ case IRP_MN_QUERY_STOP_DEVICE:
+ Status = STATUS_NOT_IMPLEMENTED;
+ break;
+
+ case IRP_MN_REMOVE_DEVICE:
+ Status = STATUS_NOT_IMPLEMENTED;
+ break;
+
+ case IRP_MN_START_DEVICE:
+ DPRINT("IRP_MN_START_DEVICE received\n");
+ Status = FdoStartDevice(DeviceObject, Irp);
+ break;
+
+ case IRP_MN_STOP_DEVICE:
+ /* Currently not supported */
+ //bm_terminate();
+ Status = STATUS_UNSUCCESSFUL;
+ break;
+
+ case IRP_MN_SURPRISE_REMOVAL:
+ Status = STATUS_NOT_IMPLEMENTED;
+ break;
+
+ default:
+ DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction);
+ Status = STATUS_NOT_IMPLEMENTED;
+ break;
+ }
+
+ if (Status != STATUS_PENDING) {
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ }
+
+ DPRINT("Leaving. Status 0x%X\n", Status);
+
+ return Status;
+}
+
+
+NTSTATUS
+STDCALL
+FdoPowerControl(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp)
+/*
+ * FUNCTION: Handle power management IRPs for the ACPI device
+ * ARGUMENTS:
+ * DeviceObject = Pointer to functional device object of the ACPI driver
+ * Irp = Pointer to IRP that should be handled
+ * RETURNS:
+ * Status
+ */
+{
+ PIO_STACK_LOCATION IrpSp;
+ NTSTATUS Status;
+
+ DPRINT("Called\n");
+
+ IrpSp = IoGetCurrentIrpStackLocation(Irp);
+
+ switch (IrpSp->MinorFunction) {
+ case IRP_MN_SET_POWER:
+ Status = FdoSetPower(DeviceObject, Irp, IrpSp);
+ break;
+
+ default:
+ DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction);
+ Status = STATUS_NOT_IMPLEMENTED;
+ break;
+ }
+
+ if (Status != STATUS_PENDING) {
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ }
+
+ DPRINT("Leaving. Status 0x%X\n", Status);
+
+ return Status;
+}
+
+/* EOF */
typedef enum {
dsStopped,
- dsStarted
+ dsStarted,
+ dsPaused,
+ dsRemoved,
+ dsSurpriseRemoved
} ACPI_DEVICE_STATE;
-typedef struct _ACPI_DEVICE
+
+typedef struct _COMMON_DEVICE_EXTENSION
{
- // Entry on device list
- LIST_ENTRY DeviceListEntry;
- // Bus manager handle
- BM_HANDLE BmHandle;
- // Physical Device Object
- PDEVICE_OBJECT Pdo;
- // Initialization function
- ACPI_DRIVER_FUNCTION Initialize;
- // Cleanup function
- ACPI_DRIVER_FUNCTION Terminate;
-} ACPI_DEVICE, *PACPI_DEVICE;
+ // Pointer to device object, this device extension is associated with
+ PDEVICE_OBJECT DeviceObject;
+ // Wether this device extension is for an FDO or PDO
+ BOOLEAN IsFDO;
+ // Wether the device is removed
+ BOOLEAN Removed;
+ // Current device power state for the device
+ DEVICE_POWER_STATE DevicePowerState;
+ // Lower device object
+ PDEVICE_OBJECT Ldo;
+} COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
-typedef struct _ACPI_DEVICE_EXTENSION
+/* Physical Device Object device extension for a child device */
+typedef struct _PDO_DEVICE_EXTENSION
{
+ // Common device data
+ COMMON_DEVICE_EXTENSION;
+ // Hardware IDs
+ UNICODE_STRING HardwareIDs;
+ // Compatible IDs
+ UNICODE_STRING CompatibleIDs;
+} PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
+
+typedef struct _FDO_DEVICE_EXTENSION
+{
+ // Common device data
+ COMMON_DEVICE_EXTENSION;
// Physical Device Object
PDEVICE_OBJECT Pdo;
- // Lower device object
- PDEVICE_OBJECT Ldo;
// Current state of the driver
ACPI_DEVICE_STATE State;
// Supported system states
ULONG DeviceListCount;
// Lock for namespace device list
KSPIN_LOCK DeviceListLock;
-} ACPI_DEVICE_EXTENSION, *PACPI_DEVICE_EXTENSION;
+} FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
+
+
+typedef struct _ACPI_DEVICE
+{
+ // Entry on device list
+ LIST_ENTRY DeviceListEntry;
+ // Bus manager handle
+ BM_HANDLE BmHandle;
+ // Physical Device Object
+ PDEVICE_OBJECT Pdo;
+ // Initialization function
+ ACPI_DRIVER_FUNCTION Initialize;
+ // Cleanup function
+ ACPI_DRIVER_FUNCTION Terminate;
+} ACPI_DEVICE, *PACPI_DEVICE;
+
+
+/* acpienum.c */
NTSTATUS
ACPIEnumerateRootBusses(
- PACPI_DEVICE_EXTENSION DeviceExtension);
+ PFDO_DEVICE_EXTENSION DeviceExtension);
NTSTATUS
ACPIEnumerateNamespace(
- PACPI_DEVICE_EXTENSION DeviceExtension);
+ PFDO_DEVICE_EXTENSION DeviceExtension);
+
+
+/* fdo.c */
+
+NTSTATUS
+STDCALL
+FdoPnpControl(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp);
+
+NTSTATUS
+STDCALL
+FdoPowerControl(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp);
+
+/* pdo.c */
+
+NTSTATUS
+STDCALL
+PdoPnpControl(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp);
+
+NTSTATUS
+STDCALL
+PdoPowerControl(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp);
/* EOF */
#define NDEBUG
#include <debug.h>
-
-typedef struct _ACPI_OS_DPC
-{
- OSD_EXECUTION_CALLBACK Routine;
- PVOID Context;
-} ACPI_OS_DPC, *PACPI_OS_DPC;
-
static PKINTERRUPT AcpiInterrupt;
static BOOLEAN AcpiInterruptHandlerRegistered = FALSE;
static OSD_HANDLER AcpiIrqHandler = NULL;
static PVOID AcpiIrqContext = NULL;
static ULONG AcpiIrqNumber = 0;
+static KDPC AcpiDpc;
static PVOID IVTVirtualAddress = NULL;
static PVOID BDAVirtualAddress = NULL;
+VOID
+OslDpcStub(
+ IN PKDPC Dpc,
+ IN PVOID DeferredContext,
+ IN PVOID SystemArgument1,
+ IN PVOID SystemArgument2)
+{
+ OSD_EXECUTION_CALLBACK Routine = (OSD_EXECUTION_CALLBACK)SystemArgument1;
+
+ DPRINT("OslDpcStub()\n");
+
+ DPRINT("Calling [%p]([%p])\n", Routine, SystemArgument2);
+
+ (*Routine)(SystemArgument2);
+}
+
+
ACPI_STATUS
acpi_os_remove_interrupt_handler(
u32 irq,
{
DPRINT("acpi_os_initialize()\n");
+ KeInitializeDpc(&AcpiDpc, OslDpcStub, NULL);
+
return AE_OK;
}
return AE_OK;
}
-VOID
-OslDpcStub(
- IN PKDPC Dpc,
- IN PVOID DeferredContext,
- IN PVOID SystemArgument1,
- IN PVOID SystemArgument2)
-{
- PACPI_OS_DPC DpcContext = (PACPI_OS_DPC)DeferredContext;
-
- DPRINT("OslDpcStub()\n");
-
- DPRINT("Calling [%p]([%p])\n", DpcContext->Routine, DpcContext->Context);
-
- (*DpcContext->Routine)(DpcContext->Context);
-
- ExFreePool(Dpc);
-}
-
ACPI_STATUS
acpi_os_queue_for_execution(
u32 priority,
OSD_EXECUTION_CALLBACK function,
void *context)
{
- PKDPC Dpc;
- PACPI_OS_DPC DpcContext;
ACPI_STATUS Status = AE_OK;
DPRINT("acpi_os_queue_for_execution()\n");
DPRINT("Scheduling task [%p](%p) for execution.\n", function, context);
- Dpc = ExAllocatePool(NonPagedPool, sizeof(KDPC) + sizeof(ACPI_OS_DPC));
- if (!Dpc)
- return AE_NO_MEMORY;
-
- DpcContext = (PACPI_OS_DPC)((ULONG)Dpc + sizeof(KDPC));
-
- DpcContext->Routine = function;
- DpcContext->Context = context;
-
- KeInitializeDpc(Dpc, OslDpcStub, DpcContext);
#if 0
switch (priority) {
case OSD_PRIORITY_MED:
- KeSetImportanceDpc(Dpc, MediumImportance);
+ KeSetImportanceDpc(&AcpiDpc, MediumImportance);
case OSD_PRIORITY_LO:
- KeSetImportanceDpc(Dpc, LowImportance);
+ KeSetImportanceDpc(&AcpiDpc, LowImportance);
case OSD_PRIORITY_HIGH:
default:
- KeSetImportanceDpc(Dpc, HighImportance);
+ KeSetImportanceDpc(&AcpiDpc, HighImportance);
}
#endif
+
+ KeInsertQueueDpc(&AcpiDpc, (PVOID)function, (PVOID)context);
+
return Status;
}
--- /dev/null
+/* $Id: pdo.c,v 1.1 2001/08/23 17:32:04 chorns Exp $
+ *
+ * PROJECT: ReactOS ACPI bus driver
+ * FILE: acpi/ospm/pdo.c
+ * PURPOSE: Child device object dispatch routines
+ * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
+ * UPDATE HISTORY:
+ * 08-08-2001 CSH Created
+ */
+#include <acpisys.h>
+#include <bm.h>
+#include <bn.h>
+
+#define NDEBUG
+#include <debug.h>
+
+/*** PRIVATE *****************************************************************/
+
+NTSTATUS
+PdoQueryId(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ PIO_STACK_LOCATION IrpSp)
+{
+ PPDO_DEVICE_EXTENSION DeviceExtension;
+ ACPI_STATUS AcpiStatus;
+ NTSTATUS Status;
+
+ DPRINT("Called\n");
+
+ DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+// Irp->IoStatus.Information = 0;
+
+ switch (IrpSp->Parameters.QueryId.IdType) {
+ case BusQueryDeviceID:
+ break;
+
+ case BusQueryHardwareIDs:
+ case BusQueryCompatibleIDs:
+ case BusQueryInstanceID:
+ case BusQueryDeviceSerialNumber:
+ default:
+ Status = STATUS_NOT_IMPLEMENTED;
+ }
+
+ return Status;
+}
+
+
+NTSTATUS
+PdoSetPower(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ PIO_STACK_LOCATION IrpSp)
+{
+ PPDO_DEVICE_EXTENSION DeviceExtension;
+ ACPI_STATUS AcpiStatus;
+ NTSTATUS Status;
+ ULONG AcpiState;
+
+ DPRINT("Called\n");
+
+ DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ if (IrpSp->Parameters.Power.Type == DevicePowerState) {
+ Status = STATUS_SUCCESS;
+ switch (IrpSp->Parameters.Power.State.SystemState) {
+ default:
+ Status = STATUS_UNSUCCESSFUL;
+ }
+ } else {
+ Status = STATUS_UNSUCCESSFUL;
+ }
+
+ return Status;
+}
+
+
+/*** PUBLIC ******************************************************************/
+
+NTSTATUS
+STDCALL
+PdoPnpControl(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp)
+/*
+ * FUNCTION: Handle Plug and Play IRPs for the child device
+ * ARGUMENTS:
+ * DeviceObject = Pointer to physical device object of the child device
+ * Irp = Pointer to IRP that should be handled
+ * RETURNS:
+ * Status
+ */
+{
+ PIO_STACK_LOCATION IrpSp;
+ NTSTATUS Status;
+
+ DPRINT("Called\n");
+
+ Status = Irp->IoStatus.Status;
+
+ IrpSp = IoGetCurrentIrpStackLocation(Irp);
+
+ switch (IrpSp->MinorFunction) {
+ case IRP_MN_CANCEL_REMOVE_DEVICE:
+ break;
+
+ case IRP_MN_CANCEL_STOP_DEVICE:
+ break;
+
+ case IRP_MN_DEVICE_USAGE_NOTIFICATION:
+ break;
+
+ case IRP_MN_EJECT:
+ break;
+
+ case IRP_MN_QUERY_BUS_INFORMATION:
+ break;
+
+ case IRP_MN_QUERY_CAPABILITIES:
+ break;
+
+ case IRP_MN_QUERY_DEVICE_RELATIONS:
+ /* FIXME: Possibly handle for RemovalRelations */
+ break;
+
+ case IRP_MN_QUERY_DEVICE_TEXT:
+ break;
+
+ case IRP_MN_QUERY_ID:
+ break;
+
+ case IRP_MN_QUERY_PNP_DEVICE_STATE:
+ break;
+
+ case IRP_MN_QUERY_REMOVE_DEVICE:
+ break;
+
+ case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:
+ break;
+
+ case IRP_MN_QUERY_RESOURCES:
+ break;
+
+ case IRP_MN_QUERY_STOP_DEVICE:
+ break;
+
+ case IRP_MN_REMOVE_DEVICE:
+ break;
+
+ case IRP_MN_SET_LOCK:
+ break;
+
+ case IRP_MN_START_DEVICE:
+ break;
+
+ case IRP_MN_STOP_DEVICE:
+ break;
+
+ case IRP_MN_SURPRISE_REMOVAL:
+ break;
+
+ default:
+ DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction);
+ break;
+ }
+
+ if (Status != STATUS_PENDING) {
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ }
+
+ DPRINT("Leaving. Status 0x%X\n", Status);
+
+ return Status;
+}
+
+NTSTATUS
+STDCALL
+PdoPowerControl(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp)
+/*
+ * FUNCTION: Handle power management IRPs for the child device
+ * ARGUMENTS:
+ * DeviceObject = Pointer to physical device object of the child device
+ * Irp = Pointer to IRP that should be handled
+ * RETURNS:
+ * Status
+ */
+{
+ PIO_STACK_LOCATION IrpSp;
+ NTSTATUS Status;
+
+ DPRINT("Called\n");
+
+ IrpSp = IoGetCurrentIrpStackLocation(Irp);
+
+ switch (IrpSp->MinorFunction) {
+ case IRP_MN_SET_POWER:
+ Status = PdoSetPower(DeviceObject, Irp, IrpSp);
+ break;
+
+ default:
+ DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction);
+ Status = STATUS_NOT_IMPLEMENTED;
+ break;
+ }
+
+ if (Status != STATUS_PENDING) {
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ }
+
+ DPRINT("Leaving. Status 0x%X\n", Status);
+
+ return Status;
+}
+
+/* EOF */