struct mutex lock;
wait_queue_head_t wait;
struct list_head list;
+++ ++++ atomic_t irq_count;
u8 handlers_installed;
} *boot_ec, *first_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,"
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);
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 */