summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPete Batard <pbatard@gmail.com>2011-03-03 18:35:35 +0000
committerHans de Goede <hdegoede@redhat.com>2011-06-17 12:04:15 +0200
commit212ca37cdf525cfc07386b36bb3841bad0f7f3e3 (patch)
tree7e99c7d3c54d66b373c5fab240ac1188bd42d55e
parent98b240d03d81b92d4d0455dd2f34ea52c4454f92 (diff)
Windows: add speed retrievalfedora-1.0.9-0.1usbredir
* use the (currently superspeed unaware) _EX calls and structs
-rw-r--r--libusb/os/windows_usb.c7
-rw-r--r--libusb/os/windows_usb.h14
2 files changed, 12 insertions, 9 deletions
diff --git a/libusb/os/windows_usb.c b/libusb/os/windows_usb.c
index 873a9ba..596cd08 100644
--- a/libusb/os/windows_usb.c
+++ b/libusb/os/windows_usb.c
@@ -980,7 +980,7 @@ static int init_device(struct libusb_device* dev, struct libusb_device* parent_d
{
HANDLE handle;
DWORD size;
- USB_NODE_CONNECTION_INFORMATION conn_info;
+ USB_NODE_CONNECTION_INFORMATION_EX conn_info;
struct windows_device_priv *priv, *parent_priv;
struct libusb_context *ctx = DEVICE_CTX(dev);
struct libusb_device* tmp_dev;
@@ -1030,9 +1030,9 @@ static int init_device(struct libusb_device* dev, struct libusb_device* parent_d
usbi_warn(ctx, "could not open hub %s: %s", parent_priv->path, windows_error_str(0));
return LIBUSB_ERROR_ACCESS;
}
- size = sizeof(USB_NODE_CONNECTION_INFORMATION);
+ size = sizeof(conn_info);
conn_info.ConnectionIndex = (ULONG)port_number;
- if (!DeviceIoControl(handle, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION, &conn_info, size,
+ if (!DeviceIoControl(handle, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX, &conn_info, size,
&conn_info, size, &size, NULL)) {
usbi_warn(ctx, "could not get node connection information for device '%s': %s",
device_id, windows_error_str(0));
@@ -1060,6 +1060,7 @@ static int init_device(struct libusb_device* dev, struct libusb_device* parent_d
usbi_err(ctx, "program assertion failed: device address overflow");
}
dev->device_address = (uint8_t)conn_info.DeviceAddress;
+ dev->speed = conn_info.Speed + 1; // expected future-proof
} else {
dev->device_address = UINT8_MAX; // Hubs from HCD have a devaddr of 255
force_hcd_device_descriptor(dev);
diff --git a/libusb/os/windows_usb.h b/libusb/os/windows_usb.h
index 6f930d5..608f369 100644
--- a/libusb/os/windows_usb.h
+++ b/libusb/os/windows_usb.h
@@ -317,10 +317,12 @@ typedef RETURN_TYPE CONFIGRET;
#define USB_REQUEST_SYNC_FRAME LIBUSB_REQUEST_SYNCH_FRAME
#define USB_GET_NODE_INFORMATION 258
-#define USB_GET_NODE_CONNECTION_INFORMATION 259
#define USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION 260
#define USB_GET_NODE_CONNECTION_NAME 261
#define USB_GET_HUB_CAPABILITIES 271
+#if !defined(USB_GET_NODE_CONNECTION_INFORMATION_EX)
+#define USB_GET_NODE_CONNECTION_INFORMATION_EX 274
+#endif
#if !defined(USB_GET_HUB_CAPABILITIES_EX)
#define USB_GET_HUB_CAPABILITIES_EX 276
#endif
@@ -381,8 +383,8 @@ DLL_DECLARE(WINAPI, CONFIGRET, CM_Get_Device_IDA, (DEVINST, PCHAR, ULONG, ULONG)
#define IOCTL_USB_GET_NODE_INFORMATION \
CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION \
- CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX \
+ CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES \
CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_ATTRIBUTES, METHOD_BUFFERED, FILE_ANY_ACCESS)
@@ -512,17 +514,17 @@ typedef struct _USB_PIPE_INFO {
ULONG ScheduleOffset;
} USB_PIPE_INFO, *PUSB_PIPE_INFO;
-typedef struct _USB_NODE_CONNECTION_INFORMATION {
+typedef struct _USB_NODE_CONNECTION_INFORMATION_EX {
ULONG ConnectionIndex;
USB_DEVICE_DESCRIPTOR DeviceDescriptor;
UCHAR CurrentConfigurationValue;
- BOOLEAN LowSpeed;
+ UCHAR Speed;
BOOLEAN DeviceIsHub;
USHORT DeviceAddress;
ULONG NumberOfOpenPipes;
USB_CONNECTION_STATUS ConnectionStatus;
// USB_PIPE_INFO PipeList[0];
-} USB_NODE_CONNECTION_INFORMATION, *PUSB_NODE_CONNECTION_INFORMATION;
+} USB_NODE_CONNECTION_INFORMATION_EX, *PUSB_NODE_CONNECTION_INFORMATION_EX;
typedef struct _USB_HUB_CAP_FLAGS {
ULONG HubIsHighSpeedCapable:1;