Date: Sat, 4 Jul 2009 11:17:55 GMT From: Sylvestre Gallon <syl@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 165589 for review Message-ID: <200907041117.n64BHt82056356@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=165589 Change 165589 by syl@syl_atuin on 2009/07/04 11:17:43 Add support for big transfers. Update test3 to perform benches. Remove a buggy libusb20_close. Affected files ... .. //depot/projects/soc2009/syl_usb/libusb-tests/transfers/test3/test3.c#7 edit .. //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10.c#56 edit .. //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10_io.c#22 edit Differences ... ==== //depot/projects/soc2009/syl_usb/libusb-tests/transfers/test3/test3.c#7 (text+ko) ==== @@ -128,11 +128,13 @@ volatile int transferred; libusb_device **devs_list; libusb_device_descriptor ddesc; + int random; + uint32_t size; int found = 0; int ret; int i; - printf("this test dump the 512 first byte of a memory stick\n"); + printf("this test read bytes of a memory stick\n"); if (libusb_init(&ctx) != 0) { fprintf(stderr, "libusb_init_failed\n"); return (EXIT_FAILURE); @@ -187,13 +189,12 @@ do_msc_req(test_unit_ready, sizeof(test_unit_ready), 0xd); do_msc_req(read_capacity, sizeof(read_capacity), 0x8); - do_read(0, BLOCK_SIZE); - for (i = 0 ; i < BLOCK_SIZE ; i++) { - if (i != 0 && (i % 0x10) == 0) - printf("\n"); - printf("0x%.2x ", buffer[i]); + sranddev(); + for (size = 0 ; ;) { + random = rand() % 1024; + do_read(random, 0x10000); + size+=0x10000; + printf("read sector : 0x%x total read 0x%x\n", random, size); } - printf("\n"); - return (EXIT_SUCCESS); } ==== //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10.c#56 (text+ko) ==== @@ -838,6 +838,82 @@ return; } +static int +libusb_get_maxframe(struct libusb20_device *pdev, libusb_transfer *xfer) +{ + int ret; + int usb_speed; + + usb_speed = libusb20_dev_get_speed(pdev); + + switch (xfer->type) { + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + switch (usb_speed) { + case LIBUSB20_SPEED_LOW: + case LIBUSB20_SPEED_FULL: + ret = 60 * 1; + break ; + default : + ret = 60 * 8; + break ; + } + break ; + case LIBUSB_TRANSFER_TYPE_CONTROL: + ret = 2; + break ; + default: + ret = 1; + break ; + } + + return ret; +} + +static int +libusb_get_buffsize(struct libusb20_device *pdev, libusb_transfer *xfer) +{ + int ret; + int usb_speed; + + usb_speed = libusb20_dev_get_speed(pdev); + + switch (xfer->type) { + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + ret = 0; + break ; + case LIBUSB_TRANSFER_TYPE_CONTROL: + switch (usb_speed) { + case LIBUSB20_SPEED_LOW: + ret = 8; + break ; + case LIBUSB20_SPEED_FULL: + ret = 64; + break ; + case LIBUSB20_SPEED_HIGH: + ret = 64; + break ; + } + /*add */ + ret += 8; + break ; + default : + switch (usb_speed) { + case LIBUSB20_SPEED_LOW: + ret = 256; + break ; + case LIBUSB20_SPEED_FULL: + ret = 4096; + break ; + default: + ret = 16384; + break ; + } + break ; + } + + return ret; +} + static void libusb10_proxy(struct libusb20_transfer *xfer) { @@ -845,6 +921,9 @@ struct libusb20_device *pdev; libusb_transfer *usb_xfer; libusb_context *ctx; + uint32_t pos; + uint32_t max; + uint32_t size; uint8_t status; uint32_t iso_packets; int i; @@ -859,20 +938,29 @@ switch (status) { case LIBUSB20_TRANSFER_COMPLETED: - DPRINTF(ctx, LIBUSB_DEBUG_TRANSFER, "LIBUSB20 SUBMIT"); + usb_backend->transferred += libusb20_tr_get_actual_length(xfer); + DPRINTF(ctx, LIBUSB_DEBUG_TRANSFER, "LIBUSB20 TRANSFER %i bytes", + usb_backend->transferred); + if (usb_backend->transferred != usb_xfer->length) + goto tr_start; - usb_backend->transferred += libusb20_tr_get_actual_length(xfer); + DPRINTF(ctx, LIBUSB_DEBUG_TRANSFER, "LIBUSB20 TRANSFER COMPLETE"); usb_handle_transfer_completion(usb_backend, LIBUSB_TRANSFER_COMPLETED); break ; case LIBUSB20_TRANSFER_START: +tr_start: DPRINTF(ctx, LIBUSB_DEBUG_TRANSFER, "LIBUSB20 START"); + max = libusb_get_buffsize(pdev, usb_xfer); + pos = usb_backend->transferred; + size = (usb_xfer->length - pos); + size = (size > max) ? max : size; usb_xfer->actual_length = 0; switch (usb_xfer->type) { case LIBUSB_TRANSFER_TYPE_CONTROL: DPRINTF(ctx, LIBUSB_DEBUG_TRANSFER, "TYPE CTR"); libusb20_tr_setup_control(xfer, usb_xfer->buffer, - (void *)(((uint8_t *) usb_xfer->buffer) + + (void *)(((uint8_t *) &usb_xfer->buffer[pos]) + sizeof(libusb_control_setup)), usb_xfer->timeout); break ; @@ -883,19 +971,19 @@ usb_xfer->num_iso_packets = iso_packets; for (i = 0 ; i < usb_xfer->num_iso_packets ; i++) { libusb20_tr_setup_isoc(xfer, - usb_xfer->buffer, usb_xfer->length, i); + &usb_xfer->buffer[pos], size, i); } libusb20_tr_set_total_frames(xfer, i); break ; case LIBUSB_TRANSFER_TYPE_BULK: DPRINTF(ctx, LIBUSB_DEBUG_TRANSFER, "TYPE BULK"); - libusb20_tr_setup_bulk(xfer, usb_xfer->buffer, - usb_xfer->length, usb_xfer->timeout); + libusb20_tr_setup_bulk(xfer, &usb_xfer->buffer[pos], + size, usb_xfer->timeout); break ; case LIBUSB_TRANSFER_TYPE_INTERRUPT: DPRINTF(ctx, LIBUSB_DEBUG_TRANSFER, "TYPE INTR"); - libusb20_tr_setup_intr(xfer, usb_xfer->buffer, - usb_xfer->length, usb_xfer->timeout); + libusb20_tr_setup_intr(xfer, &usb_xfer->buffer[pos], + size, usb_xfer->timeout); break ; } libusb20_tr_submit(xfer); @@ -941,82 +1029,6 @@ } } -static int -libusb_get_maxframe(struct libusb20_device *pdev, libusb_transfer *xfer) -{ - int ret; - int usb_speed; - - usb_speed = libusb20_dev_get_speed(pdev); - - switch (xfer->type) { - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - switch (usb_speed) { - case LIBUSB20_SPEED_LOW: - case LIBUSB20_SPEED_FULL: - ret = 60 * 1; - break ; - default : - ret = 60 * 8; - break ; - } - break ; - case LIBUSB_TRANSFER_TYPE_CONTROL: - ret = 2; - break ; - default: - ret = 1; - break ; - } - - return ret; -} - -static int -libusb_get_buffsize(struct libusb20_device *pdev, libusb_transfer *xfer) -{ - int ret; - int usb_speed; - - usb_speed = libusb20_dev_get_speed(pdev); - - switch (xfer->type) { - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - ret = 0; - break ; - case LIBUSB_TRANSFER_TYPE_CONTROL: - switch (usb_speed) { - case LIBUSB20_SPEED_LOW: - ret = 8; - break ; - case LIBUSB20_SPEED_FULL: - ret = 64; - break ; - case LIBUSB20_SPEED_HIGH: - ret = 64; - break ; - } - /*add */ - ret += 8; - break ; - default : - switch (usb_speed) { - case LIBUSB20_SPEED_LOW: - ret = 256; - break ; - case LIBUSB20_SPEED_FULL: - ret = 4096; - break ; - default: - ret = 16384; - break ; - } - break ; - } - - return ret; -} - int libusb_submit_transfer(struct libusb_transfer *xfer) { ==== //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10_io.c#22 (text+ko) ==== @@ -125,8 +125,6 @@ if (xfer->flags & LIBUSB_TRANSFER_FREE_TRANSFER) libusb_free_transfer(xfer); - DPRINTF(ctx, LIBUSB_DEBUG_TRANSFER, "LIBUSB20_TR_CLOSE"); - libusb20_tr_close(xfer->os_priv); pthread_mutex_lock(&ctx->event_waiters_lock); pthread_cond_broadcast(&ctx->event_waiters_cond); pthread_mutex_unlock(&ctx->event_waiters_lock);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200907041117.n64BHt82056356>