If the EC fails to go into burst mode for whatever reason, the Burst Acknowledge byte will not be there to read, which means the status won't have EC_STAT_OBF, which means acpiec_wait will spin forever, hanging the machine.
This at least gets us moving again, ignoring the failure to enter burst mode. diff --git a/sys/dev/acpi/acpiec.c b/sys/dev/acpi/acpiec.c index a7627b8..c280410 100644 --- a/sys/dev/acpi/acpiec.c +++ b/sys/dev/acpi/acpiec.c @@ -130,6 +130,7 @@ acpiec_write_cmd(struct acpiec_softc *sc, u_int8_t val) acpiec_wait(sc, EC_STAT_IBF, 0); dnprintf(40, "acpiec: write_cmd -- %d\n", (int)val); bus_space_write_1(sc->sc_cmd_bt, sc->sc_cmd_bh, 0, val); + acpiec_wait(sc, EC_STAT_IBF, 0); } u_int8_t @@ -196,7 +197,10 @@ void acpiec_burst_enable(struct acpiec_softc *sc) { acpiec_write_cmd(sc, EC_CMD_BE); - acpiec_read_data(sc); + if (acpiec_status(sc) & (EC_STAT_BURST|EC_STAT_OBF)) + acpiec_read_data(sc); + else + dnprintf(10, "%s: failed to enter burst mode\n", DEVNAME(sc)); } void