summaryrefslogtreecommitdiffstats
path: root/lib/libusb
diff options
context:
space:
mode:
authorhselasky <hselasky@FreeBSD.org>2016-06-12 23:26:38 +0000
committerhselasky <hselasky@FreeBSD.org>2016-06-12 23:26:38 +0000
commit95dbfb128a36ddac8b85e396d07093795bf2b172 (patch)
tree91ca97361c58f6271ef100e3d5c1be7ed950c0f4 /lib/libusb
parent83b176045cd0be35522afc4c6ac8a114bee4c924 (diff)
downloadFreeBSD-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')
-rw-r--r--lib/libusb/libusb10.c16
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
OpenPOWER on IntegriCloud