Commit 8b0531fb2b399a6a606906014209e1e7814bbcca

Con Kolivas 2013-04-08T10:13:15

Make the detection of all wrong results on avalon much more conservative to avoid false positives on work restarts.

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,