Retry up to USB_RETRY_MAX times to clear a halt condition before failing.
diff --git a/usbutils.c b/usbutils.c
index 3602417..ec59639 100644
--- a/usbutils.c
+++ b/usbutils.c
@@ -2310,16 +2310,20 @@ usb_bulk_transfer(struct libusb_device_handle *dev_handle, int intinfo,
usb_cmdname(cmd), *transferred, err, errn);
if (err == LIBUSB_ERROR_PIPE || err == LIBUSB_TRANSFER_STALL) {
- cgpu->usbinfo.last_pipe = time(NULL);
- cgpu->usbinfo.pipe_count++;
- applog(LOG_INFO, "%s%i: libusb pipe error, trying to clear",
- cgpu->drv->name, cgpu->device_id);
- err = libusb_clear_halt(dev_handle, endpoint);
- applog(LOG_DEBUG, "%s%i: libusb pipe error%scleared",
- cgpu->drv->name, cgpu->device_id, err ? " not " : " ");
+ int retries = 0;
- if (err)
- cgpu->usbinfo.clear_fail_count++;
+ do {
+ cgpu->usbinfo.last_pipe = time(NULL);
+ cgpu->usbinfo.pipe_count++;
+ applog(LOG_INFO, "%s%i: libusb pipe error, trying to clear",
+ cgpu->drv->name, cgpu->device_id);
+ err = libusb_clear_halt(dev_handle, endpoint);
+ applog(LOG_DEBUG, "%s%i: libusb pipe error%scleared",
+ cgpu->drv->name, cgpu->device_id, err ? " not " : " ");
+
+ if (err)
+ cgpu->usbinfo.clear_fail_count++;
+ } while (err && ++retries < USB_RETRY_MAX);
}
if ((endpoint & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_IN)
memcpy(data, buf, length);