Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/mips/cavium/dev Redo cnmac attachments - cnmacM @ g...



details:   https://anonhg.NetBSD.org/src/rev/4a45ce719cab
branches:  trunk
changeset: 1011216:4a45ce719cab
user:      simonb <simonb%NetBSD.org@localhost>
date:      Tue Jun 23 05:17:13 2020 +0000

description:
Redo cnmac attachments - cnmacM @ gmxN @ pip0 @ iobus
Support SGMII mode used on CN70XX.
Most functional changes from OpenBSD octeon port.  Still more to come from
the OpenBSD driver.

diffstat:

 sys/arch/mips/cavium/dev/if_cnmac.c      |  805 ++++++------------------------
 sys/arch/mips/cavium/dev/if_cnmacvar.h   |   56 +-
 sys/arch/mips/cavium/dev/octeon_gmx.c    |  756 +++++++++++++++-------------
 sys/arch/mips/cavium/dev/octeon_gmxreg.h |   90 +++-
 sys/arch/mips/cavium/dev/octeon_gmxvar.h |   45 +-
 5 files changed, 679 insertions(+), 1073 deletions(-)

diffs (truncated from 2533 to 300 lines):

diff -r 275557f4e7a3 -r 4a45ce719cab sys/arch/mips/cavium/dev/if_cnmac.c
--- a/sys/arch/mips/cavium/dev/if_cnmac.c       Tue Jun 23 05:15:33 2020 +0000
+++ b/sys/arch/mips/cavium/dev/if_cnmac.c       Tue Jun 23 05:17:13 2020 +0000
@@ -1,11 +1,33 @@
-/*     $NetBSD: if_cnmac.c,v 1.23 2020/06/22 02:26:19 simonb Exp $     */
+/*     $NetBSD: if_cnmac.c,v 1.24 2020/06/23 05:17:13 simonb Exp $     */
+
+/*
+ * Copyright (c) 2007 Internet Initiative Japan, Inc.
+ * 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, 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 REGENTS 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 REGENTS 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 <sys/cdefs.h>
-#if 0
-__KERNEL_RCSID(0, "$NetBSD: if_cnmac.c,v 1.23 2020/06/22 02:26:19 simonb Exp $");
-#endif
-
-#include "opt_octeon.h"
+__KERNEL_RCSID(0, "$NetBSD: if_cnmac.c,v 1.24 2020/06/23 05:17:13 simonb Exp $");
 
 /*
  * If no free send buffer is available, free all the sent buffers and bail out.
@@ -30,7 +52,6 @@
 #include <sys/syslog.h>
 
 #include <net/if.h>
-#include <net/if_dl.h>
 #include <net/if_media.h>
 #include <net/if_ether.h>
 #include <net/route.h>
@@ -52,23 +73,24 @@
 #include <mips/cpuregs.h>
 
 #include <mips/cavium/octeonreg.h>
+#include <mips/cavium/octeonvar.h>
 #include <mips/cavium/include/iobusvar.h>
 
 #include <mips/cavium/dev/octeon_ciureg.h>
+#include <mips/cavium/dev/octeon_faureg.h>
+#include <mips/cavium/dev/octeon_fpareg.h>
 #include <mips/cavium/dev/octeon_gmxreg.h>
 #include <mips/cavium/dev/octeon_pipreg.h>
 #include <mips/cavium/dev/octeon_powreg.h>
-#include <mips/cavium/dev/octeon_faureg.h>
-#include <mips/cavium/dev/octeon_fpareg.h>
+#include <mips/cavium/dev/octeon_fauvar.h>
 #include <mips/cavium/dev/octeon_fpavar.h>
 #include <mips/cavium/dev/octeon_gmxvar.h>
-#include <mips/cavium/dev/octeon_fauvar.h>
-#include <mips/cavium/dev/octeon_powvar.h>
 #include <mips/cavium/dev/octeon_ipdvar.h>
 #include <mips/cavium/dev/octeon_pipvar.h>
 #include <mips/cavium/dev/octeon_pkovar.h>
-#include <mips/cavium/dev/octeon_asxvar.h>
+#include <mips/cavium/dev/octeon_powvar.h>
 #include <mips/cavium/dev/octeon_smivar.h>
+
 #include <mips/cavium/dev/if_cnmacvar.h>
 
 /*
@@ -86,8 +108,6 @@
 static void    cnmac_pip_init(struct cnmac_softc *);
 static void    cnmac_ipd_init(struct cnmac_softc *);
 static void    cnmac_pko_init(struct cnmac_softc *);
-static void    cnmac_asx_init(struct cnmac_softc *);
-static void    cnmac_smi_init(struct cnmac_softc *);
 
 static void    cnmac_board_mac_addr(uint8_t *, size_t, struct cnmac_softc *);
 
@@ -107,11 +127,8 @@
     uint64_t *);
 static inline void cnmac_send_queue_del(struct cnmac_softc *, struct mbuf **,
     uint64_t **);
-static inline int cnmac_buf_free_work(struct cnmac_softc *, uint64_t *,
-    uint64_t);
-static inline void cnmac_buf_ext_free_m(struct mbuf *, void *, size_t, void *);
-static inline void cnmac_buf_ext_free_ext(struct mbuf *, void *, size_t,
-    void *);
+static inline int cnmac_buf_free_work(struct cnmac_softc *, uint64_t *);
+static inline void cnmac_buf_ext_free(struct mbuf *, void *, size_t, void *);
 
 static int     cnmac_ioctl(struct ifnet *, u_long, void *);
 static void    cnmac_watchdog(struct ifnet *);
@@ -122,7 +139,8 @@
 static inline int cnmac_send_cmd(struct cnmac_softc *, uint64_t, uint64_t,
     int *);
 static inline uint64_t cnmac_send_makecmd_w1(int, paddr_t);
-static inline uint64_t cnmac_send_makecmd_w0(uint64_t, uint64_t, size_t, int);
+static inline uint64_t cnmac_send_makecmd_w0(uint64_t, uint64_t, size_t, int,
+    int);
 static inline int cnmac_send_makecmd_gbuf(struct cnmac_softc *, struct mbuf *,
     uint64_t *, int *);
 static inline int cnmac_send_makecmd(struct cnmac_softc *, struct mbuf *,
@@ -140,25 +158,12 @@
 
 static inline int cnmac_recv_mbuf(struct cnmac_softc *, uint64_t *,
     struct mbuf **);
-static inline int cnmac_recv_check_code(struct cnmac_softc *, uint64_t);
-static inline int cnmac_recv_check_jumbo(struct cnmac_softc *, uint64_t);
-static inline int cnmac_recv_check_link(struct cnmac_softc *, uint64_t);
 static inline int cnmac_recv_check(struct cnmac_softc *, uint64_t);
 static inline int cnmac_recv(struct cnmac_softc *, uint64_t *);
-static void    cnmac_recv_redir(struct ifnet *, struct mbuf *);
-static inline void cnmac_recv_intr(void *, uint64_t *);
-
-/* Device driver context */
-static struct  cnmac_softc *cnmac_gsc[GMX_PORT_NUNITS];
-static void    *cnmac_pow_recv_ih;
+static int     cnmac_intr(void *);
 
