Use libusb's own zero length packet support unless we have to emulate it on windows since only libusb knows for sure if it's needed.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
diff --git a/usbutils.c b/usbutils.c
index 974812b..3b62545 100644
--- a/usbutils.c
+++ b/usbutils.c
@@ -2418,7 +2418,7 @@ usb_bulk_transfer(struct libusb_device_handle *dev_handle, int intinfo,
struct usb_epinfo *usb_epinfo;
struct usb_transfer ut;
unsigned char endpoint;
- int err, errn, dummy;
+ int err, errn;
/* End of transfer and zero length packet required */
bool eot = false, zlp = false;
#if DO_USB_STATS
@@ -2426,6 +2426,8 @@ usb_bulk_transfer(struct libusb_device_handle *dev_handle, int intinfo,
#endif
unsigned char buf[512];
#ifdef WIN32
+ int dummy;
+
/* On windows the callback_timeout is a safety mechanism only. */
bulk_timeout = timeout;
callback_timeout += WIN_CALLBACK_EXTRA;
@@ -2448,6 +2450,8 @@ usb_bulk_transfer(struct libusb_device_handle *dev_handle, int intinfo,
if (unlikely(cgpu->shutdown))
return libusb_bulk_transfer(dev_handle, endpoint, data, length, transferred, timeout);
+ init_usb_transfer(&ut);
+
if ((endpoint & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_OUT) {
memcpy(buf, data, length);
/* If this is the last packet in a transfer and is the length
@@ -2455,11 +2459,14 @@ usb_bulk_transfer(struct libusb_device_handle *dev_handle, int intinfo,
* packet to let the device know it's the end of the message.*/
if (eot)
zlp = true;
+#ifndef WIN32
+ /* Windows doesn't support this flag so we emulate it below */
+ ut.transfer->flags |= LIBUSB_TRANSFER_ADD_ZERO_PACKET;
+#endif
}
USBDEBUG("USB debug: @usb_bulk_transfer(%s (nodev=%s),intinfo=%d,epinfo=%d,data=%p,length=%d,timeout=%u,mode=%d,cmd=%s,seq=%d) endpoint=%d", cgpu->drv->name, bool_str(cgpu->usbinfo.nodev), intinfo, epinfo, data, length, timeout, mode, usb_cmdname(cmd), seq, (int)endpoint);
- init_usb_transfer(&ut);
libusb_fill_bulk_transfer(ut.transfer, dev_handle, endpoint, buf, length,
transfer_callback, &ut, bulk_timeout);
STATS_TIMEVAL(&tv_start);
@@ -2498,8 +2505,12 @@ usb_bulk_transfer(struct libusb_device_handle *dev_handle, int intinfo,
}
if ((endpoint & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_IN)
memcpy(data, buf, *transferred);
- else if (zlp) /* Send a zero length packet */
+ else if (zlp) {
+#ifdef WIN32
+ /* Send a zero length packet */
libusb_bulk_transfer(dev_handle, endpoint, NULL, 0, &dummy, 100);
+#endif
+ }
return err;
}