From 8a0ce01e9200c604139b76b5addc40a3f6e8dd01 Mon Sep 17 00:00:00 2001 From: njl Date: Mon, 4 Apr 2005 15:26:51 +0000 Subject: Add devclass_get_drivers(9) which provides an array of pointers to driver instances in a given devclass. This is useful for systems that want to call code in driver static methods, similar to device_identify(). Reviewed by: dfr MFC after: 2 weeks --- share/man/man9/devclass_get_drivers.9 | 57 +++++++++++++++++++++++++++++++++++ sys/kern/subr_bus.c | 41 +++++++++++++++++++++++++ sys/sys/bus.h | 1 + 3 files changed, 99 insertions(+) create mode 100644 share/man/man9/devclass_get_drivers.9 diff --git a/share/man/man9/devclass_get_drivers.9 b/share/man/man9/devclass_get_drivers.9 new file mode 100644 index 0000000..f9561eb --- /dev/null +++ b/share/man/man9/devclass_get_drivers.9 @@ -0,0 +1,57 @@ +.\" -*- nroff -*- +.\" +.\" Copyright (c) 2005 Nate Lawson +.\" +.\" All rights reserved. +.\" +.\" This program is free software. +.\" +.\" 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 April 3, 2005 +.Dt DEVCLASS_GET_DRIVERS 9 +.Os +.Sh NAME +.Nm devclass_get_drivers +.Nd get a list of drivers in a devclass +.Sh SYNOPSIS +.In sys/param.h +.In sys/bus.h +.Ft int +.Fn devclass_get_drivers "devclass_t dc" "driver_t ***listp" "int *countp" +.Sh DESCRIPTION +Retrieve a list of pointers to all driver instances currently in the +devclass and return the list in +.Fa *listp +and the number of drivers in the list in +.Fa *countp . +The memory allocated for the list should be freed using +.Fn free "*listp" "M_TEMP" . +.Sh RETURN VALUES +Zero is returned on success, otherwise an appropriate error is returned. +.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 45d1718..16a2609 100644 --- a/sys/kern/subr_bus.c +++ b/sys/kern/subr_bus.c @@ -1134,6 +1134,47 @@ devclass_get_devices(devclass_t dc, device_t **devlistp, int *devcountp) } /** + * @brief Get a list of drivers in the devclass + * + * An array containing a list of pointers to all the drivers in the + * given devclass is allocated and returned in @p *listp. The number + * of drivers in the array is returned in @p *countp. The caller should + * free the array using @c free(p, M_TEMP). + * + * @param dc the devclass to examine + * @param listp gives location for array pointer return value + * @param countp gives location for number of array elements + * return value + * + * @retval 0 success + * @retval ENOMEM the array allocation failed + */ +int +devclass_get_drivers(devclass_t dc, driver_t ***listp, int *countp) +{ + driverlink_t dl; + driver_t **list; + int count; + + count = 0; + TAILQ_FOREACH(dl, &dc->drivers, link) + count++; + list = malloc(count * sizeof(driver_t *), M_TEMP, M_NOWAIT); + if (list == NULL) + return (ENOMEM); + + count = 0; + TAILQ_FOREACH(dl, &dc->drivers, link) { + list[count] = dl->driver; + count++; + } + *listp = list; + *countp = count; + + return (0); +} + +/** * @brief Get the number of devices in a devclass * * @param dc the devclass to examine diff --git a/sys/sys/bus.h b/sys/sys/bus.h index 2fbf074..99c8670 100644 --- a/sys/sys/bus.h +++ b/sys/sys/bus.h @@ -383,6 +383,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_drivers(devclass_t dc, driver_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); -- cgit v1.1