Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 23 Jul 2007 18:06:05 GMT
From:      Maxim Zhuravlev <thioretic@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 123980 for review
Message-ID:  <200707231806.l6NI65Kh000279@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=123980

Change 123980 by thioretic@thioretic on 2007/07/23 18:05:04

	ivars stuff. some cleanups.

Affected files ...

.. //depot/projects/soc2007/thioretic_gidl/kern/subr_bus.c#19 edit

Differences ...

==== //depot/projects/soc2007/thioretic_gidl/kern/subr_bus.c#19 (text+ko) ====

@@ -171,8 +171,8 @@
 #define DF_PERSISTENT	256		/* Should not delete when refs == 0*/
 	u_char	order;			/**< order from device_add_child_ordered() */
 	u_char	pad;
-	void	*ivars;			/**< instance variables  */
-	void	*softc;			/**< current driver's variables  */
+	//void	*ivars;			/**< instance variables  */
+	//void	*softc;			/**< current driver's variables  */
 	u_long	refs;
 	int raw;
 
@@ -2000,7 +2000,7 @@
  * @returns the new device
  */
 static device_t
-make_device(device_t parent, const char *name, int unit/*, driver_t *initto*/)	/*TODO*/
+make_device(device_t parent, const char *name, int unit)	/*TODO*/
 {
 	device_t dev;
 	devclass_t dc;
@@ -2053,7 +2053,6 @@
 			return (NULL);
 		}
 	}
-	dev->ivars = NULL;
 
 	TAILQ_INSERT_TAIL(&bus_data_devices, dev, devlink);
 	bus_data_generation_update();
@@ -2253,7 +2252,7 @@
 	}
 
 	if (devtodel->refs) 
-		return (1);
+		return (0);
 
 	TAILQ_REMOVE(&bus_data_devices, devtodel, devlink);
 	kobj_delete((kobj_t) devtodel, M_BUS);
@@ -2868,6 +2867,32 @@
 		dil->flags &= ~DF_EXTERNALSOFTC;
 }
 
