diff options
| author | John Baldwin <jhb@FreeBSD.org> | 2025-08-01 20:07:30 +0000 |
|---|---|---|
| committer | John Baldwin <jhb@FreeBSD.org> | 2025-08-01 20:07:30 +0000 |
| commit | 96a550e9dd892f24a479da00ead93fbfaafb7733 (patch) | |
| tree | 44f7288db1e56108a2d8642769842f1404d1598b | |
| parent | 79059e0ec9b1d3273ce32fdd028802fcad4b85ab (diff) | |
genet: Add a detach routine
PR: 288309
Co-authored by: Mike Belanger <mibelanger@qnx.com>
MFC after: 2 weeks
| -rw-r--r-- | sys/arm64/broadcom/genet/if_genet.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/sys/arm64/broadcom/genet/if_genet.c b/sys/arm64/broadcom/genet/if_genet.c index 182b5582fb7c..013573f1551b 100644 --- a/sys/arm64/broadcom/genet/if_genet.c +++ b/sys/arm64/broadcom/genet/if_genet.c @@ -201,6 +201,7 @@ struct gen_softc { static void gen_init(void *softc); static void gen_start(if_t ifp); +static void gen_stop(struct gen_softc *sc); static void gen_destroy(struct gen_softc *sc); static int gen_encap(struct gen_softc *sc, struct mbuf **mp); static int gen_parse_tx(struct mbuf *m, int csum_flags); @@ -380,6 +381,39 @@ gen_destroy(struct gen_softc *sc) } static int +gen_detach(device_t dev) +{ + struct gen_softc *sc; + int error; + + sc = device_get_softc(dev); + + GEN_LOCK(sc); + gen_stop(sc); + GEN_UNLOCK(sc); + callout_drain(&sc->stat_ch); + ether_ifdetach(sc->ifp); + + /* Detach the miibus */ + error = bus_generic_detach(dev); + if (error != 0) + return (error); + + /* clean up dma */ + gen_bus_dma_teardown(sc); + + /* Release bus resources. */ + bus_teardown_intr(sc->dev, sc->res[_RES_IRQ1], sc->ih); + bus_teardown_intr(sc->dev, sc->res[_RES_IRQ2], sc->ih2); + bus_release_resources(sc->dev, gen_spec, sc->res); + + if (sc->ifp != NULL) + if_free(sc->ifp); + mtx_destroy(&sc->mtx); + return (0); +} + +static int gen_get_phy_mode(device_t dev) { struct gen_softc *sc; @@ -1805,6 +1839,7 @@ static device_method_t gen_methods[] = { /* Device interface */ DEVMETHOD(device_probe, gen_probe), DEVMETHOD(device_attach, gen_attach), + DEVMETHOD(device_detach, gen_detach), /* MII interface */ DEVMETHOD(miibus_readreg, gen_miibus_readreg), |
