Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 3 Apr 2011 20:22:49 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r220304 - head/sys/dev/usb
Message-ID:  <201104032022.p33KMnGY054680@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: hselasky
Date: Sun Apr  3 20:22:49 2011
New Revision: 220304
URL: http://svn.freebsd.org/changeset/base/220304

Log:
  - Fix for missing event if a libUSB USB transfer is started and
  stopped rapidly in succession.
  
  Reported by:	J.R. Oldroyd
  MFC after:	7 days
  Approved by:	thompsa (mentor)

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

Modified: head/sys/dev/usb/usb_generic.c
==============================================================================
--- head/sys/dev/usb/usb_generic.c	Sun Apr  3 20:17:49 2011	(r220303)
+++ head/sys/dev/usb/usb_generic.c	Sun Apr  3 20:22:49 2011	(r220304)
@@ -1399,6 +1399,7 @@ ugen_ioctl(struct usb_fifo *f, u_long cm
 	}     u;
 	struct usb_endpoint *ep;
 	struct usb_endpoint_descriptor *ed;
+	struct usb_xfer *xfer;
 	int error = 0;
 	uint8_t iface_index;
 	uint8_t isread;
@@ -1425,11 +1426,11 @@ ugen_ioctl(struct usb_fifo *f, u_long cm
 
 	case USB_FS_START:
 		error = ugen_fs_copy_in(f, u.pstart->ep_index);
-		if (error) {
+		if (error)
 			break;
-		}
 		mtx_lock(f->priv_mtx);
-		usbd_transfer_start(f->fs_xfer[u.pstart->ep_index]);
+		xfer = f->fs_xfer[u.pstart->ep_index];
+		usbd_transfer_start(xfer);
 		mtx_unlock(f->priv_mtx);
 		break;
 
@@ -1439,7 +1440,19 @@ ugen_ioctl(struct usb_fifo *f, u_long cm
 			break;
 		}
 		mtx_lock(f->priv_mtx);
-		usbd_transfer_stop(f->fs_xfer[u.pstop->ep_index]);
+		xfer = f->fs_xfer[u.pstart->ep_index];
+		if (usbd_transfer_pending(xfer)) {
+			usbd_transfer_stop(xfer);
+			/*
+			 * Check if the USB transfer was stopped
+			 * before it was even started. Else a cancel
+			 * callback will be pending.
+			 */
+			if (!xfer->flags_int.transferring) {
+				ugen_fs_set_complete(xfer->priv_sc,
+				    USB_P2U(xfer->priv_fifo));
+			}
+		}
 		mtx_unlock(f->priv_mtx);
 		break;
 



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