From 7ad8af19b91bfc8727b3e4fac10fae4d84d3d47c Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Mon, 27 May 2013 17:08:06 +1000 Subject: [PATCH] avalon_read should not loop but just return whatever it has succeeded in reading. --- driver-avalon.c | 54 +++++++++++++++++++++++-------------------------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/driver-avalon.c b/driver-avalon.c index 6543476f..34b20c82 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