From eb164d7529677c48d1b6c7a9dd9d152d71e38d43 Mon Sep 17 00:00:00 2001 From: "haidong.zheng" Date: Wed, 12 Dec 2018 11:07:18 +0800 Subject: 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 Signed-off-by: Tom Zheng Signed-off-by: Nathan Hjelm --- libusb/os/windows_winusb.c | 52 +++++++++++++++++++++++++++++++++------------- libusb/version_nano.h | 2 +- 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 -- cgit v1.2.1