summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornjl <njl@FreeBSD.org>2005-04-04 15:26:51 +0000
committernjl <njl@FreeBSD.org>2005-04-04 15:26:51 +0000
commit8a0ce01e9200c604139b76b5addc40a3f6e8dd01 (patch)
tree2fd7241d62840a6b94ee90132966b761e27bf097
parentd8b17b2eac0bc6aa7fcc63f8f2aed9016c3a885d (diff)
downloadFreeBSD-src-8a0ce01e9200c604139b76b5addc40a3f6e8dd01.zip
FreeBSD-src-8a0ce01e9200c604139b76b5addc40a3f6e8dd01.tar.gz
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
-rw-r--r--share/man/man9/devclass_get_drivers.957
-rw-r--r--sys/kern/subr_bus.c41
-rw-r--r--sys/sys/bus.h1
3 files changed, 99 insertions, 0 deletions
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);
OpenPOWER on IntegriCloud