Module Name: src Committed By: skrll Date: Sat Sep 24 15:06:29 UTC 2016
Modified Files: src/sys/dev/ic: sl811hs.c sl811hsreg.h Log Message: Truncate the transfer length if an overflow is seen rather than halting. Don't consider an EP11_STAT_SETUP as an error as it's not valid for host operation. Should fix kern/51500: axe(4) at slhci(4) does not attach, but there are more problems with axe(4) To generate a diff of this commit: cvs rdiff -u -r1.95 -r1.96 src/sys/dev/ic/sl811hs.c cvs rdiff -u -r1.5 -r1.6 src/sys/dev/ic/sl811hsreg.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/ic/sl811hs.c diff -u src/sys/dev/ic/sl811hs.c:1.95 src/sys/dev/ic/sl811hs.c:1.96 --- src/sys/dev/ic/sl811hs.c:1.95 Thu Sep 15 21:45:37 2016 +++ src/sys/dev/ic/sl811hs.c Sat Sep 24 15:06:29 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: sl811hs.c,v 1.95 2016/09/15 21:45:37 jdolecek Exp $ */ +/* $NetBSD: sl811hs.c,v 1.96 2016/09/24 15:06:29 skrll Exp $ */ /* * Not (c) 2007 Matthew Orgass @@ -68,7 +68,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sl811hs.c,v 1.95 2016/09/15 21:45:37 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sl811hs.c,v 1.96 2016/09/24 15:06:29 skrll Exp $"); #ifdef _KERNEL_OPT #include "opt_slhci.h" @@ -2047,24 +2047,21 @@ slhci_abdone(struct slhci_softc *sc, int #endif if (!(status & SL11_EPSTAT_ERRBITS)) { - unsigned int cont; - cont = slhci_read(sc, slhci_tregs[ab][CONT]); - if (cont != 0) - DLOG(D_XFER, "cont %d len %d", cont, - spipe->tregs[LEN], 0,0); - if (__predict_false(cont > spipe->tregs[LEN])) { - DDOLOG("cont > len! cont %d len %d xfer->ux_length %d " - "spipe %p", cont, spipe->tregs[LEN], xfer->ux_length, - spipe); - printf("%s: cont > len! cont %d len %d xfer->ux_length " - "%d", SC_NAME(sc), cont, spipe->tregs[LEN], - xfer->ux_length); - slhci_halt(sc, spipe, xfer); - return; + unsigned int cont = slhci_read(sc, slhci_tregs[ab][CONT]); + unsigned int len = spipe->tregs[LEN]; + DLOG(D_XFER, "cont %d len %d", cont, len, 0, 0); + if ((status & SL11_EPSTAT_OVERFLOW) || cont > len) { + DDOLOG("overflow - cont %d len %d xfer->ux_length %d " + "xfer->actlen %d", cont, len, xfer->ux_length, + xfer->ux_actlen); + printf("%s: overflow cont %d len %d xfer->ux_length" + " %d xfer->ux_actlen %d\n", SC_NAME(sc), cont, + len, xfer->ux_length, xfer->ux_actlen); + actlen = len; } else { - spipe->nerrs = 0; - actlen = spipe->tregs[LEN] - cont; + actlen = len - cont; } + spipe->nerrs = 0; } /* Actual copyin done after starting next transfer. */ @@ -2120,16 +2117,6 @@ slhci_abdone(struct slhci_softc *sc, int 0); DDOLOGSTATUS(status); - if (status & SL11_EPSTAT_OVERFLOW && - ratecheck(&sc->sc_overflow_warn_rate, - &overflow_warn_rate)) { - printf("%s: Overflow condition: " - "data corruption possible\n", - SC_NAME(sc)); - DDOLOG("Overflow condition: " - "data corruption possible", - 0, 0, 0, 0); - } head = Q_CALLBACKS; } else { head = Q_NEXT_CB; Index: src/sys/dev/ic/sl811hsreg.h diff -u src/sys/dev/ic/sl811hsreg.h:1.5 src/sys/dev/ic/sl811hsreg.h:1.6 --- src/sys/dev/ic/sl811hsreg.h:1.5 Sat Sep 24 14:55:16 2016 +++ src/sys/dev/ic/sl811hsreg.h Sat Sep 24 15:06:29 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: sl811hsreg.h,v 1.5 2016/09/24 14:55:16 skrll Exp $ */ +/* $NetBSD: sl811hsreg.h,v 1.6 2016/09/24 15:06:29 skrll Exp $ */ /* * Not (c) 2007 Matthew Orgass @@ -88,8 +88,6 @@ #define SL11_EPSTAT_ERRBITS ( \ SL11_EPSTAT_ERROR | \ SL11_EPSTAT_TIMEOUT | \ - SL11_EPSTAT_SETUP | \ - SL11_EPSTAT_OVERFLOW | \ SL11_EPSTAT_NAK | \ SL11_EPSTAT_STALL \ )