From 01f964efebc3ee74f0733fbdf921817ddb6c1a6f Mon Sep 17 00:00:00 2001 From: Fredrik Holmqvist Date: Wed, 8 Sep 2010 19:19:49 +0000 Subject: [PATCH] Introduce a gSystemShutdown flag to be able to check if system is shutting down. ACPI Embedded Controller now uses polling when it is set to true. This might help with ACPI shutdown issues, if not this change can be reverted. Not verified as it works on all my machines even without this. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38585 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/kernel/kernel.h | 1 + .../kernel/bus_managers/acpi/acpi_embedded_controller.cpp | 4 ++-- src/system/kernel/main.cpp | 1 + src/system/kernel/shutdown.cpp | 2 ++ 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/headers/private/kernel/kernel.h b/headers/private/kernel/kernel.h index 56117b9f26..1fabbad0c0 100644 --- a/headers/private/kernel/kernel.h +++ b/headers/private/kernel/kernel.h @@ -49,6 +49,7 @@ /* during kernel startup, interrupts are disabled (among other things) */ extern bool gKernelStartup; +extern bool gKernelShutdown; #ifdef __cplusplus diff --git a/src/add-ons/kernel/bus_managers/acpi/acpi_embedded_controller.cpp b/src/add-ons/kernel/bus_managers/acpi/acpi_embedded_controller.cpp index 3bf86385b1..01e1135feb 100644 --- a/src/add-ons/kernel/bus_managers/acpi/acpi_embedded_controller.cpp +++ b/src/add-ons/kernel/bus_managers/acpi/acpi_embedded_controller.cpp @@ -604,7 +604,7 @@ EcSpaceHandler(uint32 function, acpi_physical_address address, uint32 width, * (Not sure if it's needed) */ - if (gKernelStartup || sc->ec_suspending) { + if (gKernelStartup || gKernelShutdown || sc->ec_suspending) { if ((EC_GET_CSR(sc) & EC_EVENT_SCI)) { //CTR0(KTR_ACPI, "ec running gpe handler directly"); EcGpeQueryHandler(sc); @@ -667,7 +667,7 @@ EcWaitEvent(struct acpi_ec_cookie* sc, EC_EVENT event, int32 generationCount) int32 count, i; // int need_poll = cold || rebooting || ec_polled_mode || sc->ec_suspending; - int needPoll = ec_polled_mode || sc->ec_suspending || gKernelStartup; + int needPoll = ec_polled_mode || sc->ec_suspending || gKernelStartup || gKernelShutdown; // The main CPU should be much faster than the EC. So the status should // be "not ready" when we start waiting. But if the main CPU is really diff --git a/src/system/kernel/main.cpp b/src/system/kernel/main.cpp index bd5cee8c12..b56c334557 100644 --- a/src/system/kernel/main.cpp +++ b/src/system/kernel/main.cpp @@ -64,6 +64,7 @@ #endif bool gKernelStartup = true; +bool gKernelShutdown = false; static kernel_args sKernelArgs; static uint32 sCpuRendezvous; diff --git a/src/system/kernel/shutdown.cpp b/src/system/kernel/shutdown.cpp index 16b8056fb6..7759b677de 100644 --- a/src/system/kernel/shutdown.cpp +++ b/src/system/kernel/shutdown.cpp @@ -15,6 +15,8 @@ system_shutdown(bool reboot) int32 cookie = 0; team_info info; + gKernelShutdown = true; + // Now shutdown all system services! // TODO: Once we are sure we can shutdown the system on all hardware // checking reboot may not be necessary anymore.