Author: hselasky
Date: Sat Nov 19 10:11:50 2011
New Revision: 227701
URL: http://svn.freebsd.org/changeset/base/227701

Log:
  Move the device_delete_all_children() function from usb_util.c
  to kern/subr_bus.c. Simplify this function so that it no longer
  depends on malloc() to execute. Identify a few other places where
  it makes sense to use device_delete_all_children().
  
  MFC after:    1 week

Modified:
  head/sys/arm/xscale/ixp425/avila_ata.c
  head/sys/dev/ahci/ahci.c
  head/sys/dev/ata/ata-disk.c
  head/sys/dev/ata/ata-pci.c
  head/sys/dev/gpio/gpiobus.c
  head/sys/dev/mvs/mvs_pci.c
  head/sys/dev/mvs/mvs_soc.c
  head/sys/dev/ppbus/ppbconf.c
  head/sys/dev/ppc/ppc.c
  head/sys/dev/siba/siba_core.c
  head/sys/dev/siis/siis.c
  head/sys/dev/usb/usb_util.c
  head/sys/dev/usb/usb_util.h
  head/sys/kern/subr_bus.c
  head/sys/sys/bus.h

Modified: head/sys/arm/xscale/ixp425/avila_ata.c
==============================================================================
--- head/sys/arm/xscale/ixp425/avila_ata.c      Sat Nov 19 09:16:52 2011        
(r227700)
+++ head/sys/arm/xscale/ixp425/avila_ata.c      Sat Nov 19 10:11:50 2011        
(r227701)
@@ -259,17 +259,11 @@ static int
 ata_avila_detach(device_t dev)
 {
        struct ata_avila_softc *sc = device_get_softc(dev);
-       device_t *children;
-       int nc;
 
        /* XXX quiesce gpio? */
 
        /* detach & delete all children */
-       if (device_get_children(dev, &children, &nc) == 0) {
-               if (nc > 0)
-                       device_delete_child(dev, children[0]);
-               free(children, M_TEMP);
-       }
+       device_delete_all_children(dev);
 
        bus_teardown_intr(dev, sc->sc_irq, sc->sc_ih);
        bus_release_resource(dev, SYS_RES_IRQ, sc->sc_rid, sc->sc_irq);

Modified: head/sys/dev/ahci/ahci.c
==============================================================================
--- head/sys/dev/ahci/ahci.c    Sat Nov 19 09:16:52 2011        (r227700)
+++ head/sys/dev/ahci/ahci.c    Sat Nov 19 10:11:50 2011        (r227701)
@@ -515,15 +515,11 @@ static int
 ahci_detach(device_t dev)
 {
        struct ahci_controller *ctlr = device_get_softc(dev);
-       device_t *children;
-       int nchildren, i;
+       int i;
 
        /* Detach & delete all children */
-       if (!device_get_children(dev, &children, &nchildren)) {
-               for (i = 0; i < nchildren; i++)
-                       device_delete_child(dev, children[i]);
-               free(children, M_TEMP);
-       }
+       device_delete_all_children(dev);
+
        /* Free interrupts. */
        for (i = 0; i < ctlr->numirqs; i++) {
                if (ctlr->irqs[i].r_irq) {

Modified: head/sys/dev/ata/ata-disk.c
==============================================================================
--- head/sys/dev/ata/ata-disk.c Sat Nov 19 09:16:52 2011        (r227700)
+++ head/sys/dev/ata/ata-disk.c Sat Nov 19 10:11:50 2011        (r227701)
@@ -172,8 +172,6 @@ ad_detach(device_t dev)
 {
     struct ad_softc *adp = device_get_ivars(dev);
     struct ata_device *atadev = device_get_softc(dev);
-    device_t *children;
-    int nchildren, i;
 
     /* check that we have a valid disk to detach */
     if (!device_get_ivars(dev))
@@ -183,12 +181,7 @@ ad_detach(device_t dev)
     callout_drain(&atadev->spindown_timer);
 
     /* detach & delete all children */
-    if (!device_get_children(dev, &children, &nchildren)) {
-       for (i = 0; i < nchildren; i++)
-           if (children[i])
-               device_delete_child(dev, children[i]);
-       free(children, M_TEMP);
-    }
+    device_delete_all_children(dev);
 
     /* destroy disk from the system so we don't get any further requests */
     disk_destroy(adp->disk);

Modified: head/sys/dev/ata/ata-pci.c
==============================================================================
--- head/sys/dev/ata/ata-pci.c  Sat Nov 19 09:16:52 2011        (r227700)
+++ head/sys/dev/ata/ata-pci.c  Sat Nov 19 10:11:50 2011        (r227701)
@@ -136,15 +136,10 @@ int
 ata_pci_detach(device_t dev)
 {
     struct ata_pci_controller *ctlr = device_get_softc(dev);
-    device_t *children;
-    int nchildren, i;
 
     /* detach & delete all children */
-    if (!device_get_children(dev, &children, &nchildren)) {
-       for (i = 0; i < nchildren; i++)
-           device_delete_child(dev, children[i]);
-       free(children, M_TEMP);
-    }
+    device_delete_all_children(dev);
+
     if (ctlr->r_irq) {
        bus_teardown_intr(dev, ctlr->r_irq, ctlr->handle);
        bus_release_resource(dev, SYS_RES_IRQ, ctlr->r_irq_rid, ctlr->r_irq);

Modified: head/sys/dev/gpio/gpiobus.c
==============================================================================
--- head/sys/dev/gpio/gpiobus.c Sat Nov 19 09:16:52 2011        (r227700)
+++ head/sys/dev/gpio/gpiobus.c Sat Nov 19 10:11:50 2011        (r227701)
@@ -219,8 +219,7 @@ static int
 gpiobus_detach(device_t dev)
 {
        struct gpiobus_softc *sc = GPIOBUS_SOFTC(dev);
-       int err, ndevs, i;
-       device_t *devlist;
+       int err;
 
        KASSERT(mtx_initialized(&sc->sc_mtx),
            ("gpiobus mutex not initialized"));
@@ -228,16 +227,14 @@ gpiobus_detach(device_t dev)
 
        if ((err = bus_generic_detach(dev)) != 0)
                return (err);
-       if ((err = device_get_children(dev, &devlist, &ndevs)) != 0)
-               return (err);
-       for (i = 0; i < ndevs; i++)
-               device_delete_child(dev, devlist[i]);
+
+       /* detach and delete all children */
+       device_delete_all_children(dev);
 
        if (sc->sc_pins_mapped) {
                free(sc->sc_pins_mapped, M_DEVBUF);
                sc->sc_pins_mapped = NULL;
        }
-       free(devlist, M_TEMP);
 
        return (0);
 }

Modified: head/sys/dev/mvs/mvs_pci.c
==============================================================================
--- head/sys/dev/mvs/mvs_pci.c  Sat Nov 19 09:16:52 2011        (r227700)
+++ head/sys/dev/mvs/mvs_pci.c  Sat Nov 19 10:11:50 2011        (r227701)
@@ -177,15 +177,10 @@ static int
 mvs_detach(device_t dev)
 {
        struct mvs_controller *ctlr = device_get_softc(dev);
-       device_t *children;
-       int nchildren, i;
 
        /* Detach & delete all children */
-       if (!device_get_children(dev, &children, &nchildren)) {
-               for (i = 0; i < nchildren; i++)
-                       device_delete_child(dev, children[i]);
-               free(children, M_TEMP);
-       }
+       device_delete_all_children(dev);
+
        /* Free interrupt. */
        if (ctlr->irq.r_irq) {
                bus_teardown_intr(dev, ctlr->irq.r_irq,

Modified: head/sys/dev/mvs/mvs_soc.c
==============================================================================
--- head/sys/dev/mvs/mvs_soc.c  Sat Nov 19 09:16:52 2011        (r227700)
+++ head/sys/dev/mvs/mvs_soc.c  Sat Nov 19 10:11:50 2011        (r227701)
@@ -173,15 +173,10 @@ static int
 mvs_detach(device_t dev)
 {
        struct mvs_controller *ctlr = device_get_softc(dev);
-       device_t *children;
-       int nchildren, i;
 
        /* Detach & delete all children */
-       if (!device_get_children(dev, &children, &nchildren)) {
-               for (i = 0; i < nchildren; i++)
-                       device_delete_child(dev, children[i]);
-               free(children, M_TEMP);
-       }
+       device_delete_all_children(dev);
+
        /* Free interrupt. */
        if (ctlr->irq.r_irq) {
                bus_teardown_intr(dev, ctlr->irq.r_irq,

Modified: head/sys/dev/ppbus/ppbconf.c
==============================================================================
--- head/sys/dev/ppbus/ppbconf.c        Sat Nov 19 09:16:52 2011        
(r227700)
+++ head/sys/dev/ppbus/ppbconf.c        Sat Nov 19 10:11:50 2011        
(r227701)
@@ -422,20 +422,14 @@ ppbus_attach(device_t dev)
 static int
 ppbus_detach(device_t dev)
 {
-       device_t *children;
-       int error, nchildren, i;
+       int error;
 
        error = bus_generic_detach(dev);
        if (error)
                return (error);
 
        /* detach & delete all children */
-       if (!device_get_children(dev, &children, &nchildren)) {
-               for (i = 0; i < nchildren; i++)
-                       if (children[i])
-                               device_delete_child(dev, children[i]);
-               free(children, M_TEMP);
-       }
+       device_delete_all_children(dev);
 
        return (0);
 }

Modified: head/sys/dev/ppc/ppc.c
==============================================================================
--- head/sys/dev/ppc/ppc.c      Sat Nov 19 09:16:52 2011        (r227700)
+++ head/sys/dev/ppc/ppc.c      Sat Nov 19 10:11:50 2011        (r227701)
@@ -1851,20 +1851,13 @@ int
 ppc_detach(device_t dev)
 {
        struct ppc_data *ppc = DEVTOSOFTC(dev);
-       device_t *children;
-       int nchildren, i;
 
        if (ppc->res_irq == 0) {
                return (ENXIO);
        }
 
        /* detach & delete all children */
-       if (!device_get_children(dev, &children, &nchildren)) {
-               for (i = 0; i < nchildren; i++)
-                       if (children[i])
-                               device_delete_child(dev, children[i]);
-               free(children, M_TEMP);
-       }
+       device_delete_all_children(dev);
 
        if (ppc->res_irq != 0) {
                bus_teardown_intr(dev, ppc->res_irq, ppc->intr_cookie);

Modified: head/sys/dev/siba/siba_core.c
==============================================================================
--- head/sys/dev/siba/siba_core.c       Sat Nov 19 09:16:52 2011        
(r227700)
+++ head/sys/dev/siba/siba_core.c       Sat Nov 19 10:11:50 2011        
(r227701)
@@ -214,16 +214,8 @@ siba_core_attach(struct siba_softc *siba
 int
 siba_core_detach(struct siba_softc *siba)
 {
-       device_t *devlistp;
-       int devcnt, error = 0, i;
-
-       error = device_get_children(siba->siba_dev, &devlistp, &devcnt);
-       if (error != 0)
-               return (0);
-
-       for ( i = 0 ; i < devcnt ; i++)
-               device_delete_child(siba->siba_dev, devlistp[i]);
-       free(devlistp, M_TEMP);
+       /* detach & delete all children */
+       device_delete_all_children(siba->siba_dev);
        return (0);
 }
 

Modified: head/sys/dev/siis/siis.c
==============================================================================
--- head/sys/dev/siis/siis.c    Sat Nov 19 09:16:52 2011        (r227700)
+++ head/sys/dev/siis/siis.c    Sat Nov 19 10:11:50 2011        (r227701)
@@ -205,15 +205,10 @@ static int
 siis_detach(device_t dev)
 {
        struct siis_controller *ctlr = device_get_softc(dev);
-       device_t *children;
-       int nchildren, i;
 
        /* Detach & delete all children */
-       if (!device_get_children(dev, &children, &nchildren)) {
-               for (i = 0; i < nchildren; i++)
-                       device_delete_child(dev, children[i]);
-               free(children, M_TEMP);
-       }
+       device_delete_all_children(dev);
+
        /* Free interrupts. */
        if (ctlr->irq.r_irq) {
                bus_teardown_intr(dev, ctlr->irq.r_irq,

Modified: head/sys/dev/usb/usb_util.c
==============================================================================
--- head/sys/dev/usb/usb_util.c Sat Nov 19 09:16:52 2011        (r227700)
+++ head/sys/dev/usb/usb_util.c Sat Nov 19 10:11:50 2011        (r227701)
@@ -58,31 +58,6 @@
 #include <dev/usb/usb_bus.h>
 
 /*------------------------------------------------------------------------*
- * device_delete_all_children - delete all children of a device
- *------------------------------------------------------------------------*/
-#ifndef device_delete_all_children
-int
-device_delete_all_children(device_t dev)
-{
-       device_t *devlist;
-       int devcount;
-       int error;
-
-       error = device_get_children(dev, &devlist, &devcount);
-       if (error == 0) {
-               while (devcount-- > 0) {
-                       error = device_delete_child(dev, devlist[devcount]);
-                       if (error) {
-                               break;
-                       }
-               }
-               free(devlist, M_TEMP);
-       }
-       return (error);
-}
-#endif
-
-/*------------------------------------------------------------------------*
  *     device_set_usb_desc
  *
  * This function can be called at probe or attach to set the USB

Modified: head/sys/dev/usb/usb_util.h
==============================================================================
--- head/sys/dev/usb/usb_util.h Sat Nov 19 09:16:52 2011        (r227700)
+++ head/sys/dev/usb/usb_util.h Sat Nov 19 10:11:50 2011        (r227701)
@@ -27,7 +27,6 @@
 #ifndef _USB_UTIL_H_
 #define        _USB_UTIL_H_
 
-int    device_delete_all_children(device_t dev);
 uint8_t        usb_make_str_desc(void *ptr, uint16_t max_len, const char *s);
 void   usb_printbcd(char *p, uint16_t p_len, uint16_t bcd);
 void   usb_trim_spaces(char *p);

Modified: head/sys/kern/subr_bus.c
==============================================================================
--- head/sys/kern/subr_bus.c    Sat Nov 19 09:16:52 2011        (r227700)
+++ head/sys/kern/subr_bus.c    Sat Nov 19 10:11:50 2011        (r227701)
@@ -1881,6 +1881,39 @@ device_delete_child(device_t dev, device
 }
 
 /**
+ * @brief Delete all children devices of the given device, if any.
+ *
+ * This function deletes all children devices of the given device, if
+ * any, using the device_delete_child() function for each device it
+ * finds. If a child device cannot be deleted, this function will
+ * return an error code.
+ * 
+ * @param dev          the parent device
+ *
+ * @retval 0           success
+ * @retval non-zero    a device would not detach
+ */
+int
+device_delete_all_children(device_t dev)
+{
+       device_t child;
+       int error;
+
+       PDEBUG(("Deleting all children of %s", DEVICENAME(dev)));
+
+       error = 0;
+
+       while ( (child = TAILQ_FIRST(&dev->children)) ) {
+               error = device_delete_child(dev, child);
+               if (error) {
+                       PDEBUG(("Failed deleting %s", DEVICENAME(child)));
+                       break;
+               }
+       }
+       return (error);
+}
+
+/**
  * @brief Find a device given a unit number
  *
  * This is similar to devclass_get_devices() but only searches for

Modified: head/sys/sys/bus.h
==============================================================================
--- head/sys/sys/bus.h  Sat Nov 19 09:16:52 2011        (r227700)
+++ head/sys/sys/bus.h  Sat Nov 19 10:11:50 2011        (r227701)
@@ -424,6 +424,7 @@ device_t    device_add_child_ordered(device
                                         const char *name, int unit);
 void   device_busy(device_t dev);
 int    device_delete_child(device_t dev, device_t child);
+int    device_delete_all_children(device_t dev);
 int    device_attach(device_t dev);
 int    device_detach(device_t dev);
 void   device_disable(device_t dev);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to