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