PERFORCE change 101241 for review

Warner Losh imp at FreeBSD.org
Mon Jul 10 21:38:06 UTC 2006


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

Change 101241 by imp at imp_lighthouse on 2006/07/10 21:37:21

	First cut, and a rough one at that, at allowing hints to have
	a dual meaning. The traditional "I claim there's a device
	here" as well as "If you find a device here, prefer this device
	mapping, if you please."  We create a function to ask the bus
	if there's a better unit number for this device than the one we're
	trying, if the device has a wildcarded unit number.

Affected files ...

.. //depot/projects/arm/src/sys/kern/bus_if.m#3 edit
.. //depot/projects/arm/src/sys/kern/subr_bus.c#11 edit

Differences ...

==== //depot/projects/arm/src/sys/kern/bus_if.m#3 (text+ko) ====

@@ -529,3 +529,20 @@
 	const char *	_dname;
 	int		_dunit;
 };
+
+/**
+ * @brief Asks the bus to give us a hand hinting this device.
+ *
+ * Before we probe a child of a bus that's been wildcarded, we call the
+ * bus to see if there's any 'hints' as to unit number for the child
+ * presented for this kind of device.
+ *
+ * @param _dev		the bus device
+ * @param _child	child to hint
+ * @param _dunit	the unit number of the device
+ */
+METHOD void hint_device_unit {
+	device_t	_dev;
+	device_t	_child;
+	int		*_dunit;
+};

==== //depot/projects/arm/src/sys/kern/subr_bus.c#11 (text+ko) ====

@@ -1697,10 +1697,10 @@
 int
 device_probe_child(device_t dev, device_t child)
 {
-	devclass_t dc;
+	devclass_t dc, childdc;
 	driverlink_t best = 0;
 	driverlink_t dl;
-	int result, pri = 0;
+	int unit, result, pri = 0;
 	int hasclass = (child->devclass != 0);
 
 	GIANT_REQUIRED;
@@ -1724,7 +1724,18 @@
 			device_set_driver(child, dl->driver);
 			if (!hasclass)
 				device_set_devclass(child, dl->driver->name);
-
+			if (child->flags & DF_WILDCARD) {
+				unit = child->unit;
+				BUS_HINT_DEVICE_UNIT(dev, child, &unit);
+				if (unit != child->unit) {
+					childdc = child->devclass;
+					devclass_delete_device(childdc, child);
+					if (childdc->devices[unit] != NULL)
+						continue;
+					child->unit = unit;
+					devclass_add_device(childdc, child);
+				}
+			}
 			/* Fetch any flags for the device before probing. */
 			resource_int_value(dl->driver->name, child->unit,
 			    "flags", &child->devflags);


More information about the p4-projects mailing list