Browse Source

Avoid triggering unnecessary device rescans (such as with pre-lowlevel drivers)

Luke Dashjr 11 years ago
parent
commit
5d0d96f933
1 changed files with 15 additions and 13 deletions
  1. 15 13
      miner.c

+ 15 - 13
miner.c

@@ -10927,20 +10927,12 @@ const struct device_drv *_probe_device_find_drv(const char * const _dname, const
 	return dreg->drv;
 }
 
-static
-bool _probe_device_internal(struct lowlevel_device_info * const info, const char * const dname, const size_t dnamelen)
-{
-	const struct device_drv * const drv = _probe_device_find_drv(dname, dnamelen);
-	if (!(drv && drv->lowl_probe && drv_algo_check(drv)))
-		return false;
-	return drv->lowl_probe(info);
-}
-
 static
 void *probe_device_thread(void *p)
 {
 	struct lowlevel_device_info * const infolist = p;
 	struct lowlevel_device_info *info = infolist;
+	bool request_rescan = false;
 	
 	{
 		char threadname[5 + strlen(info->devid) + 1];
@@ -10968,11 +10960,14 @@ void *probe_device_thread(void *p)
 			if (!_probe_device_match(info, ser))
 				continue;
 			const size_t dnamelen = (colon - dname);
-			if (_probe_device_internal(info, dname, dnamelen))
+			const struct device_drv * const drv = _probe_device_find_drv(dname, dnamelen);
+			if (!(drv && drv->lowl_probe && drv_algo_check(drv)))
+				continue;
+			if (drv->lowl_probe(info))
 				return NULL;
 			else
 			if (opt_hotplug)
-				bfg_need_detect_rescan = true;
+				request_rescan = true;
 		}
 	}
 	
@@ -11048,7 +11043,7 @@ void *probe_device_thread(void *p)
 							return NULL;
 					}
 					if (opt_hotplug)
-						bfg_need_detect_rescan = true;
+						request_rescan = true;
 					break;
 				}
 			}
@@ -11059,11 +11054,18 @@ void *probe_device_thread(void *p)
 		const size_t dnamelen = (colon - dname);
 		LL_FOREACH2(infolist, info, same_devid_next)
 		{
-			if (_probe_device_internal(info, dname, dnamelen))
+			const struct device_drv * const drv = _probe_device_find_drv(dname, dnamelen);
+			if (!(drv && drv->lowl_probe && drv_algo_check(drv)))
+				continue;
+			if (drv->lowl_probe(info))
 				return NULL;
 		}
 	}
 	
+	// Only actually request a rescan if we never found any cgpu
+	if (request_rescan)
+		bfg_need_detect_rescan = true;
+	
 	return NULL;
 }