Handle (unit == -1) case in the device_find_child() function as already used
authorHasso Tepper <hasso@dragonflybsd.org>
Tue, 2 Sep 2008 17:48:26 +0000 (17:48 +0000)
committerHasso Tepper <hasso@dragonflybsd.org>
Tue, 2 Sep 2008 17:48:26 +0000 (17:48 +0000)
by agp(4) and coretemp(4) code. Fixes unload/load cycle of the coretemp(4),
agp(4) has more problems.

Obtained-from: FreeBSD

sys/kern/subr_bus.c

index 83ead30..3975dca 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/subr_bus.c,v 1.54.2.9 2002/10/10 15:13:32 jhb Exp $
- * $DragonFly: src/sys/kern/subr_bus.c,v 1.41 2008/01/05 13:30:33 corecode Exp $
+ * $DragonFly: src/sys/kern/subr_bus.c,v 1.42 2008/09/02 17:48:26 hasso Exp $
  */
 
 #include "opt_bus.h"
@@ -608,8 +608,19 @@ device_delete_child(device_t dev, device_t child)
        return(0);
 }
 
-/*
- * Find only devices attached to this bus.
+/**
+ * @brief Find a device given a unit number
+ *
+ * This is similar to devclass_get_devices() but only searches for
+ * 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.)
+ *
+ * @returns            the device with the given unit number or @c
+ *                     NULL if there is no such device
  */
 device_t
 device_find_child(device_t dev, const char *classname, int unit)
@@ -621,9 +632,17 @@ device_find_child(device_t dev, const char *classname, int unit)
        if (!dc)
                return(NULL);
 
-       child = devclass_get_device(dc, unit);
-       if (child && child->parent == dev)
-               return(child);
+       if (unit != -1) {
+               child = devclass_get_device(dc, unit);
+               if (child && child->parent == dev)
+                       return (child);
+       } else {
+               for (unit = 0; unit < devclass_get_maxunit(dc); unit++) {
+                       child = devclass_get_device(dc, unit);
+                       if (child && child->parent == dev)
+                               return (child);
+               }
+       }
        return(NULL);
 }