[ACPI]
[reactos.git] / reactos / drivers / bus / acpi / busmgr / bus.c
index cbc240e..b0b6a4d 100644 (file)
@@ -465,7 +465,7 @@ acpi_bus_generate_event_dpc(PKDPC Dpc,
     ULONG_PTR TypeData = (ULONG_PTR)SystemArgument2;
        KIRQL OldIrql;
 
-    event = ExAllocatePoolWithTag(NonPagedPool,sizeof(struct acpi_bus_event), 'IPCA');
+    event = ExAllocatePoolWithTag(NonPagedPool,sizeof(struct acpi_bus_event), 'epcA');
        if (!event)
                return;
 
@@ -549,7 +549,7 @@ acpi_bus_receive_event (
 
        memcpy(event, entry, sizeof(struct acpi_bus_event));
 
-       ExFreePoolWithTag(entry, 'IPCA');
+       ExFreePoolWithTag(entry, 'epcA');
        return_VALUE(0);
 }
 
@@ -721,11 +721,13 @@ acpi_bus_notify (
        //blocking_notifier_call_chain(&acpi_bus_notify_list,
        //      type, (void *)handle);
 
+       acpi_bus_get_device(handle, &device);
+
        switch (type) {
 
        case ACPI_NOTIFY_BUS_CHECK:
                DPRINT("Received BUS CHECK notification for device [%s]\n",
-                       device->pnp.bus_id);
+                       device ? device->pnp.bus_id : "n/a");
                acpi_bus_check_scope(handle);
                /*
                 * TBD: We'll need to outsource certain events to non-ACPI
@@ -735,7 +737,7 @@ acpi_bus_notify (
 
        case ACPI_NOTIFY_DEVICE_CHECK:
                DPRINT("Received DEVICE CHECK notification for device [%s]\n",
-                       device->pnp.bus_id);
+                       device ? device->pnp.bus_id : "n/a");
                acpi_bus_check_device(handle);
                /*
                 * TBD: We'll need to outsource certain events to non-ACPI
@@ -745,7 +747,7 @@ acpi_bus_notify (
 
        case ACPI_NOTIFY_DEVICE_WAKE:
                DPRINT("Received DEVICE WAKE notification for device [%s]\n",
-                       device->pnp.bus_id);
+                       device ? device->pnp.bus_id : "n/a");
                acpi_bus_check_device(handle);
                /*
                 * TBD: We'll need to outsource certain events to non-ACPI
@@ -755,41 +757,40 @@ acpi_bus_notify (
 
        case ACPI_NOTIFY_EJECT_REQUEST:
                DPRINT1("Received EJECT REQUEST notification for device [%s]\n",
-                       device->pnp.bus_id);
+                       device ? device->pnp.bus_id : "n/a");
                /* TBD */
                break;
 
        case ACPI_NOTIFY_DEVICE_CHECK_LIGHT:
                DPRINT1("Received DEVICE CHECK LIGHT notification for device [%s]\n",
-                       device->pnp.bus_id);
+                       device ? device->pnp.bus_id : "n/a");
                /* TBD: Exactly what does 'light' mean? */
                break;
 
        case ACPI_NOTIFY_FREQUENCY_MISMATCH:
                DPRINT1("Received FREQUENCY MISMATCH notification for device [%s]\n",
-                       device->pnp.bus_id);
+                       device ? device->pnp.bus_id : "n/a");
                /* TBD */
                break;
 
        case ACPI_NOTIFY_BUS_MODE_MISMATCH:
                DPRINT1("Received BUS MODE MISMATCH notification for device [%s]\n",
-                       device->pnp.bus_id);
+                       device ? device->pnp.bus_id : "n/a");
                /* TBD */
                break;
 
        case ACPI_NOTIFY_POWER_FAULT:
                DPRINT1("Received POWER FAULT notification for device [%s]\n",
-                       device->pnp.bus_id);
+                       device ? device->pnp.bus_id : "n/a");
                /* TBD */
                break;
 
        default:
-               DPRINT1("Received unknown/unsupported notification [%08x]\n",
-                       type);
+               DPRINT1("Received unknown/unsupported notification [%08x] for device [%s]\n",
+                       type, device ? device->pnp.bus_id : "n/a");
                break;
        }
 
