svn commit: r199001 - in stable/7/sys: kern sys

John Baldwin jhb at FreeBSD.org
Fri Nov 6 20:23:43 UTC 2009


Author: jhb
Date: Fri Nov  6 20:23:42 2009
New Revision: 199001
URL: http://svn.freebsd.org/changeset/base/199001

Log:
  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.

Modified:
  stable/7/sys/kern/subr_bus.c
  stable/7/sys/sys/bus.h
Directory Properties:
  stable/7/sys/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/kern/subr_bus.c
==============================================================================
--- stable/7/sys/kern/subr_bus.c	Fri Nov  6 20:23:16 2009	(r199000)
+++ stable/7/sys/kern/subr_bus.c	Fri Nov  6 20:23:42 2009	(r199001)
@@ -858,9 +858,10 @@ devclass_find(const char *classname)
  * @param driver	the driver to register
  */
 int
-devclass_add_driver(devclass_t dc, driver_t *driver)
+devclass_add_driver(devclass_t dc, driver_t *driver, devclass_t *dcp)
 {
 	driverlink_t dl;
+	const char *parentname;
 	int i;
 
 	PDEBUG(("%s", DRIVERNAME(driver)));
@@ -878,9 +879,17 @@ devclass_add_driver(devclass_t dc, drive
 	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);
@@ -3853,27 +3862,8 @@ driver_module_handler(module_t mod, int 
 		driver = dmd->dmd_driver;
 		PDEBUG(("Loading module: driver %s on bus %s",
 		    DRIVERNAME(driver), dmd->dmd_busname));
-		error = devclass_add_driver(bus_devclass, driver);
-		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,
+		    dmd->dmd_devclass);
 		break;
 
 	case MOD_UNLOAD:

Modified: stable/7/sys/sys/bus.h
==============================================================================
--- stable/7/sys/sys/bus.h	Fri Nov  6 20:23:16 2009	(r199000)
+++ stable/7/sys/sys/bus.h	Fri Nov  6 20:23:42 2009	(r199001)
@@ -432,7 +432,8 @@ void	device_verbose(device_t dev);
 /*
  * Access functions for devclass.
  */
-int	devclass_add_driver(devclass_t dc, kobj_class_t driver);
+int	devclass_add_driver(devclass_t dc, kobj_class_t driver,
+			    devclass_t *dcp);
 int	devclass_delete_driver(devclass_t dc, kobj_class_t driver);
 devclass_t	devclass_create(const char *classname);
 devclass_t	devclass_find(const char *classname);


More information about the svn-src-all mailing list