summaryrefslogtreecommitdiffstats
path: root/sys/dev/acpica
diff options
context:
space:
mode:
authornjl <njl@FreeBSD.org>2006-06-11 20:31:41 +0000
committernjl <njl@FreeBSD.org>2006-06-11 20:31:41 +0000
commit10be3320d84f39b175a9c4953aa07a8a91eeff8b (patch)
treea57ee72caeb394b96c715accbee0370637f52139 /sys/dev/acpica
parent5ec37c2386324112b5437ea5f6241d0ca49dca39 (diff)
downloadFreeBSD-src-10be3320d84f39b175a9c4953aa07a8a91eeff8b.zip
FreeBSD-src-10be3320d84f39b175a9c4953aa07a8a91eeff8b.tar.gz
By default, don't disable ACPI during reboot. This appears to hang some
systems. Introduce a new sysctl "hw.acpi.disable_on_reboot" that allows users to re-enable the old behavior in case it's needed for some systems. We never disable in the power-off path. Original approach submitted by Alexander Logvinov <abuse@akavia.ru> with reworking by Jung-uk Kim and myself.
Diffstat (limited to 'sys/dev/acpica')
-rw-r--r--sys/dev/acpica/acpi.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/sys/dev/acpica/acpi.c b/sys/dev/acpica/acpi.c
index 9fe6abc..d740a3a 100644
--- a/sys/dev/acpica/acpi.c
+++ b/sys/dev/acpica/acpi.c
@@ -522,6 +522,9 @@ acpi_attach(device_t dev)
OID_AUTO, "s4bios", CTLFLAG_RW, &sc->acpi_s4bios, 0, "S4BIOS mode");
SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
OID_AUTO, "verbose", CTLFLAG_RW, &sc->acpi_verbose, 0, "verbose mode");
+ SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
+ OID_AUTO, "disable_on_reboot", CTLFLAG_RW,
+ &sc->acpi_do_disable, 0, "Disable ACPI when rebooting/halting system");
/*
* Default to 1 second before sleeping to give some machines time to
@@ -1630,13 +1633,15 @@ acpi_fake_objhandler(ACPI_HANDLE h, UINT32 fn, void *data)
static void
acpi_shutdown_final(void *arg, int howto)
{
- ACPI_STATUS status;
+ struct acpi_softc *sc;
+ ACPI_STATUS status;
/*
* XXX Shutdown code should only run on the BSP (cpuid 0).
* Some chipsets do not power off the system correctly if called from
* an AP.
*/
+ sc = arg;
if ((howto & RB_POWEROFF) != 0) {
status = AcpiEnterSleepStatePrep(ACPI_STATE_S5);
if (ACPI_FAILURE(status)) {
@@ -1653,7 +1658,8 @@ acpi_shutdown_final(void *arg, int howto)
DELAY(1000000);
printf("ACPI power-off failed - timeout\n");
}
- } else if ((howto & RB_AUTOBOOT) != 0 && AcpiGbl_FADT->ResetRegSup) {
+ } else if ((howto & RB_HALT) == 0 && AcpiGbl_FADT->ResetRegSup) {
+ /* Reboot using the reset register. */
status = AcpiHwLowLevelWrite(
AcpiGbl_FADT->ResetRegister.RegisterBitWidth,
AcpiGbl_FADT->ResetValue, &AcpiGbl_FADT->ResetRegister);
@@ -1663,7 +1669,11 @@ acpi_shutdown_final(void *arg, int howto)
DELAY(1000000);
printf("ACPI reset failed - timeout\n");
}
- } else if (panicstr == NULL) {
+ } else if (sc->acpi_do_disable && panicstr == NULL) {
+ /*
+ * Only disable ACPI if the user requested. On some systems, writing
+ * the disable value to SMI_CMD hangs the system.
+ */
printf("Shutting down ACPI\n");
AcpiTerminate();
}
OpenPOWER on IntegriCloud