Display errors on failed usb read and write and consider sequential IO errors a permanent failure.
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 62 63 64 65 66 67 68 69 70 71 72
diff --git a/usbutils.c b/usbutils.c
index 836b591..01e69dc 100644
--- a/usbutils.c
+++ b/usbutils.c
@@ -2307,7 +2307,7 @@ int _usb_read(struct cgpu_info *cgpu, int intinfo, int epinfo, char *buf, size_t
USB_REJECT(cgpu, MODE_BULK_READ);
err = LIBUSB_ERROR_NO_DEVICE;
- goto out_unlock;
+ goto out_nodev;
}
usbdev = cgpu->usbdev;
@@ -2419,9 +2419,6 @@ int _usb_read(struct cgpu_info *cgpu, int intinfo, int epinfo, char *buf, size_t
*processed = tot;
memcpy((char *)buf, (const char *)usbbuf, (tot < (int)bufsiz) ? tot + 1 : (int)bufsiz);
- if (NODEV(err))
- release_cgpu(cgpu);
-
goto out_unlock;
}
@@ -2547,10 +2544,16 @@ int _usb_read(struct cgpu_info *cgpu, int intinfo, int epinfo, char *buf, size_t
*processed = tot;
memcpy((char *)buf, (const char *)usbbuf, (tot < (int)bufsiz) ? tot + 1 : (int)bufsiz);
- if (NODEV(err))
- release_cgpu(cgpu);
-
out_unlock:
+ if (err && err != LIBUSB_ERROR_TIMEOUT) {
+ applog(LOG_WARNING, "%s %i usb read error: %s", cgpu->drv->name, cgpu->device_id,
+ libusb_error_name(err));
+ if (cgpu->usbinfo.continuous_ioerr_count > USB_RETRY_MAX)
+ err = LIBUSB_ERROR_OTHER;
+ if (NODEV(err))
+ release_cgpu(cgpu);
+ }
+out_nodev:
DEVUNLOCK(cgpu, pstate);
return err;
@@ -2585,7 +2588,7 @@ int _usb_write(struct cgpu_info *cgpu, int intinfo, int epinfo, char *buf, size_
USB_REJECT(cgpu, MODE_BULK_WRITE);
err = LIBUSB_ERROR_NO_DEVICE;
- goto out_unlock;
+ goto out_nodev;
}
usbdev = cgpu->usbdev;
@@ -2649,10 +2652,15 @@ int _usb_write(struct cgpu_info *cgpu, int intinfo, int epinfo, char *buf, size_
*processed = tot;
- if (NODEV(err))
- release_cgpu(cgpu);
-
-out_unlock:
+ if (err) {
+ applog(LOG_WARNING, "%s %i usb write error: %s", cgpu->drv->name, cgpu->device_id,
+ libusb_error_name(err));
+ if (cgpu->usbinfo.continuous_ioerr_count > USB_RETRY_MAX)
+ err = LIBUSB_ERROR_OTHER;
+ if (NODEV(err))
+ release_cgpu(cgpu);
+ }
+out_nodev:
DEVUNLOCK(cgpu, pstate);
return err;