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
This commit is contained in:
njl 2005-04-04 15:26:51 +00:00
parent c3e11b6b72
commit 824f34041b
3 changed files with 99 additions and 0 deletions

View File

@ -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 .

View File

@ -1133,6 +1133,47 @@ devclass_get_devices(devclass_t dc, device_t **devlistp, int *devcountp)
return (0);
}
/**
* @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
*

View File

@ -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);