diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c --- a/sys/kern/subr_bus.c +++ b/sys/kern/subr_bus.c @@ -5285,31 +5285,38 @@ kobj_class_t driver; int error, pass; - bus_topo_lock(); - dmd = (struct driver_module_data *)arg; - bus_devclass = devclass_find_internal(dmd->dmd_busname, NULL, TRUE); error = 0; switch (what) { case MOD_LOAD: + bus_topo_lock(); + bus_devclass = devclass_find_internal(dmd->dmd_busname, NULL, + TRUE); + bus_topo_unlock(); if (dmd->dmd_chainevh) - error = dmd->dmd_chainevh(mod,what,dmd->dmd_chainarg); + error = dmd->dmd_chainevh(mod, what, dmd->dmd_chainarg); pass = dmd->dmd_pass; driver = dmd->dmd_driver; PDEBUG(("Loading module: driver %s on bus %s (pass %d)", DRIVERNAME(driver), dmd->dmd_busname, pass)); + bus_topo_lock(); error = devclass_add_driver(bus_devclass, driver, pass, dmd->dmd_devclass); + bus_topo_unlock(); break; case MOD_UNLOAD: PDEBUG(("Unloading module: driver %s from bus %s", DRIVERNAME(dmd->dmd_driver), dmd->dmd_busname)); + bus_topo_lock(); + bus_devclass = devclass_find_internal(dmd->dmd_busname, NULL, + FALSE); error = devclass_delete_driver(bus_devclass, dmd->dmd_driver); + bus_topo_unlock(); if (!error && dmd->dmd_chainevh) error = dmd->dmd_chainevh(mod,what,dmd->dmd_chainarg); @@ -5318,8 +5325,12 @@ PDEBUG(("Quiesce module: driver %s from bus %s", DRIVERNAME(dmd->dmd_driver), dmd->dmd_busname)); + bus_topo_lock(); + bus_devclass = devclass_find_internal(dmd->dmd_busname, NULL, + FALSE); error = devclass_quiesce_driver(bus_devclass, dmd->dmd_driver); + bus_topo_unlock(); if (!error && dmd->dmd_chainevh) error = dmd->dmd_chainevh(mod,what,dmd->dmd_chainarg); @@ -5329,8 +5340,6 @@ break; } - bus_topo_unlock(); - return (error); }