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

From: Zhenlei Huang <zlei_at_FreeBSD.org>
Date: Sat, 02 Aug 2025 01:00:07 UTC

> On Aug 2, 2025, at 4:09 AM, John Baldwin <jhb@FreeBSD.org> wrote:
> 
> 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);
~~~~~~

I guess the above logic want be wrapped by condition `device_is_attached(dev)` .

> +
> +	/* 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),