Browse Source

bifury: Tolerate other data before version reply

Luke Dashjr 12 years ago
parent
commit
98aeb818d9
1 changed files with 22 additions and 5 deletions
  1. 22 5
      driver-bifury.c

+ 22 - 5
driver-bifury.c

@@ -81,8 +81,10 @@ static
 bool bifury_detect_one(const char * const devpath)
 bool bifury_detect_one(const char * const devpath)
 {
 {
 	char buf[0x40], *p, *q;
 	char buf[0x40], *p, *q;
+	bytes_t reply = BYTES_INIT;
 	int major, minor, hwrev, chips;
 	int major, minor, hwrev, chips;
 	struct cgpu_info *cgpu;
 	struct cgpu_info *cgpu;
+	struct timeval tv_timeout;
 	const int fd = serial_open(devpath, 0, 10, true);
 	const int fd = serial_open(devpath, 0, 10, true);
 	applog(LOG_DEBUG, "%s: %s %s",
 	applog(LOG_DEBUG, "%s: %s %s",
 	       bifury_drv.dname,
 	       bifury_drv.dname,
@@ -95,22 +97,36 @@ bool bifury_detect_one(const char * const devpath)
 	while (read(fd, buf, sizeof(buf)) == sizeof(buf))
 	while (read(fd, buf, sizeof(buf)) == sizeof(buf))
 	{}
 	{}
 	
 	
+	if (opt_dev_protocol)
+		applog(LOG_DEBUG, "%s fd=%d: DEVPROTO: SEND %s", bifury_drv.dname, fd, "version");
 	if (8 != write(fd, "version\n", 8))
 	if (8 != write(fd, "version\n", 8))
 	{
 	{
 		applog(LOG_DEBUG, "%s: Error sending version request", bifury_drv.dname);
 		applog(LOG_DEBUG, "%s: Error sending version request", bifury_drv.dname);
 		goto err;
 		goto err;
 	}
 	}
 	
 	
-	if (read(fd, buf, sizeof(buf)) < 1 || strncmp("version ", buf, 8))
+	timer_set_delay_from_now(&tv_timeout, 1000000);
+	while (true)
 	{
 	{
-		applog(LOG_DEBUG, "%s: Wrong response to version request: %s",
-		       bifury_drv.dname, buf);
-		goto err;
+		p = bifury_readln(fd, &reply);
+		if (opt_dev_protocol)
+			applog(LOG_DEBUG, "%s fd=%d: DEVPROTO: RECV %s",
+			       bifury_drv.dname, fd, p);
+		if (!strncmp("version ", p, 8))
+			break;
+		free(p);
+		if (timer_passed(&tv_timeout, NULL))
+		{
+			applog(LOG_DEBUG, "%s: Timed out waiting for response to version request",
+			       bifury_drv.dname);
+			goto err;
+		}
 	}
 	}
 	
 	
+	bytes_free(&reply);
 	serial_close(fd);
 	serial_close(fd);
 	
 	
-	major = strtol(&buf[8], &p, 10);
+	major = strtol(&p[8], &p, 10);
 	if (p == &buf[8] || p[0] != '.')
 	if (p == &buf[8] || p[0] != '.')
 		goto parseerr;
 		goto parseerr;
 	minor = strtol(&p[1], &q, 10);
 	minor = strtol(&p[1], &q, 10);
@@ -143,6 +159,7 @@ bool bifury_detect_one(const char * const devpath)
 parseerr:
 parseerr:
 	applog(LOG_DEBUG, "%s: Error parsing version response", bifury_drv.dname);
 	applog(LOG_DEBUG, "%s: Error parsing version response", bifury_drv.dname);
 err:
 err:
+	bytes_free(&reply);
 	serial_close(fd);
 	serial_close(fd);
 	return false;
 	return false;
 }
 }