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>
__FBSDID("$FreeBSD$");
@ -758,6 +758,9 @@ usb_transfer_complete(usbd_xfer_handle xfer)
{
usbd_pipe_handle pipe = xfer->pipe;
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 polling;
@ -842,14 +845,12 @@ usb_transfer_complete(usbd_xfer_handle xfer)
pipe->methods->done(xfer);
#endif
if ((xfer->flags & USBD_SYNCHRONOUS) && !polling)
if (sync && !polling)
wakeup(xfer);
if (!repeat) {
/* XXX should we stop the queue on all errors? */
if ((xfer->status == USBD_CANCELLED ||
xfer->status == USBD_TIMEOUT) &&
pipe->iface != NULL) /* not control pipe */
if (erred && pipe->iface != NULL) /* not control pipe */
pipe->running = 0;
else
usbd_start_next(pipe);