On Mon, Sep 02, 2013 at 02:32:50PM +0200, Martin Pieuchot wrote:
> You might also rely on the fact that if you have a "sc->synaptics"
> already allocated to try harder.  Because in this case you know
> that you have a synaptic touchpad.

That works. Here's a simpler diff that fixes my issue, too.

Index: pms.c
===================================================================
RCS file: /cvs/src/sys/dev/pckbc/pms.c,v
retrieving revision 1.45
diff -u -p -r1.45 pms.c
--- pms.c       16 Jul 2013 08:11:39 -0000      1.45
+++ pms.c       2 Sep 2013 16:44:48 -0000
@@ -937,15 +937,38 @@ pms_enable_synaptics(struct pms_softc *s
        struct synaptics_softc *syn = sc->synaptics;
        struct wsmousedev_attach_args a;
        u_char resp[3];
-       int mode;
+       int mode, i;
 
        if (pms_set_resolution(sc, 0) ||
            pms_set_resolution(sc, 0) ||
            pms_set_resolution(sc, 0) ||
            pms_set_resolution(sc, 0) ||
            pms_get_status(sc, resp) ||
-           resp[1] != SYNAPTICS_ID_MAGIC)
-               goto err;
+           resp[1] != SYNAPTICS_ID_MAGIC) {
+               if (sc->synaptics == NULL)
+                       goto err;
+               /* 
+                * Some synaptics touchpads don't resume quickly.
+                * Retry a few times.
+                */
+               for (i = 10; i > 0; --i) {
+                       printf("%s: device not resuming, retrying\n",
+                           DEVNAME(sc));
+                       pms_reset(sc);
+                       if (pms_set_resolution(sc, 0) ||
+                           pms_set_resolution(sc, 0) ||
+                           pms_set_resolution(sc, 0) ||
+                           pms_set_resolution(sc, 0) ||
+                           pms_get_status(sc, resp) ||
+                           resp[1] == SYNAPTICS_ID_MAGIC)
+                               break;
+                       delay(100000);
+               }
+               if (i == 0) {
+                       printf("%s: lost device\n", DEVNAME(sc));
+                       goto err;
+               }
+       }
 
        if (sc->synaptics == NULL) {
                sc->synaptics = syn = malloc(sizeof(struct synaptics_softc),

Reply via email to