diff --git a/driver-avalon.c b/driver-avalon.c index 36fcee6f..7d02c50c 100644 --- a/driver-avalon.c +++ b/driver-avalon.c @@ -261,13 +261,11 @@ static int avalon_get_result(int fd, struct avalon_result *ar, struct cgpu_info *avalon; struct avalon_info *info; uint8_t result[AVALON_READ_SIZE]; - int ret, read_count = AVALON_RESET_FAULT_DECISECONDS * AVALON_TIME_FACTOR; + int ret, read_count; - if (likely(thr)) { - avalon = thr->cgpu; - info = avalon_infos[avalon->device_id]; - read_count = info->read_count; - } + avalon = thr->cgpu; + info = avalon_infos[avalon->device_id]; + read_count = info->read_count; memset(result, 0, AVALON_READ_SIZE); ret = avalon_gets(fd, result, read_count, thr, tv_finish); @@ -307,6 +305,39 @@ static bool avalon_decode_nonce(struct thr_info *thr, struct avalon_result *ar, return true; } +static void avalon_get_reset(int fd, struct avalon_result *ar) +{ + int read_amount = AVALON_READ_SIZE; + uint8_t result[AVALON_READ_SIZE]; + struct timeval timeout = {1, 0}; + ssize_t ret = 0; + fd_set rd; + + memset(result, 0, AVALON_READ_SIZE); + memset(ar, 0, AVALON_READ_SIZE); + FD_ZERO(&rd); + FD_SET(fd, &rd); + ret = select(fd + 1, &rd, NULL, NULL, &timeout); + if (unlikely(ret < 0)) { + applog(LOG_WARNING, "Avalon: Error on select in avalon_get_reset"); + return; + } + if (!ret) { + applog(LOG_WARNING, "Avalon: Timeout on select in avalon_get_reset"); + return; + } + ret = read(fd, result, read_amount); + if (unlikely(ret != read_amount)) { + applog(LOG_WARNING, "Avalon: Error on read in avalon_get_reset"); + return; + } + if (opt_debug) { + applog(LOG_DEBUG, "Avalon: get:"); + hexdump((uint8_t *)result, AVALON_READ_SIZE); + } + memcpy((uint8_t *)ar, result, AVALON_READ_SIZE); +} + static int avalon_reset(int fd, struct avalon_result *ar) { struct avalon_task at; @@ -325,7 +356,7 @@ static int avalon_reset(int fd, struct avalon_result *ar) if (ret == AVA_SEND_ERROR) return 1; - avalon_get_result(fd, ar, NULL, NULL); + avalon_get_reset(fd, ar); buf = (uint8_t *)ar; /* Sometimes there is one extra 0 byte for some reason in the buffer,