+
+void*
+device_get_driver_ivars (device_t dev, driver_t *driver){
+	int level;
+	driverinfolink_t dil;
+	u_int32_t flags;
+
+	KASSERT(dev != NULL, ("device_get_ivars(NULL, ...)"));
+	if (!driverinfo_get_flags (driver, &flags))
+		return (NULL);
+	level = driverinfo_flags2idx (flags);
+	
+	if (TAILQ_EMPTY(&dev->drivers[level]))
+		return (NULL);
+
+	TAILQ_FOREACH (dil, &dev->drivers[level], link){
+		if (dil->pdriver->driver == driver)
+			break;
+	}
+	
+	if (!dil)
+		return (NULL);
+	else	
+		return (dil->ivars);
+}
+
 /**
  * @brief Get the device's ivars field
  *
@@ -2878,9 +2903,37 @@
 void *
 device_get_ivars(device_t dev)
 {
+	driverinfolink_t dil;
+
+	KASSERT(dev != NULL, ("device_get_ivars(NULL, ...)"));
+	if (TAILQ_EMPTY(&dev->drivers[DRV_LOWEST]))
+		return (NULL);
+	dil = TAILQ_FIRST(&dev->drivers[DRV_LOWEST]);
+	
+	return (dil>ivars);
+}
+
+void
+device_set_driver_ivars (device_t dev, driver_t *driver, void* ivars){
+	int level;
+	driverinfolink_t dil;
+	u_int32_t flags;
 
 	KASSERT(dev != NULL, ("device_get_ivars(NULL, ...)"));
-	return (dev->ivars);
+	if (!driverinfo_get_flags (driver, &flags))
+		return (NULL);
+	level = driverinfo_flags2idx (flags);
+	
+	if (TAILQ_EMPTY(&dev->drivers[level]))
+		return (NULL);
+
+	TAILQ_FOREACH (dil, &dev->drivers[level], link){
+		if (dil->pdriver->driver == driver)
+			break;
+	}
+	
+	if (dil)
+		dil->ivars = ivars;
 }
 
 /**
@@ -2889,9 +2942,14 @@
 void
 device_set_ivars(device_t dev, void * ivars)
 {
+	driverinfolink_t dil;
 
 	KASSERT(dev != NULL, ("device_set_ivars(NULL, ...)"));
-	dev->ivars = ivars;
+	if(!(TAILQ_EMPTY(&dev->drivers[DRV_LOWEST]))){
+		dil = TAILQ_FIRST(&dev->drivers[DRV_LOWEST]);
+	}
+	dil = TAILQ_FIRST(&dev->drivers[DRV_LOWEST]);
+	dil->ivars = ivars;
 }
 
 /**
@@ -3078,7 +3136,7 @@
 	driverinfo_t di; 
 	driverinfolink_t dil;
 	uint32_t flags;
-	int level;
+	int level, present = 0;
 
 	if (dev->state >= DS_ATTACHED)
 		return (EBUSY);
@@ -3086,20 +3144,15 @@
 	if (driver == dev->driver->pdriver->driver)
 		return (0);
 	
+	di = driverinfo_find_driver (driver);	
+	driverinfo_get_flags(driver, &flags);
+	level = driverinfo_flags2idx(flags);
+
 	if (driver != NULL){
-		di = driverinfo_find_driver (driver);
-
-		driverinfo_get_flags(driver, &flags);
-		level = driverinfo_flags2idx(flags);
-
 		TAILQ_FOREACH(dil, &(dev->drivers[level]), link){
 			if (dil->pdriver == di)
 				break;
 		}
-		if (dil){
-			dil->state = DS_RAW;
-			return (0);
-		}
 	}
 
 	if(driver == NULL || level == DRV_LOWEST){
@@ -3107,31 +3160,33 @@
 			return (EBUSY);
 	}
 
-	dil = malloc (sizeof(struct driverinfolink), M_BUS, M_NOWAIT|M_ZERO);
+	if (!dil){
+		dil = malloc (sizeof(struct driverinfolink), M_BUS, M_NOWAIT|M_ZERO);
+		TAILQ_INSERT_TAIL (&dev->drivers[level], dil);
+	}
+
 	dil->pdriver = di;
 	dil->state = DS_RAW;
 	dev->raw++;
 	
-	TAILQ_INSERT_TAIL (&(dev->drivers[level]), dil);
-
 	dev->driver = dil;
 	dev->driver_level = level;
 
-	if (dev->softc && !(dev->flags & DF_EXTERNALSOFTC)) {	/*TODO*/
-		free(dev->softc, M_BUS_SC);
-		dev->softc = NULL;
+	if (dil->softc && !(dil->flags & DF_EXTERNALSOFTC)) {
+		free(dil->softc, M_BUS_SC);
+		dil->softc = NULL;
 	}
 	if (driver) {
-		if (!(dev->flags & DF_EXTERNALSOFTC) && driver->size > 0) {
-			dev->softc = malloc(driver->size, M_BUS_SC,
+		if (!(dil->flags & DF_EXTERNALSOFTC) && driver->size > 0) {
+			dil->softc = malloc(driver->size, M_BUS_SC,
 			    M_NOWAIT | M_ZERO);
-			if (!dev->softc) {
+			if (!dil->softc) {
 				TAILQ_REMOVE(&(dev->drivers[level]), dil, link);
 				free (dil);
 				return (ENOMEM);
 			}
 		}
-	}*/
+	}
 
 	bus_data_generation_update();
 	return (0);
@@ -4620,7 +4675,7 @@
  */
 
 static int
-parse_parent_name (char* in, char ***out){	/*TODO*/
+parse_parent_name (char* in, char ***out){
 	char* cptr = in, *ptr = in, *newpar;
 	int count = 1, num = 0;
 	
@@ -4646,9 +4701,91 @@
 			(*out)[count++] = newpar;
 			num = 0; cptr = ++ptr;
 		} while (cptr<(in+strlen(in)));
-		(*out)[count]=NULL;
+		(*out)[count] = NULL;
+		return (1);
+	}
+}
+
+int
+register_filter_or_device_driver (driver *driver, char* hosts, devclass_t *pdc){
+	int error = 0, count = 0;
+	devclass_t dc, parentdc;
+	char *parents[];
+
+	if (!parse_parent_name(hosts, &parents))
+		return (1);
+
+	while (parents[count]){
+		parentdc = devclass_find_internal(parents[count], 0, TRUE, FALSE);
+		error &= devclass_add_driver (parentdc, driver);
+		count++;
+	}
+	free(parents);
+	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;
+		*pdc =	devclass_find_internal(driver->name,
+			    parentname, TRUE, FALSE);
+	} else {
+		*pdc =	devclass_find_internal(driver->name, 0, TRUE, FALSE);
+	}
+}
+
+int
+register_func_driver (driver_t *driver, char* hosts, devclass_t *pdc){
+	int error, count=0, devcount;
+	device_t dev, *devices;
+	devclass_t dc, parentdc;
+
+	if ((dc = devclass_find_internal(driver->name, 0, TRUE, FALSE)) == NULL)
+		return (1);
+
+	if (error = devclass_add_driver(dc, driver))
+		return (error);
+
+	if ((dev = make_device (root_bus, DRIVERNAME(driver), -1)) == NULL)
 		return (1);
+
+	if (error = device_set_driver(dev, driver))
+		return (error);
+
+	if (error = device_set_devclass(dev, driver->name))
+		return (error);
+
+	/* Fetch any flags for the device before probing.*/
+	resource_int_value(driver->name, dev->unit,
+		"flags", &dev->devflags);
+	dev->flags |= DF_PERSISTENT;
+	*pdc = dc;
+
+	if (!parse_parent_name(hosts, &parents))
+		return (0);
+
+	while (parents[count]){
+		if (!(parentdc = devclass_find(parents[count++])))
+			continue;
+		devclass_get_devices(parentdc, &devices, &devcount);
+		for (i=0, i<devcount, i++){
+			device_add_existing_parent(dev, devices[i]);
+		}
 	}
+	
+	free(parents);
+
+	DEVICE_PROBE(dev);
+	device_attach(dev);
+
+	return (0);
 }
 
 /**
@@ -4664,12 +4801,9 @@
 {
 	int error=0;
 	struct driver_module_data *dmd;
-	devclass_t bus_devclass, parent_devclass, filter_devclass;
+	devclass_t bus_devclass;
 	drv_internal_t drv_intnl;
 	kobj_class_t driver;
-	char* parents[];
-	int count=0, isfilter, devcount;
-	device_t dev, *devices;
 	u_int32_t flags;
 
 	dmd = (struct driver_module_data *)arg;
@@ -4680,65 +4814,15 @@
 	case MOD_LOAD:
 		if (dmd->dmd_chainevh)
 			error = dmd->dmd_chainevh(mod,what,dmd->dmd_chainarg);
-
 		driverinfo_add_driver(drv_intnl);
 		driver = drv_intnl->devops;
 		PDEBUG(("Loading module: driver %s on bus %s",
 		    DRIVERNAME(driver), dmd->dmd_busname));
-		if (!parse_parent_name(dmd->dmd_busname, &parents))
-			break;
-		isfilter = driverinfo_isfilter (driver);
-		while (parents[count]){
-			parent_devclass = devclass_find_internal(parents[count], 0, TRUE, FALSE);
-			error &= devclass_add_driver (parent_devclass, driver);
-			count++;
-		}
-		free(parents);
-		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, FALSE);
-		} else {
-			*dmd->dmd_devclass =
-				devclass_find_internal(driver->name, 0, TRUE, FALSE);
-		}
-
-		if(drv_intnl->flags & (DR_REQDEV|DR_LOWEST)){
-			dev = make_device (root_bus, DRIVERNAME(driver), -1);
-			device_set_driver(dev, driver);
-			device_set_devclass(dev, driver->name);
-
-			/* Fetch any flags for the device before probing.
-			resource_int_value(dl->driver->name, child->unit,
-			    "flags", &child->devflags);
-			*/
-			dev->flags |= DF_PERSISTENT;
-			count = 0;
-			while (parents[count]){
-				if (!(parent_devclass = devclass_find(parents[count++])))
-					continue;
-				devclass_get_devices(parent_devclass, &devices, &devcount);
-				for (i=0, i<devcount, i++){
-					device_add_existing_parent(dev, devices[i]);
-				}
-			}
-			result = DEVICE_PROBE(dev);
-			if(result <= 0)
-				device_attach(dev);
-		}
-
+		if (isfunc = drv_intnl->flags & (DR_REQDEV|DR_LOWEST))
+			error = register_func_driver(driver, dmd->dmd_busname, dmd->dmd_devclass);
+		else
+			error = register_filter_or_device_driver(driver, dmd->dmd_busname, dmd->dmd_devclass);
 		break;
 
 	case MOD_UNLOAD:
@@ -4753,7 +4837,7 @@
 		if (!error && dmd->dmd_chainevh)
 			error = dmd->dmd_chainevh(mod,what,dmd->dmd_chainarg);
 		break;
-	case MOD_QUIESCE:		/*TODO*/
+	case MOD_QUIESCE:		
 		PDEBUG(("Quiesce module: driver %s from bus %s",
 		    DRIVERNAME(dmd->dmd_driver),
 		    dmd->dmd_busname));



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707231806.l6NI65Kh000279>