# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#	           ChangeSet	1.1125  -> 1.1126 
#	   drivers/acpi/ec.c	1.13    -> 1.14   
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 03/10/17	len.brown@intel.com	1.1126
# [ACPI] acpi_ec_gpe_query(ec) fix for T40 crash (Shaohua David Li)
# http://bugme.osdl.org/show_bug.cgi?id=1171
# --------------------------------------------
#
diff -Nru a/drivers/acpi/ec.c b/drivers/acpi/ec.c
--- a/drivers/acpi/ec.c	Fri Oct 17 15:25:41 2003
+++ b/drivers/acpi/ec.c	Fri Oct 17 15:25:41 2003
@@ -90,6 +90,13 @@
 /* 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
    -------------------------------------------------------------------------- */
@@ -389,8 +396,11 @@
 
 	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);
 }
 
 /* --------------------------------------------------------------------------
@@ -585,6 +595,8 @@
 	   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);