Date: Mon, 9 Oct 2006 06:18:55 GMT From: Hans Petter Selasky <hselasky@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 107531 for review Message-ID: <200610090618.k996ItDv066569@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=107531 Change 107531 by hselasky@hselasky_mini_itx on 2006/10/09 06:18:00 ubser: Need to stop all transfers atomically at detach, else an outstanding clear stall transfer can call "usbd_transfer_start()" passing a NULL pointer. Affected files ... .. //depot/projects/usb/src/sys/dev/usb/ubser.c#8 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb/ubser.c#8 (text+ko) ==== @@ -355,14 +355,24 @@ ubser_detach(device_t dev) { struct ubser_softc *sc = device_get_softc(dev); + uint8_t n; DPRINTF(sc, 0, "\n"); ucom_detach(sc->sc_ucom, sc->sc_numser); - /* "usbd_transfer_unsetup" will stop all active - * USB transfers: + /* need to stop all transfers atomically, + * hence when clear stall completes, it + * might start other transfers ! */ + mtx_lock(&Giant); + for (n = 0; n < UBSER_TR_MAX; n++) { + if (sc->sc_xfer[n]) { + usbd_transfer_stop(sc->sc_xfer[n]); + } + } + mtx_unlock(&Giant); + usbd_transfer_unsetup(sc->sc_xfer, UBSER_TR_MAX); return 0;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200610090618.k996ItDv066569>