summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhaidong.zheng <haidong.zheng@nxp.com>2018-12-12 11:07:18 +0800
committerNathan Hjelm <hjelmn@me.com>2019-04-05 09:35:27 -0600
commiteb164d7529677c48d1b6c7a9dd9d152d71e38d43 (patch)
tree9cacf142f23d8f62d8d9228bb070269d0d918b56
parent0b381a81bed9051bfac7a4f5a16358182c7e7f9a (diff)
downloadlibusb-eb164d7529677c48d1b6c7a9dd9d152d71e38d43.tar.gz
windows: get usb device until usb configuration is set
There are low possiblity to open device before windows complete usb configuration. Then claim interface will be always failure. this patch workaround this problem, make sure return device until windows finish usb configuration. Closes #505 Signed-off-by: Frank Li <Frank.Li@nxp.com> Signed-off-by: Tom Zheng <haidong.zheng@nxp.com> Signed-off-by: Nathan Hjelm <hjelmn@me.com>
-rw-r--r--libusb/os/windows_winusb.c52
-rw-r--r--libusb/version_nano.h2
2 files changed, 39 insertions, 15 deletions
diff --git a/libusb/os/windows_winusb.c b/libusb/os/windows_winusb.c
index 41734e2..3292e33 100644
--- a/libusb/os/windows_winusb.c
+++ b/libusb/os/windows_winusb.c
@@ -793,6 +793,7 @@ static int init_device(struct libusb_device *dev, struct libusb_device *parent_d
DWORD size;
uint8_t bus_number, depth;
int r;
+ int ginfotimeout;
priv = _device_priv(dev);
@@ -850,23 +851,46 @@ static int init_device(struct libusb_device *dev, struct libusb_device *parent_d
memset(&conn_info, 0, sizeof(conn_info));
conn_info.ConnectionIndex = (ULONG)port_number;
// coverity[tainted_data_argument]
- if (!DeviceIoControl(hub_handle, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX, &conn_info, sizeof(conn_info),
- &conn_info, sizeof(conn_info), &size, NULL)) {
- usbi_warn(ctx, "could not get node connection information for device '%s': %s",
- priv->dev_id, windows_error_str(0));
- CloseHandle(hub_handle);
- return LIBUSB_ERROR_NO_DEVICE;
- }
+ ginfotimeout = 20;
+ do {
+ if (!DeviceIoControl(hub_handle, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX, &conn_info, sizeof(conn_info),
+ &conn_info, sizeof(conn_info), &size, NULL)) {
+ usbi_warn(ctx, "could not get node connection information for device '%s': %s",
+ priv->dev_id, windows_error_str(0));
+ CloseHandle(hub_handle);
+ return LIBUSB_ERROR_NO_DEVICE;
+ }
- if (conn_info.ConnectionStatus == NoDeviceConnected) {
- usbi_err(ctx, "device '%s' is no longer connected!", priv->dev_id);
- CloseHandle(hub_handle);
- return LIBUSB_ERROR_NO_DEVICE;
+ if (conn_info.ConnectionStatus == NoDeviceConnected) {
+ usbi_err(ctx, "device '%s' is no longer connected!", priv->dev_id);
+ CloseHandle(hub_handle);
+ return LIBUSB_ERROR_NO_DEVICE;
+ }
+
+ memcpy(&priv->dev_descriptor, &(conn_info.DeviceDescriptor), sizeof(USB_DEVICE_DESCRIPTOR));
+ dev->num_configurations = priv->dev_descriptor.bNumConfigurations;
+ priv->active_config = conn_info.CurrentConfigurationValue;
+ if (priv->active_config == 0) {
+ usbi_dbg("0x%x:0x%x found %u configurations (active conf: %u) \n",
+ priv->dev_descriptor.idVendor,
+ priv->dev_descriptor.idProduct,
+ dev->num_configurations,
+ priv->active_config);
+ }
+ if (priv->active_config == 0)
+ Sleep(50);
+ } while (priv->active_config == 0 && --ginfotimeout >= 0);
+
+ if (priv->active_config == 0) {
+ usbi_dbg("after try 0x%x:0x%x found %u configurations (active conf: %u) \n",
+ priv->dev_descriptor.idVendor,
+ priv->dev_descriptor.idProduct,
+ dev->num_configurations,
+ priv->active_config);
+ usbi_dbg("Force this device active config to 1 in libusb! \nNOTICE: Should not reach this place!!!!!! \n");
+ priv->active_config = 1;
}
- memcpy(&priv->dev_descriptor, &(conn_info.DeviceDescriptor), sizeof(USB_DEVICE_DESCRIPTOR));
- dev->num_configurations = priv->dev_descriptor.bNumConfigurations;
- priv->active_config = conn_info.CurrentConfigurationValue;
usbi_dbg("found %u configurations (active conf: %u)", dev->num_configurations, priv->active_config);
// Cache as many config descriptors as we can
diff --git a/libusb/version_nano.h b/libusb/version_nano.h
index e542188..8af14bf 100644
--- a/libusb/version_nano.h
+++ b/libusb/version_nano.h
@@ -1 +1 @@
-#define LIBUSB_NANO 11362
+#define LIBUSB_NANO 11363