Set the avalon read transfer latency to avoid sleeping when no data is returned after very short latency settings.
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
diff --git a/driver-avalon.c b/driver-avalon.c
index 4136e49..789fc53 100644
--- a/driver-avalon.c
+++ b/driver-avalon.c
@@ -498,6 +498,16 @@ static void avalon_initialise(struct cgpu_info *avalon)
if (avalon->usbinfo.nodev)
return;
+ // Set latency
+ err = usb_transfer(avalon, FTDI_TYPE_OUT, FTDI_REQUEST_LATENCY,
+ AVALON_READ_TIMEOUT, interface, C_LATENCY);
+
+ applog(LOG_DEBUG, "%s%i: latency got err %d",
+ avalon->drv->name, avalon->device_id, err);
+
+ if (avalon->usbinfo.nodev)
+ return;
+
// Set data
err = usb_transfer(avalon, FTDI_TYPE_OUT, FTDI_REQUEST_DATA,
FTDI_VALUE_DATA_AVA, interface, C_SETDATA);
@@ -745,7 +755,6 @@ static void *avalon_get_results(void *userdata)
RenameThread(threadname);
while (likely(!avalon->shutdown)) {
- struct timeval tv_start, now, tdiff;
unsigned char buf[rsize];
int ret;
@@ -767,20 +776,11 @@ static void *avalon_get_results(void *userdata)
offset = 0;
}
- cgtime(&tv_start);
ret = avalon_read(avalon, buf, rsize, AVALON_READ_TIMEOUT,
C_AVALON_READ);
- if (ret < 1) {
- int us_delay;
-
- cgtime(&now);
- timersub(&now, &tv_start, &tdiff);
- us_delay = AVALON_READ_TIMEOUT * 1000 - (tdiff.tv_usec);
- if (us_delay > 0)
- nusleep(us_delay);
+ if (ret < 1)
continue;
- }
if (opt_debug) {
applog(LOG_DEBUG, "Avalon: get:");