summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/kern/subr_bus.c
diff options
context:
space:
mode:
Diffstat (limited to 'freebsd/sys/kern/subr_bus.c')
-rw-r--r--freebsd/sys/kern/subr_bus.c38
1 files changed, 33 insertions, 5 deletions
diff --git a/freebsd/sys/kern/subr_bus.c b/freebsd/sys/kern/subr_bus.c
index bfeb1c34..e43d0030 100644
--- a/freebsd/sys/kern/subr_bus.c
+++ b/freebsd/sys/kern/subr_bus.c
@@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/conf.h>
+#include <sys/domainset.h>
#include <sys/eventhandler.h>
#include <sys/filio.h>
#include <sys/lock.h>
@@ -2564,7 +2565,7 @@ void
device_set_softc(device_t dev, void *softc)
{
if (dev->softc && !(dev->flags & DF_EXTERNALSOFTC))
- free(dev->softc, M_BUS_SC);
+ free_domain(dev->softc, M_BUS_SC);
dev->softc = softc;
if (dev->softc)
dev->flags |= DF_EXTERNALSOFTC;
@@ -2581,7 +2582,7 @@ device_set_softc(device_t dev, void *softc)
void
device_free_softc(void *softc)
{
- free(softc, M_BUS_SC);
+ free_domain(softc, M_BUS_SC);
}
/**
@@ -2830,6 +2831,11 @@ device_set_devclass_fixed(device_t dev, const char *classname)
int
device_set_driver(device_t dev, driver_t *driver)
{
+#ifndef __rtems__
+ int domain;
+ struct domainset *policy;
+#endif /* __rtems__ */
+
if (dev->state >= DS_ATTACHED)
return (EBUSY);
@@ -2837,7 +2843,7 @@ device_set_driver(device_t dev, driver_t *driver)
return (0);
if (dev->softc && !(dev->flags & DF_EXTERNALSOFTC)) {
- free(dev->softc, M_BUS_SC);
+ free_domain(dev->softc, M_BUS_SC);
dev->softc = NULL;
}
device_set_desc(dev, NULL);
@@ -2846,8 +2852,14 @@ device_set_driver(device_t dev, driver_t *driver)
if (driver) {
kobj_init((kobj_t) dev, (kobj_class_t) driver);
if (!(dev->flags & DF_EXTERNALSOFTC) && driver->size > 0) {
- dev->softc = malloc(driver->size, M_BUS_SC,
- M_NOWAIT | M_ZERO);
+#ifndef __rtems__
+ if (bus_get_domain(dev, &domain) == 0)
+ policy = DOMAINSET_PREF(domain);
+ else
+ policy = DOMAINSET_RR();
+#endif /* __rtems__ */
+ dev->softc = malloc_domainset(driver->size, M_BUS_SC,
+ policy, M_NOWAIT | M_ZERO);
if (!dev->softc) {
kobj_delete((kobj_t) dev, NULL);
kobj_init((kobj_t) dev, &null_class);
@@ -3771,6 +3783,22 @@ bus_generic_attach(device_t dev)
}
/**
+ * @brief Helper function for delaying attaching children
+ *
+ * Many buses can't run transactions on the bus which children need to probe and
+ * attach until after interrupts and/or timers are running. This function
+ * delays their attach until interrupts and timers are enabled.
+ */
+int
+bus_delayed_attach_children(device_t dev)
+{
+ /* Probe and attach the bus children when interrupts are available */
+ config_intrhook_oneshot((ich_func_t)bus_generic_attach, dev);
+
+ return (0);
+}
+
+/**
* @brief Helper function for implementing DEVICE_DETACH()
*
* This function can be used to help implement the DEVICE_DETACH() for