Commit 4ddbe241354c80aafae4cb76e622ed9c6069a882

Con Kolivas 2013-05-25T15:52:08

Don't close avalon after detecting it until we're cleaning up, instead using reset for comms failures.

diff --git a/driver-avalon.c b/driver-avalon.c
index d0c05af..7ffc0ff 100644
--- a/driver-avalon.c
+++ b/driver-avalon.c
@@ -674,9 +674,6 @@ static bool avalon_detect_one(const char *devpath)
 		   * avalon_close(fd);
 		   * return false; */
 	}
-	avalon_close(fd);
-
-	avalon->device_fd = -1;
 
 	return true;
 }
@@ -686,32 +683,9 @@ static inline void avalon_detect()
 	serial_detect(&avalon_drv, avalon_detect_one);
 }
 
-static void __avalon_init(struct cgpu_info *avalon)
-{
-	applog(LOG_INFO, "Avalon: Opened on %s", avalon->device_path);
-}
-
 static void avalon_init(struct cgpu_info *avalon)
 {
-	struct avalon_info *info = avalon->device_data;
-	int fd, ret;
-
-	avalon->device_fd = -1;
-	fd = avalon_open(avalon->device_path, info->baud);
-	if (unlikely(fd == -1)) {
-		applog(LOG_ERR, "Avalon: Failed to open on %s",
-		       avalon->device_path);
-		return;
-	}
-
-	ret = avalon_reset(avalon, fd);
-	if (ret) {
-		avalon_close(fd);
-		return;
-	}
-
-	avalon->device_fd = fd;
-	__avalon_init(avalon);
+	applog(LOG_INFO, "Avalon: Opened on %s", avalon->device_path);
 }
 
 static bool avalon_prepare(struct thr_info *thr)
@@ -725,10 +699,8 @@ static bool avalon_prepare(struct thr_info *thr)
 			       AVALON_ARRAY_SIZE);
 	if (!avalon->works)
 		quit(1, "Failed to calloc avalon works in avalon_prepare");
-	if (avalon->device_fd == -1)
-		avalon_init(avalon);
-	else
-		__avalon_init(avalon);
+
+	avalon_init(avalon);
 
 	cgtime(&now);
 	get_datestamp(avalon->init, &now);
@@ -874,15 +846,6 @@ static int64_t avalon_scanhash(struct thr_info *thr)
 	info = avalon->device_data;
 	avalon_get_work_count = info->miner_count;
 
-	if (unlikely(avalon->device_fd == -1)) {
-		if (!avalon_prepare(thr)) {
-			applog(LOG_ERR, "AVA%i: Comms error(open)",
-			       avalon->device_id);
-			dev_error(avalon, REASON_DEV_COMMS_ERROR);
-			/* fail the device if the reopen attempt fails */
-			return -1;
-		}
-	}
 	fd = avalon->device_fd;
 #ifndef WIN32
 	tcflush(fd, TCOFLUSH);
@@ -901,12 +864,11 @@ static int64_t avalon_scanhash(struct thr_info *thr)
 			     (ret == AVA_SEND_BUFFER_EMPTY &&
 			      (i + 1 == end_count) &&
 			      first_try))) {
-			do_avalon_close(thr);
 			applog(LOG_ERR, "AVA%i: Comms error(buffer)",
 			       avalon->device_id);
 			dev_error(avalon, REASON_DEV_COMMS_ERROR);
+			avalon_reset(avalon, fd);
 			first_try = 0;
-			avalon_init(avalon);
 			return 0;	/* This should never happen */
 		}
 		if (ret == AVA_SEND_BUFFER_EMPTY && (i + 1 == end_count)) {
@@ -939,10 +901,10 @@ static int64_t avalon_scanhash(struct thr_info *thr)
 
 		ret = avalon_get_result(fd, &ar, thr, &tv_finish);
 		if (unlikely(ret == AVA_GETS_ERROR)) {
-			do_avalon_close(thr);
 			applog(LOG_ERR,
 			       "AVA%i: Comms error(read)", avalon->device_id);
 			dev_error(avalon, REASON_DEV_COMMS_ERROR);
+			avalon_reset(avalon, fd);
 			return 0;
 		}
 		if (unlikely(ret == AVA_GETS_RESTART))
@@ -986,12 +948,11 @@ static int64_t avalon_scanhash(struct thr_info *thr)
 		/* Look for all invalid results, or consecutive failure
 		 * to generate any results suggesting the FPGA
 		 * controller has screwed up. */
-		do_avalon_close(thr);
 		applog(LOG_ERR,
 			"AVA%i: FPGA controller messed up, %d wrong results",
 			avalon->device_id, result_wrong);
 		dev_error(avalon, REASON_DEV_COMMS_ERROR);
-		avalon_init(avalon);
+		avalon_reset(avalon, fd);
 		return 0;
 	}