From e2c4379290b6ead0b1f387202a17d15a16f2366a Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Sat, 25 May 2013 22:21:02 +1000 Subject: [PATCH] Repeat going idle after avalon reset, and wait for write ready before sending each reset request instead of some arbitrary sleep time. --- driver-avalon.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/driver-avalon.c b/driver-avalon.c index f11fc577..1e918f2b 100644 --- a/driver-avalon.c +++ b/driver-avalon.c @@ -416,9 +416,6 @@ static void avalon_idle(struct cgpu_info *avalon, int fd) break; } applog(LOG_ERR, "Avalon: Going to idle mode"); - sleep(2); - avalon_clear_readbuf(fd); - applog(LOG_ERR, "Avalon: Idle"); } static int avalon_reset(struct cgpu_info *avalon, int fd) @@ -437,11 +434,18 @@ static int avalon_reset(struct cgpu_info *avalon, int fd) ret = avalon_write(fd, "ad", 2); if (unlikely(ret == AVA_SEND_ERROR)) return -1; + /* Ignore first result as it may be corrupt with old work */ + avalon_clear_readbuf(fd); + + /* What do these sleeps do?? */ p.tv_sec = 0; p.tv_nsec = AVALON_RESET_PITCH; nanosleep(&p, NULL); - avalon_clear_readbuf(fd); avalon_idle(avalon, fd); + avalon_wait_write(fd); + avalon_clear_readbuf(fd); + applog(LOG_ERR, "Avalon: Idle"); + /* Reset again, then check result */ ret = avalon_write(fd, "ad", 2); if (unlikely(ret == AVA_SEND_ERROR)) @@ -468,6 +472,8 @@ static int avalon_reset(struct cgpu_info *avalon, int fd) /* FIXME: return 1; */ } else applog(LOG_WARNING, "Avalon: Reset succeeded"); + + avalon_idle(avalon, fd); return 0; }