diff options
Diffstat (limited to 'sys/dev/msk/if_msk.c')
-rw-r--r-- | sys/dev/msk/if_msk.c | 52 |
1 files changed, 13 insertions, 39 deletions
diff --git a/sys/dev/msk/if_msk.c b/sys/dev/msk/if_msk.c index bb00ffc7ae34..295eb2584b3e 100644 --- a/sys/dev/msk/if_msk.c +++ b/sys/dev/msk/if_msk.c @@ -252,6 +252,7 @@ static const char *model_name[] = { static int mskc_probe(device_t); static int mskc_attach(device_t); +static void mskc_child_deleted(device_t, device_t); static int mskc_detach(device_t); static int mskc_shutdown(device_t); static int mskc_setup_rambuffer(struct msk_softc *); @@ -335,6 +336,7 @@ static device_method_t mskc_methods[] = { DEVMETHOD(device_resume, mskc_resume), DEVMETHOD(device_shutdown, mskc_shutdown), + DEVMETHOD(bus_child_deleted, mskc_child_deleted), DEVMETHOD(bus_get_dma_tag, mskc_get_dma_tag), DEVMETHOD_END @@ -1564,7 +1566,6 @@ static int msk_probe(device_t dev) { struct msk_softc *sc; - char desc[100]; sc = device_get_softc(device_get_parent(dev)); /* @@ -1573,11 +1574,10 @@ msk_probe(device_t dev) * mskc_attach() will create a second device instance * for us. */ - snprintf(desc, sizeof(desc), + device_set_descf(dev, "Marvell Technology Group Ltd. %s Id 0x%02x Rev 0x%02x", model_name[sc->msk_hw_id - CHIP_ID_YUKON_XL], sc->msk_hw_id, sc->msk_hw_rev); - device_set_desc_copy(dev, desc); return (BUS_PROBE_DEFAULT); } @@ -1625,11 +1625,6 @@ msk_attach(device_t dev) msk_rx_dma_jalloc(sc_if); ifp = sc_if->msk_ifp = if_alloc(IFT_ETHER); - if (ifp == NULL) { - device_printf(sc_if->msk_if_dev, "can not if_alloc()\n"); - error = ENOSPC; - goto fail; - } if_setsoftc(ifp, sc_if); if_initname(ifp, device_get_name(dev), device_get_unit(dev)); if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST); @@ -1943,7 +1938,7 @@ mskc_attach(device_t dev) if ((error = mskc_setup_rambuffer(sc)) != 0) goto fail; - sc->msk_devs[MSK_PORT_A] = device_add_child(dev, "msk", -1); + sc->msk_devs[MSK_PORT_A] = device_add_child(dev, "msk", DEVICE_UNIT_ANY); if (sc->msk_devs[MSK_PORT_A] == NULL) { device_printf(dev, "failed to add child for PORT_A\n"); error = ENXIO; @@ -1960,7 +1955,7 @@ mskc_attach(device_t dev) device_set_ivars(sc->msk_devs[MSK_PORT_A], mmd); if (sc->msk_num_port > 1) { - sc->msk_devs[MSK_PORT_B] = device_add_child(dev, "msk", -1); + sc->msk_devs[MSK_PORT_B] = device_add_child(dev, "msk", DEVICE_UNIT_ANY); if (sc->msk_devs[MSK_PORT_B] == NULL) { device_printf(dev, "failed to add child for PORT_B\n"); error = ENXIO; @@ -1977,11 +1972,7 @@ mskc_attach(device_t dev) device_set_ivars(sc->msk_devs[MSK_PORT_B], mmd); } - error = bus_generic_attach(dev); - if (error) { - device_printf(dev, "failed to attach port(s)\n"); - goto fail; - } + bus_attach_children(dev); /* Hook interrupt last to avoid having to lock softc. */ error = bus_setup_intr(dev, sc->msk_irq[0], INTR_TYPE_NET | @@ -2029,17 +2020,6 @@ msk_detach(device_t dev) MSK_IF_LOCK(sc_if); } - /* - * We're generally called from mskc_detach() which is using - * device_delete_child() to get to here. It's already trashed - * miibus for us, so don't do it here or we'll panic. - * - * if (sc_if->msk_miibus != NULL) { - * device_delete_child(dev, sc_if->msk_miibus); - * sc_if->msk_miibus = NULL; - * } - */ - msk_rx_dma_jfree(sc_if); msk_txrx_dma_free(sc_if); bus_generic_detach(dev); @@ -2053,6 +2033,12 @@ msk_detach(device_t dev) return (0); } +static void +mskc_child_deleted(device_t dev, device_t child) +{ + free(device_get_ivars(child), M_DEVBUF); +} + static int mskc_detach(device_t dev) { @@ -2061,19 +2047,7 @@ mskc_detach(device_t dev) sc = device_get_softc(dev); KASSERT(mtx_initialized(&sc->msk_mtx), ("msk mutex not initialized")); - if (device_is_alive(dev)) { - if (sc->msk_devs[MSK_PORT_A] != NULL) { - free(device_get_ivars(sc->msk_devs[MSK_PORT_A]), - M_DEVBUF); - device_delete_child(dev, sc->msk_devs[MSK_PORT_A]); - } - if (sc->msk_devs[MSK_PORT_B] != NULL) { - free(device_get_ivars(sc->msk_devs[MSK_PORT_B]), - M_DEVBUF); - device_delete_child(dev, sc->msk_devs[MSK_PORT_B]); - } - bus_generic_detach(dev); - } + bus_generic_detach(dev); /* Disable all interrupts. */ CSR_WRITE_4(sc, B0_IMSK, 0); |