summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--share/man/man9/device_find_child.913
-rw-r--r--sys/kern/subr_bus.c20
2 files changed, 25 insertions, 8 deletions
diff --git a/share/man/man9/device_find_child.9 b/share/man/man9/device_find_child.9
index 4dd6a2c..35b6c6c 100644
--- a/share/man/man9/device_find_child.9
+++ b/share/man/man9/device_find_child.9
@@ -28,7 +28,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd June 16, 1998
+.Dd February 8, 2005
.Dt DEVICE_FIND_CHILD 9
.Os
.Sh NAME
@@ -38,14 +38,21 @@
.In sys/param.h
.In sys/bus.h
.Ft device_t
-.Fn device_find_child "device_t dev" "const char* name" "int unit"
+.Fn device_find_child "device_t dev" "const char *classname" "int unit"
.Sh DESCRIPTION
This function looks for a specific child of
.Dv dev .
with the given
-.Fa name
+.Fa classname
and
.Fa unit .
+If
+.Fa unit
+is -1, it returns the first child of
+.Dv dev
+with a matching
+.Fa classname
+(that is, the one with the lowest unit.)
.Sh RETURN VALUES
If it exists, the child device is returned, otherwise NULL.
.Sh SEE ALSO
diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c
index 58d4a67..b63b926 100644
--- a/sys/kern/subr_bus.c
+++ b/sys/kern/subr_bus.c
@@ -1576,8 +1576,10 @@ device_delete_child(device_t dev, device_t child)
* devices which have @p dev as a parent.
*
* @param dev the parent device to search
- * @param unit the unit number to search for
- *
+ * @param unit the unit number to search for. If the unit is -1,
+ * return the first child of @p dev which has name
+ * @p classname (that is, the one with the lowest unit.)
+ *
* @returns the device with the given unit number or @c
* NULL if there is no such device
*/
@@ -1591,9 +1593,17 @@ device_find_child(device_t dev, const char *classname, int unit)
if (!dc)
return (NULL);
- child = devclass_get_device(dc, unit);
- if (child && child->parent == dev)
- return (child);
+ if (unit != -1) {
+ child = devclass_get_device(dc, unit);
+ if (child && child->parent == dev)
+ return (child);
+ } else {
+ for (unit = 0; unit < devclass_get_maxunit(dc); unit++) {
+ child = devclass_get_device(dc, unit);
+ if (child && child->parent == dev)
+ return (child);
+ }
+ }
return (NULL);
}
OpenPOWER on IntegriCloud