diff --git a/share/man/man9/devclass_get_count.9 b/share/man/man9/devclass_get_count.9 new file mode 100644 index 000000000000..5dcb6c5c710c --- /dev/null +++ b/share/man/man9/devclass_get_count.9 @@ -0,0 +1,47 @@ +.\" -*- nroff -*- +.\" +.\" Copyright (c) 2004 Nate Lawson +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR +.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT, +.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd December 5, 2004 +.Dt DEVCLASS_GET_COUNT 9 +.Os +.Sh NAME +.Nm devclass_get_count +.Nd get the number of devices in a devclass +.Sh SYNOPSIS +.In sys/param.h +.In sys/bus.h +.Ft int +.Fn devclass_get_count "devclass_t dc" +.Sh DESCRIPTION +Returns the number of device instances in the specified +.Dv devclass . +.Sh SEE ALSO +.Xr devclass 9 , +.Xr device 9 +.Sh AUTHORS +This man page was written by +.An Nate Lawson . diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c index 05bfe6588a97..ca9b03b9fb1d 100644 --- a/sys/kern/subr_bus.c +++ b/sys/kern/subr_bus.c @@ -1054,15 +1054,10 @@ devclass_get_softc(devclass_t dc, int unit) int devclass_get_devices(devclass_t dc, device_t **devlistp, int *devcountp) { - int i; - int count; + int count, i; device_t *list; - count = 0; - for (i = 0; i < dc->maxunit; i++) - if (dc->devices[i]) - count++; - + count = devclass_get_count(dc); list = malloc(count * sizeof(device_t), M_TEMP, M_NOWAIT|M_ZERO); if (!list) return (ENOMEM); @@ -1081,6 +1076,23 @@ devclass_get_devices(devclass_t dc, device_t **devlistp, int *devcountp) return (0); } +/** + * @brief Get the number of devices in a devclass + * + * @param dc the devclass to examine + */ +int +devclass_get_count(devclass_t dc) +{ + int count, i; + + count = 0; + for (i = 0; i < dc->maxunit; i++) + if (dc->devices[i]) + count++; + return (count); +} + /** * @brief Get the maximum unit number used in a devclass * diff --git a/sys/sys/bus.h b/sys/sys/bus.h index 3c88b4dca20f..14d6a07a3c47 100644 --- a/sys/sys/bus.h +++ b/sys/sys/bus.h @@ -381,6 +381,7 @@ const char *devclass_get_name(devclass_t dc); device_t devclass_get_device(devclass_t dc, int unit); void *devclass_get_softc(devclass_t dc, int unit); int devclass_get_devices(devclass_t dc, device_t **listp, int *countp); +int devclass_get_count(devclass_t dc); int devclass_get_maxunit(devclass_t dc); int devclass_find_free_unit(devclass_t dc, int unit); void devclass_set_parent(devclass_t dc, devclass_t pdc);