The branch main has been updated by imp:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=22ea1ec051c15659944bf3922c33ec4025d010ea

commit 22ea1ec051c15659944bf3922c33ec4025d010ea
Author:     Warner Losh <i...@freebsd.org>
AuthorDate: 2024-07-25 04:22:48 +0000
Commit:     Warner Losh <i...@freebsd.org>
CommitDate: 2024-07-25 04:22:48 +0000

    newbus: introduce DEVICE_UNIT_ANY
    
    Right now we pass a bare -1 for situations where any unit number will do.
    Instead, introduce a DEVICE_UNIT_ANY to use instead of the bare constant.
    Update documentation and examples where -1 is currently used, though
    additional doc updates may be needed.
    
    Sponsored by:           Netflix
---
 share/man/man9/DEVICE_IDENTIFY.9 |  2 +-
 share/man/man9/devclass.9        |  7 ++++---
 sys/kern/subr_bus.c              | 40 ++++++++++++++++++++--------------------
 sys/sys/bus.h                    |  1 +
 4 files changed, 26 insertions(+), 24 deletions(-)

diff --git a/share/man/man9/DEVICE_IDENTIFY.9 b/share/man/man9/DEVICE_IDENTIFY.9
index 4892e66eb214..d75c1a91ce4a 100644
--- a/share/man/man9/DEVICE_IDENTIFY.9
+++ b/share/man/man9/DEVICE_IDENTIFY.9
@@ -73,7 +73,7 @@ foo_identify(driver_t *driver, device_t parent)
        retrieve_device_information;
        if (devices matches one of your supported devices &&
            not already in device tree) {
-               child = BUS_ADD_CHILD(parent, 0, "foo", -1);
+               child = BUS_ADD_CHILD(parent, 0, "foo", DEVICE_UNIT_ANY);
                bus_set_resource(child, SYS_RES_IOPORT, 0, FOO_IOADDR, 1);
        }
 }
diff --git a/share/man/man9/devclass.9 b/share/man/man9/devclass.9
index d3c83133ae17..cbf81f3b0fa3 100644
--- a/share/man/man9/devclass.9
+++ b/share/man/man9/devclass.9
@@ -46,10 +46,11 @@ Each
 has a name and there cannot be two devclasses with the same name.
 This ensures that unique unit numbers are allocated to device
 instances.
+All instances with the same name are treated as being the same.
 .Pp
-Beware that this means
-.Vt devclass
-must be the same for different bus attachments of the same device driver.
+When no specific unit number is needed,
+.Vt DEVICE_UNIT_ANY
+is used.
 .Sh SEE ALSO
 .Xr devclass_add_driver 9 ,
 .Xr devclass_delete_driver 9 ,
diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c
index 9df58cb987f6..71d04e483d4d 100644
--- a/sys/kern/subr_bus.c
+++ b/sys/kern/subr_bus.c
@@ -1060,9 +1060,9 @@ devclass_get_count(devclass_t dc)
 /**
  * @brief Get the maximum unit number used in a devclass
  *
- * Note that this is one greater than the highest currently-allocated
- * unit.  If a null devclass_t is passed in, -1 is returned to indicate
- * that not even the devclass has been allocated yet.
+ * Note that this is one greater than the highest currently-allocated unit.  If
+ * @p dc is NULL, @c -1 is returned to indicate that not even the devclass has
+ * been allocated yet.
  *
  * @param dc           the devclass to examine
  */
@@ -1135,9 +1135,9 @@ devclass_get_sysctl_tree(devclass_t dc)
  * @internal
  * @brief Allocate a unit number
  *
