From c55830502a0df4ae1165e583de4e96a11af33c62 Mon Sep 17 00:00:00 2001 From: Kano Date: Tue, 24 Jul 2012 02:19:23 +1000 Subject: [PATCH] BFL force all code to timeout to avoid hanging --- driver-bitforce.c | 16 +++++++++------- fpgautils.c | 10 +++++----- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/driver-bitforce.c b/driver-bitforce.c index 31892297..ff537203 100644 --- a/driver-bitforce.c +++ b/driver-bitforce.c @@ -34,13 +34,15 @@ struct device_api bitforce_api; -#define BFopen(devpath) serial_open(devpath, 0, -1, true) +// Code must deal with a timeout +#define BFopen(devpath) serial_open(devpath, 0, 1, true) static void BFgets(char *buf, size_t bufLen, int fd) { - do + do { + buf[0] = '\0'; --bufLen; - while (likely(bufLen && read(fd, buf, 1) == 1 && (buf++)[0] != '\n')); + } while (likely(bufLen && read(fd, buf, 1) == 1 && (buf++)[0] != '\n')); buf[0] = '\0'; } @@ -72,7 +74,7 @@ static bool bitforce_detect_one(const char *devpath) BFwrite(fdDev, "ZGX", 3); BFgets(pdevbuf, sizeof(pdevbuf), fdDev); if (unlikely(!pdevbuf[0])) { - applog(LOG_ERR, "BFL: Error reading (ZGX)"); + applog(LOG_ERR, "BFL: Error reading/timeout (ZGX)"); return 0; } @@ -200,7 +202,7 @@ void bitforce_init(struct cgpu_info *bitforce) if (unlikely(!pdevbuf[0])) { mutex_unlock(&bitforce->device_mutex); - applog(LOG_ERR, "BFL%i: Error reading (ZGX)", bitforce->device_id); + applog(LOG_ERR, "BFL%i: Error reading/timeout (ZGX)", bitforce->device_id); return; } @@ -240,7 +242,7 @@ static bool bitforce_get_temp(struct cgpu_info *bitforce) mutex_unlock(&bitforce->device_mutex); if (unlikely(!pdevbuf[0])) { - applog(LOG_ERR, "BFL%i: Error: Get temp returned empty string", bitforce->device_id); + applog(LOG_ERR, "BFL%i: Error: Get temp returned empty string/timed out", bitforce->device_id); bitforce->temp = 0; return false; } @@ -328,7 +330,7 @@ re_send: } if (unlikely(!pdevbuf[0])) { - applog(LOG_ERR, "BFL%i: Error: Send block data returned empty string", bitforce->device_id); + applog(LOG_ERR, "BFL%i: Error: Send block data returned empty string/timed out", bitforce->device_id); return false; } diff --git a/fpgautils.c b/fpgautils.c index 0ebee7f6..07b3fe36 100644 --- a/fpgautils.c +++ b/fpgautils.c @@ -178,7 +178,8 @@ serial_open(const char*devpath, unsigned long baud, signed short timeout, bool p SetCommConfig(hSerial, &comCfg, sizeof(comCfg)); - const DWORD ctoms = (timeout == -1) ? 30000 : (timeout * 100); + // Code must specify a valid timeout value (0 means don't timeout) + const DWORD ctoms = (timeout * 100); COMMTIMEOUTS cto = {ctoms, 0, ctoms, 0, ctoms}; SetCommTimeouts(hSerial, &cto); @@ -230,10 +231,9 @@ serial_open(const char*devpath, unsigned long baud, signed short timeout, bool p my_termios.c_oflag &= ~OPOST; my_termios.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); - if (timeout >= 0) { - my_termios.c_cc[VTIME] = (cc_t)timeout; - my_termios.c_cc[VMIN] = 0; - } + // Code must specify a valid timeout value (0 means don't timeout) + my_termios.c_cc[VTIME] = (cc_t)timeout; + my_termios.c_cc[VMIN] = 0; tcsetattr(fdDev, TCSANOW, &my_termios); if (purge)