|
|
|
@ -829,6 +829,7 @@ static int64_t avalon_scanhash(struct thr_info *thr)
@@ -829,6 +829,7 @@ static int64_t avalon_scanhash(struct thr_info *thr)
|
|
|
|
|
uint32_t nonce; |
|
|
|
|
int64_t hash_count; |
|
|
|
|
static int first_try = 0; |
|
|
|
|
int result_wrong; |
|
|
|
|
|
|
|
|
|
avalon = thr->cgpu; |
|
|
|
|
works = avalon->works; |
|
|
|
@ -890,6 +891,7 @@ static int64_t avalon_scanhash(struct thr_info *thr)
@@ -890,6 +891,7 @@ static int64_t avalon_scanhash(struct thr_info *thr)
|
|
|
|
|
elapsed.tv_sec = elapsed.tv_usec = 0; |
|
|
|
|
gettimeofday(&tv_start, NULL); |
|
|
|
|
|
|
|
|
|
result_wrong = 0; |
|
|
|
|
hash_count = 0; |
|
|
|
|
while (true) { |
|
|
|
|
full = avalon_buffer_full(fd); |
|
|
|
@ -917,6 +919,7 @@ static int64_t avalon_scanhash(struct thr_info *thr)
@@ -917,6 +919,7 @@ static int64_t avalon_scanhash(struct thr_info *thr)
|
|
|
|
|
|
|
|
|
|
if (!avalon_decode_nonce(thr, &ar, &nonce)) { |
|
|
|
|
info->no_matching_work++; |
|
|
|
|
result_wrong++; |
|
|
|
|
|
|
|
|
|
if (opt_debug) { |
|
|
|
|
timersub(&tv_finish, &tv_start, &elapsed); |
|
|
|
@ -936,6 +939,17 @@ static int64_t avalon_scanhash(struct thr_info *thr)
@@ -936,6 +939,17 @@ static int64_t avalon_scanhash(struct thr_info *thr)
|
|
|
|
|
elapsed.tv_sec, elapsed.tv_usec); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (result_wrong >= avalon_get_work_count && ret != AVA_GETS_RESTART) { |
|
|
|
|
/* This mean 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", avalon->device_id); |
|
|
|
|
dev_error(avalon, REASON_DEV_COMMS_ERROR); |
|
|
|
|
sleep(1); |
|
|
|
|
avalon_init(avalon); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
avalon_free_work_array(thr); |
|
|
|
|
|
|
|
|
|