diff options
author | hselasky <hselasky@FreeBSD.org> | 2016-06-12 23:26:38 +0000 |
---|---|---|
committer | hselasky <hselasky@FreeBSD.org> | 2016-06-12 23:26:38 +0000 |
commit | 95dbfb128a36ddac8b85e396d07093795bf2b172 (patch) | |
tree | 91ca97361c58f6271ef100e3d5c1be7ed950c0f4 /lib/libusb/libusb10.c | |
parent | 83b176045cd0be35522afc4c6ac8a114bee4c924 (diff) | |
download | FreeBSD-src-95dbfb128a36ddac8b85e396d07093795bf2b172.zip FreeBSD-src-95dbfb128a36ddac8b85e396d07093795bf2b172.tar.gz |
Implement code to stop all USB endpoints before executing a USB device
reset command, alternate setting command or set configuration
command. Else LibUSB v1.0 will not re-open the endpoints which the
kernel closes and the USB application might wait infinitely for
transfers to complete.
Approved by: re (hrs)
MFC after: 3 days
Diffstat (limited to 'lib/libusb/libusb10.c')
-rw-r--r-- | lib/libusb/libusb10.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/libusb/libusb10.c b/lib/libusb/libusb10.c index 8d42e59..1ccd630 100644 --- a/lib/libusb/libusb10.c +++ b/lib/libusb/libusb10.c @@ -51,6 +51,8 @@ #include "libusb.h" #include "libusb10.h" +#define LIBUSB_NUM_SW_ENDPOINTS (16 * 4) + static pthread_mutex_t default_context_lock = PTHREAD_MUTEX_INITIALIZER; struct libusb_context *usbi_default_context = NULL; @@ -442,7 +444,7 @@ libusb_open(libusb_device *dev, libusb_device_handle **devh) if (dev == NULL) return (LIBUSB_ERROR_INVALID_PARAM); - err = libusb20_dev_open(pdev, 16 * 4 /* number of endpoints */ ); + err = libusb20_dev_open(pdev, LIBUSB_NUM_SW_ENDPOINTS); if (err) { libusb_unref_device(dev); return (LIBUSB_ERROR_NO_MEM); @@ -1482,7 +1484,17 @@ libusb_cancel_transfer(struct libusb_transfer *uxfer) UNEXPORTED void libusb10_cancel_all_transfer(libusb_device *dev) { - /* TODO */ + struct libusb20_device *pdev = dev->os_priv; + unsigned x; + + for (x = 0; x != LIBUSB_NUM_SW_ENDPOINTS; x++) { + struct libusb20_transfer *xfer; + + xfer = libusb20_tr_get_pointer(pdev, x); + if (xfer == NULL) + continue; + libusb20_tr_close(xfer); + } } uint16_t |