|
@@ -71,9 +71,6 @@ enum ec_command {
|
|
|
#define ACPI_EC_UDELAY_GLK 1000 /* Wait 1ms max. to get global lock */
|
|
|
#define ACPI_EC_MSI_UDELAY 550 /* Wait 550us for MSI EC */
|
|
|
|
|
|
-#define ACPI_EC_STORM_THRESHOLD 8 /* number of false interrupts
|
|
|
- per one transaction */
|
|
|
-
|
|
|
enum {
|
|
|
EC_FLAGS_QUERY_PENDING, /* Query is pending */
|
|
|
EC_FLAGS_GPE_STORM, /* GPE storm detected */
|
|
@@ -87,6 +84,15 @@ static unsigned int ec_delay __read_mostly = ACPI_EC_DELAY;
|
|
|
module_param(ec_delay, uint, 0644);
|
|
|
MODULE_PARM_DESC(ec_delay, "Timeout(ms) waited until an EC command completes");
|
|
|
|
|
|
+/*
|
|
|
+ * If the number of false interrupts per one transaction exceeds
|
|
|
+ * this threshold, will think there is a GPE storm happened and
|
|
|
+ * will disable the GPE for normal transaction.
|
|
|
+ */
|
|
|
+static unsigned int ec_storm_threshold __read_mostly = 8;
|
|
|
+module_param(ec_storm_threshold, uint, 0644);
|
|
|
+MODULE_PARM_DESC(ec_storm_threshold, "Maxim false GPE numbers not considered as GPE storm");
|
|
|
+
|
|
|
/* If we find an EC via the ECDT, we need to keep a ptr to its context */
|
|
|
/* External interfaces use first EC only, so remember */
|
|
|
typedef int (*acpi_ec_query_func) (void *data);
|
|
@@ -319,7 +325,7 @@ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t)
|
|
|
msleep(1);
|
|
|
/* It is safe to enable the GPE outside of the transaction. */
|
|
|
acpi_enable_gpe(NULL, ec->gpe);
|
|
|
- } else if (t->irq_count > ACPI_EC_STORM_THRESHOLD) {
|
|
|
+ } else if (t->irq_count > ec_storm_threshold) {
|
|
|
pr_info(PREFIX "GPE storm detected, "
|
|
|
"transactions will use polling mode\n");
|
|
|
set_bit(EC_FLAGS_GPE_STORM, &ec->flags);
|