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