Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 11 Mar 2010 21:49:43 +0000 (UTC)
From:      Andrew Thompson <thompsa@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r205035 - head/sys/dev/usb
Message-ID:  <201003112149.o2BLnhfi063822@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201003112149.o2BLnhfi063822>