Make sure there is a way to reset the endpoint FIFO on transfer errors for

ISOCHRONOUS transfers

Submitted by:	Hans Petter Selasky
This commit is contained in:
Andrew Thompson 2010-03-11 21:49:43 +00:00
parent 6703f98c02
commit 3f6c7805b4
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=205035

View File

@ -2410,21 +2410,24 @@ usbd_pipe_start(struct usb_xfer_queue *pq)
* Check if we are supposed to stall the endpoint:
*/
if (xfer->flags.stall_pipe) {
struct usb_device *udev;
struct usb_xfer_root *info;
/* clear stall command */
xfer->flags.stall_pipe = 0;
/* get pointer to USB device */
info = xfer->xroot;
udev = info->udev;
/*
* Only stall BULK and INTERRUPT endpoints.
*/
type = (ep->edesc->bmAttributes & UE_XFERTYPE);
if ((type == UE_BULK) ||
(type == UE_INTERRUPT)) {
struct usb_device *udev;
struct usb_xfer_root *info;
uint8_t did_stall;
info = xfer->xroot;
udev = info->udev;
did_stall = 1;
if (udev->flags.usb_mode == USB_MODE_DEVICE) {
@ -2452,6 +2455,17 @@ usbd_pipe_start(struct usb_xfer_queue *pq)
ep->is_stalled = 1;
return;
}
} else if (type == UE_ISOCHRONOUS) {
/*
* Make sure any FIFO overflow or other FIFO
* error conditions go away by resetting the
* endpoint FIFO through the clear stall
* method.
*/
if (udev->flags.usb_mode == USB_MODE_DEVICE) {
(udev->bus->methods->clear_stall) (udev, ep);
}
}
}
/* Set or clear stall complete - special case */