Commit dc9c3783ecb15ea2e52af12ffa4e773cf2440eb3

Con Kolivas 2013-10-08T22:05:01

Display errors on failed usb read and write and consider sequential IO errors a permanent failure.

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;