Cleanup some of the newbus infrastructure.
authorMatthew Dillon <dillon@dragonflybsd.org>
Fri, 28 Oct 2005 03:25:57 +0000 (03:25 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Fri, 28 Oct 2005 03:25:57 +0000 (03:25 +0000)
* Change the device_identify API to return success/failure, like
  most of the other newbus methods.  This may be used for conflict
  resolution in the future.

* Clearly document the device_identify method and formalize its use
  by adding discrimination between initial bus probes and bus rescans.
  Do not re-execute static identification code that has already been run
  every time a new driver is added at run-time.

* Clearly document the do-ISA-last hack.

* Provide generic routines for the most common device_identify operations
  (psueo or synthesized devices that operate under other devices, such as
  lpt operating under ppbus, which are not 'scanned' by the parent bus).

* Remove the hacks that install and initialize the nexus device.  Instead,
  use the existing DRIVER_MODULE infrastructure to install nexus under
  root_bus.

* Document the boot-time initialization path so it doesn't take the next
  guy 8 hours to figure out what code is actually being run when.

37 files changed:
sys/bus/firewire/firewire.c
sys/bus/isa/isa_common.c
sys/bus/isa/isahint.c
sys/bus/isa/pnp.c
sys/bus/pci/i386/pcibus.c
sys/dev/acpica5/acpi.c
sys/dev/acpica5/acpi_timer.c
sys/dev/disk/aha/aha_isa.c
sys/dev/disk/sbp/sbp.c
sys/dev/disk/vpo/vpo.c
sys/dev/misc/dcons/dcons_crom.c
sys/dev/misc/lpbb/lpbb.c
sys/dev/misc/lpt/lpt.c
sys/dev/misc/orm/orm.c
sys/dev/misc/pcfclock/pcfclock.c
sys/dev/misc/ppi/ppi.c
sys/dev/misc/pps/pps.c
sys/dev/netif/ep/if_ep_isa.c
sys/dev/netif/ex/if_ex_isa.c
sys/dev/netif/fwe/if_fwe.c
sys/dev/netif/plip/if_plip.c
sys/dev/sound/isa/es1888.c
sys/i386/apm/apm.c
sys/i386/i386/autoconf.c
sys/i386/i386/nexus.c
sys/i386/i386/pnpbios.c
sys/i386/isa/npx.c
sys/i386/isa/pmtimer.c
sys/kern/device_if.m
sys/kern/subr_bus.c
sys/platform/pc32/apm/apm.c
sys/platform/pc32/i386/autoconf.c
sys/platform/pc32/i386/nexus.c
sys/platform/pc32/i386/pnpbios.c
sys/platform/pc32/isa/npx.c
sys/platform/pc32/isa/pmtimer.c
sys/sys/bus.h

index b60c7ef..a6c0e8c 100644 (file)
@@ -32,7 +32,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  * 
  * $FreeBSD: src/sys/dev/firewire/firewire.c,v 1.68 2004/01/08 14:58:09 simokawa Exp $
- * $DragonFly: src/sys/bus/firewire/firewire.c,v 1.11 2005/06/02 20:40:33 dillon Exp $
+ * $DragonFly: src/sys/bus/firewire/firewire.c,v 1.12 2005/10/28 03:25:33 dillon Exp $
  *
  */
 
@@ -90,7 +90,6 @@ MALLOC_DEFINE(M_FWXFER, "fw_xfer", "XFER/FireWire");
 
 devclass_t firewire_devclass;
 
-static void firewire_identify  (driver_t *, device_t);
 static int firewire_probe      (device_t);
 static int firewire_attach      (device_t);
 static int firewire_detach      (device_t);
@@ -114,9 +113,13 @@ struct fw_xfer *asyreqq (struct firewire_comm *, u_int8_t, u_int8_t, u_int8_t,
        u_int32_t, u_int32_t, void (*)(struct fw_xfer *));
 static int fw_bmr (struct firewire_comm *);
 
+/*
+ * note: bus_generic_identify() will automatically install a "firewire"
+ * device under any attached fwohci device.
+ */
 static device_method_t firewire_methods[] = {
        /* Device interface */
-       DEVMETHOD(device_identify,      firewire_identify),
+       DEVMETHOD(device_identify,      bus_generic_identify),
        DEVMETHOD(device_probe,         firewire_probe),
        DEVMETHOD(device_attach,        firewire_attach),
        DEVMETHOD(device_detach,        firewire_detach),
@@ -320,12 +323,6 @@ fw_asystart(struct fw_xfer *xfer)
        return;
 }
 
-static void
-firewire_identify(driver_t *driver, device_t parent)
-{
-       BUS_ADD_CHILD(parent, 0, "firewire", -1);
-}
-
 static int
 firewire_probe(device_t dev)
 {
@@ -2227,6 +2224,10 @@ fw_modevent(module_t mode, int type, void *data)
        return (err);
 }
 
+/*
+ * This causes the firewire identify to be called for any attached fwohci
+ * device in the system.
+ */
 DECLARE_DUMMY_MODULE(firewire);
 DRIVER_MODULE(firewire,fwohci,firewire_driver,firewire_devclass,fw_modevent,0);
 MODULE_VERSION(firewire, 1);
index 9f5afee..36f8f16 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/isa/isa_common.c,v 1.16.2.1 2000/09/16 15:49:52 roger Exp $
- * $DragonFly: src/sys/bus/isa/isa_common.c,v 1.7 2005/08/04 15:38:58 drhodus Exp $
+ * $DragonFly: src/sys/bus/isa/isa_common.c,v 1.8 2005/10/28 03:25:35 dillon Exp $
  */
 /*
  * Modifications for Intel architecture by Garrett A. Wollman.
@@ -440,8 +440,11 @@ isa_probe_children(device_t dev)
 
        /*
         * Create all the children by calling driver's identify methods.
+        * Since this routine is called long after the ISA bus had been
+        * attached, yet never probed, we have to call a hack function that
+        * temporarily sets the bus back to DS_ALIVE to run the probe.
         */
-       bus_generic_probe(dev);
+       bus_generic_probe_hack(dev);
 
        if (device_get_children(dev, &children, &nchildren))
                return;
index 56ff97a..376e449 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/isa/isahint.c,v 1.8.2.1 2001/03/21 11:18:25 nyan Exp $
- * $DragonFly: src/sys/bus/isa/isahint.c,v 1.3 2003/08/07 21:16:46 dillon Exp $
+ * $DragonFly: src/sys/bus/isa/isahint.c,v 1.4 2005/10/28 03:25:35 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -83,12 +83,20 @@ isahint_add_device(device_t parent, const char *name, int unit)
                device_disable(child);
 }
 
-static void
+static int
 isahint_identify(driver_t *driver, device_t parent)
 {
        int i;
        static char buf[] = "isaXXX";
 
+       /*
+        * If the parent bus is already attached we are being called to
+        * rescan.  We do not suppot rescanning the hints, just return
+        * success.
+        */
+       if (device_get_state(parent) == DS_ATTACHED)
+               return(0);
+
        /*
         * Add all devices configured to be attached to parent.
         */
@@ -115,6 +123,7 @@ isahint_identify(driver_t *driver, device_t parent)
                                   resource_query_name(i),
                                   resource_query_unit(i));
        }
