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:
parent
483c6192ec
commit
ec47b83454
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user