PERFORCE change 161679 for review

Sylvestre Gallon syl at FreeBSD.org
Wed May 6 20:56:06 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=161679

Change 161679 by syl at syl_atuin on 2009/05/06 20:55:52

	- Implement libusb_cancel_transfer.
	- Restore zero length array for compatibility reasons.
	- Update xfer->status on libusb_submit_transfer.

Affected files ...

.. //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb.h#6 edit
.. //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10.c#5 edit

Differences ...

==== //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb.h#6 (text+ko) ====

@@ -328,8 +328,9 @@
 	libusb_transfer_cb_fn callback;
 	void   *user_data;
 	unsigned char *buffer;
+	void *os_priv;
 	int	num_iso_packets;
-	struct libusb_iso_packet_descriptor *iso_packet_desc;
+	struct libusb_iso_packet_descriptor iso_packet_desc[0];
 }	libusb_transfer __aligned(sizeof(void *));
 
 typedef struct libusb_pollfd {

==== //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10.c#5 (text+ko) ====

@@ -494,28 +494,58 @@
 int
 libusb_submit_transfer(struct libusb_transfer *xfer)
 {
-	struct libusb20_transfer usb20_xfer;
+	struct libusb20_transfer *usb20_xfer;
 	int ret;
 
-	libusb20_tr_open(&usb20_xfer, xfer->length, xfer->num_iso_packets, xfer->endpoint);
-	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);
-	libusb20_tr_set_priv_sc0(&usb20_xfer, xfer->callback);
-	libusb20_tr_set_priv_sc1(&usb20_xfer, xfer->user_data);
-	libusb20_tr_set_callback(&usb20_xfer, libusb10_proxy);
-	libusb20_tr_submit(&usb20_xfer);
+	usb20_xfer = malloc(sizeof(*usb20_xfer));
+	xfer->os_priv = usb20_xfer;
+
+	libusb20_tr_open(usb20_xfer, xfer->length, xfer->num_iso_packets, xfer->endpoint);
+	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);
+	libusb20_tr_set_priv_sc0(usb20_xfer, xfer->callback);
+	libusb20_tr_set_priv_sc1(usb20_xfer, xfer->user_data);
+	libusb20_tr_set_callback(usb20_xfer, libusb10_proxy);
+	libusb20_tr_submit(usb20_xfer);
 
-	switch (libusb20_tr_get_status(&usb20_xfer)) {
-		default:
-			ret = LIBUSB_ERROR_OTHER;
+	switch (libusb20_tr_get_status(usb20_xfer)) {
+	case LIBUSB20_TRANSFER_COMPLETED:
+		xfer->status = LIBUSB_TRANSFER_COMPLETED;
+		break ;
+	case LIBUSB20_TRANSFER_OVERFLOW:
+		xfer->status = LIBUSB_TRANSFER_OVERFLOW;
+		break ;
+	case LIBUSB20_TRANSFER_NO_DEVICE:
+		xfer->status = LIBUSB_TRANSFER_NO_DEVICE;
+		break ;
+	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 ;
+	case LIBUSB20_TRANSFER_TIMED_OUT:
+		xfer->status = LIBUSB_TRANSFER_TIMED_OUT;
+		break ;
+	default:
+		xfer->status = LIBUSB_TRANSFER_ERROR;
 	}
-	return (ret);
+	return (0);
 }
 
 int
 libusb_cancel_transfer(struct libusb_transfer *xfer)
 {
+	if (xfer == NULL)
+		return (LIBUSB_ERROR_NO_MEM);
+	libusb20_tr_stop(xfer->os_priv);
+	libusb20_tr_close(xfer->os_priv);
+
 	return (0);
 }
 


More information about the p4-projects mailing list