Check results come in at least at 2/3 the rate they should be on avalon and if not, reset it.
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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
diff --git a/driver-avalon.c b/driver-avalon.c
index e877ec6..8e30268 100644
--- a/driver-avalon.c
+++ b/driver-avalon.c
@@ -593,8 +593,7 @@ static struct work *avalon_valid_result(struct cgpu_info *avalon, struct avalon_
static void avalon_update_temps(struct cgpu_info *avalon, struct avalon_info *info,
struct avalon_result *ar);
-static void avalon_inc_nvw(struct cgpu_info *avalon, struct avalon_info *info,
- struct thr_info *thr)
+static void avalon_inc_nvw(struct avalon_info *info, struct thr_info *thr)
{
if (unlikely(info->idle))
return;
@@ -603,10 +602,7 @@ static void avalon_inc_nvw(struct cgpu_info *avalon, struct avalon_info *info,
thr->cgpu->drv->name, thr->cgpu->device_id);
inc_hw_errors(thr);
- mutex_lock(&info->lock);
info->no_matching_work++;
- avalon->results--;
- mutex_unlock(&info->lock);
}
static void avalon_parse_results(struct cgpu_info *avalon, struct avalon_info *info,
@@ -628,16 +624,8 @@ static void avalon_parse_results(struct cgpu_info *avalon, struct avalon_info *i
if (avalon_decode_nonce(thr, avalon, info, ar, work)) {
mutex_lock(&info->lock);
- if (++avalon->results > 0 &&
- !(avalon->results % info->miner_count)) {
+ if (!info->nonces++)
gettemp = true;
- avalon->results = 0;
- }
- info->nonces++;
- mutex_unlock(&info->lock);
- } else {
- mutex_lock(&info->lock);
- avalon->results--;
mutex_unlock(&info->lock);
}
@@ -653,12 +641,12 @@ static void avalon_parse_results(struct cgpu_info *avalon, struct avalon_info *i
* work result. */
if (spare < (int)AVALON_READ_SIZE)
return;
- avalon_inc_nvw(avalon, info, thr);
+ avalon_inc_nvw(info, thr);
} else {
spare = AVALON_READ_SIZE + i;
if (i) {
if (i >= (int)AVALON_READ_SIZE)
- avalon_inc_nvw(avalon, info, thr);
+ avalon_inc_nvw(info, thr);
else
applog(LOG_WARNING, "Avalon: Discarding %d bytes from buffer", i);
}
@@ -712,14 +700,6 @@ static void *avalon_get_results(void *userdata)
if (offset >= (int)AVALON_READ_SIZE)
avalon_parse_results(avalon, info, thr, readbuf, &offset);
- /* Check for nothing but consecutive bad results and reset the
- * FPGA if necessary */
- if (unlikely(avalon->results <= -info->miner_count)) {
- applog(LOG_ERR, "AVA%d: %d invalid consecutive results, resetting",
- avalon->device_id, -avalon->results);
- avalon_running_reset(avalon, info, fd);
- }
-
if (unlikely(offset + rsize >= AVALON_READBUF_SIZE)) {
/* This should never happen */
applog(LOG_ERR, "Avalon readbuf overflow, resetting buffer");
@@ -1012,6 +992,7 @@ static int64_t avalon_scanhash(struct thr_info *thr)
{
struct cgpu_info *avalon = thr->cgpu;
struct avalon_info *info = avalon->device_data;
+ const int miner_count = info->miner_count;
struct timeval now, then, tdiff;
int64_t hash_count, us_timeout;
struct timespec abstime;
@@ -1033,9 +1014,22 @@ static int64_t avalon_scanhash(struct thr_info *thr)
mutex_lock(&info->lock);
hash_count = 0xffffffffull * (uint64_t)info->nonces;
+ avalon->results += info->nonces;
+ if (avalon->results > miner_count)
+ avalon->results = miner_count;
+ if (!info->idle)
+ avalon->results -= miner_count / 3;
info->nonces = 0;
mutex_unlock(&info->lock);
+ /* Check for nothing but consecutive bad results or consistently less
+ * results than we should be getting and reset the FPGA if necessary */
+ if (avalon->results < -miner_count) {
+ applog(LOG_ERR, "AVA%d: Result return rate low, resetting!",
+ avalon->device_id);
+ avalon_running_reset(avalon, info, avalon->device_fd);
+ }
+
/* This hashmeter is just a utility counter based on returned shares */
return hash_count;
}