Merge branches 'release', 'bugzilla-8570', 'bugzilla-9966', 'bugzilla-9998', 'bugzill...
authorLen Brown <len.brown@intel.com>
Thu, 13 Mar 2008 05:59:45 +0000 (01:59 -0400)
committerLen Brown <len.brown@intel.com>
Thu, 13 Mar 2008 05:59:45 +0000 (01:59 -0400)
1  2  3  4  5  6  7  8 
drivers/acpi/ec.c

diff --combined drivers/acpi/ec.c
@@@@@@@@@ -129,6 -129,6 -129,6 -129,7 -129,6 -129,6 -129,6 -129,6 +129,7 @@@@@@@@@ static struct acpi_ec 
                struct mutex lock;
                wait_queue_head_t wait;
                struct list_head list;
+++ ++++        atomic_t irq_count;
                u8 handlers_installed;
        } *boot_ec, *first_ec;
        
@@@@@@@@@ -181,6 -181,6 -181,6 -182,8 -181,6 -181,6 -181,6 -181,6 +182,8 @@@@@@@@@ static int acpi_ec_wait(struct acpi_ec 
        {
                int ret = 0;
        
+++ ++++        atomic_set(&ec->irq_count, 0);
+++ ++++
                if (unlikely(event == ACPI_EC_EVENT_OBF_1 &&
                             test_bit(EC_FLAGS_NO_OBF1_GPE, &ec->flags)))
                        force_poll = 1;
                        while (time_before(jiffies, delay)) {
                                if (acpi_ec_check_status(ec, event))
                                        goto end;
+++ ++++                        msleep(5);
                        }
                }
                pr_err(PREFIX "acpi_ec_wait timeout,"
@@@@@@@@@ -529,6 -529,6 -529,6 -533,13 -529,6 -529,6 -529,6 -529,6 +533,13 @@@@@@@@@ static u32 acpi_ec_gpe_handler(void *da
                struct acpi_ec *ec = data;
        
                pr_debug(PREFIX "~~~> interrupt\n");
+++ ++++        atomic_inc(&ec->irq_count);
+++ ++++        if (atomic_read(&ec->irq_count) > 5) {
+++ ++++                pr_err(PREFIX "GPE storm detected, disabling EC GPE\n");
+++ ++++                acpi_disable_gpe(NULL, ec->gpe, ACPI_ISR);
+++ ++++                clear_bit(EC_FLAGS_GPE_MODE, &ec->flags);
+++ ++++                return ACPI_INTERRUPT_HANDLED;
+++ ++++        }
                clear_bit(EC_FLAGS_WAIT_GPE, &ec->flags);
                if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags))
                        wake_up(&ec->wait);
@@@@@@@@@ -943,11 -943,11 -943,11 -954,11 -943,7 -943,11 -943,11 -943,11 +954,7 @@@@@@@@@ int __init acpi_ec_ecdt_probe(void
                        boot_ec->command_addr = ecdt_ptr->control.address;
                        boot_ec->data_addr = ecdt_ptr->data.address;
                        boot_ec->gpe = ecdt_ptr->gpe;
---- ---                if (ACPI_FAILURE(acpi_get_handle(NULL, ecdt_ptr->id,
---- ---                                &boot_ec->handle))) {
---- ---                        pr_info("Failed to locate handle for boot EC\n");
---- ---                        boot_ec->handle = ACPI_ROOT_OBJECT;
---- ---                }
++++ +++                boot_ec->handle = ACPI_ROOT_OBJECT;
                } else {
                        /* This workaround is needed only on some broken machines,
                         * which require early EC, but fail to provide ECDT */