freebsd_network: Check for errors in usbd_transfer_submit.
This way, transfers that fail to queue will have their callbacks actually invoked. Fixes hangs when trying to disable unplugged USB WiFi devices.
This commit is contained in:
@@ -413,20 +413,25 @@ usbd_transfer_submit(struct usb_xfer* xfer)
|
|||||||
|
|
||||||
xfer->transferred_length = 0;
|
xfer->transferred_length = 0;
|
||||||
xfer->in_progress = true;
|
xfer->in_progress = true;
|
||||||
|
status_t status = B_NOT_SUPPORTED;
|
||||||
switch (xfer->type) {
|
switch (xfer->type) {
|
||||||
case UE_BULK:
|
case UE_BULK:
|
||||||
sUSB->queue_bulk_v(xfer->pipe, xfer->frames, xfer->nframes, usbd_callback, xfer);
|
status = sUSB->queue_bulk_v(xfer->pipe, xfer->frames, xfer->nframes, usbd_callback, xfer);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case UE_INTERRUPT:
|
case UE_INTERRUPT:
|
||||||
KASSERT(xfer->nframes == 1, ("invalid frame count for interrupt transfer"));
|
KASSERT(xfer->nframes == 1, ("invalid frame count for interrupt transfer"));
|
||||||
sUSB->queue_interrupt(xfer->pipe, xfer->frames[0].iov_base, xfer->frames[0].iov_len,
|
status = sUSB->queue_interrupt(xfer->pipe,
|
||||||
|
xfer->frames[0].iov_base, xfer->frames[0].iov_len,
|
||||||
usbd_callback, xfer);
|
usbd_callback, xfer);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
panic("unhandled pipe type %d", xfer->type);
|
panic("unhandled pipe type %d", xfer->type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (status != B_OK)
|
||||||
|
usbd_callback(xfer, status, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user