git: 4885d6f3ec5b - main - if_mvneta: Use clock frequency
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 04 Jan 2022 12:29:33 UTC
The branch main has been updated by wma: URL: https://cgit.FreeBSD.org/src/commit/?id=4885d6f3ec5bdb9c7bf57f7a07575089572ef3ab commit 4885d6f3ec5bdb9c7bf57f7a07575089572ef3ab Author: Hubert Mazur <hum@semihalf.com> AuthorDate: 2021-08-24 10:04:30 +0000 Commit: Wojciech Macek <wma@FreeBSD.org> CommitDate: 2022-01-04 12:26:35 +0000 if_mvneta: Use clock frequency Make neta use frequency obtained from clock, instead of hardcoded one. Use default frequency in case of clock device failure. Remove unnecessary function calls to obtain frequency and use cached one instead. Reviewed by: manu Obtained from: Semihalf Differential revision: https://reviews.freebsd.org/D32336 --- sys/dev/neta/if_mvneta.c | 47 ++++++++++++++++++++++++++++----------------- sys/dev/neta/if_mvnetavar.h | 2 ++ 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/sys/dev/neta/if_mvneta.c b/sys/dev/neta/if_mvneta.c index c94e91b16013..4d54e95e807d 100644 --- a/sys/dev/neta/if_mvneta.c +++ b/sys/dev/neta/if_mvneta.c @@ -65,6 +65,8 @@ __FBSDID("$FreeBSD$"); #include <sys/rman.h> #include <machine/resource.h> +#include <dev/extres/clk/clk.h> + #include <dev/mii/mii.h> #include <dev/mii/miivar.h> @@ -200,9 +202,6 @@ STATIC int mvneta_detach(device_t); STATIC int mvneta_miibus_readreg(device_t, int, int); STATIC int mvneta_miibus_writereg(device_t, int, int, int); -/* Clock */ -STATIC uint32_t mvneta_get_clk(void); - static device_method_t mvneta_methods[] = { /* Device interface */ DEVMETHOD(device_detach, mvneta_detach), @@ -344,16 +343,6 @@ static struct { { mvneta_rxtxth_intr, "MVNETA aggregated interrupt" }, }; -STATIC uint32_t -mvneta_get_clk() -{ -#if defined(__aarch64__) - return (A3700_TCLK_250MHZ); -#else - return (get_tclk()); -#endif -} - static int mvneta_set_mac_address(struct mvneta_softc *sc, uint8_t *addr) { @@ -541,7 +530,9 @@ mvneta_attach(device_t self) #if !defined(__aarch64__) uint32_t reg; #endif - +#if defined(__aarch64__) + clk_t clk; +#endif sc = device_get_softc(self); sc->dev = self; @@ -563,6 +554,27 @@ mvneta_attach(device_t self) MVNETA_WRITE(sc, MVNETA_PRXINIT, 0x00000001); MVNETA_WRITE(sc, MVNETA_PTXINIT, 0x00000001); +#if defined(__aarch64__) + error = clk_get_by_ofw_index(sc->dev, ofw_bus_get_node(sc->dev), 0, + &clk); + if (error != 0) { + device_printf(sc->dev, + "Cannot get clock, using default frequency: %d\n", + A3700_TCLK_250MHZ); + sc->clk_freq = A3700_TCLK_250MHZ; + } else { + error = clk_get_freq(clk, &sc->clk_freq); + if (error != 0) { + device_printf(sc->dev, + "Cannot obtain frequency from parent clock\n"); + bus_release_resources(sc->dev, res_spec, sc->res); + return (error); + } + } +#else + sc->clk_freq = get_tclk(); +#endif + #if !defined(__aarch64__) /* * Disable port snoop for buffers and descriptors @@ -1380,7 +1392,7 @@ mvneta_ring_init_rx_queue(struct mvneta_softc *sc, int q) rx = MVNETA_RX_RING(sc, q); rx->dma = rx->cpu = 0; rx->queue_th_received = MVNETA_RXTH_COUNT; - rx->queue_th_time = (mvneta_get_clk() / 1000) / 10; /* 0.1 [ms] */ + rx->queue_th_time = (sc->clk_freq / 1000) / 10; /* 0.1 [ms] */ /* Initialize LRO */ rx->lro_enabled = FALSE; @@ -3389,7 +3401,7 @@ sysctl_set_queue_rxthtime(SYSCTL_HANDLER_ARGS) mvneta_rx_lockq(sc, arg->queue); rx = MVNETA_RX_RING(sc, arg->queue); time_mvtclk = rx->queue_th_time; - time_us = ((uint64_t)time_mvtclk * 1000ULL * 1000ULL) / mvneta_get_clk(); + time_us = ((uint64_t)time_mvtclk * 1000ULL * 1000ULL) / sc->clk_freq; mvneta_rx_unlockq(sc, arg->queue); mvneta_sc_unlock(sc); @@ -3406,8 +3418,7 @@ sysctl_set_queue_rxthtime(SYSCTL_HANDLER_ARGS) mvneta_sc_unlock(sc); return (EINVAL); } - time_mvtclk = - (uint64_t)mvneta_get_clk() * (uint64_t)time_us / (1000ULL * 1000ULL); + time_mvtclk = sc->clk_freq * (uint64_t)time_us / (1000ULL * 1000ULL); rx->queue_th_time = time_mvtclk; reg = MVNETA_PRXITTH_RITT(rx->queue_th_time); MVNETA_WRITE(sc, MVNETA_PRXITTH(arg->queue), reg); diff --git a/sys/dev/neta/if_mvnetavar.h b/sys/dev/neta/if_mvnetavar.h index 0e6cf7829197..b73ced5d2fe1 100644 --- a/sys/dev/neta/if_mvnetavar.h +++ b/sys/dev/neta/if_mvnetavar.h @@ -258,6 +258,8 @@ struct mvneta_softc { struct mtx mtx; struct resource *res[2]; void *ih_cookie[1]; + + uint64_t clk_freq; struct ifnet *ifp; uint32_t mvneta_if_flags;