From: Matthew Garrett <mjg@redhat.com> Date: Thu, 30 Oct 2008 13:33:03 +0000 Subject: [acpi] fix boot hang on old systems without _CST methods Message-id: 20081030133303.GA30703@srcf.ucam.org O-Subject: [RHEL 5.3 PATCH] Bug #467927 - fix boot hang on old systems without _CST methods Bugzilla: 467927 RH-Acked-by: Peter Martuccelli <peterm@redhat.com> RH-Acked-by: Aristeu Rozanski <aris@redhat.com> The fix for 443516 means that advertised C3 states will be entered even if the system does not have a bm_control flag set to indicate support for OS/hardware DMA arbitration. This turns out to cause problems on older systems. The Windows behaviour is to only enter C3 on such systems if C state transition information is exported via a _CST method. This patch adds an extra check in the C3 verification routine and has been verified to fix the system in 467927 that otherwise hangs on boot. This is a backport of upstream commit ed3110efb538d7acbf635095c1382118f7414f75 . diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index ce47f96..f40b175 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c @@ -843,11 +843,17 @@ static void acpi_processor_power_verify_c3(struct acpi_processor *pr, } if (pr->flags.bm_check) { - /* bus mastering control is necessary */ if (!pr->flags.bm_control) { - /* In this case we enter C3 without bus mastering */ - ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "C3 support without bus mastering control\n")); + if (pr->flags.has_cst != 1) { + /* bus mastering control is necessary */ + ACPI_DEBUG_PRINT((ACPI_DB_INFO, + "C3 support requires BM control\n")); + return; + } else { + /* Here we enter C3 without bus mastering */ + ACPI_DEBUG_PRINT((ACPI_DB_INFO, + "C3 support without BM control\n")); + } } } else { /*