If we got an OBE/IBF event, we failed to re-enable the GPE. This would

cause the EC to stop handling future events because the GPE stayed masked.
Set a flag when queueing a GPE handler since it will ultimately re-enable
the GPE.  In all other cases, re-enable it ourselves.  I reworked the
patch from the submitter.

Submitted by:	Rong-en Fan <grafan@gmail.com>
This commit is contained in:
Nate Lawson 2007-03-20 00:58:19 +00:00
parent ec002fee99
commit 6e141df200
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=167730

View File

@ -787,6 +787,7 @@ EcGpeHandler(void *Context)
struct acpi_ec_softc *sc = Context;
ACPI_STATUS Status;
EC_STATUS EcStatus;
int query_pend;
KASSERT(Context != NULL, ("EcGpeHandler called with NULL"));
@ -821,6 +822,7 @@ EcGpeHandler(void *Context)
* it along to any potential waiters as it may be an IBE/OBF event.
* If it is set, queue a query handler.
*/
query_pend = FALSE;
if ((EcStatus & EC_EVENT_SCI) == 0) {
CTR1(KTR_ACPI, "ec event was IBE/OBF, status %#x", EcStatus);
sc->ec_csrvalue = EcStatus;
@ -832,12 +834,19 @@ EcGpeHandler(void *Context)
Context);
if (ACPI_SUCCESS(Status)) {
sc->ec_sci_pend = TRUE;
} else {
query_pend = TRUE;
} else
printf("Queuing GPE query handler failed.\n");
Status = AcpiEnableGpe(sc->ec_gpehandle, sc->ec_gpebit, ACPI_ISR);
if (ACPI_FAILURE(Status))
printf("EcGpeHandler: AcpiEnableEvent failed\n");
}
}
/*
* If we didn't queue a query handler, which will eventually re-enable
* the GPE, re-enable it right now so we can get more events.
*/
if (!query_pend) {
Status = AcpiEnableGpe(sc->ec_gpehandle, sc->ec_gpebit, ACPI_ISR);
if (ACPI_FAILURE(Status))
printf("EcGpeHandler: AcpiEnableGpe failed\n");
}
EcUnlock(sc);