Fixes for APCI bus driver.
authorCasper Hornstrup <chorns@users.sourceforge.net>
Thu, 23 Aug 2001 17:32:04 +0000 (17:32 +0000)
committerCasper Hornstrup <chorns@users.sourceforge.net>
Thu, 23 Aug 2001 17:32:04 +0000 (17:32 +0000)
svn path=/trunk/; revision=2194

reactos/drivers/bus/acpi/makefile
reactos/drivers/bus/acpi/ospm/acpienum.c
reactos/drivers/bus/acpi/ospm/acpisys.c
reactos/drivers/bus/acpi/ospm/fdo.c [new file with mode: 0644]
reactos/drivers/bus/acpi/ospm/include/acpisys.h
reactos/drivers/bus/acpi/ospm/osl.c
reactos/drivers/bus/acpi/ospm/pdo.c [new file with mode: 0644]

index 545b1f5..d90f44b 100644 (file)
@@ -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 \
index 187e10d..6ff8557 100644 (file)
@@ -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)
 {
+  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");
 
@@ -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);
index 89c30e1..a68c78f 100644 (file)
@@ -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;
-
-  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;
 }
 
@@ -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);
-
-  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;
 }
 
@@ -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 (file)
index 0000000..5df235e
--- /dev/null
@@ -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 <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 */
index eb07880..a63e73b 100644 (file)
@@ -16,29 +16,44 @@ typedef ACPI_STATUS (*ACPI_DRIVER_FUNCTION)(VOID);
 
 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
@@ -49,14 +64,61 @@ typedef struct _ACPI_DEVICE_EXTENSION
   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 */
index 32d7870..980bf07 100644 (file)
 #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,
@@ -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 (file)
index 0000000..f7d17c5
--- /dev/null
@@ -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 <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 */