Some particular Acer/Packard Bell machines hang during shutdown. The system completely hangs while doing bit operations for turning on SLP_EN bit in ACPI PM1A control address and Sleep Control Register. Thus the normal acpi_power_off path can never complete the shutdown process. We have found a workaround to force these systems to use EFI for poweroff, included below, but I wonder if anything better can be done. It is especially not ideal because the system hangs the same way when going into suspend and we don't have a workaround for that. Any debugging tips for how to diagnose such problems? Thanks Daniel --- drivers/firmware/efi/reboot.c | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/drivers/firmware/efi/reboot.c b/drivers/firmware/efi/reboot.c index 62ead9b..6d1496d 100644 --- a/drivers/firmware/efi/reboot.c +++ b/drivers/firmware/efi/reboot.c @@ -4,6 +4,7 @@ */ #include <linux/efi.h> #include <linux/reboot.h> +#include <linux/dmi.h> int efi_reboot_quirk_mode = -1; @@ -43,6 +44,45 @@ void efi_reboot(enum reboot_mode reboot_mode, const char *__unused) efi.reset_system(efi_mode, EFI_SUCCESS, 0, NULL); } +static const struct dmi_system_id force_efi_poweroff[] = { + { + .ident = "Packard Bell Easynote ENLG81AP", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Packard Bell"), + DMI_MATCH(DMI_PRODUCT_NAME, "Easynote ENLG81AP"), + }, + }, + { + .ident = "Packard Bell Easynote ENTE69AP", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Packard Bell"), + DMI_MATCH(DMI_PRODUCT_NAME, "Easynote ENTE69AP"), + }, + }, + { + .ident = "Acer Aspire ES1-533", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-533"), + }, + }, + { + .ident = "Acer Aspire ES1-732", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-732"), + }, + }, + {} +}; + +bool efi_poweroff_forced(void) +{ + if (dmi_check_system(force_efi_poweroff)) + return true; + return false; +} + bool __weak efi_poweroff_required(void) { return false; @@ -58,7 +98,7 @@ static int __init efi_shutdown_init(void) if (!efi_enabled(EFI_RUNTIME_SERVICES)) return -ENODEV; - if (efi_poweroff_required()) + if (efi_poweroff_required() || efi_poweroff_forced()) pm_power_off = efi_power_off; return 0; -- 2.9.3 -- To unsubscribe from this list: send the line "unsubscribe linux-efi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html