From f1d1b028f2fb6aa8a2b2291a1798e6332e39a6b8 Mon Sep 17 00:00:00 2001 From: Hugo Santos Date: Thu, 10 May 2007 06:33:35 +0000 Subject: [PATCH] freebsd compat. layer: another go at multiple MII module support. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21100 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/libs/compat/freebsd_network/compat.c | 45 ++++++++++--------- .../freebsd_network/compat/sys/haiku-module.h | 10 ++--- .../freebsd_network/compat/sys/kernel.h | 1 + 3 files changed, 31 insertions(+), 25 deletions(-) diff --git a/src/libs/compat/freebsd_network/compat.c b/src/libs/compat/freebsd_network/compat.c index 1142038978..9603d92145 100644 --- a/src/libs/compat/freebsd_network/compat.c +++ b/src/libs/compat/freebsd_network/compat.c @@ -360,6 +360,30 @@ device_add_child(device_t dev, const char *name, int order) } +driver_t * +__haiku_probe_miibus(device_t dev, driver_t *drivers[], int count) +{ + driver_t *selected = NULL; + int i, selcost = 0; + + for (i = 0; i < count; i++) { + device_probe_t *probe = (device_probe_t *) + _resolve_method(drivers[i], "device_probe"); + if (probe) { + int result = probe(dev); + if (result >= 0) { + if (selected == NULL || result > selcost) { + selected = drivers[i]; + selcost = result; + } + } + } + } + + return selected; +} + + void bus_generic_attach(device_t dev) { @@ -369,26 +393,7 @@ bus_generic_attach(device_t dev) child; child = list_get_next_item(&dev->children, child)) { if (child->driver == NULL) { if (dev->driver == &miibus_driver) { - int i, driver_count, driver_cost = INT_MIN; - driver_t **drivers, *driver = NULL; - - drivers = __haiku_get_miibus_drivers(&driver_count); - - for (i = 0; i < driver_count; i++) { - device_probe_t *probe = (device_probe_t *) - _resolve_method(drivers[i], "device_probe"); - - if (probe) { - /* XXX this kinda reverses the original logic */ - int result = probe(child); - if (result >= 0) { - if (driver == NULL || result > driver_cost) { - driver = drivers[i]; - driver_cost = result; - } - } - } - } + driver_t *driver = __haiku_select_miibus_driver(child); if (driver) device_set_driver(child, driver); diff --git a/src/libs/compat/freebsd_network/compat/sys/haiku-module.h b/src/libs/compat/freebsd_network/compat/sys/haiku-module.h index 7041f79486..1e8e2f3f94 100644 --- a/src/libs/compat/freebsd_network/compat/sys/haiku-module.h +++ b/src/libs/compat/freebsd_network/compat/sys/haiku-module.h @@ -52,7 +52,8 @@ status_t _fbsd_init_driver(driver_t *); void _fbsd_uninit_driver(driver_t *); extern const char gDriverName[]; -driver_t **__haiku_get_miibus_drivers(int *count); +driver_t *__haiku_select_miibus_driver(device_t dev); +driver_t *__haiku_probe_miibus(device_t dev, driver_t *drivers[], int count); /* we define the driver methods with HAIKU_FBSD_DRIVER_GLUE to * force the rest of the stuff to be linked back with the driver. @@ -80,11 +81,10 @@ driver_t **__haiku_get_miibus_drivers(int *count); device_hooks *find_device(const char *name) \ { return &gDeviceHooks; } -#define HAIKU_FBSD_RETURN_MII_DRIVER(drivers, driver_count) \ - driver_t **__haiku_get_miibus_drivers(int *count) \ +#define HAIKU_FBSD_RETURN_MII_DRIVER(drivers, count) \ + driver_t *__haiku_select_miibus_driver(device_t dev) \ { \ - (*count) = (driver_count); \ - return (drivers); \ + return __haiku_probe_miibus(dev, drivers, count); \ } #define HAIKU_FBSD_MII_DRIVER(name) \ diff --git a/src/libs/compat/freebsd_network/compat/sys/kernel.h b/src/libs/compat/freebsd_network/compat/sys/kernel.h index 41e7946e29..88188edc67 100644 --- a/src/libs/compat/freebsd_network/compat/sys/kernel.h +++ b/src/libs/compat/freebsd_network/compat/sys/kernel.h @@ -7,6 +7,7 @@ #include #include +#include #define hz 1000000LL