Index: sys/dev/acpica/acpi.c =================================================================== --- sys/dev/acpica/acpi.c (revision 237459) +++ sys/dev/acpica/acpi.c (working copy) @@ -1855,7 +1855,6 @@ acpi_probe_order(ACPI_HANDLE handle, int *order) static ACPI_STATUS acpi_probe_child(ACPI_HANDLE handle, UINT32 level, void *context, void **status) { - struct acpi_prw_data prw; ACPI_OBJECT_TYPE type; ACPI_HANDLE h; device_t bus, child; @@ -1885,8 +1884,6 @@ acpi_probe_child(ACPI_HANDLE handle, UINT32 level, if (strcmp(handle_str, "\\_SB_") == 0 || strcmp(handle_str, "\\_TZ_") == 0) break; - if (acpi_parse_prw(handle, &prw) == 0) - AcpiSetupGpeForWake(handle, prw.gpe_handle, prw.gpe_bit); /* * Ignore devices that do not have a _HID or _CID. They should @@ -2834,7 +2831,6 @@ int acpi_wake_set_enable(device_t dev, int enable) { struct acpi_prw_data prw; - ACPI_STATUS status; int flags; /* Make sure the device supports waking the system and get the GPE. */ @@ -2842,23 +2838,10 @@ acpi_wake_set_enable(device_t dev, int enable) return (ENXIO); flags = acpi_get_flags(dev); - if (enable) { - status = AcpiSetGpeWakeMask(prw.gpe_handle, prw.gpe_bit, - ACPI_GPE_ENABLE); - if (ACPI_FAILURE(status)) { - device_printf(dev, "enable wake failed\n"); - return (ENXIO); - } + if (enable) acpi_set_flags(dev, flags | ACPI_FLAG_WAKE_ENABLED); - } else { - status = AcpiSetGpeWakeMask(prw.gpe_handle, prw.gpe_bit, - ACPI_GPE_DISABLE); - if (ACPI_FAILURE(status)) { - device_printf(dev, "disable wake failed\n"); - return (ENXIO); - } + else acpi_set_flags(dev, flags & ~ACPI_FLAG_WAKE_ENABLED); - } return (0); } @@ -2868,10 +2851,15 @@ acpi_wake_sleep_prep(ACPI_HANDLE handle, int sstat { struct acpi_prw_data prw; device_t dev; + ACPI_STATUS status; /* Check that this is a wake-capable device and get its GPE. */ if (acpi_parse_prw(handle, &prw) != 0) return (ENXIO); + + status = AcpiSetupGpeForWake(handle, prw.gpe_handle, prw.gpe_bit); + if (ACPI_FAILURE(status) && status != AE_ALREADY_EXISTS) + return (ENXIO); dev = acpi_get_device(handle); /* @@ -2887,7 +2875,8 @@ acpi_wake_sleep_prep(ACPI_HANDLE handle, int sstat device_printf(dev, "wake_prep disabled wake for %s (S%d)\n", acpi_name(handle), sstate); } else if (dev && (acpi_get_flags(dev) & ACPI_FLAG_WAKE_ENABLED) != 0) { - acpi_pwr_wake_enable(handle, 1); + AcpiSetGpeWakeMask(prw.gpe_handle, prw.gpe_bit, ACPI_GPE_ENABLE); + acpi_pwr_wake_enable(handle, &prw, 1); acpi_SetInteger(handle, "_PSW", 1); if (bootverbose) device_printf(dev, "wake_prep enabled for %s (S%d)\n", @@ -2923,8 +2912,9 @@ acpi_wake_run_prep(ACPI_HANDLE handle, int sstate) if (bootverbose) device_printf(dev, "run_prep re-enabled %s\n", acpi_name(handle)); } else { + AcpiSetGpeWakeMask(prw.gpe_handle, prw.gpe_bit, ACPI_GPE_DISABLE); acpi_SetInteger(handle, "_PSW", 0); - acpi_pwr_wake_enable(handle, 0); + acpi_pwr_wake_enable(handle, &prw, 0); if (bootverbose) device_printf(dev, "run_prep cleaned up for %s\n", acpi_name(handle)); Index: sys/dev/acpica/acpi_button.c =================================================================== --- sys/dev/acpica/acpi_button.c (revision 237459) +++ sys/dev/acpica/acpi_button.c (working copy) @@ -165,9 +165,10 @@ acpi_button_attach(device_t dev) } /* Enable the GPE for wake/runtime. */ - acpi_wake_set_enable(dev, 1); - if (acpi_parse_prw(sc->button_handle, &prw) == 0) + if (acpi_parse_prw(sc->button_handle, &prw) == 0) { + acpi_set_flags(dev, ACPI_FLAG_WAKE_ENABLED); AcpiEnableGpe(prw.gpe_handle, prw.gpe_bit); + } return_VALUE (0); } Index: sys/dev/acpica/acpi_lid.c =================================================================== --- sys/dev/acpica/acpi_lid.c (revision 237459) +++ sys/dev/acpica/acpi_lid.c (working copy) @@ -116,9 +116,10 @@ acpi_lid_attach(device_t dev) acpi_lid_notify_handler, sc); /* Enable the GPE for wake/runtime. */ - acpi_wake_set_enable(dev, 1); - if (acpi_parse_prw(sc->lid_handle, &prw) == 0) + if (acpi_parse_prw(sc->lid_handle, &prw) == 0) { + acpi_set_flags(dev, ACPI_FLAG_WAKE_ENABLED); AcpiEnableGpe(prw.gpe_handle, prw.gpe_bit); + } return (0); } Index: sys/dev/acpica/acpi_powerres.c =================================================================== --- sys/dev/acpica/acpi_powerres.c (revision 237459) +++ sys/dev/acpica/acpi_powerres.c (working copy) @@ -502,16 +502,16 @@ out: /* Enable or disable a power resource for wake */ ACPI_STATUS -acpi_pwr_wake_enable(ACPI_HANDLE consumer, int enable) +acpi_pwr_wake_enable(ACPI_HANDLE consumer, struct acpi_prw_data *prw, + int enable) { ACPI_STATUS status; struct acpi_powerconsumer *pc; - struct acpi_prw_data prw; int i; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - if (consumer == NULL) + if (consumer == NULL || prw == NULL) return (AE_BAD_PARAMETER); ACPI_SERIAL_BEGIN(powerres); @@ -522,16 +522,13 @@ ACPI_STATUS panic("acpi wake added power consumer but can't find it"); } - status = AE_OK; - if (acpi_parse_prw(consumer, &prw) != 0) - goto out; - for (i = 0; i < prw.power_res_count; i++) + for (i = 0; i < prw->power_res_count; i++) if (enable) - acpi_pwr_reference_resource(&prw.power_res[i], pc); + acpi_pwr_reference_resource(&prw->power_res[i], pc); else acpi_pwr_dereference_resource(pc); - if (prw.power_res_count > 0) + if (prw->power_res_count > 0) acpi_pwr_switch_power(); out: Index: sys/dev/acpica/acpivar.h =================================================================== --- sys/dev/acpica/acpivar.h (revision 237459) +++ sys/dev/acpica/acpivar.h (working copy) @@ -403,7 +403,8 @@ EVENTHANDLER_DECLARE(acpi_sleep_event, acpi_event_ EVENTHANDLER_DECLARE(acpi_wakeup_event, acpi_event_handler_t); /* Device power control. */ -ACPI_STATUS acpi_pwr_wake_enable(ACPI_HANDLE consumer, int enable); +ACPI_STATUS acpi_pwr_wake_enable(ACPI_HANDLE consumer, + struct acpi_prw_data *, int enable); ACPI_STATUS acpi_pwr_switch_consumer(ACPI_HANDLE consumer, int state); int acpi_device_pwr_for_sleep(device_t bus, device_t dev, int *dstate);