Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 27 May 2009 16:56:14 GMT
From:      Sylvestre Gallon <syl@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 162889 for review
Message-ID:  <200905271656.n4RGuEgK056279@repoman.freebsd.org>

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

Change 162889 by syl@syl_rincewind on 2009/05/27 16:55:50

	Fix bug spotted by Hans Petter Selasky :
	- Change (void *) cast by (uint8_t *)
	- Delete 0 timing check in submit_transfer.
	- SINGLE_SHORT and SHORT_NOT_OK are not error flags.
	- Correct the transfer code using libusb_tr_setup_XXX.

Affected files ...

.. //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10.c#13 edit

Differences ...

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

@@ -94,6 +94,8 @@
 #define GET_CONTEXT(ctx) \
 	if (ctx == NULL) ctx = usbi_default_context;
 
+#define MAX(a,b) (((a)>(b))?(a):(b))
+
 /*  Library initialisation / deinitialisation */
 
 struct usb_pollfd {
@@ -673,7 +675,7 @@
 
 	memset(xfer, 0, len);
 
-	xfer = (struct libusb_transfer *) ((void *)xfer + 
+	xfer = (struct libusb_transfer *) ((uint8_t *)xfer + 
 	    sizeof(struct usb_transfer));
 	return (xfer);
 }
@@ -709,6 +711,7 @@
 	struct libusb_context *ctx;
 	struct timespec cur_ts;
 	struct timeval *cur_tv;
+	int num_frame;
 	int ret;
 
 	if (xfer == NULL)
@@ -717,15 +720,11 @@
 	ctx = xfer->dev_handle->dev->ctx;
 	pdev = xfer->dev_handle->os_priv;
 
-	usb_backend = (struct usb_transfer *) ((void *)xfer - 
+	usb_backend = (struct usb_transfer *) ((uint8_t *)xfer - 
 	    sizeof(struct usb_transfer));
 	usb_backend->transferred = 0;
 	usb_backend->flags = 0;
 
-	/*calculate_timeout*/
-	if (xfer->timeout == 0)
-		return (LIBUSB_ERROR_OTHER);
-
 	ret = clock_gettime(CLOCK_MONOTONIC, &cur_ts);
 	cur_ts.tv_sec += xfer->timeout / 1000;
 	cur_ts.tv_nsec += (xfer->timeout % 1000) * 1000000;
@@ -764,8 +763,8 @@
 	GET_XFER(usb20_xfer, xfer->endpoint, pdev);
 	xfer->os_priv = usb20_xfer;
 
-	ret = libusb20_tr_open(usb20_xfer, xfer->length, xfer->num_iso_packets, 
-	    xfer->endpoint);
+	ret = libusb20_tr_open(usb20_xfer, xfer->length, 
+	    MAX(2, xfer->num_iso_packets), xfer->endpoint);
        
 	if (ret != 0) {
 		pthread_mutex_lock(&ctx->flying_transfers_lock);
@@ -774,6 +773,23 @@
 		return (LIBUSB_ERROR_OTHER);
 	}
 
+	switch (xfer->type) {
+	case LIBUSB_TRANSFER_TYPE_BULK:
+		libusb20_tr_setup_intr(usb20_xfer, xfer->buffer, xfer->length, xfer->timeout);
+	case LIBUSB_TRANSFER_TYPE_INTERRUPT:
+		libusb20_tr_setup_bulk(usb20_xfer, xfer->buffer, xfer->length, xfer->timeout);
+		break ;
+	case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:
+		/* what means frindex ? */
+		libusb20_tr_setup_isoc(usb20_xfer, xfer->buffer, xfer->length, 0);
+		break ;
+	case LIBUSB_TRANSFER_TYPE_CONTROL:
+		libusb20_tr_setup_control(usb20_xfer, xfer->buffer, 
+		    (void *)(((uint8_t *) xfer->buffer) + 
+	  	    sizeof(libusb_control_setup)), xfer->timeout);
+		break ;
+	}
+
 	libusb20_tr_set_timeout(usb20_xfer, xfer->timeout);
 	libusb20_tr_set_buffer(usb20_xfer, xfer->buffer, xfer->num_iso_packets);
 	libusb20_tr_set_length(usb20_xfer, xfer->length, xfer->num_iso_packets);
@@ -795,10 +811,6 @@
 	case LIBUSB20_TRANSFER_STALL:
 		xfer->status = LIBUSB_TRANSFER_STALL;
 		break ;
-	case LIBUSB20_TRANSFER_SINGLE_SHORT_NOT_OK:
-	case LIBUSB20_TRANSFER_MULTI_SHORT_NOT_OK:
-		xfer->status = LIBUSB_TRANSFER_SHORT_NOT_OK;
-		break ;
 	case LIBUSB20_TRANSFER_CANCELLED:
 		xfer->status = LIBUSB_TRANSFER_CANCELLED;
 		break ;
@@ -1198,6 +1210,9 @@
 	return (0);
 }
 
+/*
+ * Need to fix xfer->type
+ */
 int
 libusb_interrupt_transfer(struct libusb_device_handle *devh,
     unsigned char endpoint, unsigned char *data, int length, int *transferred,



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