+       return(0);
 }
 
 static device_method_t isahint_methods[] = {
@@ -130,6 +139,10 @@ static driver_t isahint_driver = {
        1,                      /* no softc */
 };
 
+/*
+ * This will cause the identify routine to be called for any isa bus
+ * attached to the system.
+ */
 static devclass_t hint_devclass;
 
 DRIVER_MODULE(isahint, isa, isahint_driver, hint_devclass, 0, 0);
index 44e0234..264fd52 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/isa/pnp.c,v 1.5.2.1 2002/10/14 09:31:09 nyan Exp $
- *     $DragonFly: src/sys/bus/isa/pnp.c,v 1.6 2005/06/12 20:55:14 swildner Exp $
+ *     $DragonFly: src/sys/bus/isa/pnp.c,v 1.7 2005/10/28 03:25:35 dillon Exp $
  *      from: pnp.c,v 1.11 1999/05/06 22:11:19 peter Exp
  */
 
@@ -762,12 +762,18 @@ pnp_isolation_protocol(device_t parent)
  * may be called more than once ?
  *
  */
-
-static void
+static int
 pnp_identify(driver_t *driver, device_t parent)
 {
        int num_pnp_devs;
 
+       /*
+        * We do not support rescanning PNP devices, just return
+        * success (leave the previously scanned devices intact).
+        */
+       if (device_get_state(parent) == DS_ATTACHED)
+               return (0);
+
 #if 0
        if (pnp_ldn_overrides[0].csn == 0) {
                if (bootverbose)
@@ -786,8 +792,13 @@ pnp_identify(driver_t *driver, device_t parent)
                if (num_pnp_devs)
                        break;
        }
+       return (num_pnp_devs ? 0 : ENXIO);
 }
 
+/*
+ * This causes pnp_identify() to be called for any attached ISA bus in
+ * the system.
+ */
 static device_method_t pnp_methods[] = {
        /* Device interface */
        DEVMETHOD(device_identify,      pnp_identify),
index 452d055..4aa2948 100644 (file)
@@ -24,7 +24,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/isa/pcibus.c,v 1.57.2.12 2003/08/07 06:19:26 imp Exp $
- * $DragonFly: src/sys/bus/pci/i386/pcibus.c,v 1.12 2005/04/20 10:51:24 joerg Exp $
+ * $DragonFly: src/sys/bus/pci/i386/pcibus.c,v 1.13 2005/10/28 03:25:36 dillon Exp $
  *
  */
 
@@ -290,7 +290,7 @@ nexus_pcib_is_host_bridge(int bus, int slot, int func,
  * Scan the first pci bus for host-pci bridges and add pcib instances
  * to the nexus for each bridge.
  */
-static void
+static int
 nexus_pcib_identify(driver_t *driver, device_t parent)
 {
        int bus, slot, func;
@@ -301,16 +301,24 @@ nexus_pcib_identify(driver_t *driver, device_t parent)
        device_t child;
        devclass_t pci_devclass;
 
+       /*
+        * XXX currently do not support rescanning the pci bus
+        */
+       if (device_get_state(parent) == DS_ATTACHED)
+               return (0);
+
        if (pci_cfgregopen() == 0)
-               return;
+               return (ENXIO);
+
        /*
         * Check to see if we haven't already had a PCI bus added
         * via some other means. If we have, bail since otherwise
         * we're going to end up duplicating it.
         */
        if ((pci_devclass = devclass_find("pci")) &&
-           devclass_get_device(pci_devclass,0))
-               return;
+           devclass_get_device(pci_devclass,0)) {
+               return (ENXIO);
+       }
        
        bus = 0;
  retry:
@@ -400,6 +408,7 @@ nexus_pcib_identify(driver_t *driver, device_t parent)
                child = BUS_ADD_CHILD(parent, 100, "pcib", 0);
                nexus_set_pcibus(child, 0);
        }
+       return (0);
 }
 
 static int
@@ -491,6 +500,10 @@ static device_method_t nexus_pcib_methods[] = {
        { 0, 0 }
 };
 
+/*
+ * This causes nexus_pcib_identify() to automatically be called when
+ * nexus is attaching.  
+ */
 static driver_t nexus_pcib_driver = {
        "pcib",
        nexus_pcib_methods,
index f05c1cb..fad0978 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/dev/acpica/acpi.c,v 1.157 2004/06/05 09:56:04 njl Exp $
- *     $DragonFly: src/sys/dev/acpica5/acpi.c,v 1.14 2005/09/23 02:28:50 y0netan1 Exp $
+ *     $DragonFly: src/sys/dev/acpica5/acpi.c,v 1.15 2005/10/28 03:25:37 dillon Exp $
  */
 
 #include "opt_acpi.h"
@@ -103,7 +103,7 @@ static struct acpi_quirks acpi_quirks_table[] = {
 };
 
 static int     acpi_modevent(struct module *mod, int event, void *junk);
-static void    acpi_identify(driver_t *driver, device_t parent);
+static int     acpi_identify(driver_t *driver, device_t parent);
 static int     acpi_probe(device_t dev);
 static int     acpi_attach(device_t dev);
 static int     acpi_shutdown(device_t dev);
@@ -304,35 +304,42 @@ acpi_Startup(void)
 /*
  * Detect ACPI, perform early initialisation
  */
-static void
+static int
 acpi_identify(driver_t *driver, device_t parent)
 {
     device_t   child;
 
+    /*
+     * No sense rescanning an ACPI 'bus'.
+     */
+    if (device_get_state(parent) == DS_ATTACHED)
+       return(0);
+
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
     if (!cold)
-       return_VOID;
+       return (ENXIO);
 
     /* Check that we haven't been disabled with a hint. */
     if (resource_disabled("acpi", 0))
-       return_VOID;
+       return (ENXIO);
 
     /* Make sure we're not being doubly invoked. */
     if (device_find_child(parent, "acpi", 0) != NULL)
-       return_VOID;
+       return (ENXIO);
 
     /* Initialize ACPI-CA. */
     if (ACPI_FAILURE(acpi_Startup()))
-       return_VOID;
+       return (ENXIO);
 
     snprintf(acpi_ca_version, sizeof(acpi_ca_version), "%#x", ACPI_CA_VERSION);
 
     /* Attach the actual ACPI device. */
     if ((child = BUS_ADD_CHILD(parent, 0, "acpi", 0)) == NULL) {
        device_printf(parent, "ACPI: could not attach\n");
-       return_VOID;
+       return (ENXIO);
     }
+    return (0);
 }
 
 /*
index 237c33f..6718491 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/acpica/acpi_timer.c,v 1.33 2004/05/30 20:08:23 phk Exp $
- * $DragonFly: src/sys/dev/acpica5/acpi_timer.c,v 1.5 2005/06/09 19:14:11 eirikn Exp $
+ * $DragonFly: src/sys/dev/acpica5/acpi_timer.c,v 1.6 2005/10/28 03:25:37 dillon Exp $
  */
 #include "opt_acpi.h"
 #include <sys/param.h>
@@ -82,7 +82,7 @@ static struct cputimer acpi_cputimer = {
        0, 0, 0
 };
 
-static void    acpi_timer_identify(driver_t *driver, device_t parent);
+static int     acpi_timer_identify(driver_t *driver, device_t parent);
 static int     acpi_timer_probe(device_t dev);
 static int     acpi_timer_attach(device_t dev);
 static int     acpi_timer_sysctl_freq(SYSCTL_HANDLER_ARGS);
@@ -118,7 +118,7 @@ acpi_timer_read()
  * Locate the ACPI timer using the FADT, set up and allocate the I/O resources
  * we will be using.
  */
-static void
+static int
 acpi_timer_identify(driver_t *driver, device_t parent)
 {
     device_t   dev;
@@ -126,14 +126,20 @@ acpi_timer_identify(driver_t *driver, device_t parent)
     u_long     rlen, rstart;
     int                i, j, rid, rtype;
 
+    /*
+     * Just try once, do nothing if the 'acpi' bus is rescanned.
+     */
+    if (device_get_state(parent) == DS_ATTACHED)
+       return (0);
+
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
     if (acpi_disabled("timer") || AcpiGbl_FADT == NULL)
-       return_VOID;
+       return (ENXIO);
 
     if ((dev = BUS_ADD_CHILD(parent, 0, "acpi_timer", 0)) == NULL) {
        device_printf(parent, "could not add acpi_timer0\n");
-       return_VOID;
+       return (ENXIO);
     }
     acpi_timer_dev = dev;
 
@@ -147,7 +153,7 @@ acpi_timer_identify(driver_t *driver, device_t parent)
     if (acpi_timer_reg == NULL) {
        device_printf(dev, "couldn't allocate I/O resource (%s 0x%lx)\n",
                      rtype == SYS_RES_IOPORT ? "port" : "mem", rstart);
-       return_VOID;
+       return (ENXIO);
     }
     acpi_timer_bsh = rman_get_bushandle(acpi_timer_reg);
     acpi_timer_bst = rman_get_bustag(acpi_timer_reg);
@@ -183,7 +189,7 @@ acpi_timer_identify(driver_t *driver, device_t parent)
 
     cputimer_register(&acpi_cputimer);
     cputimer_select(&acpi_cputimer, 0);
-    return_VOID;
+    return (0);
 }
 
 static int
index c49ed72..456f677 100644 (file)
@@ -29,7 +29,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/aha/aha_isa.c,v 1.17.2.1 2000/08/02 22:24:40 peter Exp $
- * $DragonFly: src/sys/dev/disk/aha/aha_isa.c,v 1.7 2005/10/12 17:35:49 dillon Exp $
+ * $DragonFly: src/sys/dev/disk/aha/aha_isa.c,v 1.8 2005/10/28 03:25:39 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -317,17 +317,11 @@ aha_isa_detach(device_t dev)
        return (0);
 }
 
-static void
-aha_isa_identify(driver_t *driver, device_t parent)
-{
-}
-
 static device_method_t aha_isa_methods[] = {
        /* Device interface */
        DEVMETHOD(device_probe,         aha_isa_probe),
        DEVMETHOD(device_attach,        aha_isa_attach),
        DEVMETHOD(device_detach,        aha_isa_detach),
-       DEVMETHOD(device_identify,      aha_isa_identify),
 
        { 0, 0 }
 };
index 33d19b6..04bcb55 100644 (file)
@@ -32,7 +32,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  * 
  * $FreeBSD: src/sys/dev/firewire/sbp.c,v 1.74 2004/01/08 14:58:09 simokawa Exp $
- * $DragonFly: src/sys/dev/disk/sbp/sbp.c,v 1.14 2005/06/02 20:40:42 dillon Exp $
+ * $DragonFly: src/sys/dev/disk/sbp/sbp.c,v 1.15 2005/10/28 03:25:41 dillon Exp $
  *
  */
 
@@ -310,17 +310,6 @@ static char *orb_status1_serial_bus_error[] = {
        /* F */ "Address error"
 };
 
-static void
-sbp_identify(driver_t *driver, device_t parent)
-{
-       device_t child;
-SBP_DEBUG(0)
-       printf("sbp_identify\n");
-END_DEBUG
-
-       child = BUS_ADD_CHILD(parent, 0, "sbp", device_get_unit(parent));
-}
-
 /*
  * sbp_probe()
  */
@@ -2762,9 +2751,16 @@ sbp_abort_all_ocbs(struct sbp_dev *sdev, int status)
 
 static devclass_t sbp_devclass;
 
+/*
+ * Because sbp is a static device that always exists under any attached
+ * firewire device, and not scanned by the firewire device, we need an 
+ * identify function to install the device.  For our sanity we want
+ * the sbp device to have the same unit number as the fireweire device.
+ */
+
 static device_method_t sbp_methods[] = {
        /* device interface */
-       DEVMETHOD(device_identify,      sbp_identify),
+       DEVMETHOD(device_identify,      bus_generic_identify_sameunit),
        DEVMETHOD(device_probe,         sbp_probe),
        DEVMETHOD(device_attach,        sbp_attach),
        DEVMETHOD(device_detach,        sbp_detach),
index 3119189..1902cf6 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ppbus/vpo.c,v 1.20.2.1 2000/05/07 21:08:18 n_hibma Exp $
- * $DragonFly: src/sys/dev/disk/vpo/vpo.c,v 1.5 2005/06/16 15:53:37 dillon Exp $
+ * $DragonFly: src/sys/dev/disk/vpo/vpo.c,v 1.6 2005/10/28 03:25:43 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -89,13 +89,6 @@ static void  vpo_cam_rescan_callback(struct cam_periph *periph,
                                        union ccb *ccb);
 static void    vpo_cam_rescan(struct vpo_data *vpo);
 
-static void
-vpo_identify(driver_t *driver, device_t parent)
-{
-
-       BUS_ADD_CHILD(parent, 0, "vpo", 0);
-}
-
 /*
  * vpo_probe()
  */
@@ -448,14 +441,17 @@ vpo_poll(struct cam_sim *sim)
        return;
 }
 
+/*
+ * Always create a "vpo" device under ppbus.  Use device_identify to
+ * create the static entry for any attached ppbus.
+ */
 static devclass_t vpo_devclass;
 
 static device_method_t vpo_methods[] = {
        /* device interface */
-       DEVMETHOD(device_identify,      vpo_identify),
+       DEVMETHOD(device_identify,      bus_generic_identify),
        DEVMETHOD(device_probe,         vpo_probe),
        DEVMETHOD(device_attach,        vpo_attach),
-
        { 0, 0 }
 };
 
@@ -465,3 +461,4 @@ static driver_t vpo_driver = {
        sizeof(struct vpo_data),
 };
 DRIVER_MODULE(vpo, ppbus, vpo_driver, vpo_devclass, 0, 0);
+
index b19ed86..99b85e5 100644 (file)
@@ -33,7 +33,7 @@
  * 
  * $Id: dcons_crom.c,v 1.8 2003/10/23 15:47:21 simokawa Exp $
  * $FreeBSD: src/sys/dev/dcons/dcons_crom.c,v 1.5 2004/10/13 05:38:42 simokawa Exp $
- * $DragonFly: src/sys/dev/misc/dcons/dcons_crom.c,v 1.2 2004/10/25 13:53:26 simokawa Exp $
+ * $DragonFly: src/sys/dev/misc/dcons/dcons_crom.c,v 1.3 2005/10/28 03:25:44 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -87,12 +87,6 @@ struct dcons_crom_softc {
        bus_addr_t bus_addr;
 };
 
-static void
-dcons_crom_identify(driver_t *driver, device_t parent)
-{
-       BUS_ADD_CHILD(parent, 0, "dcons_crom", device_get_unit(parent));
-}
-
 static int
 dcons_crom_probe(device_t dev)
 {
@@ -224,11 +218,17 @@ dcons_crom_detach(device_t dev)
        return 0;
 }
 
+/*
+ * Because dcons_crom is a static device that always exists under any attached
+ * firewire device, and not scanned by the firewire device, we need an 
+ * identify function to install the device.  For our sanity we want
+ * the sbp device to have the same unit number as the fireweire device.
+ */
 static devclass_t dcons_crom_devclass;
 
 static device_method_t dcons_crom_methods[] = {
        /* device interface */
-       DEVMETHOD(device_identify,      dcons_crom_identify),
+       DEVMETHOD(device_identify,      bus_generic_identify_sameunit),
        DEVMETHOD(device_probe,         dcons_crom_probe),
        DEVMETHOD(device_attach,        dcons_crom_attach),
        DEVMETHOD(device_detach,        dcons_crom_detach),
index 4dc5457..f311f08 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ppbus/lpbb.c,v 1.11.2.1 2000/05/24 00:20:57 n_hibma Exp $
- * $DragonFly: src/sys/dev/misc/lpbb/lpbb.c,v 1.3 2003/08/07 21:16:56 dillon Exp $
+ * $DragonFly: src/sys/dev/misc/lpbb/lpbb.c,v 1.4 2005/10/28 03:25:45 dillon Exp $
  *
  */
 
 
 static int lpbb_detect(device_t dev);
 
-static void
-lpbb_identify(driver_t *driver, device_t parent)
-{
-
-       BUS_ADD_CHILD(parent, 0, "lpbb", 0);
-}
-
 static int
 lpbb_probe(device_t dev)
 {
@@ -204,11 +197,16 @@ lpbb_getdataline(device_t dev)
        return (getSDA(ppbus));
 }
 
+/*
+ * Because lpbb is a static device that always exists under any attached
+ * ppbus device, and not scanned by the ppbus device, we need an identify
+ * function to install the device.
+ */
 static devclass_t lpbb_devclass;
 
 static device_method_t lpbb_methods[] = {
        /* device interface */
-       DEVMETHOD(device_identify,      lpbb_identify),
+       DEVMETHOD(device_identify,      bus_generic_identify),
        DEVMETHOD(device_probe,         lpbb_probe),
        DEVMETHOD(device_attach,        lpbb_attach),
 
index 164bfec..cc3a440 100644 (file)
@@ -49,7 +49,7 @@
  *     From Id: lpt.c,v 1.55.2.1 1996/11/12 09:08:38 phk Exp
  *     From Id: nlpt.c,v 1.14 1999/02/08 13:55:43 des Exp
  * $FreeBSD: src/sys/dev/ppbus/lpt.c,v 1.15.2.3 2000/07/07 00:30:40 obrien Exp $
- * $DragonFly: src/sys/dev/misc/lpt/lpt.c,v 1.13 2005/10/12 17:35:50 dillon Exp $
+ * $DragonFly: src/sys/dev/misc/lpt/lpt.c,v 1.14 2005/10/28 03:25:46 dillon Exp $
  */
 
 /*
@@ -347,13 +347,6 @@ end_probe:
        return (status);
 }
 
-static void
-lpt_identify(driver_t *driver, device_t parent)
-{
-
-       BUS_ADD_CHILD(parent, 0, LPT_NAME, 0);
-}
-
 /*
  * lpt_probe()
  */
@@ -968,9 +961,14 @@ lptioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *p)
        return(error);
 }
 
+/*
+ * Because lpt is a static device that always exists under a ppbus device,
+ * and not scanned by the ppbus device, we need an identify function to
+ * install its device.
+ */
 static device_method_t lpt_methods[] = {
        /* device interface */
-       DEVMETHOD(device_identify,      lpt_identify),
+       DEVMETHOD(device_identify,      bus_generic_identify),
        DEVMETHOD(device_probe,         lpt_probe),
        DEVMETHOD(device_attach,        lpt_attach),
 
@@ -984,3 +982,4 @@ static driver_t lpt_driver = {
 };
 
 DRIVER_MODULE(lpt, ppbus, lpt_driver, lpt_devclass, 0, 0);
+
index 903b7fc..a04702a 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/isa/orm.c,v 1.1.2.1 2001/06/19 05:48:29 imp Exp $
- *     $DragonFly: src/sys/dev/misc/orm/orm.c,v 1.3 2003/08/07 21:16:57 dillon Exp $
+ *     $DragonFly: src/sys/dev/misc/orm/orm.c,v 1.4 2005/10/28 03:25:47 dillon Exp $
  */
 
 /*
@@ -78,7 +78,7 @@ orm_attach(device_t dev)
        return (0);
 }
 
-static void
+static int
 orm_identify(driver_t* driver, device_t parent)
 {
        bus_space_handle_t      bh;
@@ -91,6 +91,15 @@ orm_identify(driver_t* driver, device_t parent)
        struct orm_softc        *sc;
        u_int8_t                buf[3];
 
+       /*
+        * rescanning the isa bus, do nothing
+        */
+       if (device_get_state(parent) == DS_ATTACHED)
+               return (0);
+
+       /*
+        * Otherwise see if it exists
+        */
        child = BUS_ADD_CHILD(parent, ISA_ORDER_SENSITIVE, "orm", -1);
        device_set_driver(child, driver);
        isa_set_logicalid(child, ORM_ID);
@@ -146,12 +155,18 @@ orm_identify(driver_t* driver, device_t parent)
                chunk += rom_size;
        }
 
-       if (sc->rnum == 0)
+       /*
+        * note: sc becomes invalid after we delete the child.
+        */
+       if (sc->rnum == 0) {
                device_delete_child(parent, child);
-       else if (sc->rnum == 1)
+               return (ENXIO);
+       }
+       if (sc->rnum == 1)
                device_set_desc(child, "Option ROM");
        else
                device_set_desc(child, "Option ROMs");
+       return (0);
 }
 
 static int
