diff --git a/reactos/drivers/bus/acpi/makefile b/reactos/drivers/bus/acpi/makefile index 545b1f5bff3..d90f44be0f7 100644 --- a/reactos/drivers/bus/acpi/makefile +++ b/reactos/drivers/bus/acpi/makefile @@ -1,4 +1,4 @@ -# $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 = ../../.. @@ -42,7 +42,9 @@ OBJECTS_OSPM = \ 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 \ diff --git a/reactos/drivers/bus/acpi/ospm/acpienum.c b/reactos/drivers/bus/acpi/ospm/acpienum.c index 187e10dd3b8..6ff85574561 100644 --- a/reactos/drivers/bus/acpi/ospm/acpienum.c +++ b/reactos/drivers/bus/acpi/ospm/acpienum.c @@ -1,4 +1,4 @@ -/* $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 @@ -104,7 +104,7 @@ bm_print1 ( NTSTATUS ACPIEnumerateRootBusses( - PACPI_DEVICE_EXTENSION DeviceExtension) + PFDO_DEVICE_EXTENSION DeviceExtension) { BM_HANDLE_LIST HandleList; PACPI_DEVICE AcpiDevice; @@ -132,7 +132,7 @@ ACPIEnumerateRootBusses( 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 @@ -146,6 +146,8 @@ ACPIEnumerateRootBusses( return STATUS_INSUFFICIENT_RESOURCES; } + RtlZeroMemory(AcpiDevice, sizeof(ACPI_DEVICE)); + AcpiDevice->Pdo = NULL; AcpiDevice->BmHandle = HandleList.handles[i]; @@ -158,6 +160,8 @@ ACPIEnumerateRootBusses( } else { DPRINT("Got no devices (Status 0x%X)\n", AcpiStatus); } + for (j=0; j < 4*10*1000;j++) + KeStallExecutionProcessor(1000); return STATUS_SUCCESS; } @@ -165,15 +169,16 @@ ACPIEnumerateRootBusses( NTSTATUS ACPIEnumerateNamespace( - PACPI_DEVICE_EXTENSION DeviceExtension) + PFDO_DEVICE_EXTENSION DeviceExtension) { - ACPI_STATUS AcpiStatus; - BM_DEVICE_ID Criteria; BM_HANDLE_LIST HandleList; - ULONG i; - + PACPI_DEVICE AcpiDevice; + ACPI_STATUS AcpiStatus; + BM_HANDLE DeviceHandle; + BM_DEVICE_ID Criteria; BM_NODE *Node; - ULONG j, q; + KIRQL OldIrql; + ULONG i; DPRINT("Called\n"); @@ -191,13 +196,34 @@ ACPIEnumerateNamespace( 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); diff --git a/reactos/drivers/bus/acpi/ospm/acpisys.c b/reactos/drivers/bus/acpi/ospm/acpisys.c index 89c30e15182..a68c78f989b 100644 --- a/reactos/drivers/bus/acpi/ospm/acpisys.c +++ b/reactos/drivers/bus/acpi/ospm/acpisys.c @@ -1,4 +1,4 @@ -/* $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 @@ -23,8 +23,6 @@ #endif /* ALLOC_PRAGMA */ -FADT_DESCRIPTOR_REV2 acpi_fadt; - NTSTATUS STDCALL @@ -61,401 +59,33 @@ ACPIDispatchDeviceControl( } -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; + DeviceExtension = (PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - 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; + if (DeviceExtension->IsFDO) { + Status = FdoPnpControl(DeviceObject, Irp); + } else { + Status = FdoPnpControl(DeviceObject, Irp); } - if (Status != STATUS_PENDING) { - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - } - - DPRINT("Leaving. Status 0x%X\n", Status); - return Status; } @@ -466,31 +96,19 @@ ACPIPowerControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { - PIO_STACK_LOCATION IrpSp; + PCOMMON_DEVICE_EXTENSION DeviceExtension; NTSTATUS Status; DPRINT("Called\n"); - IrpSp = IoGetCurrentIrpStackLocation(Irp); + DeviceExtension = (PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - switch (IrpSp->MinorFunction) { - case IRP_MN_SET_POWER: - Status = ACPISetPower(DeviceObject, Irp, IrpSp); - break; - - default: - DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction); - Status = STATUS_NOT_IMPLEMENTED; - break; + if (DeviceExtension->IsFDO) { + Status = FdoPowerControl(DeviceObject, Irp); + } else { + Status = PdoPowerControl(DeviceObject, Irp); } - if (Status != STATUS_PENDING) { - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - } - - DPRINT("Leaving. Status 0x%X\n", Status); - return Status; } @@ -500,20 +118,20 @@ ACPIAddDevice( 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; diff --git a/reactos/drivers/bus/acpi/ospm/fdo.c b/reactos/drivers/bus/acpi/ospm/fdo.c new file mode 100644 index 00000000000..5df235e7a6a --- /dev/null +++ b/reactos/drivers/bus/acpi/ospm/fdo.c @@ -0,0 +1,512 @@ +/* $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 +#include +#include + +#define NDEBUG +#include + +/*** 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 */ diff --git a/reactos/drivers/bus/acpi/ospm/include/acpisys.h b/reactos/drivers/bus/acpi/ospm/include/acpisys.h index eb0788011d0..a63e73b7822 100644 --- a/reactos/drivers/bus/acpi/ospm/include/acpisys.h +++ b/reactos/drivers/bus/acpi/ospm/include/acpisys.h @@ -16,9 +16,57 @@ typedef ACPI_STATUS (*ACPI_DRIVER_FUNCTION)(VOID); typedef enum { dsStopped, - dsStarted + dsStarted, + dsPaused, + dsRemoved, + dsSurpriseRemoved } ACPI_DEVICE_STATE; + +typedef struct _COMMON_DEVICE_EXTENSION +{ + // 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; + +/* 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; + // Current state of the driver + ACPI_DEVICE_STATE State; + // Supported system states + BOOLEAN SystemStates[ACPI_S_STATE_COUNT]; + // Namespace device list + LIST_ENTRY DeviceListHead; + // Number of devices in device list + ULONG DeviceListCount; + // Lock for namespace device list + KSPIN_LOCK DeviceListLock; +} FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION; + + typedef struct _ACPI_DEVICE { // Entry on device list @@ -33,30 +81,44 @@ typedef struct _ACPI_DEVICE ACPI_DRIVER_FUNCTION Terminate; } ACPI_DEVICE, *PACPI_DEVICE; -typedef struct _ACPI_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 - BOOLEAN SystemStates[ACPI_S_STATE_COUNT]; - // Namespace device list - LIST_ENTRY DeviceListHead; - // Number of devices in device list - ULONG DeviceListCount; - // Lock for namespace device list - KSPIN_LOCK DeviceListLock; -} ACPI_DEVICE_EXTENSION, *PACPI_DEVICE_EXTENSION; + +/* 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 */ diff --git a/reactos/drivers/bus/acpi/ospm/osl.c b/reactos/drivers/bus/acpi/ospm/osl.c index 32d7870c500..980bf07769b 100644 --- a/reactos/drivers/bus/acpi/ospm/osl.c +++ b/reactos/drivers/bus/acpi/ospm/osl.c @@ -27,22 +27,33 @@ #define NDEBUG #include - -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, @@ -54,6 +65,8 @@ acpi_os_initialize(void) { DPRINT("acpi_os_initialize()\n"); + KeInitializeDpc(&AcpiDpc, OslDpcStub, NULL); + return AE_OK; } @@ -444,32 +457,12 @@ acpi_os_unload_module ( 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"); @@ -479,27 +472,20 @@ acpi_os_queue_for_execution( 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; } diff --git a/reactos/drivers/bus/acpi/ospm/pdo.c b/reactos/drivers/bus/acpi/ospm/pdo.c new file mode 100644 index 00000000000..f7d17c578f4 --- /dev/null +++ b/reactos/drivers/bus/acpi/ospm/pdo.c @@ -0,0 +1,221 @@ +/* $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 +#include +#include + +#define NDEBUG +#include + +/*** 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 */