|
@@ -286,7 +286,8 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,
|
|
acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
|
|
acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
|
|
} else if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags) &&
|
|
} else if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags) &&
|
|
t->irq_count > ACPI_EC_STORM_THRESHOLD) {
|
|
t->irq_count > ACPI_EC_STORM_THRESHOLD) {
|
|
- pr_debug(PREFIX "GPE storm detected\n");
|
|
|
|
|
|
+ pr_info(PREFIX "GPE storm detected, "
|
|
|
|
+ "transactions will use polling mode\n");
|
|
set_bit(EC_FLAGS_GPE_STORM, &ec->flags);
|
|
set_bit(EC_FLAGS_GPE_STORM, &ec->flags);
|
|
}
|
|
}
|
|
return ret;
|
|
return ret;
|
|
@@ -566,9 +567,15 @@ static u32 acpi_ec_gpe_handler(void *data)
|
|
if (!test_bit(EC_FLAGS_GPE_MODE, &ec->flags) &&
|
|
if (!test_bit(EC_FLAGS_GPE_MODE, &ec->flags) &&
|
|
!test_bit(EC_FLAGS_NO_GPE, &ec->flags)) {
|
|
!test_bit(EC_FLAGS_NO_GPE, &ec->flags)) {
|
|
/* this is non-query, must be confirmation */
|
|
/* this is non-query, must be confirmation */
|
|
- if (printk_ratelimit())
|
|
|
|
- pr_info(PREFIX "non-query interrupt received,"
|
|
|
|
|
|
+ if (!test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) {
|
|
|
|
+ if (printk_ratelimit())
|
|
|
|
+ pr_info(PREFIX "non-query interrupt received,"
|
|
|
|
+ " switching to interrupt mode\n");
|
|
|
|
+ } else {
|
|
|
|
+ /* hush, STORM switches the mode every transaction */
|
|
|
|
+ pr_debug(PREFIX "non-query interrupt received,"
|
|
" switching to interrupt mode\n");
|
|
" switching to interrupt mode\n");
|
|
|
|
+ }
|
|
set_bit(EC_FLAGS_GPE_MODE, &ec->flags);
|
|
set_bit(EC_FLAGS_GPE_MODE, &ec->flags);
|
|
}
|
|
}
|
|
return ACPI_INTERRUPT_HANDLED;
|
|
return ACPI_INTERRUPT_HANDLED;
|