diff options
author | Jordan Hargrave <jordan@cvs.openbsd.org> | 2006-11-25 16:25:54 +0000 |
---|---|---|
committer | Jordan Hargrave <jordan@cvs.openbsd.org> | 2006-11-25 16:25:54 +0000 |
commit | 4f8c985557c57a61fe9c8836eee54d484be827c9 (patch) | |
tree | 103fd25e972444bc73a4d09b8f7af61e5ea2118b /sys/dev | |
parent | 71f29fbb42e8da8bcd0986a633a14c3d64c6e3e1 (diff) |
Fixed acpiec code for deadlock
acpiec events are handled at GPE/thread context, no longer need wakeup
cVS: ----------------------------------------------------------------------
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/acpi/acpiec.c | 36 |
1 files changed, 4 insertions, 32 deletions
diff --git a/sys/dev/acpi/acpiec.c b/sys/dev/acpi/acpiec.c index be45f654f19..1e586e99273 100644 --- a/sys/dev/acpi/acpiec.c +++ b/sys/dev/acpi/acpiec.c @@ -1,4 +1,4 @@ -/* $OpenBSD: acpiec.c,v 1.7 2006/10/15 15:28:32 jordan Exp $ */ +/* $OpenBSD: acpiec.c,v 1.8 2006/11/25 16:25:53 jordan Exp $ */ /* * Copyright (c) 2006 Can Erkin Acar <canacar@openbsd.org> * @@ -81,7 +81,6 @@ struct aml_node *aml_find_name(struct acpi_softc *, struct aml_node *, #define ACPIEC_MAX_EVENTS 256 struct acpiec_event { struct aml_node *event; - int active; }; struct acpiec_softc { @@ -98,10 +97,9 @@ struct acpiec_softc { struct acpi_softc *sc_acpi; struct aml_node *sc_devnode; u_int32_t sc_gpe; - struct acpiec_event sc_events[ACPIEC_MAX_EVENTS]; + struct acpiec_event sc_events[ACPIEC_MAX_EVENTS]; struct rwlock sc_lock; int sc_locked; - int sc_pending; }; @@ -129,7 +127,7 @@ acpiec_intr(struct acpiec_softc *sc) if ((stat & EC_STAT_SCI_EVT) != 0 && sc->sc_locked == 0) acpiec_sci_event(sc); - return (sc->sc_pending); + return (0); } void @@ -209,12 +207,7 @@ acpiec_sci_event(struct acpiec_softc *sc) evt = bus_space_read_1(sc->sc_data_bt, sc->sc_data_bh, 0); dnprintf(10, "%s: sci_event: 0x%02x\n", DEVNAME(sc), (int) evt); - - sc->sc_events[evt].active = 1; - sc->sc_pending = 1; - - sc->sc_acpi->sc_wakeup = 0; - wakeup(sc->sc_acpi); + aml_evalnode(sc->sc_acpi, sc->sc_events[evt].event, 0, NULL, NULL); } u_int8_t @@ -368,27 +361,6 @@ acpiec_gpehandler(struct acpi_softc *acpi_sc, int gpe, void *arg) return (0); } -void -acpiec_handle_events(struct acpiec_softc *sc) -{ - int idx; - - if (sc->sc_pending == 0) - return; - - sc->sc_pending = 0; - - for (idx = 0; idx < ACPIEC_MAX_EVENTS; idx++) { - if (sc->sc_events[idx].active == 0 || - sc->sc_events[idx].event == NULL) - continue; - dnprintf(10, "%s: handling event 0x%02x\n", DEVNAME(sc), idx); - aml_evalnode(sc->sc_acpi, sc->sc_events[idx].event, 0, NULL, NULL); - sc->sc_events[idx].active = 0; - } -} - - /* parse the resource buffer to get a 'register' value */ int acpiec_getregister(const u_int8_t *buf, int size, int *type, bus_size_t *addr) |