> Date: Mon, 24 Sep 2012 22:06:24 +0400 > From: Denis Lapshin <deniza...@gmail.com> > > Two years ago Marco issued a patch > http://marc.info/?l=openbsd-tech&m=128612230314484&w=4 in order to > prevent incorrect reading acpitz on HP Compaq (or any HP laptops with > acpiec madness) by adding some delays to have data prepared to > read/write. > > It has been tested and works perfectly fine on some HP laptops: 6510b, > 8510p/w, 8710p/w. > > Please add this patch into the source tree to have it by default.
This is just papering over the problem. Marco didn't really understand what he was doing. Seriously, making a local variable volatile? > Index: acpiec.c > =================================================================== > RCS file: /cvs/src/sys/dev/acpi/acpiec.c,v > retrieving revision 1.43 > diff -u -p -r1.43 acpiec.c > --- acpiec.c 8 Aug 2010 17:25:41 -0000 1.43 > +++ acpiec.c 29 Sep 2010 04:24:13 -0000 > @@ -92,7 +92,7 @@ void > acpiec_wait(struct acpiec_softc *sc, u_int8_t mask, u_int8_t val) > { > static int acpiecnowait; > - u_int8_t stat; > + volatile u_int8_t stat; > > dnprintf(40, "%s: EC wait_ns for: %b == %02x\n", > DEVNAME(sc), (int)mask, > @@ -104,8 +104,14 @@ acpiec_wait(struct acpiec_softc *sc, u_i > if (cold || (stat & EC_STAT_BURST)) > delay(1); > else > - tsleep(&acpiecnowait, PWAIT, "acpiec", 1); > + tsleep(&acpiecnowait, PWAIT, "ecstat", 1); > } > + > + /* delay to make sure the data is actually ready */ > + if (cold) > + delay(10); > + else > + tsleep(&acpiecnowait, PWAIT, "ecout", 1); > > dnprintf(40, "%s: EC wait_ns, stat: %b\n", DEVNAME(sc), (int)stat, > "\20\x8IGN\x7SMI\x6SCI\05BURST\04CMD\03IGN\02IBF\01OBF");