git: 96a550e9dd89 - main - genet: Add a detach routine

From: John Baldwin <jhb_at_FreeBSD.org>
Date: Fri, 01 Aug 2025 20:09:15 UTC
The branch main has been updated by jhb:

URL: https://cgit.FreeBSD.org/src/commit/?id=96a550e9dd892f24a479da00ead93fbfaafb7733

commit 96a550e9dd892f24a479da00ead93fbfaafb7733
Author:     John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2025-08-01 20:07:30 +0000
Commit:     John Baldwin <jhb@FreeBSD.org>
CommitDate: 2025-08-01 20:07:30 +0000

    genet: Add a detach routine
    
    PR:             288309
    Co-authored by: Mike Belanger <mibelanger@qnx.com>
    MFC after:      2 weeks
---
 sys/arm64/broadcom/genet/if_genet.c | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

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);
@@ -379,6 +380,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)
 {
@@ -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),