diff --git a/sys/dev/usb/uatp.c b/sys/dev/usb/uatp.c index a9db72e539af..f9d53d600abd 100644 --- a/sys/dev/usb/uatp.c +++ b/sys/dev/usb/uatp.c @@ -1416,6 +1416,19 @@ uatp_intr(struct uhidev *addr, void *ibuf, unsigned int len) (sc->sc_input_index + len)); sc->sc_input_index = 0; return; + } else if (sc->sc_input_size == 81 && len == 17 && + sc->sc_input_index != 64) { + /* + * Quirk of Fountain and Geyser 1 devices: a 17-byte + * packet seems to mean the last one, but sometimes we + * get desynchronized, so drop this one and start over + * if we see a 17-byte packet that's not at the end. + */ + aprint_error_dev(uatp_dev(sc), + "discarding 17-byte nonterminal input at %u\n", + sc->sc_input_index); + sc->sc_input_index = 0; + return; } #if UATP_DEBUG