Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 4 Jun 2009 12:07:27 GMT
From:      Sylvestre Gallon <syl@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 163484 for review
Message-ID:  <200906041207.n54C7Rwg062096@repoman.freebsd.org>

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

Change 163484 by syl@syl_rincewind on 2009/06/04 12:07:08

	Fix transfer flag in interrupt transfers.

Affected files ...

.. //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10_io.c#7 edit

Differences ...

==== //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10_io.c#7 (text+ko) ====

@@ -558,12 +558,13 @@
 	return (ret);
 }
 
-int
-libusb_bulk_transfer(struct libusb_device_handle *devh,
+static int
+do_transfer(struct libusb_device_handle *devh, 
     unsigned char endpoint, unsigned char *data, int length,
-    int *transferred, unsigned int timeout)
+    int *transferred, unsigned int timeout, int type)
 {
 	struct libusb_transfer *xfer;
+	libusb_context *ctx;
 	int complet;
 	int ret;
 
@@ -574,9 +575,11 @@
 	if (xfer == NULL)
 		return (LIBUSB_ERROR_NO_MEM);
 
+	ctx = devh->dev->ctx;
+
 	xfer->dev_handle = devh;
 	xfer->endpoint = endpoint;
-	xfer->type = LIBUSB_TRANSFER_TYPE_BULK;
+	xfer->type = type;
 	xfer->timeout = timeout;
 	xfer->buffer = data;
 	xfer->length = length;
@@ -589,16 +592,18 @@
 		return (ret);
 	}
 
-	while (!complet)
-		if ((ret = libusb_handle_events(devh->dev->ctx)) < 0) {
+	while (complet == 0) {
+		if ((ret = libusb_handle_events(ctx)) < 0) {
 			libusb_cancel_transfer(xfer);
 			libusb_free_transfer(xfer);
-			while (!complet)
-				if (libusb_handle_events(devh->dev->ctx))
-					break;
+			while (complet == 0) {
+				if (libusb_handle_events(ctx))
+					break ;
+			}
 			return (ret);
 		}
-	
+	}
+
 	*transferred = xfer->actual_length;
 	switch (xfer->status) {
 	case LIBUSB_TRANSFER_COMPLETED:
@@ -618,14 +623,23 @@
 	return (0);
 }
 
+int
+libusb_bulk_transfer(struct libusb_device_handle *devh,
+    unsigned char endpoint, unsigned char *data, int length,
+    int *transferred, unsigned int timeout)
+{
+	return (do_transfer(devh, endpoint, data, length, transferred,
+	    timeout, LIBUSB_TRANSFER_TYPE_BULK));
+}
+
 /*
  * Need to fix xfer->type
  */
 int
 libusb_interrupt_transfer(struct libusb_device_handle *devh,
-    unsigned char endpoint, unsigned char *data, int length, int *transferred,
-    unsigned int timeout)
+    unsigned char endpoint, unsigned char *data, int length, 
+    int *transferred, unsigned int timeout)
 {
-	return (libusb_bulk_transfer(devh, endpoint, data, length, 
-	    transferred, timeout));
+	return (do_transfer(devh, endpoint, data, length, transferred,
+	    timeout, LIBUSB_TRANSFER_TYPE_INTERRUPT));
 }



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