-       acpi_bus_get_device(handle, &device);
        if (device) {
                driver = device->driver;
                if (driver && driver->ops.notify &&
@@ -1137,7 +1138,7 @@ acpi_bus_add (
        struct acpi_device      *device = NULL;
        char                    bus_id[5] = {'?',0};
        ACPI_BUFFER     buffer;
-       ACPI_DEVICE_INFO        *info;
+       ACPI_DEVICE_INFO        *info = NULL;
        char                    *hid = NULL;
        char                    *uid = NULL;
        ACPI_PNP_DEVICE_ID_LIST *cid_list = NULL;
@@ -1147,7 +1148,7 @@ acpi_bus_add (
        if (!child)
                return_VALUE(AE_BAD_PARAMETER);
 
-       device = ExAllocatePoolWithTag(NonPagedPool,sizeof(struct acpi_device), 'IPCA');
+       device = ExAllocatePoolWithTag(NonPagedPool,sizeof(struct acpi_device), 'DpcA');
        if (!device) {
                DPRINT1("Memory allocation error\n");
                return_VALUE(-12);
@@ -1191,14 +1192,6 @@ acpi_bus_add (
                snprintf(device->pnp.bus_id, sizeof(device->pnp.bus_id), "%s", bus_id);
                buffer.Pointer = NULL;
 
-        /* HACK: Skip HPET */
-        if (strstr(device->pnp.bus_id, "HPET"))
-        {
-            DPRINT("Using HPET hack\n");
-            result = -1;
-            goto end;
-        }
-
                break;
        }
 
@@ -1255,6 +1248,7 @@ acpi_bus_add (
                        ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
                                "Error reading device info\n"));
                        result = AE_NOT_FOUND;
+                       info = NULL;
                        goto end;
                }
                if (info->Valid & ACPI_VALID_HID)
@@ -1263,9 +1257,20 @@ acpi_bus_add (
                        uid = info->UniqueId.String;
                if (info->Valid & ACPI_VALID_CID) {
                        cid_list = &info->CompatibleIdList;
-                       device->pnp.cid_list = ExAllocatePoolWithTag(NonPagedPool,cid_list->ListSize, 'IPCA');
-                       if (device->pnp.cid_list)
-                               memcpy(device->pnp.cid_list, cid_list, cid_list->ListSize);
+                       device->pnp.cid_list = ExAllocatePoolWithTag(NonPagedPool,cid_list->ListSize, 'DpcA');
+                       if (device->pnp.cid_list) {
+                               char *p = (char *)&device->pnp.cid_list->Ids[cid_list->Count];
+                               device->pnp.cid_list->Count = cid_list->Count;
+                               device->pnp.cid_list->ListSize = cid_list->ListSize;
+                               for (i = 0; i < cid_list->Count; i++) {
+                                       device->pnp.cid_list->Ids[i].Length = cid_list->Ids[i].Length;
+                                       device->pnp.cid_list->Ids[i].String = p;
+                                       ASSERT(p + cid_list->Ids[i].Length <= (char *)device->pnp.cid_list + cid_list->ListSize);
+                                       memcpy(device->pnp.cid_list->Ids[i].String,
+                                               cid_list->Ids[i].String, cid_list->Ids[i].Length);
+                                       p += cid_list->Ids[i].Length;
+                               }
+                       }
                        else
                                DPRINT("Memory allocation error\n");
                }
@@ -1326,7 +1331,7 @@ acpi_bus_add (
        }
 
        if (hid) {
-        device->pnp.hardware_id = ExAllocatePoolWithTag(NonPagedPool, strlen(hid) + 1, 'IPCA');
+        device->pnp.hardware_id = ExAllocatePoolWithTag(NonPagedPool, strlen(hid) + 1, 'DpcA');
         if (device->pnp.hardware_id) {
             snprintf(device->pnp.hardware_id, strlen(hid) + 1, "%s", hid);
             device->flags.hardware_id = 1;
@@ -1433,14 +1438,16 @@ acpi_bus_add (
                acpi_bus_find_driver(device);
 
 end:
+       if (info != NULL)
+               ACPI_FREE(info);
        if (result) {
                if (device->pnp.cid_list) {
-                       ExFreePoolWithTag(device->pnp.cid_list, 'IPCA');
+                       ExFreePoolWithTag(device->pnp.cid_list, 'DpcA');
                }
         if (device->pnp.hardware_id) {
-            ExFreePoolWithTag(device->pnp.hardware_id, 'IPCA');
+            ExFreePoolWithTag(device->pnp.hardware_id, 'DpcA');
         }
-               ExFreePoolWithTag(device, 'IPCA');
+               ExFreePoolWithTag(device, 'DpcA');
                return_VALUE(result);
        }
        *child = device;
@@ -1461,13 +1468,13 @@ acpi_bus_remove (
        acpi_device_unregister(device);
 
        if (device->pnp.cid_list)
-               ExFreePoolWithTag(device->pnp.cid_list, 'IPCA');
+               ExFreePoolWithTag(device->pnp.cid_list, 'DpcA');
 
     if (device->pnp.hardware_id)
-        ExFreePoolWithTag(device->pnp.hardware_id, 'IPCA');
+        ExFreePoolWithTag(device->pnp.hardware_id, 'DpcA');
 
        if (device)
-               ExFreePoolWithTag(device, 'IPCA');
+               ExFreePoolWithTag(device, 'DpcA');
 
        return_VALUE(0);
 }
@@ -1672,7 +1679,7 @@ acpi_bus_init (void)
        /*
         * Register the for all standard device notifications.
         */
-       status = AcpiInstallNotifyHandler(ACPI_ROOT_OBJECT, ACPI_SYSTEM_NOTIFY, &acpi_bus_notify, NULL);
+       status = AcpiInstallNotifyHandler(ACPI_ROOT_OBJECT, ACPI_SYSTEM_NOTIFY, acpi_bus_notify, NULL);
        if (ACPI_FAILURE(status)) {
                DPRINT1("Unable to register for device notifications\n");
                result = AE_NOT_FOUND;
@@ -1703,7 +1710,7 @@ acpi_bus_init (void)
        /* Mimic structured exception handling */
 error2:
        AcpiRemoveNotifyHandler(ACPI_ROOT_OBJECT,
-               ACPI_SYSTEM_NOTIFY, &acpi_bus_notify);
+               ACPI_SYSTEM_NOTIFY, acpi_bus_notify);
 error1:
        AcpiTerminate();
        return_VALUE(AE_NOT_FOUND);
@@ -1752,7 +1759,7 @@ acpi_init (void)
 
        DPRINT("Subsystem revision %08x\n",ACPI_CA_VERSION);
 
-        KeInitializeSpinLock(&acpi_bus_event_lock);
+       KeInitializeSpinLock(&acpi_bus_event_lock);
        KeInitializeEvent(&AcpiEventQueue, NotificationEvent, FALSE);
        ExInitializeFastMutex(&acpi_bus_drivers_lock);