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