Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 11 Sep 2008 08:02:08 GMT
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 149590 for review
Message-ID:  <200809110802.m8B828rd068818@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=149590

Change 149590 by hselasky@hselasky_laptop001 on 2008/09/11 08:01:24

	
	When there is no buffer we need to call start_read/start_write
	function. Maybe it will create a buffer, which is the case for UGEN.

Affected files ...

.. //depot/projects/usb/src/sys/dev/usb2/core/usb2_dev.c#28 edit

Differences ...

==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_dev.c#28 (text+ko) ====

@@ -847,6 +847,7 @@
 	f->flag_iserror = 1;
 	/* need to wait until all callers have exited */
 	while (f->refcount != 0) {
+		mtx_unlock(&usb2_ref_lock);	/* avoid LOR */
 		mtx_lock(f->priv_mtx);
 		/* get I/O thread out of any sleep state */
 		if (f->flag_sleeping) {
@@ -854,6 +855,7 @@
 			usb2_cv_broadcast(&f->cv_io);
 		}
 		mtx_unlock(f->priv_mtx);
+		mtx_lock(&usb2_ref_lock);
 
 		/* wait for sync */
 		usb2_cv_wait(&f->cv_drain, &usb2_ref_lock);
@@ -1462,7 +1464,8 @@
 }
 
 static int
-usb2_ioctl_f_sub(struct usb2_fifo *f, u_long cmd, void *addr, struct thread *td)
+usb2_ioctl_f_sub(struct usb2_fifo *f, u_long cmd, void *addr,
+    struct thread *td)
 {
 	int error = 0;
 
@@ -1526,17 +1529,10 @@
 	if (fflags & FREAD) {
 		if (fflags & FWRITE) {
 			/*
-			 * Automagically figure out if we have an IOCTL that
-			 * should not be replicated to both FIFOs:
+			 * Make sure that the IOCTL is not
+			 * duplicated:
 			 */
-			if ((loc.rxfifo->priv_sc0 ==
-			    loc.txfifo->priv_sc0) &&
-			    (loc.rxfifo->priv_sc1 ==
-			    loc.txfifo->priv_sc1) &&
-			    (loc.rxfifo->methods ==
-			    loc.txfifo->methods)) {
-				is_common = 1;
-			}
+			is_common = 1;
 		}
 		err_rx = usb2_ioctl_f_sub(loc.rxfifo, cmd, addr, td);
 		if (err_rx == ENOTTY) {
@@ -1624,6 +1620,13 @@
 				/* we got an error */
 				m = (void *)1;
 			} else {
+				if (f->queue_data == NULL) {
+					/*
+					 * start write transfer, if not
+					 * already started
+					 */
+					(f->methods->f_start_write) (f);
+				}
 				/* check if any packets are available */
 				USB_IF_POLL(&f->free_q, m);
 			}
@@ -1656,6 +1659,13 @@
 				/* we have and error */
 				m = (void *)1;
 			} else {
+				if (f->queue_data == NULL) {
+					/*
+					 * start read transfer, if not
+					 * already started
+					 */
+					(f->methods->f_start_read) (f);
+				}
 				/* check if any packets are available */
 				USB_IF_POLL(&f->used_q, m);
 			}
@@ -1860,6 +1870,10 @@
 		err = EIO;
 		goto done;
 	}
+	if ((f->queue_data == NULL) && (f->fs_ep_max == 0)) {
+		/* start write transfer, if not already started */
+		(f->methods->f_start_write) (f);
+	}
 	while (uio->uio_resid > 0) {
 
 		if (f->fs_ep_max == 0) {



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