From ae01678e481414c064467f08a16c1b5e19e9370b Mon Sep 17 00:00:00 2001 From: Len Brown Date: Fri, 17 Oct 2003 09:19:54 -0400 Subject: [PATCH] [ACPI] acpi_ec_gpe_query(ec) fix for T40 crash (Shaohua David Li) http://bugme.osdl.org/show_bug.cgi?id=1171 --- drivers/acpi/ec.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index 5b21db55776f9..43736fb76cb62 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c @@ -94,6 +94,13 @@ static struct acpi_ec *ec_ecdt; /* External interfaces use first EC only, so remember */ static struct acpi_device *first_ec; +/* + * We use kernel thread to handle ec's gpe query, so the query may defer. + * The query need a context, which can be freed when we replace ec_ecdt + * with EC device. So defered query may have a wrong context. + * We use an indication to avoid it + */ +static int ec_device_init = 0; /* -------------------------------------------------------------------------- Transaction Management -------------------------------------------------------------------------- */ @@ -393,8 +400,11 @@ acpi_ec_gpe_handler ( acpi_disable_gpe(NULL, ec->gpe_bit, ACPI_ISR); - status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE, - acpi_ec_gpe_query, ec); + if (!ec_device_init) + acpi_ec_gpe_query(ec); /* directly query when device didn't init */ + else + status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE, + acpi_ec_gpe_query, ec); } /* -------------------------------------------------------------------------- @@ -589,6 +599,8 @@ acpi_ec_add ( we now have the *real* EC info, so kill the makeshift one.*/ acpi_evaluate_integer(ec->handle, "_UID", NULL, &uid); if (ec_ecdt && ec_ecdt->uid == uid) { + acpi_disable_gpe(NULL, ec_ecdt->gpe_bit, ACPI_NOT_ISR); + ec_device_init = 1; acpi_remove_address_space_handler(ACPI_ROOT_OBJECT, ACPI_ADR_SPACE_EC, &acpi_ec_space_handler); -- 2.53.0