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
This commit is contained in:
parent
eeec1f9fbf
commit
90988efdc5
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user