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:
parent
6703f98c02
commit
3f6c7805b4
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=205035
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user