diff --git a/psmouse-base.c b/psmouse-base.c index b407b35..d79eafc 100644 --- a/psmouse-base.c +++ b/psmouse-base.c @@ -856,12 +856,12 @@ static const struct psmouse_protocol *psmouse_protocol_by_name(const char *name, return NULL; } - /* - * psmouse_probe() probes for a PS/2 mouse. + * __psmouse_probe() probes for a PS/2 mouse. + * Wrapped by psmouse_probe() for clean reset code. */ -static int psmouse_probe(struct psmouse *psmouse) +static int __psmouse_probe(struct psmouse *psmouse) { struct ps2dev *ps2dev = &psmouse->ps2dev; unsigned char param[2]; @@ -892,6 +892,23 @@ static int psmouse_probe(struct psmouse *psmouse) } /* + * Wrapper for probe routine to cleanly reset the device should + * the initial probe fail for any reason. + */ +static int psmouse_probe(struct psmouse *psmouse) { + struct ps2dev *ps2dev = &psmouse->ps2dev; + int i, ret = -1; + + for (i=0; ((ret = __psmouse_probe(psmouse)) != 0) && i < 3; i++) { + printk(KERN_ERR "psmouse.c: Error encountered while probing" + " PS/2 device on %s, reseting.\n", ps2dev->serio->phys); + psmouse_reset(psmouse); + } + + return ret; +} + +/* * Here we set the mouse resolution. */