index 9093df2..3d9a92c 100644 (file)
@@ -22,7 +22,7 @@
  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ppbus/pcfclock.c,v 1.3.2.1 2000/05/24 00:20:57 n_hibma Exp $
- * $DragonFly: src/sys/dev/misc/pcfclock/pcfclock.c,v 1.7 2004/05/19 22:52:43 dillon Exp $
+ * $DragonFly: src/sys/dev/misc/pcfclock/pcfclock.c,v 1.8 2005/10/28 03:25:48 dillon Exp $
  *
  */
 
@@ -125,13 +125,6 @@ static struct cdevsw pcfclock_cdevsw = {
 #define PCFCLOCK_CMD_TIME 0            /* send current time */
 #define PCFCLOCK_CMD_COPY 7    /* copy received signal to PC */
 
-static void
-pcfclock_identify(driver_t *driver, device_t parent)
-{
-
-       BUS_ADD_CHILD(parent, 0, PCFCLOCK_NAME, 0);
-}
-
 static int
 pcfclock_probe(device_t dev)
 {
@@ -331,9 +324,14 @@ pcfclock_read(dev_t dev, struct uio *uio, int ioflag)
        return (error);
 }
 
+/*
+ * Because pcfclock is a static device that always exists under any
+ * attached ppbus, and not scanned by the ppbus, we need an identify function
+ * to create the device.
+ */
 static device_method_t pcfclock_methods[] = {
        /* device interface */
-       DEVMETHOD(device_identify,      pcfclock_identify),
+       DEVMETHOD(device_identify,      bus_generic_identify),
        DEVMETHOD(device_probe,         pcfclock_probe),
        DEVMETHOD(device_attach,        pcfclock_attach),
 
@@ -347,3 +345,4 @@ static driver_t pcfclock_driver = {
 };
 
 DRIVER_MODULE(pcfclock, ppbus, pcfclock_driver, pcfclock_devclass, 0, 0);
+
index 4dff4b0..b18761a 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ppbus/ppi.c,v 1.21.2.3 2000/08/07 18:24:43 peter Exp $
- * $DragonFly: src/sys/dev/misc/ppi/ppi.c,v 1.10 2005/10/12 17:35:51 dillon Exp $
+ * $DragonFly: src/sys/dev/misc/ppi/ppi.c,v 1.11 2005/10/28 03:25:49 dillon Exp $
  *
  */
 #include "opt_ppb_1284.h"
@@ -138,13 +138,6 @@ ppi_disable_intr(device_t ppidev)
 
 #endif /* PERIPH_1284 */
 
-static void
-ppi_identify(driver_t *driver, device_t parent)
-{
-
-       BUS_ADD_CHILD(parent, 0, "ppi", 0);
-}
-
 /*
  * ppi_probe()
  */
@@ -569,9 +562,14 @@ ppiioctl(dev_t dev, u_long cmd, caddr_t data, int flags, d_thread_t *td)
        return (error);
 }
 
+/*
+ * Because ppi is a static device under any attached ppbuf, and not
+ * scanned by the ppbuf, we need an identify function to create the
+ * device.
+ */
 static device_method_t ppi_methods[] = {
        /* device interface */
-       DEVMETHOD(device_identify,      ppi_identify),
+       DEVMETHOD(device_identify,      bus_generic_identify),
        DEVMETHOD(device_probe,         ppi_probe),
        DEVMETHOD(device_attach,        ppi_attach),
 
index a375a85..f92b6cf 100644 (file)
@@ -7,7 +7,7 @@
  * ----------------------------------------------------------------------------
  *
  * $FreeBSD: src/sys/dev/ppbus/pps.c,v 1.24.2.1 2000/05/24 00:20:57 n_hibma Exp $
- * $DragonFly: src/sys/dev/misc/pps/pps.c,v 1.13 2005/10/12 17:35:51 dillon Exp $
+ * $DragonFly: src/sys/dev/misc/pps/pps.c,v 1.14 2005/10/28 03:25:50 dillon Exp $
  *
  * This driver implements a draft-mogul-pps-api-02.txt PPS source.
  *
@@ -79,13 +79,6 @@ static struct cdevsw pps_cdevsw = {
        /* psize */     nopsize
 };
 
-static void
-ppsidentify(driver_t *driver, device_t parent)
-{
-
-       BUS_ADD_CHILD(parent, 0, PPS_NAME, 0);
-}
-
 static int
 ppsprobe(device_t ppsdev)
 {
@@ -204,9 +197,13 @@ ppsioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td)
        return (pps_ioctl(cmd, data, &sc->pps));
 }
 
+/*
+ * Becuase pps is a static device under any attached ppbus, and not scanned
+ * by the ppbus, we need an identify function to create the device.
+ */
 static device_method_t pps_methods[] = {
        /* device interface */
-       DEVMETHOD(device_identify,      ppsidentify),
+       DEVMETHOD(device_identify,      bus_generic_identify),
        DEVMETHOD(device_probe,         ppsprobe),
        DEVMETHOD(device_attach,        ppsattach),
 
index 4a85bb9..87d28fb 100644 (file)
@@ -28,7 +28,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ep/if_ep_isa.c,v 1.8.2.1 2000/12/16 03:47:57 nyan Exp $
- * $DragonFly: src/sys/dev/netif/ep/if_ep_isa.c,v 1.7 2005/10/12 17:35:51 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ep/if_ep_isa.c,v 1.8 2005/10/28 03:25:51 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -58,7 +58,7 @@
 
 static u_int16_t       get_eeprom_data (int, int);
 
-static void            ep_isa_identify (driver_t *, device_t);
+static int             ep_isa_identify (driver_t *, device_t);
 static int             ep_isa_probe    (device_t);
 static int             ep_isa_attach   (device_t);
 
@@ -146,7 +146,7 @@ ep_isa_match_id (id, isa_devs)
        return (NULL);
 }
 
-static void
+static int
 ep_isa_identify (driver_t *driver, device_t parent)
 {
        int             tag = EP_LAST_TAG;
@@ -160,6 +160,15 @@ ep_isa_identify (driver_t *driver, device_t parent)
        u_int32_t       isa_id;
        device_t        child;
 
+       /*
+        * Rescans not currently supported.
+        */
+       if (device_get_state(parent) == DS_ATTACHED)
+               return (0);
+
+       /*
+        * Check for the existance of the EISA bus.
+        */
        outb(ELINK_ID_PORT, 0);
        outb(ELINK_ID_PORT, 0);
        elink_idseq(ELINK_509_POLY);
@@ -266,8 +275,7 @@ ep_isa_identify (driver_t *driver, device_t parent)
 
                found++;
        }
-
-       return;
+       return (found ? 0 : ENXIO);
 }
 
 static int