-/* sysctl'able parameters */
+/* device parameters */
 int            cnmac_param_pko_cmd_w0_n2 = 1;
-int            cnmac_param_pip_dyn_rs = 1;
-int            cnmac_param_redir = 0;
-int            cnmac_param_pktbuf = 0;
-int            cnmac_param_rate = 0;
-int            cnmac_param_intr = 0;
 
 CFATTACH_DECL_NEW(cnmac, sizeof(struct cnmac_softc),
     cnmac_match, cnmac_attach, NULL, NULL);
@@ -177,12 +182,14 @@
        _ENTRY(SG)
 #undef _ENTRY
 };
-struct octfpa_buf      *cnmac_pools[8/* XXX */];
+struct octfpa_buf      *cnmac_pools[FPA_NPOOLS];
 #define        cnmac_fb_pkt    cnmac_pools[OCTEON_POOL_NO_PKT]
 #define        cnmac_fb_wqe    cnmac_pools[OCTEON_POOL_NO_WQE]
 #define        cnmac_fb_cmd    cnmac_pools[OCTEON_POOL_NO_CMD]
 #define        cnmac_fb_sg     cnmac_pools[OCTEON_POOL_NO_SG]
 
+static int     cnmac_npowgroups = 0;
+
 static void
 cnmac_buf_init(struct cnmac_softc *sc)
 {
@@ -225,12 +232,18 @@
        prop_object_t clk;
        uint8_t enaddr[ETHER_ADDR_LEN];
 
+       if (cnmac_npowgroups >= OCTEON_POW_GROUP_MAX) {
+               printf(": out of POW groups\n");
+       }
+
        sc->sc_dev = self;
        sc->sc_regt = ga->ga_regt;
        sc->sc_port = ga->ga_portno;
        sc->sc_port_type = ga->ga_port_type;
        sc->sc_gmx = ga->ga_gmx;
        sc->sc_gmx_port = ga->ga_gmx_port;
+       sc->sc_smi = ga->ga_smi;
+       sc->sc_powgroup = cnmac_npowgroups++;
 
        if (sc->sc_port >= CVMSEG_LM_ETHER_COUNT) {
                /*
@@ -255,11 +268,9 @@
        }
 
        cnmac_board_mac_addr(enaddr, sizeof(enaddr), sc);
-       printf("%s: Ethernet address %s\n", device_xname(sc->sc_dev),
+       printf("%s: Ethernet address %s\n", device_xname(self),
            ether_sprintf(enaddr));
 
-       cnmac_gsc[sc->sc_port] = sc;
-
        SIMPLEQ_INIT(&sc->sc_sendq);
        sc->sc_soft_req_thresh = 15/* XXX */;
        sc->sc_ext_callback_cnt = 0;
@@ -269,19 +280,19 @@
        callout_init(&sc->sc_tick_misc_ch, 0);
        callout_init(&sc->sc_tick_free_ch, 0);
 
+       const int dv_unit = device_unit(self);
        octfau_op_init(&sc->sc_fau_done,
-           OCTEON_CVMSEG_ETHER_OFFSET(sc->sc_port, csm_ether_fau_done),
-           OCT_FAU_REG_ADDR_END - (8 * (sc->sc_port + 1))/* XXX */);
+           OCTEON_CVMSEG_ETHER_OFFSET(dv_unit, csm_ether_fau_done),
+           OCT_FAU_REG_ADDR_END - (8 * (dv_unit + 1))/* XXX */);
        octfau_op_set_8(&sc->sc_fau_done, 0);
 
        cnmac_pip_init(sc);
        cnmac_ipd_init(sc);
        cnmac_pko_init(sc);
-       cnmac_asx_init(sc);
-       cnmac_smi_init(sc);
+
+       cnmac_configure_common(sc);
 
        sc->sc_gmx_port->sc_ipd = sc->sc_ipd;
-       sc->sc_gmx_port->sc_port_asx = sc->sc_asx;
        sc->sc_gmx_port->sc_port_mii = &sc->sc_mii;
        sc->sc_gmx_port->sc_port_ec = &sc->sc_ethercom;
        /* XXX */
@@ -292,7 +303,7 @@
 
        cnmac_mediainit(sc);
 
-       strncpy(ifp->if_xname, device_xname(sc->sc_dev), sizeof(ifp->if_xname));
+       strncpy(ifp->if_xname, device_xname(self), sizeof(ifp->if_xname));
        ifp->if_softc = sc;
        ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
        ifp->if_ioctl = cnmac_ioctl;
@@ -303,10 +314,18 @@
        IFQ_SET_MAXLEN(&ifp->if_snd, uimax(GATHER_QUEUE_SIZE, IFQ_MAXLEN));
        IFQ_SET_READY(&ifp->if_snd);
 
-       /* XXX: not yet tx checksum */
+       
        ifp->if_capabilities =
+#if 0  /* XXX: no tx checksum yet */
+           IFCAP_CSUM_IPv4_Tx | IFCAP_CSUM_IPv4_Rx |
+           IFCAP_CSUM_TCPv4_Tx | IFCAP_CSUM_TCPv4_Rx |
+           IFCAP_CSUM_UDPv4_Tx | IFCAP_CSUM_UDPv4_Rx |
+           IFCAP_CSUM_TCPv6_Tx | IFCAP_CSUM_TCPv6_Rx |
+           IFCAP_CSUM_UDPv6_Tx | IFCAP_CSUM_UDPv6_Rx;
+#else
            IFCAP_CSUM_IPv4_Rx | IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx |
            IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx;
+#endif
 
        /* 802.1Q VLAN-sized frames are supported */
        sc->sc_ethercom.ec_capabilities |= ETHERCAP_VLAN_MTU;
@@ -317,32 +336,25 @@
        ether_ifattach(ifp, enaddr);
        octgmx_set_filter(sc->sc_gmx_port);
 
-       /* XXX */
-       sc->sc_rate_recv_check_link_cap.tv_sec = 1;
-       sc->sc_rate_recv_check_jumbo_cap.tv_sec = 1;
-       sc->sc_rate_recv_check_code_cap.tv_sec = 1;
-       sc->sc_rate_recv_fixup_odd_nibble_short_cap.tv_sec = 1;
-       sc->sc_rate_recv_fixup_odd_nibble_preamble_cap.tv_sec = 1;
-       sc->sc_rate_recv_fixup_odd_nibble_crc_cap.tv_sec = 1;
-       /* XXX */
-
 #if 1
        cnmac_buf_init(sc);
 #endif
 
-       if (cnmac_pow_recv_ih == NULL)
-               cnmac_pow_recv_ih
-                   = octpow_intr_establish(OCTEON_POW_GROUP_PIP,
-                       IPL_NET, cnmac_recv_intr, NULL, NULL);
+       sc->sc_ih = octeon_intr_establish(POW_WORKQ_IRQ(sc->sc_powgroup),
+           IPL_NET, cnmac_intr, sc);
+       if (sc->sc_ih == NULL)
+               panic("%s: could not set up interrupt", device_xname(self));
 
        dict = device_properties(sc->sc_gmx->sc_dev);
 
        clk = prop_dictionary_get(dict, "rgmii-tx");
-       KASSERT(clk != NULL);
-       sc->sc_gmx_port->sc_clk_tx_setting = prop_number_signed_value(clk);
+       if (clk)
+               sc->sc_gmx_port->sc_clk_tx_setting =
+                   prop_number_signed_value(clk);
        clk = prop_dictionary_get(dict, "rgmii-rx");
-       KASSERT(clk != NULL);
-       sc->sc_gmx_port->sc_clk_rx_setting = prop_number_signed_value(clk);
+       if (clk)
+               sc->sc_gmx_port->sc_clk_rx_setting =
+                   prop_number_signed_value(clk);
 }
 
 /* ---- submodules */
@@ -356,9 +368,10 @@
        pip_aa.aa_port = sc->sc_port;
        pip_aa.aa_regt = sc->sc_regt;
        pip_aa.aa_tag_type = POW_TAG_TYPE_ORDERED/* XXX */;
-       pip_aa.aa_receive_group = OCTEON_POW_GROUP_PIP;
+       pip_aa.aa_receive_group = sc->sc_powgroup;
        pip_aa.aa_ip_offset = sc->sc_ip_offset;
        octpip_init(&pip_aa, &sc->sc_pip);
+       octpip_port_config(sc->sc_pip);
 }
 
 /* XXX */
@@ -388,28 +401,6 @@



Home | Main Index | Thread Index | Old Index