|
@@ -12595,31 +12595,6 @@ bool _probe_device_match(const struct lowlevel_device_info * const info, const c
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static
|
|
|
|
|
-const struct device_drv *_probe_device_find_drv(const char * const _dname, const size_t dnamelen)
|
|
|
|
|
-{
|
|
|
|
|
- struct driver_registration *dreg;
|
|
|
|
|
- char dname[dnamelen];
|
|
|
|
|
- int i;
|
|
|
|
|
-
|
|
|
|
|
- for (i = 0; i < dnamelen; ++i)
|
|
|
|
|
- dname[i] = tolower(_dname[i]);
|
|
|
|
|
- BFG_FIND_DRV_BY_DNAME(dreg, dname, dnamelen);
|
|
|
|
|
- if (!dreg)
|
|
|
|
|
- {
|
|
|
|
|
- for (i = 0; i < dnamelen; ++i)
|
|
|
|
|
- dname[i] = toupper(_dname[i]);
|
|
|
|
|
- BFG_FIND_DRV_BY_NAME(dreg, dname, dnamelen);
|
|
|
|
|
- if (!dreg)
|
|
|
|
|
- return NULL;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (!drv_algo_check(dreg->drv))
|
|
|
|
|
- return NULL;
|
|
|
|
|
-
|
|
|
|
|
- return dreg->drv;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
static
|
|
static
|
|
|
bool _probe_device_do_probe(const struct device_drv * const drv, const struct lowlevel_device_info * const info, bool * const request_rescan_p)
|
|
bool _probe_device_do_probe(const struct device_drv * const drv, const struct lowlevel_device_info * const info, bool * const request_rescan_p)
|
|
|
{
|
|
{
|
|
@@ -12669,12 +12644,22 @@ void *probe_device_thread(void *p)
|
|
|
{
|
|
{
|
|
|
if (!_probe_device_match(info, ser))
|
|
if (!_probe_device_match(info, ser))
|
|
|
continue;
|
|
continue;
|
|
|
|
|
+
|
|
|
const size_t dnamelen = (colon - dname);
|
|
const size_t dnamelen = (colon - dname);
|
|
|
- const struct device_drv * const drv = _probe_device_find_drv(dname, dnamelen);
|
|
|
|
|
- if (!(drv && drv->lowl_probe && drv_algo_check(drv)))
|
|
|
|
|
- continue;
|
|
|
|
|
- if (_probe_device_do_probe(drv, info, &request_rescan))
|
|
|
|
|
- return NULL;
|
|
|
|
|
|
|
+ char dname_nt[dnamelen + 1];
|
|
|
|
|
+ memcpy(dname_nt, dname, dnamelen);
|
|
|
|
|
+ dname_nt[dnamelen] = '\0';
|
|
|
|
|
+
|
|
|
|
|
+ struct driver_registration *dreg, *dreg_tmp;
|
|
|
|
|
+ BFG_FOREACH_DRIVER_BY_PRIORITY(dreg, dreg_tmp) {
|
|
|
|
|
+ const struct device_drv * const drv = dreg->drv;
|
|
|
|
|
+ if (!(drv && drv->lowl_probe && drv_algo_check(drv)))
|
|
|
|
|
+ continue;
|
|
|
|
|
+ if (strcasecmp(drv->dname, dname_nt) && strcasecmp(drv->name, dname_nt))
|
|
|
|
|
+ continue;
|
|
|
|
|
+ if (_probe_device_do_probe(drv, info, &request_rescan))
|
|
|
|
|
+ return NULL;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -12699,8 +12684,14 @@ void *probe_device_thread(void *p)
|
|
|
if (strcasecmp("noauto", &colon[1]) && strcasecmp("auto", &colon[1]))
|
|
if (strcasecmp("noauto", &colon[1]) && strcasecmp("auto", &colon[1]))
|
|
|
continue;
|
|
continue;
|
|
|
const ssize_t dnamelen = (colon - dname);
|
|
const ssize_t dnamelen = (colon - dname);
|
|
|
- if (dnamelen >= 0 && _probe_device_find_drv(dname, dnamelen) != drv)
|
|
|
|
|
- continue;
|
|
|
|
|
|
|
+ if (dnamelen >= 0) {
|
|
|
|
|
+ char dname_nt[dnamelen + 1];
|
|
|
|
|
+ memcpy(dname_nt, dname, dnamelen);
|
|
|
|
|
+ dname_nt[dnamelen] = '\0';
|
|
|
|
|
+
|
|
|
|
|
+ if (strcasecmp(drv->dname, dname_nt) && strcasecmp(drv->name, dname_nt))
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
doauto = (tolower(colon[1]) == 'a');
|
|
doauto = (tolower(colon[1]) == 'a');
|
|
|
if (dnamelen != -1)
|
|
if (dnamelen != -1)
|
|
|
break;
|
|
break;
|
|
@@ -12777,15 +12768,24 @@ void *probe_device_thread(void *p)
|
|
|
if (strcasecmp(&colon[1], "all"))
|
|
if (strcasecmp(&colon[1], "all"))
|
|
|
continue;
|
|
continue;
|
|
|
const size_t dnamelen = (colon - dname);
|
|
const size_t dnamelen = (colon - dname);
|
|
|
- const struct device_drv * const drv = _probe_device_find_drv(dname, dnamelen);
|
|
|
|
|
- if (!(drv && drv->lowl_probe && drv_algo_check(drv)))
|
|
|
|
|
- continue;
|
|
|
|
|
- LL_FOREACH2(infolist, info, same_devid_next)
|
|
|
|
|
- {
|
|
|
|
|
- if (info->lowl->exclude_from_all)
|
|
|
|
|
|
|
+ char dname_nt[dnamelen + 1];
|
|
|
|
|
+ memcpy(dname_nt, dname, dnamelen);
|
|
|
|
|
+ dname_nt[dnamelen] = '\0';
|
|
|
|
|
+
|
|
|
|
|
+ struct driver_registration *dreg, *dreg_tmp;
|
|
|
|
|
+ BFG_FOREACH_DRIVER_BY_PRIORITY(dreg, dreg_tmp) {
|
|
|
|
|
+ const struct device_drv * const drv = dreg->drv;
|
|
|
|
|
+ if (!(drv && drv->lowl_probe && drv_algo_check(drv)))
|
|
|
continue;
|
|
continue;
|
|
|
- if (_probe_device_do_probe(drv, info, NULL))
|
|
|
|
|
- return NULL;
|
|
|
|
|
|
|
+ if (strcasecmp(drv->dname, dname_nt) && strcasecmp(drv->name, dname_nt))
|
|
|
|
|
+ continue;
|
|
|
|
|
+ LL_FOREACH2(infolist, info, same_devid_next)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (info->lowl->exclude_from_all)
|
|
|
|
|
+ continue;
|
|
|
|
|
+ if (_probe_device_do_probe(drv, info, NULL))
|
|
|
|
|
+ return NULL;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|