Only reset an avalon device with no results when there are no results consecutively.
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
diff --git a/driver-avalon.c b/driver-avalon.c
index 377a7fa..4ca3952 100644
--- a/driver-avalon.c
+++ b/driver-avalon.c
@@ -929,17 +929,22 @@ static int64_t avalon_scanhash(struct thr_info *thr)
elapsed.tv_sec, elapsed.tv_usec);
}
}
- if (unlikely(result_wrong >= avalon_get_work_count ||
- (hash_count == 0 && ret != AVA_GETS_RESTART))) {
- /* This means FPGA controller gave all wrong results, so
- * try to reset the Avalon */
- do_avalon_close(thr);
- applog(LOG_ERR,
- "AVA%i: FPGA controller mess up, %d wrong results", avalon->device_id, result_wrong);
- dev_error(avalon, REASON_DEV_COMMS_ERROR);
- sleep(1);
- avalon_init(avalon);
- return 0;
+ if (hash_count) {
+ if (avalon->results < AVALON_ARRAY_SIZE)
+ avalon->results++;
+ } else if (unlikely((result_wrong >= avalon_get_work_count ) ||
+ (ret != AVA_GETS_RESTART && --avalon->results < 0))) {
+ /* Look for all invalid results, or consecutive failure
+ * to generate any results suggesting the FPGA
+ * controller has screwed up. */
+ do_avalon_close(thr);
+ applog(LOG_ERR,
+ "AVA%i: FPGA controller messed up, %d wrong results",
+ avalon->device_id, result_wrong);
+ dev_error(avalon, REASON_DEV_COMMS_ERROR);
+ sleep(1);
+ avalon_init(avalon);
+ return 0;
}
avalon_rotate_array(avalon);
diff --git a/miner.h b/miner.h
index b4b71ce..3d275da 100644
--- a/miner.h
+++ b/miner.h
@@ -431,6 +431,7 @@ struct cgpu_info {
struct work **works;
int work_array;
int queued;
+ int results;
#endif
#ifdef USE_USBUTILS
struct cg_usb_info usbinfo;