MFC 198367:

Set the devclass_t pointer specified in the DRIVER_MODULE() macro
sooner so it is always valid when a driver's identify routine is
called.
This commit is contained in:
John Baldwin 2009-11-06 20:23:16 +00:00
parent dcf9f13772
commit f6b15c7b77

View file

@ -1049,9 +1049,10 @@ devclass_driver_added(devclass_t dc, driver_t *driver)
* @param driver the driver to register
*/
static int
devclass_add_driver(devclass_t dc, driver_t *driver, int pass)
devclass_add_driver(devclass_t dc, driver_t *driver, int pass, devclass_t *dcp)
{
driverlink_t dl;
const char *parentname;
PDEBUG(("%s", DRIVERNAME(driver)));
@ -1072,9 +1073,17 @@ devclass_add_driver(devclass_t dc, driver_t *driver, int pass)
kobj_class_compile((kobj_class_t) driver);
/*
* Make sure the devclass which the driver is implementing exists.
* If the driver has any base classes, make the
* devclass inherit from the devclass of the driver's
* first base class. This will allow the system to
* search for drivers in both devclasses for children
* of a device using this driver.
*/
devclass_find_internal(driver->name, NULL, TRUE);
if (driver->baseclasses)
parentname = driver->baseclasses[0]->name;
else
parentname = NULL;
*dcp = devclass_find_internal(driver->name, parentname, TRUE);
dl->driver = driver;
TAILQ_INSERT_TAIL(&dc->drivers, dl, link);
@ -4117,27 +4126,8 @@ driver_module_handler(module_t mod, int what, void *arg)
driver = dmd->dmd_driver;
PDEBUG(("Loading module: driver %s on bus %s (pass %d)",
DRIVERNAME(driver), dmd->dmd_busname, pass));
error = devclass_add_driver(bus_devclass, driver, pass);
if (error)
break;
/*
* If the driver has any base classes, make the
* devclass inherit from the devclass of the driver's
* first base class. This will allow the system to
* search for drivers in both devclasses for children
* of a device using this driver.
*/
if (driver->baseclasses) {
const char *parentname;
parentname = driver->baseclasses[0]->name;
*dmd->dmd_devclass =
devclass_find_internal(driver->name,
parentname, TRUE);
} else {
*dmd->dmd_devclass =
devclass_find_internal(driver->name, NULL, TRUE);
}
error = devclass_add_driver(bus_devclass, driver, pass,
dmd->dmd_devclass);
break;
case MOD_UNLOAD: