Browse Source

Check for nothing but consecutive bad results on avalon and reset the FPGA if it happens.

nfactor-troky
Con Kolivas 12 years ago
parent
commit
1ef027c444
  1. 30
      driver-avalon.c

30
driver-avalon.c

@ -222,7 +222,7 @@ static int avalon_send_task(int fd, const struct avalon_task *at,
return ret; return ret;
} }
static void avalon_decode_nonce(struct thr_info *thr, struct cgpu_info *avalon, static bool avalon_decode_nonce(struct thr_info *thr, struct cgpu_info *avalon,
struct avalon_info *info, struct avalon_result *ar, struct avalon_info *info, struct avalon_result *ar,
struct work *work) struct work *work)
{ {
@ -232,7 +232,7 @@ static void avalon_decode_nonce(struct thr_info *thr, struct cgpu_info *avalon,
info->matching_work[work->subid]++; info->matching_work[work->subid]++;
nonce = htole32(ar->nonce); nonce = htole32(ar->nonce);
applog(LOG_DEBUG, "Avalon: nonce = %0x08x", nonce); applog(LOG_DEBUG, "Avalon: nonce = %0x08x", nonce);
submit_nonce(thr, work, nonce); return submit_nonce(thr, work, nonce);
} }
static int avalon_read(int fd, char *buf, ssize_t len) static int avalon_read(int fd, char *buf, ssize_t len)
@ -544,7 +544,8 @@ 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, static void avalon_update_temps(struct cgpu_info *avalon, struct avalon_info *info,
struct avalon_result *ar); struct avalon_result *ar);
static void avalon_inc_nvw(struct avalon_info *info, struct thr_info *thr) static void avalon_inc_nvw(struct cgpu_info *avalon, struct avalon_info *info,
struct thr_info *thr)
{ {
if (unlikely(info->idle)) if (unlikely(info->idle))
return; return;
@ -555,6 +556,7 @@ static void avalon_inc_nvw(struct avalon_info *info, struct thr_info *thr)
inc_hw_errors(thr); inc_hw_errors(thr);
mutex_lock(&info->lock); mutex_lock(&info->lock);
info->no_matching_work++; info->no_matching_work++;
avalon->results--;
mutex_unlock(&info->lock); mutex_unlock(&info->lock);
} }
@ -575,15 +577,22 @@ static void avalon_parse_results(struct cgpu_info *avalon, struct avalon_info *i
found = true; found = true;
if (avalon_decode_nonce(thr, avalon, info, ar, work)) {
mutex_lock(&info->lock); mutex_lock(&info->lock);
if (avalon->results < 0)
avalon->results = 0;
if (!(++avalon->results % info->miner_count)) { if (!(++avalon->results % info->miner_count)) {
gettemp = true; gettemp = true;
avalon->results = 0; avalon->results = 0;
} }
info->nonces++; info->nonces++;
mutex_unlock(&info->lock); mutex_unlock(&info->lock);
} else {
mutex_lock(&info->lock);
avalon->results--;
mutex_unlock(&info->lock);
}
avalon_decode_nonce(thr, avalon, info, ar, work);
if (gettemp) if (gettemp)
avalon_update_temps(avalon, info, ar); avalon_update_temps(avalon, info, ar);
break; break;
@ -596,12 +605,12 @@ static void avalon_parse_results(struct cgpu_info *avalon, struct avalon_info *i
* work result. */ * work result. */
if (spare < (int)AVALON_READ_SIZE) if (spare < (int)AVALON_READ_SIZE)
return; return;
avalon_inc_nvw(info, thr); avalon_inc_nvw(avalon, info, thr);
} else { } else {
spare = AVALON_READ_SIZE + i; spare = AVALON_READ_SIZE + i;
if (i) { if (i) {
if (i >= (int)AVALON_READ_SIZE) if (i >= (int)AVALON_READ_SIZE)
avalon_inc_nvw(info, thr); avalon_inc_nvw(avalon, info, thr);
else else
applog(LOG_WARNING, "Avalon: Discarding %d bytes from buffer", i); applog(LOG_WARNING, "Avalon: Discarding %d bytes from buffer", i);
} }
@ -636,6 +645,15 @@ static void *avalon_get_results(void *userdata)
if (offset >= (int)AVALON_READ_SIZE) if (offset >= (int)AVALON_READ_SIZE)
avalon_parse_results(avalon, info, thr, readbuf, &offset); 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_reset(avalon, fd);
avalon->results = 0;
}
if (unlikely(offset + rsize >= AVALON_READBUF_SIZE)) { if (unlikely(offset + rsize >= AVALON_READBUF_SIZE)) {
/* This should never happen */ /* This should never happen */
applog(LOG_ERR, "Avalon readbuf overflow, resetting buffer"); applog(LOG_ERR, "Avalon readbuf overflow, resetting buffer");

Loading…
Cancel
Save