From owner-p4-projects@FreeBSD.ORG Sat Jul 4 11:17:56 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 6E10D1065677; Sat, 4 Jul 2009 11:17:56 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2DFEE1065675 for ; Sat, 4 Jul 2009 11:17:56 +0000 (UTC) (envelope-from syl@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 132448FC0C for ; Sat, 4 Jul 2009 11:17:56 +0000 (UTC) (envelope-from syl@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n64BHt7V056358 for ; Sat, 4 Jul 2009 11:17:55 GMT (envelope-from syl@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n64BHt82056356 for perforce@freebsd.org; Sat, 4 Jul 2009 11:17:55 GMT (envelope-from syl@FreeBSD.org) Date: Sat, 4 Jul 2009 11:17:55 GMT Message-Id: <200907041117.n64BHt82056356@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to syl@FreeBSD.org using -f From: Sylvestre Gallon To: Perforce Change Reviews Cc: Subject: PERFORCE change 165589 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 04 Jul 2009 11:17:57 -0000 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);