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

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;

Reply via email to