From nobody Thu Apr 14 19:10:25 2022 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 676D51B541FB; Thu, 14 Apr 2022 19:10:25 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4KfTYs2RDfz4dVx; Thu, 14 Apr 2022 19:10:25 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1649963425; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=uY+C/Mvb9DxOknK/U3OXtUCcC0b5i9KnI6KZDyZVfxU=; b=j+ZmlyBvtgsRGAtaJKphFdSwpY+Fpgl6j9pteJVHjqJgMw8uJBdbJB0urxudtS9HrgoES/ QBOt2G/GYXyhpGiHqHCE9QWSwTPywAdjn7lBdci/Hqt7KAR3NfL1K1XhVZVIwmyaOQ7YSz 9uTMguNFH8f9+62k0mthcCwfLMpmXkuw+/yiXxQ5bzdOB6UE0vJLpCoAk9lO3ufu1SK4Nb qbgT6sPte5vuHHySTsjsulh8JJLqSwrWtd/s6c8z9pkeCCj3Zo8ALaQKZtSpxYoBEYBAb4 OVFqs5l23iT4G51wKwyDacH9LaqMcWY5opQRtqynx7YYAtc0lKxbjZh/L211Pw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 2FAEE260CB; Thu, 14 Apr 2022 19:10:25 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 23EJAPZI008825; Thu, 14 Apr 2022 19:10:25 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 23EJAPs0008824; Thu, 14 Apr 2022 19:10:25 GMT (envelope-from git) Date: Thu, 14 Apr 2022 19:10:25 GMT Message-Id: <202204141910.23EJAPs0008824@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Mike Karels Subject: git: 8f45652b6bcc - main - genet: fix problems with interface down/up List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: karels X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 8f45652b6bccc258eb58f8721dea10184f1aaa17 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1649963425; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=uY+C/Mvb9DxOknK/U3OXtUCcC0b5i9KnI6KZDyZVfxU=; b=mrQnUkutVhtGokPCHIdneewQQANDk4zmFW05wdUWrxOH4jJVyyTXbuB7VrJvxFC6oexjDU oTbimvi0jLRAnThoQRHUWI24Vnr7mGN64BQ/Uad+T6HF41noVh9aGIckJSJCZDlA4B4bN5 xmm/uEJ7VHlS4hPdKOsfS+I0n1//TU/bBnfsFrd9I1Bmke1nCNzYE1iBxrW9zB1T+O7cY1 Yq4O9WE1xk1wd6CwauW4D/6jl1xMHY38X5CeadCYoaP5PcKw/RTxjBAyEEF1lE1ZTyoFY7 4aS8mqqFBr6M7raBsnuWlvm24rrQ5n+XOWcnhlwuY9EYuIRA1blCg4E7fw2asg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1649963425; a=rsa-sha256; cv=none; b=mBVe7HAyiIfhrbsWj6XlKqkDl8KhMzHrmZJ0GGuO1HuN2ltsFg8BVBG9tz3yK0weT0i3AK DBcsDopVUtzYZvZXImAagXL1OTED/VrLVEkK+265ShOegDD5M421yk1Q2S8xngDiyKci/7 kLJWVziv24bqHlsq8UBOCQJBcEShIuJ/UvZCmCUZb2OSWwOx4WnBhdbeRUiLLBkaO+3i3R m8f9ntWsWyCoDtIrR8+3xq/KumNzne5edvtc22ZbnrxfB/J6w5gK6NjV4eD3qXaF+ribSX Spese7Pnn9zaGEwOur0oOz0aabSqYdAo5fO5xgQT6n2ib7jrzaTQgvGgBG0XYQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by karels: URL: https://cgit.FreeBSD.org/src/commit/?id=8f45652b6bccc258eb58f8721dea10184f1aaa17 commit 8f45652b6bccc258eb58f8721dea10184f1aaa17 Author: Mike Karels AuthorDate: 2022-04-11 19:44:49 +0000 Commit: Mike Karels CommitDate: 2022-04-14 19:10:13 +0000 genet: fix problems with interface down/up The genet interface did not resume operation correctly after doing ifconfig down then up. The down/reset procedure did not clear the RUNNING flag, and did not reset enough of the hardware state. This patch is modeled on OpenBSD code, with a call to gen_reset added to reset the controller completely. Regularize the parameter to gen_dma_disable() while here. PR: 263091 Submitted by: jiahali@blackberry.com --- sys/arm64/broadcom/genet/if_genet.c | 86 ++++++++++++++++++++++++++++++++----- 1 file changed, 75 insertions(+), 11 deletions(-) diff --git a/sys/arm64/broadcom/genet/if_genet.c b/sys/arm64/broadcom/genet/if_genet.c index 31fab0f9cf09..4532c8d32f90 100644 --- a/sys/arm64/broadcom/genet/if_genet.c +++ b/sys/arm64/broadcom/genet/if_genet.c @@ -216,7 +216,7 @@ static void gen_set_enaddr(struct gen_softc *sc); static void gen_setup_rxfilter(struct gen_softc *sc); static void gen_reset(struct gen_softc *sc); static void gen_enable(struct gen_softc *sc); -static void gen_dma_disable(device_t dev); +static void gen_dma_disable(struct gen_softc *sc); static int gen_bus_dma_init(struct gen_softc *sc); static void gen_bus_dma_teardown(struct gen_softc *sc); static void gen_enable_intr(struct gen_softc *sc); @@ -289,7 +289,7 @@ gen_attach(device_t dev) /* reset core */ gen_reset(sc); - gen_dma_disable(dev); + gen_dma_disable(sc); /* Setup DMA */ error = gen_bus_dma_init(sc); @@ -484,6 +484,12 @@ gen_reset(struct gen_softc *sc) WR4(sc, GENET_UMAC_MIB_CTRL, GENET_UMAC_MIB_RESET_RUNT | GENET_UMAC_MIB_RESET_RX | GENET_UMAC_MIB_RESET_TX); WR4(sc, GENET_UMAC_MIB_CTRL, 0); +} + +static void +gen_enable(struct gen_softc *sc) +{ + u_int val; WR4(sc, GENET_UMAC_MAX_FRAME_LEN, 1536); @@ -492,12 +498,6 @@ gen_reset(struct gen_softc *sc) WR4(sc, GENET_RBUF_CTRL, val); WR4(sc, GENET_RBUF_TBUF_SIZE_CTRL, 1); -} - -static void -gen_enable(struct gen_softc *sc) -{ - u_int val; /* Enable transmitter and receiver */ val = RD4(sc, GENET_UMAC_CMD); @@ -511,6 +511,33 @@ gen_enable(struct gen_softc *sc) GENET_IRQ_TXDMA_DONE | GENET_IRQ_RXDMA_DONE); } +static void +gen_disable_intr(struct gen_softc *sc) +{ + /* Disable interrupts */ + WR4(sc, GENET_INTRL2_CPU_SET_MASK, 0xffffffff); + WR4(sc, GENET_INTRL2_CPU_CLEAR_MASK, 0xffffffff); +} + +static void +gen_disable(struct gen_softc *sc) +{ + uint32_t val; + + /* Stop receiver */ + val = RD4(sc, GENET_UMAC_CMD); + val &= ~GENET_UMAC_CMD_RXEN; + WR4(sc, GENET_UMAC_CMD, val); + + /* Stop transmitter */ + val = RD4(sc, GENET_UMAC_CMD); + val &= ~GENET_UMAC_CMD_TXEN; + WR4(sc, GENET_UMAC_CMD, val); + + /* Disable Interrupt */ + gen_disable_intr(sc); +} + static void gen_enable_offload(struct gen_softc *sc) { @@ -538,9 +565,8 @@ gen_enable_offload(struct gen_softc *sc) } static void -gen_dma_disable(device_t dev) +gen_dma_disable(struct gen_softc *sc) { - struct gen_softc *sc = device_get_softc(dev); int val; val = RD4(sc, GENET_TX_DMA_CTRL); @@ -808,6 +834,44 @@ gen_init_rxrings(struct gen_softc *sc) } +static void +gen_stop(struct gen_softc *sc) +{ + int i; + struct gen_ring_ent *ent; + + GEN_ASSERT_LOCKED(sc); + + callout_stop(&sc->stat_ch); + if_setdrvflagbits(sc->ifp, 0, IFF_DRV_RUNNING); + gen_reset(sc); + gen_disable(sc); + gen_dma_disable(sc); + + /* Clear the tx/rx ring buffer */ + for (i = 0; i < TX_DESC_COUNT; i++) { + ent = &sc->tx_ring_ent[i]; + if (ent->mbuf != NULL) { + bus_dmamap_sync(sc->tx_buf_tag, ent->map, + BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(sc->tx_buf_tag, ent->map); + m_freem(ent->mbuf); + ent->mbuf = NULL; + } + } + + for (i = 0; i < RX_DESC_COUNT; i++) { + ent = &sc->rx_ring_ent[i]; + if (ent->mbuf != NULL) { + bus_dmamap_sync(sc->rx_buf_tag, ent->map, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(sc->rx_buf_tag, ent->map); + m_freem(ent->mbuf); + ent->mbuf = NULL; + } + } +} + static void gen_init_locked(struct gen_softc *sc) { @@ -1498,7 +1562,7 @@ gen_ioctl(if_t ifp, u_long cmd, caddr_t data) gen_init_locked(sc); } else { if (if_getdrvflags(ifp) & IFF_DRV_RUNNING) - gen_reset(sc); + gen_stop(sc); } sc->if_flags = if_getflags(ifp); GEN_UNLOCK(sc);