windows_winusb: Set policy ISO_ALWAYS_START_ASAP for libusbK
authorLéo Lam <leo@innovatetechnologi.es>
Sat, 4 May 2019 17:53:56 +0000 (19:53 +0200)
committerNathan Hjelm <hjelmn@me.com>
Mon, 8 Jul 2019 04:01:14 +0000 (22:01 -0600)
In some cases, this is required to avoid eventually getting a
USBD_STATUS_BAD_START_FRAME error back from the Windows USB stack.

This makes the libusbK code match the behaviour of the Linux backend.

It appears that the libusbK backend tried to get this behaviour by
setting StartFrame to 0. However, libusbK docs state that:

"Specifing 0 for KISO_CONTEXT::StartFrame (start transfer ASAP) is
restricted to the first transaction on a newly opened or reset pipe."

Closes #569

Signed-off-by: Nathan Hjelm <hjelmn@me.com>
libusb/os/windows_winusb.c
libusb/os/windows_winusb.h
libusb/version_nano.h

index c7aec1f..19b605a 100644 (file)
@@ -2246,6 +2246,12 @@ static int winusbx_configure_endpoints(int sub_api, struct libusb_device_handle
                if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address,
                        AUTO_CLEAR_STALL, sizeof(UCHAR), &policy))
                        usbi_dbg("failed to enable AUTO_CLEAR_STALL for endpoint %02X", endpoint_address);
+
+               if (sub_api == SUB_API_LIBUSBK) {
+                       if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address,
+                               ISO_ALWAYS_START_ASAP, sizeof(UCHAR), &policy))
+                               usbi_dbg("failed to enable ISO_ALWAYS_START_ASAP for endpoint %02X", endpoint_address);
+               }
        }
 
        return LIBUSB_SUCCESS;
index 651d7c4..3a911d5 100644 (file)
@@ -412,6 +412,7 @@ typedef struct _USB_NODE_CONNECTION_INFORMATION_EX_V2 {
 
 /* winusb.dll interface */
 
+/* pipe policies */
 #define SHORT_PACKET_TERMINATE 0x01
 #define AUTO_CLEAR_STALL       0x02
 #define PIPE_TRANSFER_TIMEOUT  0x03
@@ -420,6 +421,8 @@ typedef struct _USB_NODE_CONNECTION_INFORMATION_EX_V2 {
 #define AUTO_FLUSH             0x06
 #define RAW_IO                 0x07
 #define MAXIMUM_TRANSFER_SIZE  0x08
+/* libusbK */
+#define ISO_ALWAYS_START_ASAP  0x21
 
 typedef enum _USBD_PIPE_TYPE {
        UsbdPipeTypeControl,
index 50676e4..f2a319d 100644 (file)
@@ -1 +1 @@
-#define LIBUSB_NANO 11374
+#define LIBUSB_NANO 11375