- * On entry, @p *unitp is the desired unit number (or @c -1 if any
+ * On entry, @p *unitp is the desired unit number (or @c DEVICE_UNIT_ANY if any
  * will do). The allocated unit number is returned in @p *unitp.
-
+ *
  * @param dc           the devclass to allocate from
  * @param unitp                points at the location for the allocated unit
  *                     number
@@ -1155,13 +1155,12 @@ devclass_alloc_unit(devclass_t dc, device_t dev, int 
*unitp)
        PDEBUG(("unit %d in devclass %s", unit, DEVCLANAME(dc)));
 
        /* Ask the parent bus if it wants to wire this device. */
-       if (unit == -1)
+       if (unit == DEVICE_UNIT_ANY)
                BUS_HINT_DEVICE_UNIT(device_get_parent(dev), dev, dc->name,
                    &unit);
 
        /* If we were given a wired unit number, check for existing device */
-       /* XXX imp XXX */
-       if (unit != -1) {
+       if (unit != DEVICE_UNIT_ANY) {
                if (unit >= 0 && unit < dc->maxunit &&
                    dc->devices[unit] != NULL) {
                        if (bootverbose)
@@ -1282,7 +1281,7 @@ devclass_delete_device(devclass_t dc, device_t dev)
                panic("devclass_delete_device: inconsistent device class");
        dc->devices[dev->unit] = NULL;
        if (dev->flags & DF_WILDCARD)
-               dev->unit = -1;
+               dev->unit = DEVICE_UNIT_ANY;
        dev->devclass = NULL;
        free(dev->nameunit, M_BUS);
        dev->nameunit = NULL;
@@ -1297,8 +1296,8 @@ devclass_delete_device(devclass_t dc, device_t dev)
  * @param parent       the parent of the new device
  * @param name         the devclass name of the new device or @c NULL
  *                     to leave the devclass unspecified
- * @parem unit         the unit number of the new device of @c -1 to
- *                     leave the unit number unspecified
+ * @parem unit         the unit number of the new device of @c DEVICE_UNIT_ANY
+ *                     to leave the unit number unspecified
  *
  * @returns the new device
  */
@@ -1337,7 +1336,7 @@ make_device(device_t parent, const char *name, int unit)
        dev->devflags = 0;
        dev->flags = DF_ENABLED;
        dev->order = 0;
-       if (unit == -1)
+       if (unit == DEVICE_UNIT_ANY)
                dev->flags |= DF_WILDCARD;
        if (name) {
                dev->flags |= DF_FIXEDCLASS;
@@ -1387,7 +1386,7 @@ device_print_child(device_t dev, device_t child)
  *                     new child device
  * @param name         devclass name for new device or @c NULL if not
  *                     specified
- * @param unit         unit number for new device or @c -1 if not
+ * @param unit         unit number for new device or @c DEVICE_UNIT_ANY if not
  *                     specified
  *
  * @returns            the new device
@@ -1413,7 +1412,7 @@ device_add_child(device_t dev, const char *name, int unit)
  *                     dev's list of children
  * @param name         devclass name for new device or @c NULL if not
  *                     specified
- * @param unit         unit number for new device or @c -1 if not
+ * @param unit         unit number for new device or @c DEVICE_UNIT_ANY if not
  *                     specified
  *
  * @returns            the new device
@@ -1426,7 +1425,7 @@ device_add_child_ordered(device_t dev, u_int order, const 
char *name, int unit)
 
        PDEBUG(("%s at %s with order %u as unit %d",
            name, DEVICENAME(dev), order, unit));
-       KASSERT(name != NULL || unit == -1,
+       KASSERT(name != NULL || unit == DEVICE_UNIT_ANY,
            ("child device with wildcard name and specific unit number"));
 
        child = make_device(dev, name, unit);
@@ -1541,9 +1540,10 @@ device_delete_children(device_t dev)
  * devices which have @p dev as a parent.
  *
  * @param dev          the parent device to search
- * @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.)
+ * @param unit         the unit number to search for.  If the unit is
+ *                     @c DEVICE_UNIT_ANY, 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
@@ -1558,7 +1558,7 @@ device_find_child(device_t dev, const char *classname, 
int unit)
        if (!dc)
                return (NULL);
 
-       if (unit != -1) {
+       if (unit != DEVICE_UNIT_ANY) {
                child = devclass_get_device(dc, unit);
                if (child && child->parent == dev)
                        return (child);
@@ -5788,7 +5788,7 @@ devctl2_ioctl(struct cdev *cdev, u_long cmd, caddr_t 
data, int fflag,
                if (dev->flags & DF_FIXEDCLASS)
                        devclass_delete_device(dev->devclass, dev);
                dev->flags |= DF_WILDCARD;
-               dev->unit = -1;
+               dev->unit = DEVICE_UNIT_ANY;
 
                /* Force the new device class. */
                error = devclass_add_device(dc, dev);
diff --git a/sys/sys/bus.h b/sys/sys/bus.h
index e0ad2dc447fe..acadbb217711 100644
--- a/sys/sys/bus.h
+++ b/sys/sys/bus.h
@@ -159,6 +159,7 @@ struct devreq {
 /* Flags for DEV_RESET */
 #define        DEVF_RESET_DETACH       0x0000001       /* Detach drivers vs 
suspend
                                                   device */
+#define DEVICE_UNIT_ANY                (-1)
 
 #ifdef _KERNEL
 

Reply via email to