Author: thompsa
Date: Thu Mar 11 21:49:43 2010
New Revision: 205035
URL: http://svn.freebsd.org/changeset/base/205035

Log:
  Make sure there is a way to reset the endpoint FIFO on transfer errors for
  ISOCHRONOUS transfers
  
  Submitted by: Hans Petter Selasky

Modified:
  head/sys/dev/usb/usb_transfer.c

Modified: head/sys/dev/usb/usb_transfer.c
==============================================================================
--- head/sys/dev/usb/usb_transfer.c     Thu Mar 11 21:49:00 2010        
(r205034)
+++ head/sys/dev/usb/usb_transfer.c     Thu Mar 11 21:49:43 2010        
(r205035)
@@ -2410,21 +2410,24 @@ usbd_pipe_start(struct usb_xfer_queue *p
         * 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 *p
                                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 */
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to