index 708af45..cedcc43 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/dev/ex/if_ex_isa.c,v 1.3.2.1 2001/03/05 05:33:20 imp Exp $
- *     $DragonFly: src/sys/dev/netif/ex/if_ex_isa.c,v 1.8 2005/10/12 17:35:51 dillon Exp $
+ *     $DragonFly: src/sys/dev/netif/ex/if_ex_isa.c,v 1.9 2005/10/28 03:25:52 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -52,7 +52,7 @@
 #include "if_exvar.h"
 
 /* Bus Front End Functions */
-static void    ex_isa_identify (driver_t *, device_t);
+static int     ex_isa_identify (driver_t *, device_t);
 static int     ex_isa_probe    (device_t);
 static int     ex_isa_attach   (device_t);
 
@@ -62,6 +62,9 @@ static        void    ex_pnp_wakeup   (void *);
 SYSINIT(ex_pnpwakeup, SI_SUB_CPU, SI_ORDER_ANY, ex_pnp_wakeup, NULL);
 #endif
 
+/*
+ * We need an identify function to 'probe' the ISA bus.
+ */
 static device_method_t ex_methods[] = {
        /* Device interface */
        DEVMETHOD(device_identify,      ex_isa_identify),
@@ -115,7 +118,7 @@ ex_pnp_wakeup (void * dummy)
 /*
  * Non-destructive identify.
  */
-static void
+static int
 ex_isa_identify (driver_t *driver, device_t parent)
 {
        device_t        child;
@@ -123,11 +126,19 @@ ex_isa_identify (driver_t *driver, device_t parent)
        u_char          enaddr[6];
        u_int           irq;
        int             tmp;
+       int             count;
        const char *    desc;
 
+       /*
+        * Rescanning ISA I/O ports is not supported.
+        */
+       if (device_get_state(parent) == DS_ATTACHED)
+               return (0);
+
        if (bootverbose)
                printf("ex_isa_identify()\n");
 
+       count = 0;
        for (ioport = 0x200; ioport < 0x3a0; ioport += 0x10) {
 
                /* No board found at address */
@@ -171,12 +182,12 @@ ex_isa_identify (driver_t *driver, device_t parent)
                device_set_driver(child, driver);
                bus_set_resource(child, SYS_RES_IRQ, 0, irq, 1);
                bus_set_resource(child, SYS_RES_IOPORT, 0, ioport, EX_IOSIZE);
+               ++count;
 
                if (bootverbose)
                        printf("ex: Adding board at 0x%03x, irq %d\n", ioport, irq);
        }
-
-       return;
+       return (count ? 0 : ENXIO);
 }
 
 static int
index 20cc780..d493c80 100644 (file)
@@ -32,7 +32,7 @@
  * SUCH DAMAGE.
  * 
  * $FreeBSD: src/sys/dev/firewire/if_fwe.c,v 1.27 2004/01/08 14:58:09 simokawa Exp $
- * $DragonFly: src/sys/dev/netif/fwe/if_fwe.c,v 1.20 2005/10/24 08:06:15 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/fwe/if_fwe.c,v 1.21 2005/10/28 03:25:53 dillon Exp $
  */
 
 #include "opt_inet.h"
@@ -130,12 +130,6 @@ fwe_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
 
 #endif
 
-static void
-fwe_identify(driver_t *driver, device_t parent)
-{
-       BUS_ADD_CHILD(parent, 0, "fwe", device_get_unit(parent));
-}
-
 static int
 fwe_probe(device_t dev)
 {
@@ -574,9 +568,14 @@ fwe_as_input(struct fw_xferq *xferq)
 
 static devclass_t fwe_devclass;
 
+/*
+ * Because fwe is a static device that always exists under any attached
+ * firewire device, and not scanned by the firewire device, we need an 
+ * identify function to install the device.
+ */
 static device_method_t fwe_methods[] = {
        /* device interface */
-       DEVMETHOD(device_identify,      fwe_identify),
+       DEVMETHOD(device_identify,      bus_generic_identify_sameunit),
        DEVMETHOD(device_probe,         fwe_probe),
        DEVMETHOD(device_attach,        fwe_attach),
        DEVMETHOD(device_detach,        fwe_detach),
index 177c1dd..6b9bb81 100644 (file)
@@ -25,7 +25,7 @@
  *
  *     From Id: lpt.c,v 1.55.2.1 1996/11/12 09:08:38 phk Exp
  * $FreeBSD: src/sys/dev/ppbus/if_plip.c,v 1.19.2.1 2000/05/24 00:20:57 n_hibma Exp $
- * $DragonFly: src/sys/dev/netif/plip/if_plip.c,v 1.14 2005/10/12 17:35:52 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/plip/if_plip.c,v 1.15 2005/10/28 03:25:54 dillon Exp $
  */
 
 /*
@@ -184,12 +184,6 @@ static void lp_intr(void *);
 
 static devclass_t lp_devclass;
 
-static void
-lp_identify(driver_t *driver, device_t parent)
-{
-
-       BUS_ADD_CHILD(parent, 0, "plip", 0);
-}
 /*
  * lpprobe()
  */
@@ -745,9 +739,14 @@ lpoutput (struct ifnet *ifp, struct mbuf *m,
     return 0;
 }
 
+/*
+ * Because plip is a static device that always exists under any attached
+ * ppbus device, and not scanned by the ppbus device, we need an identify
+ * function to install the device.
+ */
 static device_method_t lp_methods[] = {
        /* device interface */
-       DEVMETHOD(device_identify,      lp_identify),
+       DEVMETHOD(device_identify,      bus_generic_identify),
        DEVMETHOD(device_probe,         lp_probe),
        DEVMETHOD(device_attach,        lp_attach),
 
index f913c16..2d43213 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/sound/isa/es1888.c,v 1.5.2.5 2002/04/22 15:49:30 cg Exp $
- * $DragonFly: src/sys/dev/sound/isa/Attic/es1888.c,v 1.2 2003/06/17 04:28:30 dillon Exp $
+ * $DragonFly: src/sys/dev/sound/isa/Attic/es1888.c,v 1.3 2005/10/28 03:25:55 dillon Exp $
  */
 
 #include <dev/sound/pcm/sound.h>
 #include <dev/sound/isa/sb.h>
 
-SND_DECLARE_FILE("$DragonFly: src/sys/dev/sound/isa/Attic/es1888.c,v 1.2 2003/06/17 04:28:30 dillon Exp $");
+SND_DECLARE_FILE("$DragonFly: src/sys/dev/sound/isa/Attic/es1888.c,v 1.3 2005/10/28 03:25:55 dillon Exp $");
 
 #ifdef __alpha__
 static int
@@ -112,12 +112,18 @@ es1888_set_port(u_int32_t port)
 }
 #endif
 
-static void
+static int
 es1888_identify(driver_t *driver, device_t parent)
 {
-/*
- * Only use this on alpha since PNPBIOS is a better solution on x86.
- */
+       /*
+        * We do not suppot rescans
+        */
+       if (device_get_state(parent) == DS_ATTACHED)
+               return (0);
+
+       /*
+        * Only use this on alpha since PNPBIOS is a better solution on x86.
+        */
 #ifdef __alpha__
        u_int32_t lo, hi;
        device_t dev;
@@ -130,11 +136,11 @@ es1888_identify(driver_t *driver, device_t parent)
         * Check identification bytes for es1888.
         */
        if (es1888_dspwr(0x220, 0xe7))
-               return;
+               return (ENXIO);
        hi = es1888_get_byte(0x220);
        lo = es1888_get_byte(0x220);
        if (hi != 0x68 || (lo & 0xf0) != 0x80)
-               return;
+               return (ENXIO);
 
        /*
         * Program irq and drq.
@@ -144,7 +150,7 @@ es1888_identify(driver_t *driver, device_t parent)
            || es1888_dspwr(0x220, 0x14) /* enable irq 5 */
            || es1888_dspwr(0x220, 0xb2) /* write register b1 */
            || es1888_dspwr(0x220, 0x18)) /* enable drq 1 */
-               return;
+               return (ENXIO);
 
        /*
         * Create the device and program its resources.
@@ -155,6 +161,9 @@ es1888_identify(driver_t *driver, device_t parent)
        bus_set_resource(dev, SYS_RES_DRQ, 0, 1, 1);
        isa_set_vendorid(dev, PNP_EISAID("ESS1888"));
        isa_set_logicalid(dev, PNP_EISAID("ESS1888"));
+       return (0);
+#else
+       return (ENXIO);
 #endif
 }
 
index 69f22d7..eb761c3 100644 (file)
@@ -16,7 +16,7 @@
  * Sep, 1994   Implemented on FreeBSD 1.1.5.1R (Toshiba AVS001WD)
  *
  * $FreeBSD: src/sys/i386/apm/apm.c,v 1.114.2.5 2002/11/02 04:41:50 iwasaki Exp $
- * $DragonFly: src/sys/i386/apm/Attic/apm.c,v 1.11 2005/06/03 17:12:17 dillon Exp $
+ * $DragonFly: src/sys/i386/apm/Attic/apm.c,v 1.12 2005/10/28 03:25:57 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -801,19 +801,6 @@ apm_not_halt_cpu(void)
 
 /* device driver definitions */
 
-/*
- * Create "connection point"
- */
-static void
-apm_identify(driver_t *driver, device_t parent)
-{
-       device_t child;
-
-       child = BUS_ADD_CHILD(parent, 0, "apm", 0);
-       if (child == NULL)
-               panic("apm_identify");
-}
-
 /*
  * probe for APM BIOS
  */
@@ -1370,9 +1357,14 @@ apmpoll(dev_t dev, int events, d_thread_t *td)
        return (revents);
 }
 
+/*
+ * Because apm is a static device that always exists under any attached
+ * isa device, and not scanned by the isa device, we need an identify
+ * function to install the device so we can probe for it.
+ */
 static device_method_t apm_methods[] = {
        /* Device interface */
-       DEVMETHOD(device_identify,      apm_identify),
+       DEVMETHOD(device_identify,      bus_generic_identify),
        DEVMETHOD(device_probe,         apm_probe),
        DEVMETHOD(device_attach,        apm_attach),
 
@@ -1388,3 +1380,4 @@ static driver_t apm_driver = {
 static devclass_t apm_devclass;
 
 DRIVER_MODULE(apm, nexus, apm_driver, apm_devclass, 0, 0);
+
index 394b7a4..b3933ec 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     from: @(#)autoconf.c    7.1 (Berkeley) 5/9/91
  * $FreeBSD: src/sys/i386/i386/autoconf.c,v 1.146.2.2 2001/06/07 06:05:58 dd Exp $
- * $DragonFly: src/sys/i386/i386/Attic/autoconf.c,v 1.18 2005/09/04 01:28:59 dillon Exp $
+ * $DragonFly: src/sys/i386/i386/Attic/autoconf.c,v 1.19 2005/10/28 03:25:57 dillon Exp $
  */
 
 /*
@@ -114,8 +114,6 @@ SYSINIT(configure3, SI_SUB_CONFIGURE, SI_ORDER_ANY, configure_final, NULL);
 dev_t  rootdev = NODEV;
 dev_t  dumpdev = NODEV;
 
-device_t nexus_dev;
-
 /*
  * Determine i/o configuration for a machine.
  */
@@ -154,10 +152,13 @@ configure(dummy)
        INTREN(IRQ_SLAVE);
 #endif /* APIC_IO */
 
-       /* nexus0 is the top of the i386 device tree */
-       device_add_child(root_bus, "nexus", 0);
-
-       /* initialize new bus architecture */
+       /*
+        * This will configure all devices, generally starting with the
+        * nexus (i386/i386/nexus.c).  The nexus ISA code explicitly
+        * dummies up the attach in order to delay legacy initialization
+        * until after all other busses/subsystems have had a chance
+        * at those resources.
+        */
        root_bus_configure();
 
 #if NISA > 0
index 1b31cb1..3eab8a1 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/i386/nexus.c,v 1.26.2.10 2003/02/22 13:16:45 imp Exp $
- * $DragonFly: src/sys/i386/i386/Attic/nexus.c,v 1.18 2005/10/13 00:02:44 dillon Exp $
+ * $DragonFly: src/sys/i386/i386/Attic/nexus.c,v 1.19 2005/10/28 03:25:57 dillon Exp $
  */
 
 /*
@@ -76,7 +76,6 @@ struct nexus_device {
 
 static struct rman irq_rman, drq_rman, port_rman, mem_rman;
 
-static void nexus_identify(driver_t *, device_t);
 static int nexus_probe(device_t);
 static int nexus_attach(device_t);
 static int nexus_print_all_resources(device_t dev);
@@ -102,9 +101,13 @@ static     int nexus_set_resource(device_t, device_t, int, int, u_long, u_long);
 static int nexus_get_resource(device_t, device_t, int, int, u_long *, u_long *);
 static void nexus_delete_resource(device_t, device_t, int, int);
 
+/*
+ * The device_identify method will cause nexus to automatically associate
+ * and attach to the root bus.
+ */
 static device_method_t nexus_methods[] = {
        /* Device interface */
-       DEVMETHOD(device_identify,      nexus_identify),
+       DEVMETHOD(device_identify,      bus_generic_identify),
        DEVMETHOD(device_probe,         nexus_probe),
        DEVMETHOD(device_attach,        nexus_attach),
        DEVMETHOD(device_detach,        bus_generic_detach),
@@ -139,17 +142,6 @@ static devclass_t nexus_devclass;
 
 DRIVER_MODULE(nexus, root, nexus_driver, nexus_devclass, 0, 0);
 
-static void
-nexus_identify(driver_t *driver, device_t parent)
-{
-        /*
-         * Add child device with order of 1 so it gets probed
-         * after ACPI (which is at order 0.
-         */
-        if (BUS_ADD_CHILD(parent, 1, "legacy", 0) == NULL)
-                panic("legacy: could not attach");
-}
-
 static int
 nexus_probe(device_t dev)
 {
index 3a591b6..6b8c812 100644 (file)
@@ -26,7 +26,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/i386/i386/Attic/pnpbios.c,v 1.2 2004/10/14 03:05:52 dillon Exp $
+ * $DragonFly: src/sys/i386/i386/Attic/pnpbios.c,v 1.3 2005/10/28 03:25:57 dillon Exp $
  */
 
 /*
@@ -97,7 +97,7 @@ pnpbios_set_config(void *arg, struct isa_config *config, int enable)
 /*
  * Quiz the PnP BIOS, build a list of PNP IDs and resource data.
  */
-static void
+static int
 pnpbios_identify(driver_t *driver, device_t parent)
 {
     struct PnPBIOS_table       *pt = PnPBIOStable;
@@ -110,14 +110,20 @@ pnpbios_identify(driver_t *driver, device_t parent)
     uint32_t                   *devid, *compid;
     int                                idx, left;
     device_t                   dev;
+
+    /*
+     * Umm, we aren't going to rescan the PnP BIOS to look for new additions.
+     */
+    if (device_get_state(parent) == DS_ATTACHED)
+       return (0);
         
     /* no PnP BIOS information */
     if (pt == NULL)
-       return;
+       return (ENXIO);
 
     /* ACPI already active */
     if (devclass_get_softc(devclass_find("ACPI"), 0) != NULL)
-       return;
+       return (ENXIO);
     
     bzero(&args, sizeof(args));
     args.seg.code16.base = BIOS_PADDRTOVADDR(pt->pmentrybase);
@@ -236,6 +242,7 @@ pnpbios_identify(driver_t *driver, device_t parent)
            printf("\n");
        }
     }
+    return (0);
 }
 
 static device_method_t pnpbios_methods[] = {
index d88fbea..9557a8e 100644 (file)
@@ -33,7 +33,7 @@
  *
  *     from: @(#)npx.c 7.2 (Berkeley) 5/12/91
  * $FreeBSD: src/sys/i386/isa/npx.c,v 1.80.2.3 2001/10/20 19:04:38 tegge Exp $
- * $DragonFly: src/sys/i386/isa/Attic/npx.c,v 1.25 2005/10/12 17:35:55 dillon Exp $
+ * $DragonFly: src/sys/i386/isa/Attic/npx.c,v 1.26 2005/10/28 03:25:57 dillon Exp $
  */
 
 #include "opt_cpu.h"
@@ -142,7 +142,6 @@ typedef u_char bool_t;
 
 static int     npx_attach      (device_t dev);
        void    npx_intr        (void *);
-static void    npx_identify    (driver_t *driver, device_t parent);
 static int     npx_probe       (device_t dev);
 static int     npx_probe1      (device_t dev);
 static void    fpusave         (union savefpu *);
@@ -209,19 +208,6 @@ __asm("                                                            \n\
 ");
 #endif /* SMP */
 
-/*
- * Identify routine.  Create a connection point on our parent for probing.
- */
-static void
-npx_identify(driver_t *driver, device_t parent)
-{
-       device_t child;
-
-       child = BUS_ADD_CHILD(parent, 0, "npx", 0);
-       if (child == NULL)
-               panic("npx_identify");
-}
-
 /*
  * Probe routine.  Initialize cr0 to give correct behaviour for [f]wait
  * whether the device exists or not (XXX should be elsewhere).  Set flags
@@ -977,9 +963,14 @@ fpurstor(union savefpu *addr)
                frstor(addr);
 }
 
+/*
+ * Because npx is a static device that always exists under nexus,
+ * and is not scanned by the nexus device, we need an identify
+ * function to install the device.
+ */
 static device_method_t npx_methods[] = {
        /* Device interface */
-       DEVMETHOD(device_identify,      npx_identify),
+       DEVMETHOD(device_identify,      bus_generic_identify),
        DEVMETHOD(device_probe,         npx_probe),
        DEVMETHOD(device_attach,        npx_attach),
        DEVMETHOD(device_detach,        bus_generic_detach),
index 7c657d8..b823851 100644 (file)
@@ -22,7 +22,7 @@
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
- * $DragonFly: src/sys/i386/isa/Attic/pmtimer.c,v 1.4 2005/06/04 03:22:08 dillon Exp $
+ * $DragonFly: src/sys/i386/isa/Attic/pmtimer.c,v 1.5 2005/10/28 03:25:57 dillon Exp $
  */
 
 #include <sys/cdefs.h>
@@ -49,22 +49,6 @@ static struct isa_pnp_id pmtimer_ids[] = {
        {0}
 };
 
-static void
-pmtimer_identify(driver_t *driver, device_t parent)
-{
-       device_t child;
-
-       /*
-        * Only add a child if one doesn't exist already.
-        */
-       child = devclass_get_device(pmtimer_devclass, 0);
-       if (child == NULL) {
-               child = BUS_ADD_CHILD(parent, 0, "pmtimer", 0);
-               if (child == NULL)
-                       panic("pmtimer_identify");
-       }
-}
-
 static int
 pmtimer_probe(device_t dev)
 {
@@ -115,9 +99,14 @@ pmtimer_resume(device_t dev)
        return (0);
 }
 
+/*
+ * Because pmtimer is a static device that always exists under any attached
+ * isa device, and not scanned by the isa device, we need an identify
+ * function to install the device.
+ */
 static device_method_t pmtimer_methods[] = {
        /* Device interface */
-       DEVMETHOD(device_identify,      pmtimer_identify),
+       DEVMETHOD(device_identify,      bus_generic_identify),
        DEVMETHOD(device_probe,         pmtimer_probe),
        DEVMETHOD(device_attach,        bus_generic_attach),
        DEVMETHOD(device_suspend,       pmtimer_suspend),
index 8f323fd..f7c0cfd 100644 (file)
@@ -24,7 +24,7 @@
 # SUCH DAMAGE.
 #
 # $FreeBSD: src/sys/kern/device_if.m,v 1.7.2.1 2001/07/24 09:49:41 dd Exp $
-# $DragonFly: src/sys/kern/device_if.m,v 1.3 2003/11/17 00:54:40 asmodai Exp $
+# $DragonFly: src/sys/kern/device_if.m,v 1.4 2005/10/28 03:25:57 dillon Exp $
 #
 
 #include <sys/bus.h>
@@ -79,9 +79,20 @@ METHOD int probe {
 };
 
 #
-# Called by a parent bus to add new devices to the bus.
+# Called by a parent bus to add new devices to the bus.  The driver
+# should check parent->state to determine whether this is an initial
+# identification scan on the bus, or whether it is a rescan.  If
+# parent->state == DS_ATTACHED then the identify call is a re-scan.
 #
-STATICMETHOD void identify {
+# Return 0 on success, 0 on rescan, or an error on the initial scan if no
+# devices were added to the bus.  Using generic_bus_identify() will
+# simply call BUS_ADD_CHILD using the driver name.
+#
+# Standard matching devices do not usually have an identify function, whereas
+# busses or any entity which needs to create static device entries under
+# the bus will.
+#
+STATICMETHOD int identify {
        driver_t *driver;
        device_t parent;
 };
index c18946c..6bbf073 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/subr_bus.c,v 1.54.2.9 2002/10/10 15:13:32 jhb Exp $
- * $DragonFly: src/sys/kern/subr_bus.c,v 1.27 2005/06/27 12:24:46 joerg Exp $
+ * $DragonFly: src/sys/kern/subr_bus.c,v 1.28 2005/10/28 03:25:57 dillon Exp $
  */
 
 #include "opt_bus.h"
@@ -156,6 +156,7 @@ int
 devclass_add_driver(devclass_t dc, driver_t *driver)
 {
        driverlink_t dl;
+       device_t dev;
        int i;
 
        PDEBUG(("%s", DRIVERNAME(driver)));
@@ -181,11 +182,20 @@ devclass_add_driver(devclass_t dc, driver_t *driver)
        TAILQ_INSERT_TAIL(&dc->drivers, dl, link);
 
        /*
-        * Call BUS_DRIVER_ADDED for any existing busses in this class.
+        * Call BUS_DRIVER_ADDED for any existing busses in this class,
+        * but only if the bus has already been attached (otherwise we
+        * might probe too early).
+        *
+        * This is what will cause a newly loaded module to be associated
+        * with hardware.  bus_generic_driver_added() is typically what ends
+        * up being called.
         */
-       for (i = 0; i < dc->maxunit; i++)
-               if (dc->devices[i])
-                       BUS_DRIVER_ADDED(dc->devices[i], driver);
+       for (i = 0; i < dc->maxunit; i++) {
+               if ((dev = dc->devices[i]) != NULL) {
+                       if (dev->state == DS_ATTACHED)
+                               BUS_DRIVER_ADDED(dev, driver);
+               }
+       }
 
        return(0);
 }
@@ -1782,6 +1792,34 @@ resource_list_print_type(struct resource_list *rl, const char *name, int type,
        return(retval);
 }
 
+/*
+ * Generic driver/device identify functions.  These will install a device
+ * rendezvous point under the parent using the same name as the driver
+ * name, which will at a later time be probed and attached.
+ *
+ * These functions are used when the parent does not 'scan' its bus for
+ * matching devices, or for the particular devices using these functions,
+ * or when the device is a pseudo or synthesized device (such as can be
+ * found under firewire and ppbus).
+ */
+int
+bus_generic_identify(driver_t *driver, device_t parent)
+{
+       if (parent->state == DS_ATTACHED)
+               return (0);
+       BUS_ADD_CHILD(parent, 0, driver->name, -1);
+       return (0);
+}
+
+int
+bus_generic_identify_sameunit(driver_t *driver, device_t parent)
+{
+       if (parent->state == DS_ATTACHED)
+               return (0);
+       BUS_ADD_CHILD(parent, 0, driver->name, device_get_unit(parent));
+       return (0);
+}
+
 /*
  * Call DEVICE_IDENTIFY for each driver.
  */
@@ -1791,19 +1829,41 @@ bus_generic_probe(device_t dev)
        devclass_t dc = dev->devclass;
        driverlink_t dl;
 
-       TAILQ_FOREACH(dl, &dc->drivers, link)
+       TAILQ_FOREACH(dl, &dc->drivers, link) {
                DEVICE_IDENTIFY(dl->driver, dev);
+       }
 
        return(0);
 }
 
+/*
+ * This is an aweful hack due to the isa bus and autoconf code not
+ * probing the ISA devices until after everything else has configured.
+ * The ISA bus did a dummy attach long ago so we have to set it back
+ * to an earlier state so the probe thinks its the initial probe and
+ * not a bus rescan.
+ *
+ * XXX remove by properly defering the ISA bus scan.
+ */
+int
+bus_generic_probe_hack(device_t dev)
+{
+       if (dev->state == DS_ATTACHED) {
+               dev->state = DS_ALIVE;
+               bus_generic_probe(dev);
+               dev->state = DS_ATTACHED;
+       }
+       return (0);
+}
+
 int
 bus_generic_attach(device_t dev)
 {
        device_t child;
 
-       TAILQ_FOREACH(child, &dev->children, link)
+       TAILQ_FOREACH(child, &dev->children, link) {
                device_probe_and_attach(child);
+       }
 
        return(0);
 }
@@ -1927,9 +1987,10 @@ bus_generic_driver_added(device_t dev, driver_t *driver)
        device_t child;
 
        DEVICE_IDENTIFY(driver, dev);
-       TAILQ_FOREACH(child, &dev->children, link)
+       TAILQ_FOREACH(child, &dev->children, link) {
                if (child->state == DS_NOTPRESENT)
                        device_probe_and_attach(child);
+       }
 }
 
 int
@@ -2308,6 +2369,7 @@ static kobj_method_t root_methods[] = {
        KOBJMETHOD(device_resume,       bus_generic_resume),
 
        /* Bus interface */
+       KOBJMETHOD(bus_add_child,       device_add_child_ordered),
        KOBJMETHOD(bus_print_child,     root_print_child),
        KOBJMETHOD(bus_read_ivar,       bus_generic_read_ivar),
        KOBJMETHOD(bus_write_ivar,      bus_generic_write_ivar),
@@ -2335,7 +2397,7 @@ root_bus_module_handler(module_t mod, int what, void* arg)
                root_bus->desc = "System root bus";
                kobj_init((kobj_t) root_bus, (kobj_class_t) &root_driver);
                root_bus->driver = &root_driver;
-               root_bus->state = DS_ATTACHED;
+               root_bus->state = DS_ALIVE;
                root_devclass = devclass_find_internal("root", NULL, FALSE);
                return(0);
 
@@ -2361,8 +2423,19 @@ root_bus_configure(void)
 
        PDEBUG(("."));
 
-       TAILQ_FOREACH(dev, &root_bus->children, link)
+       /*
+        * handle device_identify based device attachments to the root_bus
+        * (typically nexus).
+        */
+       bus_generic_probe(root_bus);
+
+       /*
+        * Probe and attach the devices under root_bus.
+        */
+       TAILQ_FOREACH(dev, &root_bus->children, link) {
                device_probe_and_attach(dev);
+       }
+       root_bus->state = DS_ATTACHED;
 }
 
 int
index 0c93972..9d0472c 100644 (file)
@@ -16,7 +16,7 @@
  * Sep, 1994   Implemented on FreeBSD 1.1.5.1R (Toshiba AVS001WD)
  *
  * $FreeBSD: src/sys/i386/apm/apm.c,v 1.114.2.5 2002/11/02 04:41:50 iwasaki Exp $
- * $DragonFly: src/sys/platform/pc32/apm/apm.c,v 1.11 2005/06/03 17:12:17 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/apm/apm.c,v 1.12 2005/10/28 03:25:57 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -801,19 +801,6 @@ apm_not_halt_cpu(void)
 
 /* device driver definitions */
 
-/*
- * Create "connection point"
- */
-static void
-apm_identify(driver_t *driver, device_t parent)
-{
-       device_t child;
-
-       child = BUS_ADD_CHILD(parent, 0, "apm", 0);
-       if (child == NULL)
-               panic("apm_identify");
-}
-
 /*
  * probe for APM BIOS
  */
@@ -1370,9 +1357,14 @@ apmpoll(dev_t dev, int events, d_thread_t *td)
        return (revents);
 }
 
+/*
+ * Because apm is a static device that always exists under any attached
+ * isa device, and not scanned by the isa device, we need an identify
+ * function to install the device so we can probe for it.
+ */
 static device_method_t apm_methods[] = {
        /* Device interface */
-       DEVMETHOD(device_identify,      apm_identify),
+       DEVMETHOD(device_identify,      bus_generic_identify),
        DEVMETHOD(device_probe,         apm_probe),
        DEVMETHOD(device_attach,        apm_attach),
 
@@ -1388,3 +1380,4 @@ static driver_t apm_driver = {
 static devclass_t apm_devclass;
 
 DRIVER_MODULE(apm, nexus, apm_driver, apm_devclass, 0, 0);
+
index 985aed6..1c1eafa 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     from: @(#)autoconf.c    7.1 (Berkeley) 5/9/91
  * $FreeBSD: src/sys/i386/i386/autoconf.c,v 1.146.2.2 2001/06/07 06:05:58 dd Exp $
- * $DragonFly: src/sys/platform/pc32/i386/autoconf.c,v 1.18 2005/09/04 01:28:59 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/i386/autoconf.c,v 1.19 2005/10/28 03:25:57 dillon Exp $
  */
 
 /*
@@ -114,8 +114,6 @@ SYSINIT(configure3, SI_SUB_CONFIGURE, SI_ORDER_ANY, configure_final, NULL);
 dev_t  rootdev = NODEV;
 dev_t  dumpdev = NODEV;
 
-device_t nexus_dev;
-
 /*
  * Determine i/o configuration for a machine.
  */
@@ -154,10 +152,13 @@ configure(dummy)
        INTREN(IRQ_SLAVE);
 #endif /* APIC_IO */
 
-       /* nexus0 is the top of the i386 device tree */
-       device_add_child(root_bus, "nexus", 0);
-
-       /* initialize new bus architecture */
+       /*
+        * This will configure all devices, generally starting with the
+        * nexus (i386/i386/nexus.c).  The nexus ISA code explicitly
+        * dummies up the attach in order to delay legacy initialization
+        * until after all other busses/subsystems have had a chance
+        * at those resources.
+        */
        root_bus_configure();
 
 #if NISA > 0
index ac8128c..aeca720 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/i386/nexus.c,v 1.26.2.10 2003/02/22 13:16:45 imp Exp $
- * $DragonFly: src/sys/platform/pc32/i386/nexus.c,v 1.18 2005/10/13 00:02:44 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/i386/nexus.c,v 1.19 2005/10/28 03:25:57 dillon Exp $
  */
 
 /*
@@ -76,7 +76,6 @@ struct nexus_device {
 
 static struct rman irq_rman, drq_rman, port_rman, mem_rman;
 
-static void nexus_identify(driver_t *, device_t);
 static int nexus_probe(device_t);
 static int nexus_attach(device_t);
 static int nexus_print_all_resources(device_t dev);
@@ -102,9 +101,13 @@ static     int nexus_set_resource(device_t, device_t, int, int, u_long, u_long);
 static int nexus_get_resource(device_t, device_t, int, int, u_long *, u_long *);
 static void nexus_delete_resource(device_t, device_t, int, int);
 
+/*
+ * The device_identify method will cause nexus to automatically associate
+ * and attach to the root bus.
+ */
 static device_method_t nexus_methods[] = {
        /* Device interface */
-       DEVMETHOD(device_identify,      nexus_identify),
+       DEVMETHOD(device_identify,      bus_generic_identify),
        DEVMETHOD(device_probe,         nexus_probe),
        DEVMETHOD(device_attach,        nexus_attach),
        DEVMETHOD(device_detach,        bus_generic_detach),
@@ -139,17 +142,6 @@ static devclass_t nexus_devclass;
 
 DRIVER_MODULE(nexus, root, nexus_driver, nexus_devclass, 0, 0);
 
-static void
-nexus_identify(driver_t *driver, device_t parent)
-{
-        /*
-         * Add child device with order of 1 so it gets probed
-         * after ACPI (which is at order 0.
-         */
-        if (BUS_ADD_CHILD(parent, 1, "legacy", 0) == NULL)
-                panic("legacy: could not attach");
-}
-
 static int
 nexus_probe(device_t dev)
 {
index 649c056..37e651c 100644 (file)
@@ -26,7 +26,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/platform/pc32/i386/pnpbios.c,v 1.2 2004/10/14 03:05:52 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/i386/pnpbios.c,v 1.3 2005/10/28 03:25:57 dillon Exp $
  */
 
 /*
@@ -97,7 +97,7 @@ pnpbios_set_config(void *arg, struct isa_config *config, int enable)
 /*
  * Quiz the PnP BIOS, build a list of PNP IDs and resource data.
  */
-static void
+static int
 pnpbios_identify(driver_t *driver, device_t parent)
 {
     struct PnPBIOS_table       *pt = PnPBIOStable;
@@ -110,14 +110,20 @@ pnpbios_identify(driver_t *driver, device_t parent)
     uint32_t                   *devid, *compid;
     int                                idx, left;
     device_t                   dev;
+
+    /*
+     * Umm, we aren't going to rescan the PnP BIOS to look for new additions.
+     */
+    if (device_get_state(parent) == DS_ATTACHED)
+       return (0);
         
     /* no PnP BIOS information */
     if (pt == NULL)
-       return;
+       return (ENXIO);
 
     /* ACPI already active */
     if (devclass_get_softc(devclass_find("ACPI"), 0) != NULL)
-       return;
+       return (ENXIO);
     
     bzero(&args, sizeof(args));
     args.seg.code16.base = BIOS_PADDRTOVADDR(pt->pmentrybase);
@@ -236,6 +242,7 @@ pnpbios_identify(driver_t *driver, device_t parent)
            printf("\n");
        }
     }
+    return (0);
 }
 
 static device_method_t pnpbios_methods[] = {
index 621c460..8b73ad5 100644 (file)
@@ -33,7 +33,7 @@
  *
  *     from: @(#)npx.c 7.2 (Berkeley) 5/12/91
  * $FreeBSD: src/sys/i386/isa/npx.c,v 1.80.2.3 2001/10/20 19:04:38 tegge Exp $
- * $DragonFly: src/sys/platform/pc32/isa/npx.c,v 1.25 2005/10/12 17:35:55 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/isa/npx.c,v 1.26 2005/10/28 03:25:57 dillon Exp $
  */
 
 #include "opt_cpu.h"
@@ -142,7 +142,6 @@ typedef u_char bool_t;
 
 static int     npx_attach      (device_t dev);
        void    npx_intr        (void *);
-static void    npx_identify    (driver_t *driver, device_t parent);
 static int     npx_probe       (device_t dev);
 static int     npx_probe1      (device_t dev);
 static void    fpusave         (union savefpu *);
@@ -209,19 +208,6 @@ __asm("                                                            \n\
 ");
 #endif /* SMP */
 
-/*
- * Identify routine.  Create a connection point on our parent for probing.
- */
-static void
-npx_identify(driver_t *driver, device_t parent)
-{
-       device_t child;
-
-       child = BUS_ADD_CHILD(parent, 0, "npx", 0);
-       if (child == NULL)
-               panic("npx_identify");
-}
-
 /*
  * Probe routine.  Initialize cr0 to give correct behaviour for [f]wait
  * whether the device exists or not (XXX should be elsewhere).  Set flags
@@ -977,9 +963,14 @@ fpurstor(union savefpu *addr)
                frstor(addr);
 }
 
+/*
+ * Because npx is a static device that always exists under nexus,
+ * and is not scanned by the nexus device, we need an identify
+ * function to install the device.
+ */
 static device_method_t npx_methods[] = {
        /* Device interface */
-       DEVMETHOD(device_identify,      npx_identify),
+       DEVMETHOD(device_identify,      bus_generic_identify),
        DEVMETHOD(device_probe,         npx_probe),
        DEVMETHOD(device_attach,        npx_attach),
        DEVMETHOD(device_detach,        bus_generic_detach),
index 5529fe6..1d6d788 100644 (file)
@@ -22,7 +22,7 @@
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
- * $DragonFly: src/sys/platform/pc32/isa/pmtimer.c,v 1.4 2005/06/04 03:22:08 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/isa/pmtimer.c,v 1.5 2005/10/28 03:25:57 dillon Exp $
  */
 
 #include <sys/cdefs.h>
@@ -49,22 +49,6 @@ static struct isa_pnp_id pmtimer_ids[] = {
        {0}
 };
 
-static void
-pmtimer_identify(driver_t *driver, device_t parent)
-{
-       device_t child;
-
-       /*
-        * Only add a child if one doesn't exist already.
-        */
-       child = devclass_get_device(pmtimer_devclass, 0);
-       if (child == NULL) {
-               child = BUS_ADD_CHILD(parent, 0, "pmtimer", 0);
-               if (child == NULL)
-                       panic("pmtimer_identify");
-       }
-}
-
 static int
 pmtimer_probe(device_t dev)
 {
@@ -115,9 +99,14 @@ pmtimer_resume(device_t dev)
        return (0);
 }
 
+/*
+ * Because pmtimer is a static device that always exists under any attached
+ * isa device, and not scanned by the isa device, we need an identify
+ * function to install the device.
+ */
 static device_method_t pmtimer_methods[] = {
        /* Device interface */
-       DEVMETHOD(device_identify,      pmtimer_identify),
+       DEVMETHOD(device_identify,      bus_generic_identify),
        DEVMETHOD(device_probe,         pmtimer_probe),
        DEVMETHOD(device_attach,        bus_generic_attach),
        DEVMETHOD(device_suspend,       pmtimer_suspend),
index 5c1dd8e..a4a3631 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/sys/bus.h,v 1.30.2.5 2004/03/17 17:54:25 njl Exp $
- * $DragonFly: src/sys/sys/bus.h,v 1.16 2005/10/13 00:02:23 dillon Exp $
+ * $DragonFly: src/sys/sys/bus.h,v 1.17 2005/10/28 03:25:57 dillon Exp $
  */
 
 #ifndef _SYS_BUS_H_
@@ -160,7 +160,6 @@ int resource_list_print_type(struct resource_list *rl,
  * The root bus, to which all top-level busses are attached.
  */
 extern device_t root_bus;
-extern devclass_t root_devclass;
 void   root_bus_configure(void);
 
 /*
@@ -190,7 +189,10 @@ void       bus_generic_enable_intr(device_t dev, device_t child, void *cookie);
 int    bus_print_child_header(device_t dev, device_t child);
 int    bus_print_child_footer(device_t dev, device_t child);
 int    bus_generic_print_child(device_t dev, device_t child);
+int    bus_generic_identify(driver_t *driver, device_t parent);
+int    bus_generic_identify_sameunit(driver_t *driver, device_t parent);
 int    bus_generic_probe(device_t dev);
+int    bus_generic_probe_hack(device_t dev);
 int    bus_generic_read_ivar(device_t dev, device_t child, int which,
                              uintptr_t *result);
 int    bus_generic_release_resource(device_t bus, device_t child,