PERFORCE change 123226 for review

Maxim Zhuravlev thioretic at FreeBSD.org
Mon Jul 9 20:44:40 UTC 2007


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

Change 123226 by thioretic at thioretic on 2007/07/09 20:43:41

	TODO: device_set_driver semantics, resource_* and
	bus_generic_* stuff, some cleanups.
	DONE: softc semantics.

Affected files ...

.. //depot/projects/soc2007/thioretic_gidl/TODO#11 edit
.. //depot/projects/soc2007/thioretic_gidl/kern/subr_bus.c#12 edit

Differences ...

==== //depot/projects/soc2007/thioretic_gidl/TODO#11 (text+ko) ====

@@ -123,4 +123,13 @@
 		#		}
 		#
 		# here	driver_handler & DEVICE_PROBE reside in subr_bus
-		#	driver_probe resides in driver+		#	driver_probe resides in driver
+	a.1.4 Softc
+		SOLUTION: add softc per driver to device structure
+		FILE(S) AFFECTED: kern/subr_bus.c
+		# Added devclass_get_driver_softc(),
+		#	device_get_driver_softc(),
+		#	device_set_driver_softc().
+		# All these return softc of a specified driver for a device. Old functions
+		# (those without '_driver_') return softc of DRV_LOWEST driver (as expected).
+		
==== //depot/projects/soc2007/thioretic_gidl/kern/subr_bus.c#12 (text+ko) ====

@@ -83,6 +83,10 @@
 
 struct pdrv_compat {
 	drv_compat_t pdriver;
+	void *ivars;
+	void *softc;
+#define	DF_EXTERNALSOFTC 1		/* softc not allocated by us */
+	int flags;
 	TAILQ_ENTRY(pdrv_compat) link;
 };
 
@@ -159,7 +163,6 @@
 #define	DF_DESCMALLOCED	8		/* description was malloced */
 #define	DF_QUIET	16		/* don't print verbose attach message */
 #define	DF_DONENOMATCH	32		/* don't execute DEVICE_NOMATCH again */
-#define	DF_EXTERNALSOFTC 64		/* softc not allocated by us */
 #define	DF_REBID	128		/* Can rebid after attach */
 	u_char	order;			/**< order from device_add_child_ordered() */
 	u_char	pad;
@@ -1557,6 +1560,17 @@
 	return (device_get_softc(dev));
 }
 
+void *
+devclass_get_driver_softc (devclass_t dc, int unit, driver_t *driver){
+	device_t dev;
+
+	dev = devclass_get_device(dc, unit);
+	if (!dev)
+		return (NULL);
+
+	return (device_get_driver_softc(dev, driver));
+}
+
 /**
  * @brief Get a list of devices in the devclass
  *
@@ -1990,7 +2004,7 @@
 		}
 	}
 	dev->ivars = NULL;
-	dev->softc = NULL;
+//	dev->softc = NULL;
 
 
 	TAILQ_INSERT_TAIL(&bus_data_devices, dev, devlink);
@@ -2719,9 +2733,29 @@
 void *
 device_get_softc(device_t dev)
 {
-	return (dev->softc);
+	if(!TAILQ_EMPTY(&(dev->drivers[DRV_LOWEST])))
+		return (TAILQ_FIRST(&(dev->drivers[DRV_LOWEST]))->softc);
+	return (NULL);
+}
+
+void *
+device_get_driver_softc(device_t dev, driver_t *driver){
+	int level;
+	uint32_t flags;
+	pdrv_compat *pdrvc;
+	
+	if (!drv_compat_get_flags (driver, &flags))
+		return (NULL);
+	level = drv_compat_flags2idx (flags);
+
+	TAILQ_FOREACH (pdrvc, &(dev->drivers[level]), link){
+		if (pdrvc->pdriver->driver == driver)
+			return (pdrvc->softc);
+	}
+	return (NULL);
 }
 
+
 /**
  * @brief Set the device's softc field
  *
@@ -2731,13 +2765,43 @@
 void
 device_set_softc(device_t dev, void *softc)
 {
-	if (dev->softc && !(dev->flags & DF_EXTERNALSOFTC))
-		free(dev->softc, M_BUS_SC);
-	dev->softc = softc;
-	if (dev->softc)
-		dev->flags |= DF_EXTERNALSOFTC;
+	void *psoftc;
+	pdrv_compat *pdrvc;
+
+	if(!TAILQ_EMPTY(&(dev->drivers[DRV_LOWEST])))
+		pdrvc = TAILQ_FIRST(&(dev->drivers[DRV_LOWEST]));
+	if (pdrvc && !(pdrvc->flags & DF_EXTERNALSOFTC))
+		free(pdrvc->softc, M_BUS_SC);
+	pdrvc->softc = softc;
+	if (pdrvc->softc)
+		pdrvc->flags |= DF_EXTERNALSOFTC;
+	else
+		pdrvc->flags &= ~DF_EXTERNALSOFTC;
+}
+
+void
+device_set_driver_softc(device_t dev, driver_t *driver, void* softc){
+	int level;
+	uint32_t flags;
+	pdrv_compat *pdrvc;
+	
+	if (!drv_compat_get_flags (driver, &flags))
+		return();
+	level = drv_compat_flags2idx (flags);
+
+	TAILQ_FOREACH (pdrvc, &(dev->drivers[level]), link){
+		if (pdrvc->pdriver->driver == driver)
+			break;
+	}
+	if (!pdrvc) return();
+
+	if (!(pdrv->flags & DF_EXTERNALSOFTC))
+		free(pdrvc->softc, M_BUS_SC);
+	pdrvc->softc = softc;
+	if (pdrvc->softc)
+		pdrvc->flags |= DF_EXTERNALSOFTC;
 	else
-		dev->flags &= ~DF_EXTERNALSOFTC;
+		pdrvc->flags &= ~DF_EXTERNALSOFTC;
 }
 
 /**
@@ -4610,7 +4674,7 @@
 	    (dev->flags&DF_DESCMALLOCED? "descmalloced,":""),
 	    (dev->flags&DF_REBID? "rebiddable,":""),
 	    (dev->ivars? "":"no "),
-	    (dev->softc? "":"no "),
+	    ((TAILQ_FIRST(&(dev->drivers[DRV_LOWEST])))->softc? "":"no "),
 	    dev->busy));
 }
 


More information about the p4-projects mailing list