Browse Source

Add serial port claiming logic to avalon, bitforce, and modminer drivers

Luke Dashjr 12 years ago
parent
commit
58097a74fb
6 changed files with 19 additions and 8 deletions
  1. 3 0
      driver-avalon.c
  2. 3 0
      driver-bitforce.c
  3. 1 4
      driver-icarus.c
  4. 3 0
      driver-modminer.c
  5. 6 3
      fpgautils.c
  6. 3 1
      fpgautils.h

+ 3 - 0
driver-avalon.c

@@ -571,6 +571,9 @@ static bool avalon_detect_one(const char *devpath)
 	int baud, miner_count, asic_count, timeout, frequency = 0;
 	struct cgpu_info *avalon;
 
+	if (serial_claim(devpath, avalon_drv))
+		return false;
+	
 	int this_option_offset = ++option_offset;
 	get_options(this_option_offset, &baud, &miner_count, &asic_count,
 		    &timeout, &frequency);

+ 3 - 0
driver-bitforce.c

@@ -190,6 +190,9 @@ static bool bitforce_detect_one(const char *devpath)
 		return false;
 	}
 
+	if (serial_claim_v(devpath, &bitforce_drv))
+		return false;
+	
 	applog(LOG_DEBUG, "Found BitForce device on %s", devpath);
 	initdata = malloc(sizeof(*initdata));
 	*initdata = (struct bitforce_init_data){

+ 1 - 4
driver-icarus.c

@@ -595,11 +595,8 @@ bool icarus_detect_custom(const char *devpath, struct device_drv *api, struct IC
 			devpath, nonce_hex);
 	free(nonce_hex);
 
-	if (serial_claim(devpath, api)) {
-		const char *claimedby = serial_claim(devpath, api)->dname;
-		applog(LOG_DEBUG, "Icarus device %s already claimed by other driver: %s", devpath, claimedby);
+	if (serial_claim_v(devpath, api))
 		return false;
-	}
 
 	/* We have a real Icarus! */
 	struct cgpu_info *icarus;

+ 3 - 0
driver-modminer.c

@@ -123,6 +123,9 @@ modminer_detect_one(const char *devpath)
 	char*devname = strdup(buf);
 	applog(LOG_DEBUG, "ModMiner identified as: %s", devname);
 
+	if (serial_claim_v(devpath, &modminer_drv))
+		return false;
+	
 	if (1 != write(fd, MODMINER_FPGA_COUNT, 1))
 		bailout(LOG_DEBUG, "ModMiner detect: write failed on %s (get FPGA count)", devpath);
 	len = read(fd, buf, 1);

+ 6 - 3
fpgautils.c

@@ -347,8 +347,6 @@ int _serial_autodetect(detectone_func_t detectone, ...)
 	return rv;
 }
 
-struct device_drv *serial_claim(const char *devpath, struct device_drv *api);
-
 int _serial_detect(struct device_drv *api, detectone_func_t detectone, autoscan_func_t autoscan, int flags)
 {
 	struct string_elist *iter, *tmp;
@@ -416,7 +414,7 @@ struct _device_claim {
 	UT_hash_handle hh;
 };
 
-struct device_drv *serial_claim(const char *devpath, struct device_drv *api)
+struct device_drv *_serial_claim(const char *devpath, struct device_drv *api, bool verbose)
 {
 	static struct _device_claim *claims = NULL;
 	struct _device_claim *c;
@@ -442,7 +440,12 @@ struct device_drv *serial_claim(const char *devpath, struct device_drv *api)
 
 	HASH_FIND(hh, claims, &dev, sizeof(dev), c);
 	if (c)
+	{
+		if (verbose)
+			applog(LOG_DEBUG, "%s device %s already claimed by other driver: %s",
+			       api->dname, devpath, c->drv->dname);
 		return c->drv;
+	}
 
 	if (!api)
 		return NULL;

+ 3 - 1
fpgautils.h

@@ -28,7 +28,9 @@ extern int _serial_detect(struct device_drv *api, detectone_func_t, autoscan_fun
 extern int _serial_autodetect(detectone_func_t, ...);
 #define serial_autodetect(...)  _serial_autodetect(__VA_ARGS__, NULL)
 
-extern struct device_drv *serial_claim(const char *devpath, struct device_drv *);
+extern struct device_drv *_serial_claim(const char *devpath, struct device_drv *, bool verbose);
+#define serial_claim(devpath, drv)    _serial_claim(devpath, drv, false)
+#define serial_claim_v(devpath, drv)  _serial_claim(devpath, drv, true)
 
 extern int serial_open(const char *devpath, unsigned long baud, uint8_t timeout, bool purge);
 extern ssize_t _serial_read(int fd, char *buf, size_t buflen, char *eol);