PERFORCE change 123650 for review

Maxim Zhuravlev thioretic at FreeBSD.org
Tue Jul 17 13:04:59 UTC 2007


http://perforce.freebsd.org/chv.cgi?CH=123650

Change 123650 by thioretic at thioretic on 2007/07/17 13:04:34

	First round of cleanups.

Affected files ...

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

Differences ...

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

@@ -322,7 +322,6 @@
 			buf[strlen(buf)]='\0';
 			strcat(buf,"\n");
 		}
-		//value = dev->driver ? dev->driver->name : "";		/**TODO*/
 		break;
 	case DEVICE_SYSCTL_LOCATION:
 		value = buf = malloc(1024, M_BUS, M_WAITOK | M_ZERO);
@@ -364,7 +363,7 @@
 	SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree),
 	    OID_AUTO, "%driver", CTLFLAG_RD,
 	    dev, DEVICE_SYSCTL_DRIVER, device_sysctl_handler, "A",
-	    "device drivers names");		/**TODO*/
+	    "device drivers names");
 	SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree),
 	    OID_AUTO, "%location", CTLFLAG_RD,
 	    dev, DEVICE_SYSCTL_LOCATION, device_sysctl_handler, "A",
@@ -835,8 +834,8 @@
 	
 	if (!di && add){
 		PDEBUG(("adding driver %s to compatibility layer", driver->devops->name));
-		di = malloc(sizeof(struct /*drv_compat*/ driverinfo), M_BUS, M_NOWAIT|M_ZERO);
-		if (!drvc)
+		di = malloc(sizeof(struct driverinfo), M_BUS, M_NOWAIT|M_ZERO);
+		if (!di)
 			return (NULL);
 		di->driver = driver->devops;
 		di->flags = driver->flags;
@@ -849,7 +848,7 @@
 
 /**
  * @internal
- * @brief find compartibility layer entry, associated
+ * @brief find compatibility layer entry, associated
  *	with the driver
  *
  * @param driver	device kobj_class pointer
@@ -890,8 +889,10 @@
 static void
 driverinfo_delete_driver (driver_t *driver) {
 	driverinfo_t di;
+
 	di = driverinfo_find_driver(driver);
-	TAILQ_REMOVE(&driverinfo_layer, di, link);
+	if (di)
+		TAILQ_REMOVE(&driverinfo_layer, di, link);
 }
 
 /**
@@ -906,7 +907,6 @@
 	driverinfo_t di;
 
 	di = driverinfo_find_driver(driver);
-
 	if (!di)
 		return (0);
 	
@@ -926,21 +926,22 @@
 	driverinfo_t di;
 
 	di = driverinfo_find_driver(driver);
-
 	if (!di)
 		return (0);
+
 	di->flags = flags;
 	return (1);
 }
+
 /**
  * @internal
- * @brief Checks driver and returns corresponding driver
+ * @brief Checks driver and returns corresponding level
  *
  * @param flags	drv_compat flags
  */
 static int
 driverinfo_flags2idx (uint32_t flags){
-	switch (flags & DR_ALLEVELS){
+	switch (flags & DR_ALLLEVELS){
 		case DR_LOWEST: return (DRV_LOWEST);
 		case DR_LOWER:	return (DRV_LOWER);
 		case DR_MIDDLE: return (DRV_MIDDLE);
@@ -949,13 +950,22 @@
 	}
 }
 
+/**
+ * @internal
+ * @brief Checks, whether this is a filtering driver
+ *
+ * Returns true, if driver level is DRV_LOWEST<level<DRV_TOPMOST,
+ *	false overwise
+ */
+
+static int
 driverinfo_isfilter (driver_t *driver){
 	uint32_t flags;
 	int level;
 
 	driverinfo_get_flags (driver, &flags);
 	level = driverinfo_flags2idx (flags);
-	return((level>DR_LOWEST & level<DR_TOPMOST) ? TRUE : FALSE);
+	return((level>DRV_LOWEST & level<DRV_TOPMOST) ? TRUE : FALSE);
 }
 
 
@@ -973,7 +983,7 @@
 
 #define FOR_ALL_BUT_RAW_DRIVER (func, memb, ...)	\
 	int level;		\
-	/*pdrv_compat **/ driverinfolink_t dil;		\
+	driverinfolink_t dil;		\
 	for (level = DRV_LOWEST; level <= DRV_TOPMOST; level++){	\
 		if(TAILQ_EMPTY(&(dev->drivers[level])))		\
 			continue;	\
@@ -1190,29 +1200,16 @@
 	uint32_t flags;
 	driverinfolink_t dil;
 
-	if (!driverinfo_get_flags(driver, &flags))
-		/*todo what?*/;
+	driverinfo_get_flags(driver, &flags);
 	level = driverinfo_flags2idx (flags);
 	
-	TAILQ_FOREACH(dil, &((dev->drivers)[level]), link){
+	TAILQ_FOREACH(dil, &dev->drivers[level], link){
 		if (dil->pdriver->driver == driver) 
 			return(TRUE);
 	}
 	return(FALSE);
 }
 
-static int
-is_device_parent (device_t dev, device_t parent){
-	devicelink_t dl;
-	if (TAILQ_EMPTY(&dev->parents))
-		return (FALSE);
-	TAILQ_FOREACH (dl, &dev->parents, link){
-		if (dl->device_ptr == parent)
-			break;
-	}
-	return ((dl) ? TRUE : FALSE);
-}
-
 
 /*
  * Devclass implementation
@@ -1238,10 +1235,11 @@
  */
 static devclass_t
 devclass_find_internal(const char *classname, const char *parentname,
-		       int create, int filter)	/**TODO*/
+		       int create, int filter)
 {
 	devclass_t dc, dcp;
 	devclasslink_t dcl;
+	int created=0;
 
 	PDEBUG(("looking for %s", classname));
 	if (!classname)
@@ -1264,7 +1262,7 @@
 		TAILQ_INIT(&dc->drivers);
 		TAILQ_INIT(&dc->filters);
 		TAILQ_INSERT_TAIL(&devclasses, dc, link);
-
+		created=1;
 		bus_data_generation_update();
 	}
 
@@ -1279,21 +1277,25 @@
 	if (!parentname)
 		return (dc);
 	
-	dcp = devclass_find_internal(parentname, 0, FALSE, FALSE)
+	dcp = devclass_find_internal(parentname, 0, TRUE, FALSE)
 	
 	if (dc && !dc->parent &&
 	    strcmp(classname, parentname) != 0 &&
-	    !filter) {
+	    !filter && dcp) {
 		dc->parent = dcp;
 	}
 
 	if (filter) {
 		dcl = malloc(sizeof(struct devclasslink), M_BUS, M_NOWAIT|M_ZERO);
-		if (!dcl)
-			return (NULL); /*TODO*/
-		TAILQ_INSERT_TAIL(&(dcp->filters), dcl, link);
+		if (!dcl || !dcp){
+			if (created){
+				TAILQ_REMOVE(&devclasses, dc, link);
+				free(dc);
+			}
+			return (NULL);
+		}
+		TAILQ_INSERT_TAIL(&dcp->filters, dcl, link);
 	}
-
 	return (dc);
 }
 
@@ -1358,8 +1360,6 @@
 	 * goes. This means we can safely use static methods and avoids a
 	 * double-free in devclass_delete_driver.
 	 */
-	//kobj_class_compile((kobj_class_t) driver);
-	
 	di = driverinfo_find_driver (driver);
 	di->topology_ops = kobj_create (di->driver, M_BUS, M_NOWAIT|M_ZERO);
 
@@ -1407,7 +1407,7 @@
  * @param driver	the driver to unregister
  */
 int
-devclass_delete_driver(devclass_t busclass, driver_t *driver) /*TODO*/
+devclass_delete_driver(devclass_t busclass, driver_t *driver)
 {
 	devclass_t dc = devclass_find(driver->name);
 	driverlink_t dl;
@@ -1448,14 +1448,13 @@
 	for (i = 0; i < dc->maxunit; i++) {
 		if (dc->devices[i]) {
 			dev = dc->devices[i];
-			if (/*dev->driver == driver*/ 
-			is_device_driver(dev, driver) && 
-			!TAILQ_EMPTY(&(dev->parents)) &&
-			(TAILQ_FIRST(&(dev->parents)))->device_ptr->devclass == busclass) {
-				device_set_driver(dev, driver);
+			if (is_device_driver(dev, driver) && 
+			!TAILQ_EMPTY(&dev->parents) &&
+			(TAILQ_FIRST(&dev->parents))->device_ptr->devclass == busclass) {
+				device_set_driver (dev, driver);
 				if ((error = device_detach(dev)) != 0)
 					return (error);
-				device_set_driver(dev, NULL);
+				device_set_driver (dev, NULL);
 			}
 		}
 	}
@@ -1467,7 +1466,6 @@
 	driver->refs--;
 	if (driver->refs == 0){
 		di = driverinfo_find_driver (driver);
-		//kobj_class_free((kobj_class_t) driver);
 		kobj_delete (di->topology_ops, M_BUS);
 	}
 
@@ -1529,15 +1527,14 @@
 	for (i = 0; i < dc->maxunit; i++) {
 		if (dc->devices[i]) {
 			dev = dc->devices[i];
-			if (/*dev->driver == driver*/ 
-			is_device_driver(dev, driver) && !TAILQ_EMPTY(&(dev->parents) &&
-			(TAILQ_FIRST(&(dev->parents)))->device_ptr->devclass == busclass) {
+			if (is_device_driver(dev, driver) && 
+			!TAILQ_EMPTY(&dev->parents) &&
+			(TAILQ_FIRST(&dev->parents))->device_ptr->devclass == busclass) {
 				if ((error = device_quiesce(dev)) != 0)
 					return (error);
 			}
 		}
 	}
-
 	return (0);
 }
 
@@ -1967,14 +1964,13 @@
 static void
 devclass_device2filters (devclass_t dc, device_t dev){
 	devclasslink_t dcl;
-	driver_t *drv;
 	driverlink_t dl;
 
-	if (TAILQ_EMPTY(&(dc->filters))) return ();
-	TAILQ_FOREACH (dcl, &(dc->filters), link){
-		if (TAILQ_EMPTY(&(dcl->devclass_ptr->drivers))) 
+	if (TAILQ_EMPTY(&dc->filters)) return ();
+	TAILQ_FOREACH (dcl, &dc->filters, link){
+		if (TAILQ_EMPTY(&dcl->devclass_ptr->drivers)) 
 			continue;
-		TAILQ_FOREACH(dl, &(dcl->devclass_ptr->drivers), link){
+		TAILQ_FOREACH(dl, &dcl->devclass_ptr->drivers, link){
 			filter_probe_and_attach (dev, dl->driver);
 		}
 	}
@@ -1986,7 +1982,7 @@
 
 	for (i=0, i<=dc->maxunit; i++){
 		if ((dc->devices[i]) && 
-		   ((dc->devices[i])->state == DS_ALIVE))
+		   ((dc->devices[i])->state >= DS_ALIVE))
 			filter_probe_and_attach (dv->devices[i], filter);
 	}
 }
@@ -2032,25 +2028,11 @@
 	pd->device_ptr = parent;
 	TAILQ_INSERT_TAIL(&(dev->parents), pd, link);
 	TAILQ_INIT(&(dev->children));
-	//kobj_init((kobj_t) dev, &null_class);
 	kobj_init((kobj_t) dev, &drv_compat_ctrl_driver)
-	//dev->driver = NULL;
 	for (level=DRV_LOWEST; level<=DRV_TOPMOST; level++)
 		TAILQ_INIT(&((dev->drivers)[level]));
-	/*if (initto){
-		drvc = drv_compat_find_driver (initto);
-		if (!(drvc->topology_ops = kobj_create (initto, M_BUS, M_NOWAIT|M_ZERO)))
-			/*todo what??*/;
-	/*	dev->devclass = devclass_find (DRIVERNAME(driver));
-		level = drv_compat_flags2idx(drvc->flags);
-		TAILQ_INSERT_TAIL (&((dev->drivers)[level]), &drvc, link);
-		dev->state = DS_ALIVE;
-	}
-	else{*/
-		dev->devclass = NULL;
-		dev->state = DS_NOTPRESENT;
-	/*}*/
-
+	dev->devclass = NULL;
+	dev->state = DS_NOTPRESENT;
 	dev->refs = 0;
 	dev->unit = unit;
 	dev->nameunit = NULL;
@@ -2071,9 +2053,7 @@
 		}
 	}
 	dev->ivars = NULL;
-//	dev->softc = NULL;
 
-
 	TAILQ_INSERT_TAIL(&bus_data_devices, dev, devlink);
 	bus_data_generation_update();
 
@@ -2122,6 +2102,7 @@
 static int
 device_add_to_dev_list (device_t addwhat, devicelink_list_t *addwhere, int incr_refs){
 	devicelink_t pd;
+
 	TAILQ_FOREACH (pd, addwhere, link){
 		if (pd->device_ptr == addwhat)
 			return (1);
@@ -2147,8 +2128,8 @@
  */
 int 
 device_add_existing_child (device_t dev, device_t child){
-	device_add_to_dev_list (child, &(dev->children), TRUE);
-	device_add_to_dev_list (dev, &(child->parents), FALSE);
+	device_add_to_dev_list (child, &dev->children, TRUE);
+	device_add_to_dev_list (dev, &child->parents, FALSE);
 }
 /**
  * @brief Add a new parent, which is a device, that already exists
@@ -2157,8 +2138,8 @@
  */
 int
 device_add_existing_parent (device_t dev, device_t parent){
-	device_add_to_dev_list (parent, &(dev->parents), FALSE);
-	device_add_to_dev_list (dev, &(parent->children), TRUE);
+	device_add_to_dev_list (parent, &dev->parents, FALSE);
+	device_add_to_dev_list (dev, &parent->children, TRUE);
 }
 
 
@@ -2192,7 +2173,7 @@
 	    name, DEVICENAME(dev), order, unit));
 
 	child = malloc (sizeof(struct devicelink), M_BUS, M_NOWAIT|M_ZERO);
-	child->device_ptr = make_device(dev, name, unit/*, NULL*/);
+	child->device_ptr = make_device(dev, name, unit);
 	if (child->device_ptr == NULL){
 		free (child);
 		return (NULL);
@@ -2429,15 +2410,14 @@
 	 * If the state is already probed, then return.  However, don't
 	 * return if we can rebid this object.
 	 */
-	if (/*child->state == DS_ALIVE &&*/ (child->flags & DF_REBID) == 0)
+	if (child->state == DS_ALIVE && (child->flags & DF_REBID) == 0)
 		return (0);
 
 	for (; dc; dc = dc->parent) {
 		for (dl = first_matching_driver(dc, child);
 		     dl;
 		     dl = next_matching_driver(dc, child, dl)) {
-			if(!driverinfo_get_flags(dl->driver, &flags))
-				/*todo what?*/;
+			driverinfo_get_flags(dl->driver, &flags);
 			if (child->state == DS_ALIVE && flags & DR_LOWEST ||
 				(child->state != DS_ALIVE && flags & ~(DR_STACKAWARE|DR_LOWEST)))
 				continue;
@@ -2552,11 +2532,11 @@
  * @brief Return the parent of a device
  */
 device_t
-device_get_parent(device_t dev) /*TODO*/
+device_get_parent(device_t dev)
 {
 	devicelink_t pd;
-	if (!TAILQ_EMPTY(&(dev->parents))){
-		pd = TAILQ_FIRST(&(dev->parents));
+	if (!TAILQ_EMPTY(&dev->parents)){
+		pd = TAILQ_FIRST(&dev->parents);
 		return (pd->device_ptr);
 	}
 	return (NULL);
@@ -2625,10 +2605,10 @@
 driver_t *
 device_get_driver(device_t dev)
 {
-	//driverlink_t dl;
 	driverinfolink_t dil;
-	if (!TAILQ_EMPTY(&((dev->drivers)[DRV_LOWEST]))){
-		dil=TAILQ_FIRST(&((dev->drivers)[DRV_LOWEST]));
+
+	if (!TAILQ_EMPTY(&dev->drivers[DRV_LOWEST])){
+		dil=TAILQ_FIRST(&dev->drivers[DRV_LOWEST]);
 		return (dil->pdriver->driver);
 	}
 	return (NULL);
@@ -2810,8 +2790,8 @@
 void *
 device_get_softc(device_t dev)
 {
-	if(!TAILQ_EMPTY(&(dev->drivers[DRV_LOWEST])))
-		return (TAILQ_FIRST(&(dev->drivers[DRV_LOWEST]))->softc);
+	if(!TAILQ_EMPTY(&dev->drivers[DRV_LOWEST]))
+		return ((TAILQ_FIRST(&dev->drivers[DRV_LOWEST]))->softc);
 	return (NULL);
 }
 
@@ -2825,7 +2805,7 @@
 		return (NULL);
 	level = driverinfo_flags2idx (flags);
 
-	TAILQ_FOREACH (dil, &(dev->drivers[level]), link){
+	TAILQ_FOREACH (dil, &dev->drivers[level], link){
 		if (dil->pdriver->driver == driver)
 			return (dil->softc);
 	}
@@ -2845,8 +2825,9 @@
 	void *psoftc;
 	driverinfolink_t dil;
 
-	if(!TAILQ_EMPTY(&(dev->drivers[DRV_LOWEST])))
-		dil = TAILQ_FIRST(&(dev->drivers[DRV_LOWEST]));
+	if(TAILQ_EMPTY(&dev->drivers[DRV_LOWEST]))
+		return (NULL);		
+	dil = TAILQ_FIRST(&dev->drivers[DRV_LOWEST]);
 	if (dil && !(dil->flags & DF_EXTERNALSOFTC))
 		free(dil->softc, M_BUS_SC);
 	dil->softc = softc;
@@ -2866,7 +2847,7 @@
 		return();
 	level = driverinfo_flags2idx (flags);
 
-	TAILQ_FOREACH (dil, &(dev->drivers[level]), link){
+	TAILQ_FOREACH (dil, &dev->drivers[level], link){
 		if (dil->pdriver->driver == driver)
 			break;
 	}
@@ -2943,8 +2924,8 @@
 	devicelink_t parent;
 	if (dev->state < DS_ATTACHED)
 		panic("device_busy: called for unattached device");
-	if (dev->busy == 0 && !TAILQ_EMPTY(&(dev->parents))){
-		TAILQ_FOREACH (parent, &(dev->parents), link){
+	if (dev->busy == 0 && !TAILQ_EMPTY(&dev->parents)){
+		TAILQ_FOREACH (parent, &dev->parents, link){
 			device_busy(parent->device_ptr);
 		}
 	}
@@ -2964,12 +2945,11 @@
 		    device_get_nameunit(dev));
 	dev->busy--;
 	if (dev->busy == 0) {
-		if (/*dev->parent*/!TAILQ_EMPTY(&(dev->parents))){
-			TAILQ_FOREACH (parent, &(dev->parents), link){
+		if (!TAILQ_EMPTY(&dev->parents)){
+			TAILQ_FOREACH (parent, &dev->parents, link){
 				device_unbusy(parent->device_ptr);
 			}
 		}
-		//device_unbusy(dev->parent);
 		dev->state = DS_ATTACHED;
 	}
 }
@@ -3066,13 +3046,13 @@
 	driverinfolink_t dil;
 
 	for (level = DRV_TOPMOST; level>= DRV_LOWEST; level--){
-		if (TAILQ_EMPTY(&(dev->drivers[level])))
+		if (TAILQ_EMPTY(&dev->drivers[level]))
 			continue;
-		while(dil = TAILQ_FIRST(&(dev->drivers[level]))){
+		while(dil = TAILQ_FIRST(&dev->drivers[level])){
 			dil->state = DS_RAW;
 			if(error = device_detach(dev))
 				return(error);
-			TAILQ_REMOVE(&(dev->drivers[level]), dil, link);
+			TAILQ_REMOVE(&dev->drivers[level], dil, link);
 			free(dil);
 
 		}
@@ -3087,7 +3067,7 @@
  * @retval ENOMEM	a memory allocation failure occurred
  */
 int
-device_set_driver(device_t dev, driver_t *driver) /*TODO*/
+device_set_driver(device_t dev, driver_t *driver)
 {
 	driverinfo_t di; 
 	driverinfolink_t dil;
@@ -3140,9 +3120,6 @@
 			dev->softc = malloc(driver->size, M_BUS_SC,
 			    M_NOWAIT | M_ZERO);
 			if (!dev->softc) {
-				//kobj_delete((kobj_t) dev, 0);
-				//kobj_init((kobj_t) dev, &null_class);
-				//dev->driver = NULL;
 				TAILQ_REMOVE(&(dev->drivers[level]), dil, link);
 				free (dil);
 				return (ENOMEM);
@@ -3205,6 +3182,9 @@
 		}
 		return (error);
 	}
+	
+	dev->state = DS_ALIVE;
+
 	error = device_attach(dev);
 
 	return (error);
@@ -3238,20 +3218,19 @@
 
 	device_sysctl_init(dev);
 	if (!device_is_quiet(dev)){
-		TAILQ_FOREACH (pd, &(dev->parents), link){
+		TAILQ_FOREACH (pd, &dev->parents, link){
 			device_print_child(pd->device_ptr, dev);
 		}
 	}
 	
 	dev->raw--;
-
 	if ((error = DEVICE_ATTACH(dev)) != 0) {
 		printf("device_attach: %s%d attach returned %d\n",
 		    dev->driver->name, dev->unit, error);
 		/* Unset the class; set in device_probe_child */
 		if (dev->devclass == 0)
 			device_set_devclass(dev, 0);
-		TAILQ_REMOVE(&(dev->drivers[dev->driver_level]), dev->driver, link);
+		TAILQ_REMOVE(&dev->drivers[dev->driver_level], dev->driver, link);
 		free(dev->driver);
 		device_sysctl_fini(dev);
 		if(!dev->raw){
@@ -3268,8 +3247,8 @@
 	}
 	dil->state = DS_ATTACHED;
 	if(!dev->raw)
-		dev->state = DS_ATTECHED;
-	dev->driver = (!TAILQ_EMPTY(&(dev->drivers[DRV_LOWEST]))) ? 
+		dev->state = DS_ATTACHED;
+	dev->driver = (!TAILQ_EMPTY(&dev->drivers[DRV_LOWEST])) ? 
 		TAILQ_FIRST(&(dev->drivers[DRV_LOWEST])) : NULL;
 	dev->driver_level=DRV_LOWEST;
 	devadded(dev);
@@ -3309,10 +3288,10 @@
 	if ((error = DEVICE_DETACH(dev)) != 0)
 		return (error);
 	if (dev->driver_level != DRV_LOWEST){
-		TAILQ_REMOVE(&(dev->drivers[dev->driver_level]), dev->driver, link);
+		TAILQ_REMOVE(&dev->drivers[dev->driver_level], dev->driver, link);
 		free(dev->driver);
-		dev->driver = (!TAILQ_EMPTY(&(dev->drivers[DRV_LOWEST]))) ? 
-			TAILQ_FIRST(&(dev->drivers[DRV_LOWEST])) : NULL;
+		dev->driver = (!TAILQ_EMPTY(&dev->drivers[DRV_LOWEST])) ? 
+			TAILQ_FIRST(&dev->drivers[DRV_LOWEST]) : NULL;
 		dev->driver_level=DRV_LOWEST;
 		dev->raw--;
 		if(!dev->raw)
@@ -3321,8 +3300,8 @@
 	}
 	devremoved(dev);
 	device_printf(dev, "detached\n");
-	if (!TAILQ_EMPTY(&(dev->parents))){
-		TAILQ_FOREACH (pd, &(dev->parents), link){
+	if (!TAILQ_EMPTY(&dev->parents)){
+		TAILQ_FOREACH (pd, &dev->parents, link){
 			BUS_CHILD_DETACHED(pd->device_ptr, dev);
 		}
 	}


More information about the p4-projects mailing list