This one already got the OK of Borislav (ibm_acpi author) See mail: Subject: Re: [PATCH] Fix Thinkpad A21m shutdown Date: Wed, 12 Apr 2006 on this list. Fix Thinkpad A21m shutdown The A21m Thinkpad (maybe also be others, T21,..) have an ACPI GDCK method and an ACPI DOCK device. It seems that on others machines the GDCK is the docking device. Installing the notify handler for a GDCK fails if it is a method an not a device. When module is unloaded it is tried to remove the never installed notify handler for the GDCK method which seems to freeze the machine. Fix: Do not set notify_installed when installing the notify handler fails. Reference: https://bugzilla.novell.org/show_bug.cgi?id=150851 Signed-off-by: Thomas Renninger <mail@xxxxxxxxxxxx> drivers/acpi/ibm_acpi.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) Index: linux-2.6.18-rc2/drivers/acpi/ibm_acpi.c =================================================================== --- linux-2.6.18-rc2.orig/drivers/acpi/ibm_acpi.c +++ linux-2.6.18-rc2/drivers/acpi/ibm_acpi.c @@ -1789,12 +1789,12 @@ static int __init setup_notify(struct ib int ret; if (!*ibm->handle) - return 0; + return 1; ret = acpi_bus_get_device(*ibm->handle, &ibm->device); if (ret < 0) { printk(IBM_ERR "%s device not present\n", ibm->name); - return 0; + return 1; } acpi_driver_data(ibm->device) = ibm; @@ -1884,6 +1884,8 @@ static int __init ibm_init(struct ibm_st ret = setup_notify(ibm); if (ret < 0) return ret; + if (ret > 0) + return 0; ibm->notify_installed = 1; }
Fix Thinkpad A21m shutdown The A21m Thinkpad (maybe also be others, T21,..) have an ACPI GDCK method and an ACPI DOCK device. It seems that on others machines the GDCK is the docking device. Installing the notify handler for a GDCK fails if it is a method an not a device. When module is unloaded it is tried to remove the never installed notify handler for the GDCK method which seems to freeze the machine. Fix: Do not set notify_installed when installing the notify handler fails. Reference: https://bugzilla.novell.org/show_bug.cgi?id=150851 Signed-off-by: Thomas Renninger <mail@xxxxxxxxxxxx> drivers/acpi/ibm_acpi.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) Index: linux-2.6.18-rc2/drivers/acpi/ibm_acpi.c =================================================================== --- linux-2.6.18-rc2.orig/drivers/acpi/ibm_acpi.c +++ linux-2.6.18-rc2/drivers/acpi/ibm_acpi.c @@ -1789,12 +1789,12 @@ static int __init setup_notify(struct ib int ret; if (!*ibm->handle) - return 0; + return 1; ret = acpi_bus_get_device(*ibm->handle, &ibm->device); if (ret < 0) { printk(IBM_ERR "%s device not present\n", ibm->name); - return 0; + return 1; } acpi_driver_data(ibm->device) = ibm; @@ -1884,6 +1884,8 @@ static int __init ibm_init(struct ibm_st ret = setup_notify(ibm); if (ret < 0) return ret; + if (ret > 0) + return 0; ibm->notify_installed = 1; }