From nobody Sat Feb 4 01:23:20 2023 X-Original-To: dev-commits-src-main@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 4P7vt03mP3z3kTpf; Sat, 4 Feb 2023 01:23:20 +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 4P7vt03XNvz3wXr; Sat, 4 Feb 2023 01:23:20 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1675473800; 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=nJrGN2V3p86yBJ+xO15X7M/jIpOo9SAN5KgRkgjgTOo=; b=nfXqSPH10tth4l744CfqnDcsRoGx1iXSoNn3YKftagUtZFmND/fDty5r+GQiBNrDIvrXPy cT/OlWEnOeRQ8ZY7ssDWVxk3g1s9TPgnTJRsjMB8Yuu2HYitRiTMLpC+2SnZovV2g7o7Hm nNquA14EBobU0Y/8fy624qfOJiuovaBrj63Mm4yKaKv6NCmAeGRo/zKLQELL3sMA3rbH30 tIpoPyXfUi4wKEiMvMETpTzD/wZffz9+c/tIerT9t2OB5rHAbqtByt2vcvPKyJhK9Mh6SF GptDsq3manetuH0937SKpT78OCxYZzL558dU8gvZbKYrLW61K1NvA9KkX5mLGQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1675473800; 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=nJrGN2V3p86yBJ+xO15X7M/jIpOo9SAN5KgRkgjgTOo=; b=TkvOb0Ymr+IsvOsHGoX7cFEX1raHejmSnOYJO9uno+zA0SMD0nKHQpoA2aloW3Rx5+QpCi 2B9593ltteIpR/4Q8ADcZzXDpZIOx6RXyTtr1Bdsi7phQeY7cII1c0DseEeFvj7wMibIqk 2yX/zw6wG5hbY3g760fhSvifDq4ZtXNMRsXaHl5xwr38bdEowbU/rFCiPIgKJYCqbJibvN a/yG8G7moh1DTE3fK0VVfgK1gAeFo5PckoYjxZDj+d2qfkOyqu9AI55a5VZlfUyr3Ii5D8 OSGrz+AO+roUNlV3ZQDClJfA9/j5cKEy0GKjDX4Ge6gL4filY+uJfItvwFWQkA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1675473800; a=rsa-sha256; cv=none; b=g3r5bNgKDHO/MbJ6pzlL/1UFFYA8QAUTxYGb6T+JKagINZ1cp58z/Vc7EKXTEr4ffXuzzp 5yUQgQq+I3zIvT/IE5PkA54OEmIK3cHPMX4g1ixTieW2ZVubwOdDXOMTXpZYLscwETgKjG vTzO9JyD0nPN9Ncm1XL4/tS3DU0M4mJLiWB3A5gw5LfoVMd0Hwnzo5AFBGaPGWTLzMExfq a/SvU03u+TxrRL+QfeYcdDk7A+91HHMoyD6VxWoSAwh89OMYsWot+q8SmO5z/IyjEBsqlp tRWsCyM3a408dX8y8U+PRYGFAoH8giakiOVr6uyo+NOlQkyD4uVD2oEXaOZ1QQ== 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 4P7vt02ZSczwZG; Sat, 4 Feb 2023 01:23:20 +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 3141NKPD039103; Sat, 4 Feb 2023 01:23:20 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 3141NKPm039102; Sat, 4 Feb 2023 01:23:20 GMT (envelope-from git) Date: Sat, 4 Feb 2023 01:23:20 GMT Message-Id: <202302040123.3141NKPm039102@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Justin Hibbits Subject: git: 81471049650f - main - Remove rt ethernet driver. List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhibbits X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 81471049650fbbeb0316116b34a256053987ef96 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by jhibbits: URL: https://cgit.FreeBSD.org/src/commit/?id=81471049650fbbeb0316116b34a256053987ef96 commit 81471049650fbbeb0316116b34a256053987ef96 Author: Justin Hibbits AuthorDate: 2023-02-04 01:21:20 +0000 Commit: Justin Hibbits CommitDate: 2023-02-04 01:22:13 +0000 Remove rt ethernet driver. dev/rt is used only in some MIPS SoCs, and MIPS is gone. --- sys/dev/rt/if_rt.c | 2949 ------------------------------------------------- sys/dev/rt/if_rtreg.h | 352 ------ sys/dev/rt/if_rtvar.h | 318 ------ 3 files changed, 3619 deletions(-) diff --git a/sys/dev/rt/if_rt.c b/sys/dev/rt/if_rt.c deleted file mode 100644 index 22f24a9affda..000000000000 --- a/sys/dev/rt/if_rt.c +++ /dev/null @@ -1,2949 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-2-Clause-FreeBSD - * - * Copyright (c) 2015-2016, Stanislav Galabov - * Copyright (c) 2014, Aleksandr A. Mityaev - * Copyright (c) 2011, Aleksandr Rybalko - * based on hard work - * by Alexander Egorenkov - * and by Damien Bergamini - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice unmodified, this list of conditions, and the following - * disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include "if_rtvar.h" -#include "if_rtreg.h" - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "opt_platform.h" -#include "opt_rt305x.h" - -#ifdef FDT -#include -#include -#include -#endif - -#include -#include - -#ifdef RT_MDIO -#include -#include -#include "mdio_if.h" -#endif - -#if 0 -#include -#include -#endif - -#ifdef IF_RT_PHY_SUPPORT -#include "miibus_if.h" -#endif - -/* - * Defines and macros - */ -#define RT_MAX_AGG_SIZE 3840 - -#define RT_TX_DATA_SEG0_SIZE MJUMPAGESIZE - -#define RT_MS(_v, _f) (((_v) & _f) >> _f##_S) -#define RT_SM(_v, _f) (((_v) << _f##_S) & _f) - -#define RT_TX_WATCHDOG_TIMEOUT 5 - -#define RT_CHIPID_RT2880 0x2880 -#define RT_CHIPID_RT3050 0x3050 -#define RT_CHIPID_RT3883 0x3883 -#define RT_CHIPID_RT5350 0x5350 -#define RT_CHIPID_MT7620 0x7620 -#define RT_CHIPID_MT7621 0x7621 - -#ifdef FDT -/* more specific and new models should go first */ -static const struct ofw_compat_data rt_compat_data[] = { - { "ralink,rt2880-eth", RT_CHIPID_RT2880 }, - { "ralink,rt3050-eth", RT_CHIPID_RT3050 }, - { "ralink,rt3352-eth", RT_CHIPID_RT3050 }, - { "ralink,rt3883-eth", RT_CHIPID_RT3883 }, - { "ralink,rt5350-eth", RT_CHIPID_RT5350 }, - { "ralink,mt7620a-eth", RT_CHIPID_MT7620 }, - { "mediatek,mt7620-eth", RT_CHIPID_MT7620 }, - { "ralink,mt7621-eth", RT_CHIPID_MT7621 }, - { "mediatek,mt7621-eth", RT_CHIPID_MT7621 }, - { NULL, 0 } -}; -#endif - -/* - * Static function prototypes - */ -static int rt_probe(device_t dev); -static int rt_attach(device_t dev); -static int rt_detach(device_t dev); -static int rt_shutdown(device_t dev); -static int rt_suspend(device_t dev); -static int rt_resume(device_t dev); -static void rt_init_locked(void *priv); -static void rt_init(void *priv); -static void rt_stop_locked(void *priv); -static void rt_stop(void *priv); -static void rt_start(struct ifnet *ifp); -static int rt_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data); -static void rt_tx_watchdog(void *arg); -static void rt_intr(void *arg); -static void rt_rt5350_intr(void *arg); -static void rt_tx_coherent_intr(struct rt_softc *sc); -static void rt_rx_coherent_intr(struct rt_softc *sc); -static void rt_rx_delay_intr(struct rt_softc *sc); -static void rt_tx_delay_intr(struct rt_softc *sc); -static void rt_rx_intr(struct rt_softc *sc, int qid); -static void rt_tx_intr(struct rt_softc *sc, int qid); -static void rt_rx_done_task(void *context, int pending); -static void rt_tx_done_task(void *context, int pending); -static void rt_periodic_task(void *context, int pending); -static int rt_rx_eof(struct rt_softc *sc, - struct rt_softc_rx_ring *ring, int limit); -static void rt_tx_eof(struct rt_softc *sc, - struct rt_softc_tx_ring *ring); -static void rt_update_stats(struct rt_softc *sc); -static void rt_watchdog(struct rt_softc *sc); -static void rt_update_raw_counters(struct rt_softc *sc); -static void rt_intr_enable(struct rt_softc *sc, uint32_t intr_mask); -static void rt_intr_disable(struct rt_softc *sc, uint32_t intr_mask); -static int rt_txrx_enable(struct rt_softc *sc); -static int rt_alloc_rx_ring(struct rt_softc *sc, - struct rt_softc_rx_ring *ring, int qid); -static void rt_reset_rx_ring(struct rt_softc *sc, - struct rt_softc_rx_ring *ring); -static void rt_free_rx_ring(struct rt_softc *sc, - struct rt_softc_rx_ring *ring); -static int rt_alloc_tx_ring(struct rt_softc *sc, - struct rt_softc_tx_ring *ring, int qid); -static void rt_reset_tx_ring(struct rt_softc *sc, - struct rt_softc_tx_ring *ring); -static void rt_free_tx_ring(struct rt_softc *sc, - struct rt_softc_tx_ring *ring); -static void rt_dma_map_addr(void *arg, bus_dma_segment_t *segs, - int nseg, int error); -static void rt_sysctl_attach(struct rt_softc *sc); -#ifdef IF_RT_PHY_SUPPORT -void rt_miibus_statchg(device_t); -#endif -#if defined(IF_RT_PHY_SUPPORT) || defined(RT_MDIO) -static int rt_miibus_readreg(device_t, int, int); -static int rt_miibus_writereg(device_t, int, int, int); -#endif -static int rt_ifmedia_upd(struct ifnet *); -static void rt_ifmedia_sts(struct ifnet *, struct ifmediareq *); - -static SYSCTL_NODE(_hw, OID_AUTO, rt, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, - "RT driver parameters"); -#ifdef IF_RT_DEBUG -static int rt_debug = 0; -SYSCTL_INT(_hw_rt, OID_AUTO, debug, CTLFLAG_RWTUN, &rt_debug, 0, - "RT debug level"); -#endif - -static int -rt_probe(device_t dev) -{ - struct rt_softc *sc = device_get_softc(dev); - char buf[80]; -#ifdef FDT - const struct ofw_compat_data * cd; - - cd = ofw_bus_search_compatible(dev, rt_compat_data); - if (cd->ocd_data == 0) - return (ENXIO); - - sc->rt_chipid = (unsigned int)(cd->ocd_data); -#else -#if defined(MT7620) - sc->rt_chipid = RT_CHIPID_MT7620; -#elif defined(MT7621) - sc->rt_chipid = RT_CHIPID_MT7621; -#elif defined(RT5350) - sc->rt_chipid = RT_CHIPID_RT5350; -#else - sc->rt_chipid = RT_CHIPID_RT3050; -#endif -#endif - snprintf(buf, sizeof(buf), "Ralink %cT%x onChip Ethernet driver", - sc->rt_chipid >= 0x7600 ? 'M' : 'R', sc->rt_chipid); - device_set_desc_copy(dev, buf); - return (BUS_PROBE_GENERIC); -} - -/* - * macaddr_atoi - translate string MAC address to uint8_t array - */ -static int -macaddr_atoi(const char *str, uint8_t *mac) -{ - int count, i; - unsigned int amac[ETHER_ADDR_LEN]; /* Aligned version */ - - count = sscanf(str, "%x%*c%x%*c%x%*c%x%*c%x%*c%x", - &amac[0], &amac[1], &amac[2], - &amac[3], &amac[4], &amac[5]); - if (count < ETHER_ADDR_LEN) { - memset(mac, 0, ETHER_ADDR_LEN); - return (1); - } - - /* Copy aligned to result */ - for (i = 0; i < ETHER_ADDR_LEN; i ++) - mac[i] = (amac[i] & 0xff); - - return (0); -} - -#ifdef USE_GENERATED_MAC_ADDRESS -/* - * generate_mac(uin8_t *mac) - * This is MAC address generator for cases when real device MAC address - * unknown or not yet accessible. - * Use 'b','s','d' signature and 3 octets from CRC32 on kenv. - * MAC = 'b', 's', 'd', CRC[3]^CRC[2], CRC[1], CRC[0] - * - * Output - MAC address, that do not change between reboots, if hints or - * bootloader info unchange. - */ -static void -generate_mac(uint8_t *mac) -{ - unsigned char *cp; - int i = 0; - uint32_t crc = 0xffffffff; - - /* Generate CRC32 on kenv */ - for (cp = kenvp[0]; cp != NULL; cp = kenvp[++i]) { - crc = calculate_crc32c(crc, cp, strlen(cp) + 1); - } - crc = ~crc; - - mac[0] = 'b'; - mac[1] = 's'; - mac[2] = 'd'; - mac[3] = (crc >> 24) ^ ((crc >> 16) & 0xff); - mac[4] = (crc >> 8) & 0xff; - mac[5] = crc & 0xff; -} -#endif - -/* - * ether_request_mac - try to find usable MAC address. - */ -static int -ether_request_mac(device_t dev, uint8_t *mac) -{ - const char *var; - - /* - * "ethaddr" is passed via envp on RedBoot platforms - * "kmac" is passed via argv on RouterBOOT platforms - */ -#if defined(RT305X_UBOOT) || defined(__REDBOOT__) || defined(__ROUTERBOOT__) - if ((var = kern_getenv("ethaddr")) != NULL || - (var = kern_getenv("kmac")) != NULL ) { - if(!macaddr_atoi(var, mac)) { - printf("%s: use %s macaddr from KENV\n", - device_get_nameunit(dev), var); - freeenv(var); - return (0); - } - freeenv(var); - } -#endif - - /* - * Try from hints - * hint.[dev].[unit].macaddr - */ - if (!resource_string_value(device_get_name(dev), - device_get_unit(dev), "macaddr", &var)) { - if(!macaddr_atoi(var, mac)) { - printf("%s: use %s macaddr from hints\n", - device_get_nameunit(dev), var); - return (0); - } - } - -#ifdef USE_GENERATED_MAC_ADDRESS - generate_mac(mac); - - device_printf(dev, "use generated %02x:%02x:%02x:%02x:%02x:%02x " - "macaddr\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); -#else - /* Hardcoded */ - mac[0] = 0x00; - mac[1] = 0x18; - mac[2] = 0xe7; - mac[3] = 0xd5; - mac[4] = 0x83; - mac[5] = 0x90; - - device_printf(dev, "use hardcoded 00:18:e7:d5:83:90 macaddr\n"); -#endif - - return (0); -} - -/* - * Reset hardware - */ -static void -reset_freng(struct rt_softc *sc) -{ - /* XXX hard reset kills everything so skip it ... */ - return; -} - -static int -rt_attach(device_t dev) -{ - struct rt_softc *sc; - struct ifnet *ifp; - int error, i; -#ifdef FDT - phandle_t node; - char fdtval[32]; -#endif - - sc = device_get_softc(dev); - sc->dev = dev; - -#ifdef FDT - node = ofw_bus_get_node(sc->dev); -#endif - - mtx_init(&sc->lock, device_get_nameunit(dev), MTX_NETWORK_LOCK, - MTX_DEF | MTX_RECURSE); - - sc->mem_rid = 0; - sc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->mem_rid, - RF_ACTIVE | RF_SHAREABLE); - if (sc->mem == NULL) { - device_printf(dev, "could not allocate memory resource\n"); - error = ENXIO; - goto fail; - } - - sc->bst = rman_get_bustag(sc->mem); - sc->bsh = rman_get_bushandle(sc->mem); - - sc->irq_rid = 0; - sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irq_rid, - RF_ACTIVE); - if (sc->irq == NULL) { - device_printf(dev, - "could not allocate interrupt resource\n"); - error = ENXIO; - goto fail; - } - -#ifdef IF_RT_DEBUG - sc->debug = rt_debug; - - SYSCTL_ADD_INT(device_get_sysctl_ctx(dev), - SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, - "debug", CTLFLAG_RW, &sc->debug, 0, "rt debug level"); -#endif - - /* Reset hardware */ - reset_freng(sc); - - if (sc->rt_chipid == RT_CHIPID_MT7620) { - sc->csum_fail_ip = MT7620_RXD_SRC_IP_CSUM_FAIL; - sc->csum_fail_l4 = MT7620_RXD_SRC_L4_CSUM_FAIL; - } else if (sc->rt_chipid == RT_CHIPID_MT7621) { - sc->csum_fail_ip = MT7621_RXD_SRC_IP_CSUM_FAIL; - sc->csum_fail_l4 = MT7621_RXD_SRC_L4_CSUM_FAIL; - } else { - sc->csum_fail_ip = RT305X_RXD_SRC_IP_CSUM_FAIL; - sc->csum_fail_l4 = RT305X_RXD_SRC_L4_CSUM_FAIL; - } - - /* Fill in soc-specific registers map */ - switch(sc->rt_chipid) { - case RT_CHIPID_MT7620: - case RT_CHIPID_MT7621: - sc->gdma1_base = MT7620_GDMA1_BASE; - /* fallthrough */ - case RT_CHIPID_RT5350: - device_printf(dev, "%cT%x Ethernet MAC (rev 0x%08x)\n", - sc->rt_chipid >= 0x7600 ? 'M' : 'R', - sc->rt_chipid, sc->mac_rev); - /* RT5350: No GDMA, PSE, CDMA, PPE */ - RT_WRITE(sc, GE_PORT_BASE + 0x0C00, // UDPCS, TCPCS, IPCS=1 - RT_READ(sc, GE_PORT_BASE + 0x0C00) | (0x7<<16)); - sc->delay_int_cfg=RT5350_PDMA_BASE+RT5350_DELAY_INT_CFG; - sc->fe_int_status=RT5350_FE_INT_STATUS; - sc->fe_int_enable=RT5350_FE_INT_ENABLE; - sc->pdma_glo_cfg=RT5350_PDMA_BASE+RT5350_PDMA_GLO_CFG; - sc->pdma_rst_idx=RT5350_PDMA_BASE+RT5350_PDMA_RST_IDX; - for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++) { - sc->tx_base_ptr[i]=RT5350_PDMA_BASE+RT5350_TX_BASE_PTR(i); - sc->tx_max_cnt[i]=RT5350_PDMA_BASE+RT5350_TX_MAX_CNT(i); - sc->tx_ctx_idx[i]=RT5350_PDMA_BASE+RT5350_TX_CTX_IDX(i); - sc->tx_dtx_idx[i]=RT5350_PDMA_BASE+RT5350_TX_DTX_IDX(i); - } - sc->rx_ring_count=2; - sc->rx_base_ptr[0]=RT5350_PDMA_BASE+RT5350_RX_BASE_PTR0; - sc->rx_max_cnt[0]=RT5350_PDMA_BASE+RT5350_RX_MAX_CNT0; - sc->rx_calc_idx[0]=RT5350_PDMA_BASE+RT5350_RX_CALC_IDX0; - sc->rx_drx_idx[0]=RT5350_PDMA_BASE+RT5350_RX_DRX_IDX0; - sc->rx_base_ptr[1]=RT5350_PDMA_BASE+RT5350_RX_BASE_PTR1; - sc->rx_max_cnt[1]=RT5350_PDMA_BASE+RT5350_RX_MAX_CNT1; - sc->rx_calc_idx[1]=RT5350_PDMA_BASE+RT5350_RX_CALC_IDX1; - sc->rx_drx_idx[1]=RT5350_PDMA_BASE+RT5350_RX_DRX_IDX1; - sc->int_rx_done_mask=RT5350_INT_RXQ0_DONE; - sc->int_tx_done_mask=RT5350_INT_TXQ0_DONE; - break; - default: - device_printf(dev, "RT305XF Ethernet MAC (rev 0x%08x)\n", - sc->mac_rev); - sc->gdma1_base = GDMA1_BASE; - sc->delay_int_cfg=PDMA_BASE+DELAY_INT_CFG; - sc->fe_int_status=GE_PORT_BASE+FE_INT_STATUS; - sc->fe_int_enable=GE_PORT_BASE+FE_INT_ENABLE; - sc->pdma_glo_cfg=PDMA_BASE+PDMA_GLO_CFG; - sc->pdma_rst_idx=PDMA_BASE+PDMA_RST_IDX; - for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++) { - sc->tx_base_ptr[i]=PDMA_BASE+TX_BASE_PTR(i); - sc->tx_max_cnt[i]=PDMA_BASE+TX_MAX_CNT(i); - sc->tx_ctx_idx[i]=PDMA_BASE+TX_CTX_IDX(i); - sc->tx_dtx_idx[i]=PDMA_BASE+TX_DTX_IDX(i); - } - sc->rx_ring_count=1; - sc->rx_base_ptr[0]=PDMA_BASE+RX_BASE_PTR0; - sc->rx_max_cnt[0]=PDMA_BASE+RX_MAX_CNT0; - sc->rx_calc_idx[0]=PDMA_BASE+RX_CALC_IDX0; - sc->rx_drx_idx[0]=PDMA_BASE+RX_DRX_IDX0; - sc->int_rx_done_mask=INT_RX_DONE; - sc->int_tx_done_mask=INT_TXQ0_DONE; - } - - if (sc->gdma1_base != 0) - RT_WRITE(sc, sc->gdma1_base + GDMA_FWD_CFG, - ( - GDM_ICS_EN | /* Enable IP Csum */ - GDM_TCS_EN | /* Enable TCP Csum */ - GDM_UCS_EN | /* Enable UDP Csum */ - GDM_STRPCRC | /* Strip CRC from packet */ - GDM_DST_PORT_CPU << GDM_UFRC_P_SHIFT | /* fwd UCast to CPU */ - GDM_DST_PORT_CPU << GDM_BFRC_P_SHIFT | /* fwd BCast to CPU */ - GDM_DST_PORT_CPU << GDM_MFRC_P_SHIFT | /* fwd MCast to CPU */ - GDM_DST_PORT_CPU << GDM_OFRC_P_SHIFT /* fwd Other to CPU */ - )); - -#ifdef FDT - if (sc->rt_chipid == RT_CHIPID_RT2880 || - sc->rt_chipid == RT_CHIPID_RT3883) { - if (OF_getprop(node, "port-mode", fdtval, sizeof(fdtval)) > 0 && - strcmp(fdtval, "gigasw") == 0) - RT_WRITE(sc, MDIO_CFG, MDIO_2880_GIGA_INIT); - else - RT_WRITE(sc, MDIO_CFG, MDIO_2880_100T_INIT); - } -#endif - - /* allocate Tx and Rx rings */ - for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++) { - error = rt_alloc_tx_ring(sc, &sc->tx_ring[i], i); - if (error != 0) { - device_printf(dev, "could not allocate Tx ring #%d\n", - i); - goto fail; - } - } - - sc->tx_ring_mgtqid = 5; - for (i = 0; i < sc->rx_ring_count; i++) { - error = rt_alloc_rx_ring(sc, &sc->rx_ring[i], i); - if (error != 0) { - device_printf(dev, "could not allocate Rx ring\n"); - goto fail; - } - } - - callout_init_mtx(&sc->tx_watchdog_ch, &sc->lock, 0); - - ifp = sc->ifp = if_alloc(IFT_ETHER); - if (ifp == NULL) { - device_printf(dev, "could not if_alloc()\n"); - error = ENOMEM; - goto fail; - } - - ifp->if_softc = sc; - if_initname(ifp, device_get_name(sc->dev), device_get_unit(sc->dev)); - ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; - ifp->if_init = rt_init; - ifp->if_ioctl = rt_ioctl; - ifp->if_start = rt_start; -#define RT_TX_QLEN 256 - - IFQ_SET_MAXLEN(&ifp->if_snd, RT_TX_QLEN); - ifp->if_snd.ifq_drv_maxlen = RT_TX_QLEN; - IFQ_SET_READY(&ifp->if_snd); - -#ifdef IF_RT_PHY_SUPPORT - error = mii_attach(dev, &sc->rt_miibus, ifp, rt_ifmedia_upd, - rt_ifmedia_sts, BMSR_DEFCAPMASK, MII_PHY_ANY, MII_OFFSET_ANY, 0); - if (error != 0) { - device_printf(dev, "attaching PHYs failed\n"); - error = ENXIO; - goto fail; - } -#else - ifmedia_init(&sc->rt_ifmedia, 0, rt_ifmedia_upd, rt_ifmedia_sts); - ifmedia_add(&sc->rt_ifmedia, IFM_ETHER | IFM_100_TX | IFM_FDX, 0, - NULL); - ifmedia_set(&sc->rt_ifmedia, IFM_ETHER | IFM_100_TX | IFM_FDX); - -#endif /* IF_RT_PHY_SUPPORT */ - - ether_request_mac(dev, sc->mac_addr); - ether_ifattach(ifp, sc->mac_addr); - - /* - * Tell the upper layer(s) we support long frames. - */ - ifp->if_hdrlen = sizeof(struct ether_vlan_header); - ifp->if_capabilities |= IFCAP_VLAN_MTU; - ifp->if_capenable |= IFCAP_VLAN_MTU; - ifp->if_capabilities |= IFCAP_RXCSUM|IFCAP_TXCSUM; - ifp->if_capenable |= IFCAP_RXCSUM|IFCAP_TXCSUM; - - /* init task queue */ - NET_TASK_INIT(&sc->rx_done_task, 0, rt_rx_done_task, sc); - TASK_INIT(&sc->tx_done_task, 0, rt_tx_done_task, sc); - - sc->rx_process_limit = 100; - - sc->taskqueue = taskqueue_create("rt_taskq", M_NOWAIT, - taskqueue_thread_enqueue, &sc->taskqueue); - - taskqueue_start_threads(&sc->taskqueue, 1, PI_NET, "%s taskq", - device_get_nameunit(sc->dev)); - - TIMEOUT_TASK_INIT(sc->taskqueue, &sc->periodic_task, 0, - rt_periodic_task, sc); - - rt_sysctl_attach(sc); - - /* set up interrupt */ - error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET | INTR_MPSAFE, - NULL, (sc->rt_chipid == RT_CHIPID_RT5350 || - sc->rt_chipid == RT_CHIPID_MT7620 || - sc->rt_chipid == RT_CHIPID_MT7621) ? rt_rt5350_intr : rt_intr, - sc, &sc->irqh); - if (error != 0) { - printf("%s: could not set up interrupt\n", - device_get_nameunit(dev)); - goto fail; - } -#ifdef IF_RT_DEBUG - device_printf(dev, "debug var at %#08x\n", (u_int)&(sc->debug)); -#endif - - return (0); - -fail: - /* free Tx and Rx rings */ - for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++) - rt_free_tx_ring(sc, &sc->tx_ring[i]); - - for (i = 0; i < sc->rx_ring_count; i++) - rt_free_rx_ring(sc, &sc->rx_ring[i]); - - mtx_destroy(&sc->lock); - - if (sc->mem != NULL) - bus_release_resource(dev, SYS_RES_MEMORY, sc->mem_rid, - sc->mem); - - if (sc->irq != NULL) - bus_release_resource(dev, SYS_RES_IRQ, sc->irq_rid, - sc->irq); - - return (error); -} - -/* - * Set media options. - */ -static int -rt_ifmedia_upd(struct ifnet *ifp) -{ - struct rt_softc *sc; -#ifdef IF_RT_PHY_SUPPORT - struct mii_data *mii; - struct mii_softc *miisc; - int error = 0; - - sc = ifp->if_softc; - RT_SOFTC_LOCK(sc); - - mii = device_get_softc(sc->rt_miibus); - LIST_FOREACH(miisc, &mii->mii_phys, mii_list) - PHY_RESET(miisc); - error = mii_mediachg(mii); - RT_SOFTC_UNLOCK(sc); - - return (error); - -#else /* !IF_RT_PHY_SUPPORT */ - - struct ifmedia *ifm; - struct ifmedia_entry *ife; - - sc = ifp->if_softc; - ifm = &sc->rt_ifmedia; - ife = ifm->ifm_cur; - - if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER) - return (EINVAL); - - if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) { - device_printf(sc->dev, - "AUTO is not supported for multiphy MAC"); - return (EINVAL); - } - - /* - * Ignore everything - */ - return (0); -#endif /* IF_RT_PHY_SUPPORT */ -} - -/* - * Report current media status. - */ -static void -rt_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) -{ -#ifdef IF_RT_PHY_SUPPORT - struct rt_softc *sc; - struct mii_data *mii; - - sc = ifp->if_softc; - - RT_SOFTC_LOCK(sc); - mii = device_get_softc(sc->rt_miibus); - mii_pollstat(mii); - ifmr->ifm_active = mii->mii_media_active; - ifmr->ifm_status = mii->mii_media_status; - ifmr->ifm_active = IFM_ETHER | IFM_100_TX | IFM_FDX; - ifmr->ifm_status = IFM_AVALID | IFM_ACTIVE; - RT_SOFTC_UNLOCK(sc); -#else /* !IF_RT_PHY_SUPPORT */ - - ifmr->ifm_status = IFM_AVALID | IFM_ACTIVE; - ifmr->ifm_active = IFM_ETHER | IFM_100_TX | IFM_FDX; -#endif /* IF_RT_PHY_SUPPORT */ -} - -static int -rt_detach(device_t dev) -{ - struct rt_softc *sc; - struct ifnet *ifp; - int i; - - sc = device_get_softc(dev); - ifp = sc->ifp; - - RT_DPRINTF(sc, RT_DEBUG_ANY, "detaching\n"); - - RT_SOFTC_LOCK(sc); - ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); - callout_stop(&sc->tx_watchdog_ch); - RT_SOFTC_UNLOCK(sc); - - taskqueue_drain(sc->taskqueue, &sc->rx_done_task); - taskqueue_drain(sc->taskqueue, &sc->tx_done_task); - taskqueue_drain_timeout(sc->taskqueue, &sc->periodic_task); - - /* free Tx and Rx rings */ - RT_SOFTC_LOCK(sc); - for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++) - rt_free_tx_ring(sc, &sc->tx_ring[i]); - for (i = 0; i < sc->rx_ring_count; i++) - rt_free_rx_ring(sc, &sc->rx_ring[i]); - RT_SOFTC_UNLOCK(sc); - -#ifdef IF_RT_PHY_SUPPORT - if (sc->rt_miibus != NULL) - device_delete_child(dev, sc->rt_miibus); -#endif - - ether_ifdetach(ifp); - if_free(ifp); - - taskqueue_free(sc->taskqueue); - - mtx_destroy(&sc->lock); - - bus_generic_detach(dev); - bus_teardown_intr(dev, sc->irq, sc->irqh); - bus_release_resource(dev, SYS_RES_IRQ, sc->irq_rid, sc->irq); - bus_release_resource(dev, SYS_RES_MEMORY, sc->mem_rid, sc->mem); - - return (0); -} - -static int -rt_shutdown(device_t dev) -{ - struct rt_softc *sc; - - sc = device_get_softc(dev); - RT_DPRINTF(sc, RT_DEBUG_ANY, "shutting down\n"); - rt_stop(sc); - - return (0); -} - -static int -rt_suspend(device_t dev) -{ - struct rt_softc *sc; - - sc = device_get_softc(dev); - RT_DPRINTF(sc, RT_DEBUG_ANY, "suspending\n"); - rt_stop(sc); - - return (0); -} - -static int -rt_resume(device_t dev) -{ - struct rt_softc *sc; - struct ifnet *ifp; - - sc = device_get_softc(dev); - ifp = sc->ifp; - - RT_DPRINTF(sc, RT_DEBUG_ANY, "resuming\n"); - - if (ifp->if_flags & IFF_UP) - rt_init(sc); - - return (0); -} - -/* - * rt_init_locked - Run initialization process having locked mtx. - */ -static void -rt_init_locked(void *priv) -{ - struct rt_softc *sc; - struct ifnet *ifp; -#ifdef IF_RT_PHY_SUPPORT - struct mii_data *mii; -#endif - int i, ntries; - uint32_t tmp; - - sc = priv; - ifp = sc->ifp; -#ifdef IF_RT_PHY_SUPPORT - mii = device_get_softc(sc->rt_miibus); -#endif - - RT_DPRINTF(sc, RT_DEBUG_ANY, "initializing\n"); - - RT_SOFTC_ASSERT_LOCKED(sc); - - /* hardware reset */ - //RT_WRITE(sc, GE_PORT_BASE + FE_RST_GLO, PSE_RESET); - //rt305x_sysctl_set(SYSCTL_RSTCTRL, SYSCTL_RSTCTRL_FRENG); - - /* Fwd to CPU (uni|broad|multi)cast and Unknown */ - if (sc->gdma1_base != 0) - RT_WRITE(sc, sc->gdma1_base + GDMA_FWD_CFG, - ( - GDM_ICS_EN | /* Enable IP Csum */ - GDM_TCS_EN | /* Enable TCP Csum */ - GDM_UCS_EN | /* Enable UDP Csum */ - GDM_STRPCRC | /* Strip CRC from packet */ - GDM_DST_PORT_CPU << GDM_UFRC_P_SHIFT | /* fwd UCast to CPU */ - GDM_DST_PORT_CPU << GDM_BFRC_P_SHIFT | /* fwd BCast to CPU */ - GDM_DST_PORT_CPU << GDM_MFRC_P_SHIFT | /* fwd MCast to CPU */ - GDM_DST_PORT_CPU << GDM_OFRC_P_SHIFT /* fwd Other to CPU */ - )); - - /* disable DMA engine */ - RT_WRITE(sc, sc->pdma_glo_cfg, 0); - RT_WRITE(sc, sc->pdma_rst_idx, 0xffffffff); - - /* wait while DMA engine is busy */ - for (ntries = 0; ntries < 100; ntries++) { - tmp = RT_READ(sc, sc->pdma_glo_cfg); - if (!(tmp & (FE_TX_DMA_BUSY | FE_RX_DMA_BUSY))) - break; - DELAY(1000); - } - - if (ntries == 100) { - device_printf(sc->dev, "timeout waiting for DMA engine\n"); - goto fail; - } - - /* reset Rx and Tx rings */ - tmp = FE_RST_DRX_IDX0 | - FE_RST_DTX_IDX3 | - FE_RST_DTX_IDX2 | - FE_RST_DTX_IDX1 | - FE_RST_DTX_IDX0; - - RT_WRITE(sc, sc->pdma_rst_idx, tmp); - - /* XXX switch set mac address */ - for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++) - rt_reset_tx_ring(sc, &sc->tx_ring[i]); - - for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++) { - /* update TX_BASE_PTRx */ - RT_WRITE(sc, sc->tx_base_ptr[i], - sc->tx_ring[i].desc_phys_addr); - RT_WRITE(sc, sc->tx_max_cnt[i], - RT_SOFTC_TX_RING_DESC_COUNT); - RT_WRITE(sc, sc->tx_ctx_idx[i], 0); - } - - /* init Rx ring */ - for (i = 0; i < sc->rx_ring_count; i++) - rt_reset_rx_ring(sc, &sc->rx_ring[i]); - - /* update RX_BASE_PTRx */ - for (i = 0; i < sc->rx_ring_count; i++) { - RT_WRITE(sc, sc->rx_base_ptr[i], - sc->rx_ring[i].desc_phys_addr); - RT_WRITE(sc, sc->rx_max_cnt[i], - RT_SOFTC_RX_RING_DATA_COUNT); - RT_WRITE(sc, sc->rx_calc_idx[i], - RT_SOFTC_RX_RING_DATA_COUNT - 1); - } - - /* write back DDONE, 16byte burst enable RX/TX DMA */ - tmp = FE_TX_WB_DDONE | FE_DMA_BT_SIZE16 | FE_RX_DMA_EN | FE_TX_DMA_EN; - if (sc->rt_chipid == RT_CHIPID_MT7620 || - sc->rt_chipid == RT_CHIPID_MT7621) - tmp |= (1<<31); - RT_WRITE(sc, sc->pdma_glo_cfg, tmp); - - /* disable interrupts mitigation */ - RT_WRITE(sc, sc->delay_int_cfg, 0); - - /* clear pending interrupts */ - RT_WRITE(sc, sc->fe_int_status, 0xffffffff); - - /* enable interrupts */ - if (sc->rt_chipid == RT_CHIPID_RT5350 || - sc->rt_chipid == RT_CHIPID_MT7620 || - sc->rt_chipid == RT_CHIPID_MT7621) - tmp = RT5350_INT_TX_COHERENT | - RT5350_INT_RX_COHERENT | - RT5350_INT_TXQ3_DONE | - RT5350_INT_TXQ2_DONE | - RT5350_INT_TXQ1_DONE | - RT5350_INT_TXQ0_DONE | - RT5350_INT_RXQ1_DONE | - RT5350_INT_RXQ0_DONE; - else - tmp = CNT_PPE_AF | - CNT_GDM_AF | - PSE_P2_FC | - GDM_CRC_DROP | - PSE_BUF_DROP | - GDM_OTHER_DROP | - PSE_P1_FC | - PSE_P0_FC | - PSE_FQ_EMPTY | - INT_TX_COHERENT | - INT_RX_COHERENT | - INT_TXQ3_DONE | - INT_TXQ2_DONE | - INT_TXQ1_DONE | - INT_TXQ0_DONE | - INT_RX_DONE; - - sc->intr_enable_mask = tmp; - - RT_WRITE(sc, sc->fe_int_enable, tmp); - - if (rt_txrx_enable(sc) != 0) - goto fail; - -#ifdef IF_RT_PHY_SUPPORT - if (mii) mii_mediachg(mii); -#endif /* IF_RT_PHY_SUPPORT */ - - ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - ifp->if_drv_flags |= IFF_DRV_RUNNING; - - sc->periodic_round = 0; - - taskqueue_enqueue_timeout(sc->taskqueue, &sc->periodic_task, hz / 10); - - return; - -fail: - rt_stop_locked(sc); -} - -/* - * rt_init - lock and initialize device. - */ -static void -rt_init(void *priv) -{ - struct rt_softc *sc; - - sc = priv; - RT_SOFTC_LOCK(sc); - rt_init_locked(sc); - RT_SOFTC_UNLOCK(sc); *** 2669 LINES SKIPPED ***