Browse Source

Check results come in at least at 2/3 the rate they should be on avalon and if not, reset it.

nfactor-troky
Con Kolivas 12 years ago
parent
commit
8595f3bd74
  1. 42
      driver-avalon.c

42
driver-avalon.c

@ -593,8 +593,7 @@ static struct work *avalon_valid_result(struct cgpu_info *avalon, struct avalon_ @@ -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, @@ -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 @@ -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 @@ -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) @@ -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) @@ -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) @@ -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;
}

Loading…
Cancel
Save