diff options
-rw-r--r-- | share/man/man9/device_find_child.9 | 13 | ||||
-rw-r--r-- | sys/kern/subr_bus.c | 20 |
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); } |