Commit 7ad8af19b91bfc8727b3e4fac10fae4d84d3d47c

Con Kolivas 2013-05-27T17:08:06

avalon_read should not loop but just return whatever it has succeeded in reading.

diff --git a/driver-avalon.c b/driver-avalon.c
index 6543476..34b20c8 100644
--- a/driver-avalon.c
+++ b/driver-avalon.c
@@ -229,37 +229,33 @@ static bool avalon_decode_nonce(struct thr_info *thr, struct cgpu_info *avalon,
 static int avalon_read(struct cgpu_info *avalon, char *buf, ssize_t len)
 {
 	ssize_t aread = 0;
-
-	while (len > 0) {
-		int amount, err, offset, cp;
-		char readbuf[AVALON_FTDI_READSIZE];
-
-		err = usb_read_once_timeout(avalon, readbuf, AVALON_FTDI_READSIZE,
-					    &amount, AVALON_READ_TIMEOUT,
-					    C_AVALON_READ);
-		if (err && err != LIBUSB_ERROR_TIMEOUT) {
-			applog(LOG_WARNING, "%s%i: Get avalon read got err %d",
-			       avalon->drv->name, avalon->device_id, err);
-			nmsleep(AVALON_READ_TIMEOUT);
-			continue;
-		}
-
-		if (amount < 3)
-			continue;
-
-		offset = 2;
-		do {
-			cp = amount - 2;
-			if (cp > 62)
-				cp = 62;
-			memcpy(&buf[aread], readbuf, cp);
-			aread += cp;
-			amount -= cp + 2;
-			offset += 64;
-		} while (amount > 2);
+	int amount, err, offset, cp;
+	char readbuf[AVALON_FTDI_READSIZE];
+
+	err = usb_read_once_timeout(avalon, readbuf, len, &amount,
+				    AVALON_READ_TIMEOUT, C_AVALON_READ);
+	if (err && err != LIBUSB_ERROR_TIMEOUT) {
+		applog(LOG_WARNING, "%s%i: Get avalon read got err %d",
+			avalon->drv->name, avalon->device_id, err);
+		nmsleep(AVALON_READ_TIMEOUT);
+		return 0;
 	}
 
-	return AVA_GETS_OK;
+	if (amount < 3)
+		return 0;
+
+	offset = 2;
+	do {
+		cp = amount - 2;
+		if (cp > 62)
+			cp = 62;
+		memcpy(&buf[aread], readbuf, cp);
+		aread += cp;
+		amount -= cp + 2;
+		offset += 64;
+	} while (amount > 2);
+
+	return aread;
 }
 
 /* Wait until the ftdi chip returns a CTS saying we can send more data. The