Diff reduction to NetBSD.

usbdi.c rev. 1.104, author: mycroft
   ugen_isoc_rintr() may recycle the xfer immediately.  Therefore, we
   avoid touching the xfer after calling the callback in
   usb_transfer_complete().  From PR 25960.
This commit is contained in:
Lukas Ertl 2004-07-19 20:49:02 +00:00
parent 483c6192ec
commit ec47b83454

View File

@ -1,4 +1,4 @@
/* $NetBSD: usbdi.c,v 1.103 2002/09/27 15:37:38 provos Exp $ */ /* $NetBSD: usbdi.c,v 1.104 2004/07/17 20:16:13 mycroft Exp $ */
#include <sys/cdefs.h> #include <sys/cdefs.h>
__FBSDID("$FreeBSD$"); __FBSDID("$FreeBSD$");
@ -758,6 +758,9 @@ usb_transfer_complete(usbd_xfer_handle xfer)
{ {
usbd_pipe_handle pipe = xfer->pipe; usbd_pipe_handle pipe = xfer->pipe;
usb_dma_t *dmap = &xfer->dmabuf; usb_dma_t *dmap = &xfer->dmabuf;
int sync = xfer->flags & USBD_SYNCHRONOUS;
int erred = xfer->status == USBD_CANCELLED ||
xfer->status == USBD_TIMEOUT;
int repeat = pipe->repeat; int repeat = pipe->repeat;
int polling; int polling;
@ -842,14 +845,12 @@ usb_transfer_complete(usbd_xfer_handle xfer)
pipe->methods->done(xfer); pipe->methods->done(xfer);
#endif #endif
if ((xfer->flags & USBD_SYNCHRONOUS) && !polling) if (sync && !polling)
wakeup(xfer); wakeup(xfer);
if (!repeat) { if (!repeat) {
/* XXX should we stop the queue on all errors? */ /* XXX should we stop the queue on all errors? */
if ((xfer->status == USBD_CANCELLED || if (erred && pipe->iface != NULL) /* not control pipe */
xfer->status == USBD_TIMEOUT) &&
pipe->iface != NULL) /* not control pipe */
pipe->running = 0; pipe->running = 0;
else else
usbd_start_next(pipe); usbd_start_next(pipe);