Make the detection of all wrong results on avalon much more conservative to avoid false positives on work restarts.
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 52 53 54
diff --git a/driver-avalon.c b/driver-avalon.c
index a3e96b4..9435c36 100644
--- a/driver-avalon.c
+++ b/driver-avalon.c
@@ -824,7 +824,7 @@ static int64_t avalon_scanhash(struct thr_info *thr)
uint32_t nonce;
int64_t hash_count;
static int first_try = 0;
- int result_count, result_wrong;
+ int result_wrong;
avalon = thr->cgpu;
works = avalon->works;
@@ -886,7 +886,6 @@ static int64_t avalon_scanhash(struct thr_info *thr)
elapsed.tv_sec = elapsed.tv_usec = 0;
gettimeofday(&tv_start, NULL);
- result_count = 0;
result_wrong = 0;
hash_count = 0;
while (true) {
@@ -904,20 +903,14 @@ static int64_t avalon_scanhash(struct thr_info *thr)
dev_error(avalon, REASON_DEV_COMMS_ERROR);
return 0;
}
- if (unlikely(ret == AVA_GETS_RESTART)) {
- /* Reset the wrong count in case there has only been
- * a small number of nonces tested before the restart.
- */
- result_wrong = 0;
+ if (unlikely(ret == AVA_GETS_RESTART))
break;
- }
if (unlikely(ret == AVA_GETS_TIMEOUT)) {
timersub(&tv_finish, &tv_start, &elapsed);
applog(LOG_DEBUG, "Avalon: no nonce in (%ld.%06lds)",
elapsed.tv_sec, elapsed.tv_usec);
continue;
}
- result_count++;
if (!avalon_decode_nonce(thr, &ar, &nonce)) {
info->no_matching_work++;
@@ -941,8 +934,8 @@ static int64_t avalon_scanhash(struct thr_info *thr)
elapsed.tv_sec, elapsed.tv_usec);
}
}
- if (result_wrong && result_count == result_wrong) {
- /* This mean FPGA controller give all wrong result
+ if (result_wrong >= info->miner_count) {
+ /* This mean FPGA controller gave all wrong results, so
* try to reset the Avalon */
do_avalon_close(thr);
applog(LOG_ERR,