summaryrefslogtreecommitdiffstats
path: root/sys/kern/bus_if.m
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2009-06-09 14:26:23 +0000
committerjhb <jhb@FreeBSD.org>2009-06-09 14:26:23 +0000
commit77373ed4681d2d7d7a25a619e896c065e12976c6 (patch)
tree10671dffb6ce198477de5fc2d00a79d3d795b1a4 /sys/kern/bus_if.m
parent7e92c698d93e930bd9f98da57fa435a205f23986 (diff)
downloadFreeBSD-src-77373ed4681d2d7d7a25a619e896c065e12976c6.zip
FreeBSD-src-77373ed4681d2d7d7a25a619e896c065e12976c6.tar.gz
Add support for multiple passes of the device tree during the boot-time
probe. The current device order is unchanged. This commit just adds the infrastructure and ABI changes so that it is easier to merge later changes into 8.x. - Driver attachments now have an associated pass level. Attachments are not allowed to probe or attach to drivers until the system-wide pass level is >= the attachment's pass level. By default driver attachments use the "last" pass level (BUS_PASS_DEFAULT). Driver's that wish to probe during an earlier pass use EARLY_DRIVER_MODULE() instead of DRIVER_MODULE() which accepts the pass level as an additional parameter. - A new method BUS_NEW_PASS has been added to the bus interface. This method is invoked when the system-wide pass level is changed to kick off a rescan of the device tree so that drivers that have just been made "eligible" can probe and attach. - The bus_generic_new_pass() function provides a default implementation of BUS_NEW_PASS(). It first allows drivers that were just made eligible for this pass to identify new child devices. Then it propogates the rescan to child devices that already have an attached driver by invoking their BUS_NEW_PASS() method. It also reprobes devices without a driver. - BUS_PROBE_NOMATCH() is only invoked for devices that do not have an attached driver after being scanned during the final pass. - The bus_set_pass() function is used during boot to raise the pass level. Currently it is only called once during root_bus_configure() to raise the pass level to BUS_PASS_DEFAULT. This has the effect of probing all devices in a single pass identical to previous behavior. Reviewed by: imp Approved by: re (kib)
Diffstat (limited to 'sys/kern/bus_if.m')
-rw-r--r--sys/kern/bus_if.m8
1 files changed, 8 insertions, 0 deletions
diff --git a/sys/kern/bus_if.m b/sys/kern/bus_if.m
index f826cb1..c1c0e34 100644
--- a/sys/kern/bus_if.m
+++ b/sys/kern/bus_if.m
@@ -574,3 +574,11 @@ METHOD void hint_device_unit {
int *_unitp;
};
+/**
+ * @brief Notify a bus that the bus pass level has been changed
+ *
+ * @param _dev the bus device
+ */
+METHOD void new_pass {
+ device_t _dev;
+} DEFAULT bus_generic_new_pass;
OpenPOWER on IntegriCloud