On Fri, Oct 01, 2010 at 08:36:30PM +0600, Alexandr Shadchin wrote: > On Fri, Oct 01, 2010 at 01:23:17AM -0400, Kenneth R Westerback wrote: > > > > And it keeps my eeePC 1000HE working. Excellent!! > > > > Anyone else have problems left after this diff? If not, then let's get it > > in and go forward from here. > > > > .... Ken > > I was having problems with pckbc_flush() in pms_change_state(), > but now everything is normal. Try this diff. > > -- > Alexandr Shadchin
I will test this when I get home tonight. If Ian's problems are still addressed and no one else speaks up, I will commit when my test is successful. .... Ken > > Index: pms.c > =================================================================== > RCS file: /cvs/src/sys/dev/pckbc/pms.c,v > retrieving revision 1.6 > diff -u -p -r1.6 pms.c > --- pms.c 29 Sep 2010 19:39:18 -0000 1.6 > +++ pms.c 1 Oct 2010 14:00:35 -0000 > @@ -49,6 +49,7 @@ struct pms_softc { /* driver status inf > #define PMS_STATE_ENABLED 1 > #define PMS_STATE_SUSPENDED 2 > > + int poll; > int intelli; > int inputstate; > u_int buttons, oldbuttons; /* mouse button status */ > @@ -72,7 +73,9 @@ int pms_ioctl(void *, u_long, caddr_t, i > int pms_enable(void *); > void pms_disable(void *); > > -int pms_setintellimode(pckbc_tag_t, pckbc_slot_t); > +int pms_cmd(struct pms_softc *, u_char *, int, u_char *, int); > + > +int pms_setintellimode(struct pms_softc *sc); > > const struct wsmouse_accessops pms_accessops = { > pms_enable, > @@ -81,7 +84,19 @@ const struct wsmouse_accessops pms_acces > }; > > int > -pms_setintellimode(pckbc_tag_t tag, pckbc_slot_t slot) > +pms_cmd(struct pms_softc *sc, u_char *cmd, int len, u_char *resp, int > resplen) > +{ > + if (sc->poll) { > + return pckbc_poll_cmd(sc->sc_kbctag, sc->sc_kbcslot, > + cmd, len, resplen, resp, 1); > + } else { > + return pckbc_enqueue_cmd(sc->sc_kbctag, sc->sc_kbcslot, > + cmd, len, resplen, 1, resp); > + } > +} > + > +int > +pms_setintellimode(struct pms_softc *sc) > { > u_char cmd[2], resp[1]; > int i, res; > @@ -90,13 +105,13 @@ pms_setintellimode(pckbc_tag_t tag, pckb > cmd[0] = PMS_SET_SAMPLE; > for (i = 0; i < 3; i++) { > cmd[1] = rates[i]; > - res = pckbc_enqueue_cmd(tag, slot, cmd, 2, 0, 0, NULL); > + res = pms_cmd(sc, cmd, 2, NULL, 0); > if (res) > return (0); > } > > cmd[0] = PMS_SEND_DEV_ID; > - res = pckbc_enqueue_cmd(tag, slot, cmd, 1, 1, 1, resp); > + res = pms_cmd(sc, cmd, 1, resp, 1); > if (res || resp[0] != 3) > return (0); > > @@ -191,11 +206,8 @@ pmsattach(parent, self, aux) > sc->sc_wsmousedev = config_found(self, &a, wsmousedevprint); > > /* no interrupts until enabled */ > - cmd[0] = PMS_DEV_DISABLE; > - res = pckbc_poll_cmd(pa->pa_tag, pa->pa_slot, cmd, 1, 0, NULL, 0); > - if (res) > - printf("pmsattach: disable error\n"); > - pckbc_slot_enable(sc->sc_kbctag, sc->sc_kbcslot, 0); > + sc->poll = 1; > + pms_change_state(sc, PMS_STATE_DISABLED); > } > > int > @@ -219,7 +231,7 @@ pmsactivate(struct device *self, int act > int > pms_change_state(struct pms_softc *sc, int newstate) > { > - u_char cmd[1]; > + u_char cmd[1], resp[2]; > int res; > > switch (newstate) { > @@ -232,11 +244,14 @@ pms_change_state(struct pms_softc *sc, i > pckbc_slot_enable(sc->sc_kbctag, sc->sc_kbcslot, 1); > > pckbc_flush(sc->sc_kbctag, sc->sc_kbcslot); > - sc->intelli = pms_setintellimode(sc->sc_kbctag, sc->sc_kbcslot); > + > + cmd[0] = PMS_RESET; > + res = pms_cmd(sc, cmd, 1, resp, 2); > + > + sc->intelli = pms_setintellimode(sc); > > cmd[0] = PMS_DEV_ENABLE; > - res = pckbc_enqueue_cmd(sc->sc_kbctag, sc->sc_kbcslot, > - cmd, 1, 0, 1, 0); > + res = pms_cmd(sc, cmd, 1, NULL, 0); > if (res) > printf("pms_enable: command error\n"); > #if 0 > @@ -265,18 +280,19 @@ pms_change_state(struct pms_softc *sc, i > } > #endif > sc->sc_state = newstate; > + sc->poll = 0; > break; > case PMS_STATE_DISABLED: > > /* FALLTHROUGH */ > case PMS_STATE_SUSPENDED: > cmd[0] = PMS_DEV_DISABLE; > - res = pckbc_enqueue_cmd(sc->sc_kbctag, sc->sc_kbcslot, > - cmd, 1, 0, 1, 0); > + res = pms_cmd(sc, cmd, 1, NULL, 0); > if (res) > printf("pms_disable: command error\n"); > pckbc_slot_enable(sc->sc_kbctag, sc->sc_kbcslot, 0); > sc->sc_state = newstate; > + sc->poll = (newstate == PMS_STATE_SUSPENDED) ? 1 : 0; > break; > } > return 0;