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>