Simplify debugging and only discard from avalon read buffer if at least one full result has been discarded.
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
diff --git a/driver-avalon.c b/driver-avalon.c
index 20e0ed7..3031eb3 100644
--- a/driver-avalon.c
+++ b/driver-avalon.c
@@ -650,23 +650,24 @@ static void avalon_parse_results(struct cgpu_info *avalon, struct avalon_info *i
if (!found) {
spare = *offset - AVALON_READ_SIZE;
- if (spare)
- applog(LOG_WARNING, "Avalon: Discarding %d bytes from buffer", spare);
+ /* We are buffering and haven't accumulated one more corrupt
+ * work result. */
+ if (spare < (int)AVALON_READ_SIZE)
+ return;
+ applog(LOG_WARNING, "Avalon: Discarding %d bytes from buffer", spare);
+
+ inc_hw_errors(thr);
+ mutex_lock(&info->lock);
+ info->no_matching_work++;
+ mutex_unlock(&info->lock);
} else {
spare = AVALON_READ_SIZE + i;
if (i)
applog(LOG_WARNING, "Avalon: Discarding %d bytes from buffer", i);
}
- if (spare) {
- *offset -= spare;
- memmove(buf, buf + spare, *offset);
- }
- if (!found) {
- mutex_lock(&info->lock);
- info->no_matching_work++;
- mutex_unlock(&info->lock);
- }
+ *offset -= spare;
+ memmove(buf, buf + spare, *offset);
}
static void *avalon_get_results(void *userdata)