summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authorjkim <jkim@FreeBSD.org>2012-03-27 23:26:58 +0000
committerjkim <jkim@FreeBSD.org>2012-03-27 23:26:58 +0000
commit5ca6fae2c396941500b8bfcba7b6454abfbfdf33 (patch)
tree580d55f089aa17ccc5eb3255c2f4c2a6326a5e0e /sys/dev
parent0d733393340b7a2fe7ac702939e144d32784779a (diff)
downloadFreeBSD-src-5ca6fae2c396941500b8bfcba7b6454abfbfdf33.zip
FreeBSD-src-5ca6fae2c396941500b8bfcba7b6454abfbfdf33.tar.gz
Restore interrupt state after executing AcpiEnterSleepState().
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/acpica/acpi.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/sys/dev/acpica/acpi.c b/sys/dev/acpica/acpi.c
index ba10ea8..d1db7c9 100644
--- a/sys/dev/acpica/acpi.c
+++ b/sys/dev/acpica/acpi.c
@@ -1968,6 +1968,7 @@ static void
acpi_shutdown_final(void *arg, int howto)
{
struct acpi_softc *sc = (struct acpi_softc *)arg;
+ register_t intr;
ACPI_STATUS status;
/*
@@ -1983,13 +1984,15 @@ acpi_shutdown_final(void *arg, int howto)
return;
}
device_printf(sc->acpi_dev, "Powering system off\n");
- ACPI_DISABLE_IRQS();
+ intr = intr_disable();
status = AcpiEnterSleepState(ACPI_STATE_S5, acpi_sleep_flags);
- if (ACPI_FAILURE(status))
+ if (ACPI_FAILURE(status)) {
+ intr_restore(intr);
device_printf(sc->acpi_dev, "power-off failed - %s\n",
AcpiFormatException(status));
- else {
+ } else {
DELAY(1000000);
+ intr_restore(intr);
device_printf(sc->acpi_dev, "power-off failed - timeout\n");
}
} else if ((howto & RB_HALT) == 0 && sc->acpi_handle_reboot) {
@@ -2641,7 +2644,8 @@ enum acpi_sleep_state {
static ACPI_STATUS
acpi_EnterSleepState(struct acpi_softc *sc, int state)
{
- ACPI_STATUS status;
+ register_t intr;
+ ACPI_STATUS status;
enum acpi_sleep_state slp_state;
ACPI_FUNCTION_TRACE_U32((char *)(uintptr_t)__func__, state);
@@ -2730,8 +2734,9 @@ acpi_EnterSleepState(struct acpi_softc *sc, int state)
if (state == ACPI_STATE_S4)
AcpiEnable();
} else {
- ACPI_DISABLE_IRQS();
+ intr = intr_disable();
status = AcpiEnterSleepState(state, acpi_sleep_flags);
+ intr_restore(intr);
if (ACPI_FAILURE(status)) {
device_printf(sc->acpi_dev, "AcpiEnterSleepState failed - %s\n",
AcpiFormatException(status));
OpenPOWER on IntegriCloud