From 6d18ce4caae9d367761f669fd66fc15040c547ff Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Fri, 11 Oct 2013 14:37:40 +1100 Subject: [PATCH] Retry up to USB_RETRY_MAX times to clear a halt condition before failing. --- usbutils.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/usbutils.c b/usbutils.c index 36024173..ec596394 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);