git: aa48c1ae0831 - main - etherswitch: Cleanup detach and delete of child devices during detach
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 02 Jan 2025 18:28:31 UTC
The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=aa48c1ae0831789c6aa34bf3a85b9a2289d425e2 commit aa48c1ae0831789c6aa34bf3a85b9a2289d425e2 Author: John Baldwin <jhb@FreeBSD.org> AuthorDate: 2025-01-02 18:24:46 +0000 Commit: John Baldwin <jhb@FreeBSD.org> CommitDate: 2025-01-02 18:24:46 +0000 etherswitch: Cleanup detach and delete of child devices during detach Call bus_generic_detach first and return any error. Remove no longer needed individual device_delete_child calls. Differential Revision: https://reviews.freebsd.org/D47970 --- sys/dev/etherswitch/ar40xx/ar40xx_main.c | 9 +++++---- sys/dev/etherswitch/arswitch/arswitch.c | 9 +++++---- sys/dev/etherswitch/e6000sw/e6060sw.c | 9 +++++---- sys/dev/etherswitch/infineon/adm6996fc.c | 9 +++++---- sys/dev/etherswitch/ip17x/ip17x.c | 9 +++++---- sys/dev/etherswitch/micrel/ksz8995ma.c | 9 +++++---- sys/dev/etherswitch/mtkswitch/mtkswitch.c | 9 +++++---- sys/dev/etherswitch/rtl8366/rtl8366rb.c | 9 +++++---- sys/dev/etherswitch/ukswitch/ukswitch.c | 9 +++++---- 9 files changed, 45 insertions(+), 36 deletions(-) diff --git a/sys/dev/etherswitch/ar40xx/ar40xx_main.c b/sys/dev/etherswitch/ar40xx/ar40xx_main.c index 41e6813bc840..d5636d26120b 100644 --- a/sys/dev/etherswitch/ar40xx/ar40xx_main.c +++ b/sys/dev/etherswitch/ar40xx/ar40xx_main.c @@ -254,22 +254,23 @@ static int ar40xx_detach(device_t dev) { struct ar40xx_softc *sc = device_get_softc(dev); - int i; + int error, i; device_printf(sc->sc_dev, "%s: called\n", __func__); + error = bus_generic_detach(dev); + if (error != 0) + return (error); + callout_drain(&sc->sc_phy_callout); /* Free PHYs */ for (i = 0; i < AR40XX_NUM_PHYS; i++) { - if (sc->sc_phys.miibus[i] != NULL) - device_delete_child(dev, sc->sc_phys.miibus[i]); if (sc->sc_phys.ifp[i] != NULL) if_free(sc->sc_phys.ifp[i]); free(sc->sc_phys.ifname[i], M_DEVBUF); } - bus_generic_detach(dev); mtx_destroy(&sc->sc_mtx); return (0); diff --git a/sys/dev/etherswitch/arswitch/arswitch.c b/sys/dev/etherswitch/arswitch/arswitch.c index 92c3460e5f78..924793a0488f 100644 --- a/sys/dev/etherswitch/arswitch/arswitch.c +++ b/sys/dev/etherswitch/arswitch/arswitch.c @@ -666,13 +666,15 @@ static int arswitch_detach(device_t dev) { struct arswitch_softc *sc = device_get_softc(dev); - int i; + int error, i; callout_drain(&sc->callout_tick); + error = bus_generic_detach(dev); + if (error != 0) + return (error); + for (i=0; i < sc->numphys; i++) { - if (sc->miibus[i] != NULL) - device_delete_child(dev, sc->miibus[i]); if (sc->ifp[i] != NULL) if_free(sc->ifp[i]); free(sc->ifname[i], M_DEVBUF); @@ -680,7 +682,6 @@ arswitch_detach(device_t dev) free(sc->atu.entries, M_DEVBUF); - bus_generic_detach(dev); mtx_destroy(&sc->sc_mtx); return (0); diff --git a/sys/dev/etherswitch/e6000sw/e6060sw.c b/sys/dev/etherswitch/e6000sw/e6060sw.c index 374eb8c5316b..901f887ffdc6 100644 --- a/sys/dev/etherswitch/e6000sw/e6060sw.c +++ b/sys/dev/etherswitch/e6000sw/e6060sw.c @@ -321,18 +321,20 @@ static int e6060sw_detach(device_t dev) { struct e6060sw_softc *sc; - int i, port; + int error, i, port; sc = device_get_softc(dev); + error = bus_generic_detach(dev); + if (error != 0) + return (error); + callout_drain(&sc->callout_tick); for (i = 0; i < MII_NPHY; i++) { if (((1 << i) & sc->phymask) == 0) continue; port = e6060sw_portforphy(sc, i); - if (sc->miibus[port] != NULL) - device_delete_child(dev, (*sc->miibus[port])); if (sc->ifp[port] != NULL) if_free(sc->ifp[port]); free(sc->ifname[port], M_E6060SW); @@ -344,7 +346,6 @@ e6060sw_detach(device_t dev) free(sc->ifname, M_E6060SW); free(sc->ifp, M_E6060SW); - bus_generic_detach(dev); mtx_destroy(&sc->sc_mtx); return (0); diff --git a/sys/dev/etherswitch/infineon/adm6996fc.c b/sys/dev/etherswitch/infineon/adm6996fc.c index 2a8ee58107ee..58a3f9625d4a 100644 --- a/sys/dev/etherswitch/infineon/adm6996fc.c +++ b/sys/dev/etherswitch/infineon/adm6996fc.c @@ -281,18 +281,20 @@ static int adm6996fc_detach(device_t dev) { struct adm6996fc_softc *sc; - int i, port; + int error, i, port; sc = device_get_softc(dev); + error = bus_generic_detach(dev); + if (error != 0) + return (error); + callout_drain(&sc->callout_tick); for (i = 0; i < MII_NPHY; i++) { if (((1 << i) & sc->phymask) == 0) continue; port = adm6996fc_portforphy(sc, i); - if (sc->miibus[port] != NULL) - device_delete_child(dev, (*sc->miibus[port])); if (sc->ifp[port] != NULL) if_free(sc->ifp[port]); free(sc->ifname[port], M_ADM6996FC); @@ -304,7 +306,6 @@ adm6996fc_detach(device_t dev) free(sc->ifname, M_ADM6996FC); free(sc->ifp, M_ADM6996FC); - bus_generic_detach(dev); mtx_destroy(&sc->sc_mtx); return (0); diff --git a/sys/dev/etherswitch/ip17x/ip17x.c b/sys/dev/etherswitch/ip17x/ip17x.c index 1eee45148040..c90d46c49857 100644 --- a/sys/dev/etherswitch/ip17x/ip17x.c +++ b/sys/dev/etherswitch/ip17x/ip17x.c @@ -274,7 +274,11 @@ static int ip17x_detach(device_t dev) { struct ip17x_softc *sc; - int i, port; + int error, i, port; + + error = bus_generic_detach(dev); + if (error != 0) + return (error); sc = device_get_softc(dev); if (sc->miipoll) @@ -284,8 +288,6 @@ ip17x_detach(device_t dev) if (((1 << i) & sc->phymask) == 0) continue; port = sc->phyport[i]; - if (sc->miibus[port] != NULL) - device_delete_child(dev, (*sc->miibus[port])); if (sc->ifp[port] != NULL) if_free(sc->ifp[port]); free(sc->miibus[port], M_IP17X); @@ -299,7 +301,6 @@ ip17x_detach(device_t dev) /* Reset the switch. */ sc->hal.ip17x_reset(sc); - bus_generic_detach(dev); mtx_destroy(&sc->sc_mtx); return (0); diff --git a/sys/dev/etherswitch/micrel/ksz8995ma.c b/sys/dev/etherswitch/micrel/ksz8995ma.c index a51bdb50fdfc..c2ac994fe882 100644 --- a/sys/dev/etherswitch/micrel/ksz8995ma.c +++ b/sys/dev/etherswitch/micrel/ksz8995ma.c @@ -339,7 +339,11 @@ static int ksz8995ma_detach(device_t dev) { struct ksz8995ma_softc *sc; - int i, port; + int error, i, port; + + error = bus_generic_detach(dev); + if (error != 0) + return (error); sc = device_get_softc(dev); @@ -349,8 +353,6 @@ ksz8995ma_detach(device_t dev) if (((1 << i) & sc->phymask) == 0) continue; port = ksz8995ma_portforphy(sc, i); - if (sc->miibus[port] != NULL) - device_delete_child(dev, (*sc->miibus[port])); if (sc->ifp[port] != NULL) if_free(sc->ifp[port]); free(sc->ifname[port], M_KSZ8995MA); @@ -362,7 +364,6 @@ ksz8995ma_detach(device_t dev) free(sc->ifname, M_KSZ8995MA); free(sc->ifp, M_KSZ8995MA); - bus_generic_detach(dev); mtx_destroy(&sc->sc_mtx); return (0); diff --git a/sys/dev/etherswitch/mtkswitch/mtkswitch.c b/sys/dev/etherswitch/mtkswitch/mtkswitch.c index 7c4e8ae6f934..89e092d02ac4 100644 --- a/sys/dev/etherswitch/mtkswitch/mtkswitch.c +++ b/sys/dev/etherswitch/mtkswitch/mtkswitch.c @@ -248,19 +248,20 @@ static int mtkswitch_detach(device_t dev) { struct mtkswitch_softc *sc = device_get_softc(dev); - int phy; + int error, phy; + + error = bus_generic_detach(dev); + if (error != 0) + return (error); callout_drain(&sc->callout_tick); for (phy = 0; phy < MTKSWITCH_MAX_PHYS; phy++) { - if (sc->miibus[phy] != NULL) - device_delete_child(dev, sc->miibus[phy]); if (sc->ifp[phy] != NULL) if_free(sc->ifp[phy]); free(sc->ifname[phy], M_DEVBUF); } - bus_generic_detach(dev); mtx_destroy(&sc->sc_mtx); return (0); diff --git a/sys/dev/etherswitch/rtl8366/rtl8366rb.c b/sys/dev/etherswitch/rtl8366/rtl8366rb.c index 304e7f7b8325..079244b2f745 100644 --- a/sys/dev/etherswitch/rtl8366/rtl8366rb.c +++ b/sys/dev/etherswitch/rtl8366/rtl8366rb.c @@ -268,18 +268,19 @@ static int rtl8366rb_detach(device_t dev) { struct rtl8366rb_softc *sc; - int i; + int error, i; + + error = bus_generic_detach(dev); + if (error != 0) + return (error); sc = device_get_softc(dev); for (i=0; i < sc->numphys; i++) { - if (sc->miibus[i]) - device_delete_child(dev, sc->miibus[i]); if (sc->ifp[i] != NULL) if_free(sc->ifp[i]); free(sc->ifname[i], M_DEVBUF); } - bus_generic_detach(dev); callout_drain(&sc->callout_tick); mtx_destroy(&sc->callout_mtx); mtx_destroy(&sc->sc_mtx); diff --git a/sys/dev/etherswitch/ukswitch/ukswitch.c b/sys/dev/etherswitch/ukswitch/ukswitch.c index ed1a27a19494..a2e30c3af8a1 100644 --- a/sys/dev/etherswitch/ukswitch/ukswitch.c +++ b/sys/dev/etherswitch/ukswitch/ukswitch.c @@ -224,7 +224,11 @@ static int ukswitch_detach(device_t dev) { struct ukswitch_softc *sc = device_get_softc(dev); - int i, port; + int error, i, port; + + error = bus_generic_detach(dev); + if (error != 0) + return (error); callout_drain(&sc->callout_tick); @@ -232,8 +236,6 @@ ukswitch_detach(device_t dev) if (((1 << i) & sc->phymask) == 0) continue; port = ukswitch_portforphy(sc, i); - if (sc->miibus[port] != NULL) - device_delete_child(dev, (*sc->miibus[port])); if (sc->ifp[port] != NULL) if_free(sc->ifp[port]); free(sc->ifname[port], M_UKSWITCH); @@ -245,7 +247,6 @@ ukswitch_detach(device_t dev) free(sc->ifname, M_UKSWITCH); free(sc->ifp, M_UKSWITCH); - bus_generic_detach(dev); mtx_destroy(&sc->sc_mtx); return (0);