PERFORCE change 162889 for review
Sylvestre Gallon
syl at FreeBSD.org
Wed May 27 16:56:17 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=162889
Change 162889 by syl at 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,
More information about the p4-projects
mailing list