MFC r205035

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-04-06 23:27:04 +00:00
parent 252913a125
commit 33f167cc00

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 */