Solaris backend is not correctly setting the one transfer mode for Interrupt-In pipe
authorKenjiro Tsuji <kenjiro.tsuji@oracle.com>
Thu, 26 Sep 2019 00:51:43 +0000 (17:51 -0700)
committerNathan Hjelm <hjelmn@google.com>
Thu, 26 Sep 2019 17:43:43 +0000 (11:43 -0600)
commita45730f4339d5d6391757ee2d4c2f86b8411de5f
treec273c8fcdb93bb80dcb6a08258a5b4b16c320d52
parent906e706f8abdff626370e59b880f340cf54e3632
Solaris backend is not correctly setting the one transfer mode for Interrupt-In pipe

In sunos_check_device_and_status_open() function, if the target is an Interrupt-In
pipe, it opens the status endpoint first and writes USB_EP_INTR_ONE_XFER control
to the status endpoint to enable the one transfer mode. And it then closes the
status endpoint. After that, it opens the xfer endpoint and re-opens the status
endpoint. This is not correct, because closing the status endpoint is implicitly
disables the one tranfer mode.  As a result, an event notification won't be
delivered to the client in timely manner.  According to the comment in the source,
closing the status endpoint first and opening the xfer endpoint and status endpoint
in this order is intentional to avoit an issue that may happen if the USB device
has multiple configurations, which may be due to a ugen driver issue. To address
both issues, it can open the xfer endpoint first and immediately close it, which
will take care of the switch of configurations, if necessary.  Then, it can open
the status endpoint, enable the one transfer mode, and re-open the xfer endpoint.
This is a fix of libusb#620.

Closes #629

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