summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/arm/allwinner/a10_ehci.c6
-rw-r--r--sys/arm/at91/at91_ohci.c6
-rw-r--r--sys/arm/at91/at91_ohci_fdt.c6
-rw-r--r--sys/arm/cavium/cns11xx/ehci_ebus.c6
-rw-r--r--sys/arm/cavium/cns11xx/ohci_ec.c6
-rw-r--r--sys/arm/samsung/exynos/exynos5_xhci.c6
-rw-r--r--sys/arm/ti/am335x/am335x_musb.c11
-rw-r--r--sys/arm/ti/usb/omap_ehci.c7
-rw-r--r--sys/arm/xilinx/zy7_ehci.c11
-rw-r--r--sys/boot/kshim/bsd_kernel.c11
-rw-r--r--sys/dev/puc/puc.c3
-rw-r--r--sys/dev/usb/controller/at91dci_atmelarm.c6
-rw-r--r--sys/dev/usb/controller/at91dci_fdt.c6
-rw-r--r--sys/dev/usb/controller/atmegadci_atmelarm.c6
-rw-r--r--sys/dev/usb/controller/dwc_otg_fdt.c6
-rw-r--r--sys/dev/usb/controller/ehci_ixp4xx.c6
-rw-r--r--sys/dev/usb/controller/ehci_mv.c6
-rw-r--r--sys/dev/usb/controller/ehci_pci.c6
-rw-r--r--sys/dev/usb/controller/generic_ehci.c6
-rw-r--r--sys/dev/usb/controller/generic_ohci.c7
-rw-r--r--sys/dev/usb/controller/musb_otg_atmelarm.c6
-rw-r--r--sys/dev/usb/controller/ohci_pci.c6
-rw-r--r--sys/dev/usb/controller/ohci_s3c24x0.c6
-rw-r--r--sys/dev/usb/controller/saf1761_otg_boot.c7
-rw-r--r--sys/dev/usb/controller/saf1761_otg_fdt.c6
-rw-r--r--sys/dev/usb/controller/uhci_pci.c6
-rw-r--r--sys/dev/usb/controller/uss820dci_atmelarm.c6
-rw-r--r--sys/dev/usb/controller/xhci_mv.c7
-rw-r--r--sys/dev/usb/controller/xhci_pci.c6
-rw-r--r--sys/dev/usb/usb_device.c4
-rw-r--r--sys/dev/usb/video/udl.c9
-rw-r--r--sys/kern/subr_bus.c8
-rw-r--r--sys/mips/atheros/ar71xx_ehci.c6
-rw-r--r--sys/mips/atheros/ar71xx_ohci.c6
-rw-r--r--sys/mips/cavium/usb/octusb_octeon.c6
-rw-r--r--sys/mips/mediatek/mtk_dotg.c6
-rw-r--r--sys/mips/mediatek/mtk_ehci.c6
-rw-r--r--sys/mips/mediatek/mtk_ohci.c6
-rw-r--r--sys/mips/mediatek/mtk_xhci.c6
-rw-r--r--sys/mips/rmi/xls_ehci.c6
-rw-r--r--sys/mips/rt305x/rt305x_dotg.c6
-rw-r--r--sys/mips/rt305x/rt305x_ehci.c6
-rw-r--r--sys/mips/rt305x/rt305x_ohci.c6
43 files changed, 20 insertions, 257 deletions
diff --git a/sys/arm/allwinner/a10_ehci.c b/sys/arm/allwinner/a10_ehci.c
index accf7f9..f754c9a 100644
--- a/sys/arm/allwinner/a10_ehci.c
+++ b/sys/arm/allwinner/a10_ehci.c
@@ -278,17 +278,11 @@ a10_ehci_detach(device_t self)
struct aw_ehci_softc *aw_sc = device_get_softc(self);
ehci_softc_t *sc = &aw_sc->sc;
const struct aw_ehci_conf *conf;
- device_t bdev;
int err;
uint32_t reg_value = 0;
conf = USB_CONF(self);
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(self, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(self);
diff --git a/sys/arm/at91/at91_ohci.c b/sys/arm/at91/at91_ohci.c
index 3e39f51..4d8e301 100644
--- a/sys/arm/at91/at91_ohci.c
+++ b/sys/arm/at91/at91_ohci.c
@@ -165,14 +165,8 @@ static int
ohci_atmelarm_detach(device_t dev)
{
struct at91_ohci_softc *sc = device_get_softc(dev);
- device_t bdev;
int err;
- if (sc->sc_ohci.sc_bus.bdev) {
- bdev = sc->sc_ohci.sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(dev);
diff --git a/sys/arm/at91/at91_ohci_fdt.c b/sys/arm/at91/at91_ohci_fdt.c
index de3d357..51d9509 100644
--- a/sys/arm/at91/at91_ohci_fdt.c
+++ b/sys/arm/at91/at91_ohci_fdt.c
@@ -171,14 +171,8 @@ static int
ohci_at91_fdt_detach(device_t dev)
{
struct at91_ohci_softc *sc = device_get_softc(dev);
- device_t bdev;
int err;
- if (sc->sc_ohci.sc_bus.bdev) {
- bdev = sc->sc_ohci.sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(dev);
diff --git a/sys/arm/cavium/cns11xx/ehci_ebus.c b/sys/arm/cavium/cns11xx/ehci_ebus.c
index 18f6a14..51c4f2c 100644
--- a/sys/arm/cavium/cns11xx/ehci_ebus.c
+++ b/sys/arm/cavium/cns11xx/ehci_ebus.c
@@ -184,14 +184,8 @@ static int
ehci_ebus_detach(device_t self)
{
ehci_softc_t *sc = device_get_softc(self);
- device_t bdev;
int err;
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(self, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(self);
diff --git a/sys/arm/cavium/cns11xx/ohci_ec.c b/sys/arm/cavium/cns11xx/ohci_ec.c
index 9c49b1e..78183ea 100644
--- a/sys/arm/cavium/cns11xx/ohci_ec.c
+++ b/sys/arm/cavium/cns11xx/ohci_ec.c
@@ -177,14 +177,8 @@ static int
ohci_ec_detach(device_t dev)
{
struct ec_ohci_softc *sc = device_get_softc(dev);
- device_t bdev;
int err;
- if (sc->sc_ohci.sc_bus.bdev) {
- bdev = sc->sc_ohci.sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(dev);
diff --git a/sys/arm/samsung/exynos/exynos5_xhci.c b/sys/arm/samsung/exynos/exynos5_xhci.c
index 2accd4c..dbb8d3c 100644
--- a/sys/arm/samsung/exynos/exynos5_xhci.c
+++ b/sys/arm/samsung/exynos/exynos5_xhci.c
@@ -288,14 +288,8 @@ static int
exynos_xhci_detach(device_t dev)
{
struct exynos_xhci_softc *esc = device_get_softc(dev);
- device_t bdev;
int err;
- if (esc->base.sc_bus.bdev != NULL) {
- bdev = esc->base.sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
/* During module unload there are lots of children leftover */
device_delete_children(dev);
diff --git a/sys/arm/ti/am335x/am335x_musb.c b/sys/arm/ti/am335x/am335x_musb.c
index 4dc96c3..c168493 100644
--- a/sys/arm/ti/am335x/am335x_musb.c
+++ b/sys/arm/ti/am335x/am335x_musb.c
@@ -366,14 +366,10 @@ static int
musbotg_detach(device_t dev)
{
struct musbotg_super_softc *sc = device_get_softc(dev);
- device_t bdev;
int err;
- if (sc->sc_otg.sc_bus.bdev) {
- bdev = sc->sc_otg.sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
+ /* during module unload there are lots of children leftover */
+ device_delete_children(dev);
if (sc->sc_otg.sc_irq_res && sc->sc_otg.sc_intr_hdl) {
/*
@@ -397,9 +393,6 @@ musbotg_detach(device_t dev)
bus_release_resource(dev, SYS_RES_IRQ, sc->sc_irq_rid,
sc->sc_otg.sc_irq_res);
- /* during module unload there are lots of children leftover */
- device_delete_children(dev);
-
return (0);
}
diff --git a/sys/arm/ti/usb/omap_ehci.c b/sys/arm/ti/usb/omap_ehci.c
index 7ce957f..f7e2057 100644
--- a/sys/arm/ti/usb/omap_ehci.c
+++ b/sys/arm/ti/usb/omap_ehci.c
@@ -392,15 +392,8 @@ omap_ehci_detach(device_t dev)
{
struct omap_ehci_softc *isc = device_get_softc(dev);
ehci_softc_t *sc = &isc->base;
- device_t bdev;
int err;
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
-
/* during module unload there are lots of children leftover */
device_delete_children(dev);
diff --git a/sys/arm/xilinx/zy7_ehci.c b/sys/arm/xilinx/zy7_ehci.c
index f03c131..6468faa 100644
--- a/sys/arm/xilinx/zy7_ehci.c
+++ b/sys/arm/xilinx/zy7_ehci.c
@@ -323,20 +323,17 @@ zy7_ehci_detach(device_t dev)
{
ehci_softc_t *sc = device_get_softc(dev);
+ /* during module unload there are lots of children leftover */
+ device_delete_children(dev);
+
sc->sc_flags &= ~EHCI_SCFLG_DONEINIT;
- if (device_is_attached(dev))
- bus_generic_detach(dev);
-
if (sc->sc_irq_res && sc->sc_intr_hdl)
/* call ehci_detach() after ehci_init() called after
* successful bus_setup_intr().
*/
ehci_detach(sc);
- if (sc->sc_bus.bdev) {
- device_detach(sc->sc_bus.bdev);
- device_delete_child(dev, sc->sc_bus.bdev);
- }
+
if (sc->sc_irq_res) {
if (sc->sc_intr_hdl != NULL)
bus_teardown_intr(dev, sc->sc_irq_res,
diff --git a/sys/boot/kshim/bsd_kernel.c b/sys/boot/kshim/bsd_kernel.c
index 36a6d82..c94b755 100644
--- a/sys/boot/kshim/bsd_kernel.c
+++ b/sys/boot/kshim/bsd_kernel.c
@@ -817,8 +817,12 @@ device_delete_child(device_t dev, device_t child)
int error = 0;
device_t grandchild;
- /* remove children first */
+ /* detach parent before deleting children, if any */
+ error = device_detach(child);
+ if (error)
+ goto done;
+ /* remove children second */
while ((grandchild = TAILQ_FIRST(&child->dev_children))) {
error = device_delete_child(child, grandchild);
if (error) {
@@ -827,11 +831,6 @@ device_delete_child(device_t dev, device_t child)
}
}
- error = device_detach(child);
-
- if (error)
- goto done;
-
devclass_delete_device(child->dev_module, child);
if (dev != NULL) {
diff --git a/sys/dev/puc/puc.c b/sys/dev/puc/puc.c
index d3b14fb..3d3c3fa 100644
--- a/sys/dev/puc/puc.c
+++ b/sys/dev/puc/puc.c
@@ -414,8 +414,7 @@ puc_bfe_detach(device_t dev)
port = &sc->sc_port[idx];
if (port->p_dev == NULL)
continue;
- if (device_detach(port->p_dev) == 0) {
- device_delete_child(dev, port->p_dev);
+ if (device_delete_child(dev, port->p_dev) == 0) {
if (port->p_rres != NULL)
rman_release_resource(port->p_rres);
if (port->p_ires != NULL)
diff --git a/sys/dev/usb/controller/at91dci_atmelarm.c b/sys/dev/usb/controller/at91dci_atmelarm.c
index e352cc8..0dc1f9f 100644
--- a/sys/dev/usb/controller/at91dci_atmelarm.c
+++ b/sys/dev/usb/controller/at91dci_atmelarm.c
@@ -243,14 +243,8 @@ static int
at91_udp_detach(device_t dev)
{
struct at91_udp_softc *sc = device_get_softc(dev);
- device_t bdev;
int err;
- if (sc->sc_dci.sc_bus.bdev) {
- bdev = sc->sc_dci.sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(dev);
diff --git a/sys/dev/usb/controller/at91dci_fdt.c b/sys/dev/usb/controller/at91dci_fdt.c
index ba5ce27..431b502 100644
--- a/sys/dev/usb/controller/at91dci_fdt.c
+++ b/sys/dev/usb/controller/at91dci_fdt.c
@@ -249,14 +249,8 @@ static int
at91_udp_detach(device_t dev)
{
struct at91_udp_softc *sc = device_get_softc(dev);
- device_t bdev;
int err;
- if (sc->sc_dci.sc_bus.bdev) {
- bdev = sc->sc_dci.sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(dev);
diff --git a/sys/dev/usb/controller/atmegadci_atmelarm.c b/sys/dev/usb/controller/atmegadci_atmelarm.c
index 7c052e6..d89ba8b 100644
--- a/sys/dev/usb/controller/atmegadci_atmelarm.c
+++ b/sys/dev/usb/controller/atmegadci_atmelarm.c
@@ -155,14 +155,8 @@ static int
atmegadci_detach(device_t dev)
{
struct atmegadci_super_softc *sc = device_get_softc(dev);
- device_t bdev;
int err;
- if (sc->sc_otg.sc_bus.bdev) {
- bdev = sc->sc_otg.sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(dev);
diff --git a/sys/dev/usb/controller/dwc_otg_fdt.c b/sys/dev/usb/controller/dwc_otg_fdt.c
index 20ab0c5..80d3388 100644
--- a/sys/dev/usb/controller/dwc_otg_fdt.c
+++ b/sys/dev/usb/controller/dwc_otg_fdt.c
@@ -163,14 +163,8 @@ static int
dwc_otg_detach(device_t dev)
{
struct dwc_otg_fdt_softc *sc = device_get_softc(dev);
- device_t bdev;
int err;
- if (sc->sc_otg.sc_bus.bdev) {
- bdev = sc->sc_otg.sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(dev);
diff --git a/sys/dev/usb/controller/ehci_ixp4xx.c b/sys/dev/usb/controller/ehci_ixp4xx.c
index 1b2f640..02554ec 100644
--- a/sys/dev/usb/controller/ehci_ixp4xx.c
+++ b/sys/dev/usb/controller/ehci_ixp4xx.c
@@ -221,14 +221,8 @@ ehci_ixp_detach(device_t self)
{
struct ixp_ehci_softc *isc = device_get_softc(self);
ehci_softc_t *sc = &isc->base;
- device_t bdev;
int err;
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(self, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(self);
diff --git a/sys/dev/usb/controller/ehci_mv.c b/sys/dev/usb/controller/ehci_mv.c
index cd7d549..f433b4b 100644
--- a/sys/dev/usb/controller/ehci_mv.c
+++ b/sys/dev/usb/controller/ehci_mv.c
@@ -264,14 +264,8 @@ static int
mv_ehci_detach(device_t self)
{
ehci_softc_t *sc = device_get_softc(self);
- device_t bdev;
int err;
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(self, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(self);
diff --git a/sys/dev/usb/controller/ehci_pci.c b/sys/dev/usb/controller/ehci_pci.c
index cad351c..c69d28c 100644
--- a/sys/dev/usb/controller/ehci_pci.c
+++ b/sys/dev/usb/controller/ehci_pci.c
@@ -477,13 +477,7 @@ static int
ehci_pci_detach(device_t self)
{
ehci_softc_t *sc = device_get_softc(self);
- device_t bdev;
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(self, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(self);
diff --git a/sys/dev/usb/controller/generic_ehci.c b/sys/dev/usb/controller/generic_ehci.c
index fcae7dd..5335652 100644
--- a/sys/dev/usb/controller/generic_ehci.c
+++ b/sys/dev/usb/controller/generic_ehci.c
@@ -156,14 +156,8 @@ static int
generic_ehci_detach(device_t self)
{
ehci_softc_t *sc = device_get_softc(self);
- device_t bdev;
int err;
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(self, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(self);
diff --git a/sys/dev/usb/controller/generic_ohci.c b/sys/dev/usb/controller/generic_ohci.c
index beafd06..44d2419 100644
--- a/sys/dev/usb/controller/generic_ohci.c
+++ b/sys/dev/usb/controller/generic_ohci.c
@@ -214,18 +214,11 @@ static int
generic_ohci_detach(device_t dev)
{
struct generic_ohci_softc *sc = device_get_softc(dev);
- device_t bdev;
int err;
#ifdef EXT_RESOURCES
struct clk_list *clk, *clk_tmp;
#endif
- if (sc->ohci_sc.sc_bus.bdev) {
- bdev = sc->ohci_sc.sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
-
/* during module unload there are lots of children leftover */
device_delete_children(dev);
diff --git a/sys/dev/usb/controller/musb_otg_atmelarm.c b/sys/dev/usb/controller/musb_otg_atmelarm.c
index 3f1b9f8..b752e63 100644
--- a/sys/dev/usb/controller/musb_otg_atmelarm.c
+++ b/sys/dev/usb/controller/musb_otg_atmelarm.c
@@ -204,14 +204,8 @@ static int
musbotg_detach(device_t dev)
{
struct musbotg_super_softc *sc = device_get_softc(dev);
- device_t bdev;
int err;
- if (sc->sc_otg.sc_bus.bdev) {
- bdev = sc->sc_otg.sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(dev);
diff --git a/sys/dev/usb/controller/ohci_pci.c b/sys/dev/usb/controller/ohci_pci.c
index 96950a7..31a1f57 100644
--- a/sys/dev/usb/controller/ohci_pci.c
+++ b/sys/dev/usb/controller/ohci_pci.c
@@ -335,13 +335,7 @@ static int
ohci_pci_detach(device_t self)
{
ohci_softc_t *sc = device_get_softc(self);
- device_t bdev;
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(self, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(self);
diff --git a/sys/dev/usb/controller/ohci_s3c24x0.c b/sys/dev/usb/controller/ohci_s3c24x0.c
index 28c195a..2e06827 100644
--- a/sys/dev/usb/controller/ohci_s3c24x0.c
+++ b/sys/dev/usb/controller/ohci_s3c24x0.c
@@ -148,14 +148,8 @@ static int
ohci_s3c24x0_detach(device_t dev)
{
struct ohci_softc *sc = device_get_softc(dev);
- device_t bdev;
int err;
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(dev);
diff --git a/sys/dev/usb/controller/saf1761_otg_boot.c b/sys/dev/usb/controller/saf1761_otg_boot.c
index a2acf06..cc9e9a1 100644
--- a/sys/dev/usb/controller/saf1761_otg_boot.c
+++ b/sys/dev/usb/controller/saf1761_otg_boot.c
@@ -124,13 +124,6 @@ static int
saf1761_otg_fdt_detach(device_t dev)
{
struct saf1761_otg_softc *sc = device_get_softc(dev);
- device_t bdev;
-
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(dev);
diff --git a/sys/dev/usb/controller/saf1761_otg_fdt.c b/sys/dev/usb/controller/saf1761_otg_fdt.c
index 19c64e7..0d7f293 100644
--- a/sys/dev/usb/controller/saf1761_otg_fdt.c
+++ b/sys/dev/usb/controller/saf1761_otg_fdt.c
@@ -238,14 +238,8 @@ static int
saf1761_otg_fdt_detach(device_t dev)
{
struct saf1761_otg_softc *sc = device_get_softc(dev);
- device_t bdev;
int err;
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(dev);
diff --git a/sys/dev/usb/controller/uhci_pci.c b/sys/dev/usb/controller/uhci_pci.c
index 5916996..2f8b464 100644
--- a/sys/dev/usb/controller/uhci_pci.c
+++ b/sys/dev/usb/controller/uhci_pci.c
@@ -393,13 +393,7 @@ int
uhci_pci_detach(device_t self)
{
uhci_softc_t *sc = device_get_softc(self);
- device_t bdev;
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(self, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(self);
diff --git a/sys/dev/usb/controller/uss820dci_atmelarm.c b/sys/dev/usb/controller/uss820dci_atmelarm.c
index dcd4db4..2684d38 100644
--- a/sys/dev/usb/controller/uss820dci_atmelarm.c
+++ b/sys/dev/usb/controller/uss820dci_atmelarm.c
@@ -164,14 +164,8 @@ static int
uss820_atmelarm_detach(device_t dev)
{
struct uss820dci_softc *sc = device_get_softc(dev);
- device_t bdev;
int err;
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(dev);
diff --git a/sys/dev/usb/controller/xhci_mv.c b/sys/dev/usb/controller/xhci_mv.c
index 06b35ce..9be09bb 100644
--- a/sys/dev/usb/controller/xhci_mv.c
+++ b/sys/dev/usb/controller/xhci_mv.c
@@ -171,15 +171,8 @@ static int
xhci_detach(device_t dev)
{
struct xhci_softc *sc = device_get_softc(dev);
- device_t bdev;
int err;
- if (sc->sc_bus.bdev != NULL) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
-
/* during module unload there are lots of children leftover */
device_delete_children(dev);
diff --git a/sys/dev/usb/controller/xhci_pci.c b/sys/dev/usb/controller/xhci_pci.c
index 09fab21..35d1ea4 100644
--- a/sys/dev/usb/controller/xhci_pci.c
+++ b/sys/dev/usb/controller/xhci_pci.c
@@ -340,13 +340,7 @@ static int
xhci_pci_detach(device_t self)
{
struct xhci_softc *sc = device_get_softc(self);
- device_t bdev;
- if (sc->sc_bus.bdev != NULL) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(self, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(self);
diff --git a/sys/dev/usb/usb_device.c b/sys/dev/usb/usb_device.c
index dc0e437..41675ed 100644
--- a/sys/dev/usb/usb_device.c
+++ b/sys/dev/usb/usb_device.c
@@ -1103,10 +1103,8 @@ usb_detach_device_sub(struct usb_device *udev, device_t *ppdev,
device_printf(dev, "Resume failed\n");
}
}
- if (device_detach(dev)) {
- goto error;
- }
}
+ /* detach and delete child */
if (device_delete_child(udev->parent_dev, dev)) {
goto error;
}
diff --git a/sys/dev/usb/video/udl.c b/sys/dev/usb/video/udl.c
index 1096ed3..a15d41b 100644
--- a/sys/dev/usb/video/udl.c
+++ b/sys/dev/usb/video/udl.c
@@ -443,14 +443,9 @@ udl_detach(device_t dev)
{
struct udl_softc *sc = device_get_softc(dev);
- if (sc->sc_fbdev != NULL) {
- device_t bdev;
+ /* delete all child devices */
+ device_delete_children(dev);
- bdev = sc->sc_fbdev;
- sc->sc_fbdev = NULL;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
UDL_LOCK(sc);
sc->sc_gone = 1;
callout_stop(&sc->sc_callout);
diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c
index 9afc0c8..66567ca 100644
--- a/sys/kern/subr_bus.c
+++ b/sys/kern/subr_bus.c
@@ -1949,15 +1949,17 @@ device_delete_child(device_t dev, device_t child)
PDEBUG(("%s from %s", DEVICENAME(child), DEVICENAME(dev)));
- /* remove children first */
+ /* detach parent before deleting children, if any */
+ if ((error = device_detach(child)) != 0)
+ return (error);
+
+ /* remove children second */
while ((grandchild = TAILQ_FIRST(&child->children)) != NULL) {
error = device_delete_child(child, grandchild);
if (error)
return (error);
}
- if ((error = device_detach(child)) != 0)
- return (error);
if (child->devclass)
devclass_delete_device(child->devclass, child);
if (child->parent)
diff --git a/sys/mips/atheros/ar71xx_ehci.c b/sys/mips/atheros/ar71xx_ehci.c
index 07e06b9..19e9a0e 100644
--- a/sys/mips/atheros/ar71xx_ehci.c
+++ b/sys/mips/atheros/ar71xx_ehci.c
@@ -231,14 +231,8 @@ ar71xx_ehci_detach(device_t self)
{
struct ar71xx_ehci_softc *isc = device_get_softc(self);
ehci_softc_t *sc = &isc->base;
- device_t bdev;
int err;
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(self, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(self);
diff --git a/sys/mips/atheros/ar71xx_ohci.c b/sys/mips/atheros/ar71xx_ohci.c
index 30f2c7d..aac32ec 100644
--- a/sys/mips/atheros/ar71xx_ohci.c
+++ b/sys/mips/atheros/ar71xx_ohci.c
@@ -156,13 +156,7 @@ static int
ar71xx_ohci_detach(device_t dev)
{
struct ar71xx_ohci_softc *sc = device_get_softc(dev);
- device_t bdev;
- if (sc->sc_ohci.sc_bus.bdev) {
- bdev = sc->sc_ohci.sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(dev);
diff --git a/sys/mips/cavium/usb/octusb_octeon.c b/sys/mips/cavium/usb/octusb_octeon.c
index a49a363..5852e14 100644
--- a/sys/mips/cavium/usb/octusb_octeon.c
+++ b/sys/mips/cavium/usb/octusb_octeon.c
@@ -160,16 +160,10 @@ static int
octusb_octeon_detach(device_t dev)
{
struct octusb_octeon_softc *sc = device_get_softc(dev);
- device_t bdev;
int err;
int nports;
int i;
- if (sc->sc_dci.sc_bus.bdev) {
- bdev = sc->sc_dci.sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(dev);
diff --git a/sys/mips/mediatek/mtk_dotg.c b/sys/mips/mediatek/mtk_dotg.c
index d7421ad..e685eac 100644
--- a/sys/mips/mediatek/mtk_dotg.c
+++ b/sys/mips/mediatek/mtk_dotg.c
@@ -161,14 +161,8 @@ static int
dotg_fdt_detach(device_t dev)
{
struct dwc_otg_softc *sc = device_get_softc(dev);
- device_t bdev;
int err;
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(dev);
diff --git a/sys/mips/mediatek/mtk_ehci.c b/sys/mips/mediatek/mtk_ehci.c
index acc30eb..ed1d2fc 100644
--- a/sys/mips/mediatek/mtk_ehci.c
+++ b/sys/mips/mediatek/mtk_ehci.c
@@ -162,14 +162,8 @@ static int
ehci_fdt_detach(device_t self)
{
ehci_softc_t *sc = device_get_softc(self);
- device_t bdev;
int err;
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(self, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(self);
diff --git a/sys/mips/mediatek/mtk_ohci.c b/sys/mips/mediatek/mtk_ohci.c
index 0b554e7..ad5c68f 100644
--- a/sys/mips/mediatek/mtk_ohci.c
+++ b/sys/mips/mediatek/mtk_ohci.c
@@ -162,14 +162,8 @@ static int
ohci_fdt_detach(device_t self)
{
ohci_softc_t *sc = device_get_softc(self);
- device_t bdev;
int err;
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(self, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(self);
diff --git a/sys/mips/mediatek/mtk_xhci.c b/sys/mips/mediatek/mtk_xhci.c
index 138a4d4..55f39d5 100644
--- a/sys/mips/mediatek/mtk_xhci.c
+++ b/sys/mips/mediatek/mtk_xhci.c
@@ -161,14 +161,8 @@ static int
mtk_xhci_fdt_detach(device_t self)
{
struct xhci_softc *sc = device_get_softc(self);
- device_t bdev;
int err;
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(self, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(self);
diff --git a/sys/mips/rmi/xls_ehci.c b/sys/mips/rmi/xls_ehci.c
index 81758b2..4451d13 100644
--- a/sys/mips/rmi/xls_ehci.c
+++ b/sys/mips/rmi/xls_ehci.c
@@ -164,14 +164,8 @@ static int
ehci_xls_detach(device_t self)
{
ehci_softc_t *sc = device_get_softc(self);
- device_t bdev;
int err;
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(self, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(self);
diff --git a/sys/mips/rt305x/rt305x_dotg.c b/sys/mips/rt305x/rt305x_dotg.c
index 607b215..b39046f 100644
--- a/sys/mips/rt305x/rt305x_dotg.c
+++ b/sys/mips/rt305x/rt305x_dotg.c
@@ -173,14 +173,8 @@ static int
dotg_obio_detach(device_t dev)
{
struct dwc_otg_softc *sc = device_get_softc(dev);
- device_t bdev;
int err;
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(dev, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(dev);
diff --git a/sys/mips/rt305x/rt305x_ehci.c b/sys/mips/rt305x/rt305x_ehci.c
index 9b2fa22..0930aff 100644
--- a/sys/mips/rt305x/rt305x_ehci.c
+++ b/sys/mips/rt305x/rt305x_ehci.c
@@ -175,14 +175,8 @@ static int
ehci_obio_detach(device_t self)
{
ehci_softc_t *sc = device_get_softc(self);
- device_t bdev;
int err;
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(self, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(self);
diff --git a/sys/mips/rt305x/rt305x_ohci.c b/sys/mips/rt305x/rt305x_ohci.c
index e726e60..b700603 100644
--- a/sys/mips/rt305x/rt305x_ohci.c
+++ b/sys/mips/rt305x/rt305x_ohci.c
@@ -175,14 +175,8 @@ static int
ohci_obio_detach(device_t self)
{
ohci_softc_t *sc = device_get_softc(self);
- device_t bdev;
int err;
- if (sc->sc_bus.bdev) {
- bdev = sc->sc_bus.bdev;
- device_detach(bdev);
- device_delete_child(self, bdev);
- }
/* during module unload there are lots of children leftover */
device_delete_children(self);
OpenPOWER on IntegriCloud