PERFORCE change 165589 for review
Sylvestre Gallon
syl at FreeBSD.org
Sat Jul 4 11:17:57 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=165589
Change 165589 by syl at 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);
More information about the p4-projects
mailing list