The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/arm/cavium/cns11xx/if_ece.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2009 Yohanes Nugroho <yohanes@gmail.com>
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  *
   14  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   17  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
   18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   24  * SUCH DAMAGE.
   25  */
   26 
   27 #include <sys/cdefs.h>
   28 __FBSDID("$FreeBSD$");
   29 
   30 #include <sys/param.h>
   31 #include <sys/systm.h>
   32 #include <sys/bus.h>
   33 #include <sys/kernel.h>
   34 #include <sys/mbuf.h>
   35 #include <sys/malloc.h>
   36 #include <sys/module.h>
   37 #include <sys/rman.h>
   38 #include <sys/socket.h>
   39 #include <sys/sockio.h>
   40 #include <sys/sysctl.h>
   41 #include <sys/taskqueue.h>
   42 
   43 #include <net/ethernet.h>
   44 #include <net/if.h>
   45 #include <net/if_arp.h>
   46 #include <net/if_dl.h>
   47 #include <net/if_media.h>
   48 #include <net/if_types.h>
   49 #include <net/if_var.h>
   50 #include <net/if_vlan_var.h>
   51 
   52 #ifdef INET
   53 #include <netinet/in.h>
   54 #include <netinet/in_systm.h>
   55 #include <netinet/in_var.h>
   56 #include <netinet/ip.h>
   57 #endif
   58 
   59 #include <net/bpf.h>
   60 #include <net/bpfdesc.h>
   61 
   62 #include <dev/mii/mii.h>
   63 #include <dev/mii/miivar.h>
   64 
   65 #include <arm/cavium/cns11xx/if_ecereg.h>
   66 #include <arm/cavium/cns11xx/if_ecevar.h>
   67 #include <arm/cavium/cns11xx/econa_var.h>
   68 
   69 #include <machine/bus.h>
   70 #include <machine/intr.h>
   71 
   72 /* "device miibus" required.  See GENERIC if you get errors here. */
   73 #include "miibus_if.h"
   74 
   75 static uint8_t
   76 vlan0_mac[ETHER_ADDR_LEN] = {0x00, 0xaa, 0xbb, 0xcc, 0xdd, 0x19};
   77 
   78 /*
   79  * Boot loader expects the hardware state to be the same when we
   80  * restart the device (warm boot), so we need to save the initial
   81  * config values.
   82  */
   83 int initial_switch_config;
   84 int initial_cpu_config;
   85 int initial_port0_config;
   86 int initial_port1_config;
   87 
   88 static inline uint32_t
   89 read_4(struct ece_softc *sc, bus_size_t off)
   90 {
   91 
   92         return (bus_read_4(sc->mem_res, off));
   93 }
   94 
   95 static inline void
   96 write_4(struct ece_softc *sc, bus_size_t off, uint32_t val)
   97 {
   98 
   99         bus_write_4(sc->mem_res, off, val);
  100 }
  101 
  102 #define ECE_LOCK(_sc)           mtx_lock(&(_sc)->sc_mtx)
  103 #define ECE_UNLOCK(_sc)         mtx_unlock(&(_sc)->sc_mtx)
  104 #define ECE_LOCK_INIT(_sc) \
  105         mtx_init(&_sc->sc_mtx, device_get_nameunit(_sc->dev),   \
  106                  MTX_NETWORK_LOCK, MTX_DEF)
  107 
  108 #define ECE_TXLOCK(_sc)         mtx_lock(&(_sc)->sc_mtx_tx)
  109 #define ECE_TXUNLOCK(_sc)               mtx_unlock(&(_sc)->sc_mtx_tx)
  110 #define ECE_TXLOCK_INIT(_sc) \
  111         mtx_init(&_sc->sc_mtx_tx, device_get_nameunit(_sc->dev),        \
  112                  "ECE TX Lock", MTX_DEF)
  113 
  114 #define ECE_CLEANUPLOCK(_sc)    mtx_lock(&(_sc)->sc_mtx_cleanup)
  115 #define ECE_CLEANUPUNLOCK(_sc)  mtx_unlock(&(_sc)->sc_mtx_cleanup)
  116 #define ECE_CLEANUPLOCK_INIT(_sc) \
  117         mtx_init(&_sc->sc_mtx_cleanup, device_get_nameunit(_sc->dev),   \
  118                  "ECE cleanup Lock", MTX_DEF)
  119 
  120 #define ECE_RXLOCK(_sc)         mtx_lock(&(_sc)->sc_mtx_rx)
  121 #define ECE_RXUNLOCK(_sc)               mtx_unlock(&(_sc)->sc_mtx_rx)
  122 #define ECE_RXLOCK_INIT(_sc) \
  123         mtx_init(&_sc->sc_mtx_rx, device_get_nameunit(_sc->dev),        \
  124                  "ECE RX Lock", MTX_DEF)
  125 
  126 #define ECE_LOCK_DESTROY(_sc)   mtx_destroy(&_sc->sc_mtx);
  127 #define ECE_TXLOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx_tx);
  128 #define ECE_RXLOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx_rx);
  129 #define ECE_CLEANUPLOCK_DESTROY(_sc)    \
  130         mtx_destroy(&_sc->sc_mtx_cleanup);
  131 
  132 #define ECE_ASSERT_LOCKED(_sc)  mtx_assert(&_sc->sc_mtx, MA_OWNED);
  133 #define ECE_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED);
  134 
  135 static devclass_t ece_devclass;
  136 
  137 /* ifnet entry points */
  138 
  139 static void     eceinit_locked(void *);
  140 static void     ecestart_locked(struct ifnet *);
  141 
  142 static void     eceinit(void *);
  143 static void     ecestart(struct ifnet *);
  144 static void     ecestop(struct ece_softc *);
  145 static int      eceioctl(struct ifnet * ifp, u_long, caddr_t);
  146 
  147 /* bus entry points */
  148 
  149 static int      ece_probe(device_t dev);
  150 static int      ece_attach(device_t dev);
  151 static int      ece_detach(device_t dev);
  152 static void     ece_intr(void *);
  153 static void     ece_intr_qf(void *);
  154 static void     ece_intr_status(void *xsc);
  155 
  156 /* helper routines */
  157 static int      ece_activate(device_t dev);
  158 static void     ece_deactivate(device_t dev);
  159 static int      ece_ifmedia_upd(struct ifnet *ifp);
  160 static void     ece_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr);
  161 static int      ece_get_mac(struct ece_softc *sc, u_char *eaddr);
  162 static void     ece_set_mac(struct ece_softc *sc, u_char *eaddr);
  163 static int      configure_cpu_port(struct ece_softc *sc);
  164 static int      configure_lan_port(struct ece_softc *sc, int phy_type);
  165 static void     set_pvid(struct ece_softc *sc, int port0, int port1, int cpu);
  166 static void     set_vlan_vid(struct ece_softc *sc, int vlan);
  167 static void     set_vlan_member(struct ece_softc *sc, int vlan);
  168 static void     set_vlan_tag(struct ece_softc *sc, int vlan);
  169 static int      hardware_init(struct ece_softc *sc);
  170 static void     ece_intr_rx_locked(struct ece_softc *sc, int count);
  171 
  172 static void     ece_free_desc_dma_tx(struct ece_softc *sc);
  173 static void     ece_free_desc_dma_rx(struct ece_softc *sc);
  174 
  175 static void     ece_intr_task(void *arg, int pending __unused);
  176 static void     ece_tx_task(void *arg, int pending __unused);
  177 static void     ece_cleanup_task(void *arg, int pending __unused);
  178 
  179 static int      ece_allocate_dma(struct ece_softc *sc);
  180 
  181 static void     ece_intr_tx(void *xsc);
  182 
  183 static void     clear_mac_entries(struct ece_softc *ec, int include_this_mac);
  184 
  185 static uint32_t read_mac_entry(struct ece_softc *ec,
  186             uint8_t *mac_result,
  187             int first);
  188 
  189 /*PHY related functions*/
  190 static inline int
  191 phy_read(struct ece_softc *sc, int phy, int reg)
  192 {
  193         int val;
  194         int ii;
  195         int status;
  196 
  197         write_4(sc, PHY_CONTROL, PHY_RW_OK);
  198         write_4(sc, PHY_CONTROL,
  199             (PHY_ADDRESS(phy)|PHY_READ_COMMAND |
  200             PHY_REGISTER(reg)));
  201 
  202         for (ii = 0; ii < 0x1000; ii++) {
  203                 status = read_4(sc, PHY_CONTROL);
  204                 if (status & PHY_RW_OK) {
  205                         /* Clear the rw_ok status, and clear other
  206                          * bits value. */
  207                         write_4(sc, PHY_CONTROL, PHY_RW_OK);
  208                         val = PHY_GET_DATA(status);
  209                         return (val);
  210                 }
  211         }
  212         return (0);
  213 }
  214 
  215 static inline void
  216 phy_write(struct ece_softc *sc, int phy, int reg, int data)
  217 {
  218         int ii;
  219 
  220         write_4(sc, PHY_CONTROL, PHY_RW_OK);
  221         write_4(sc, PHY_CONTROL,
  222             PHY_ADDRESS(phy) | PHY_REGISTER(reg) |
  223             PHY_WRITE_COMMAND | PHY_DATA(data));
  224         for (ii = 0; ii < 0x1000; ii++) {
  225                 if (read_4(sc, PHY_CONTROL) & PHY_RW_OK) {
  226                         /* Clear the rw_ok status, and clear other
  227                          * bits value.
  228                          */
  229                         write_4(sc, PHY_CONTROL, PHY_RW_OK);
  230                         return;
  231                 }
  232         }
  233 }
  234 
  235 static int get_phy_type(struct ece_softc *sc)
  236 {
  237         uint16_t phy0_id = 0, phy1_id = 0;
  238 
  239         /*
  240          * Use SMI (MDC/MDIO) to read Link Partner's PHY Identifier
  241          * Register 1.
  242          */
  243         phy0_id = phy_read(sc, 0, 0x2);
  244         phy1_id = phy_read(sc, 1, 0x2);
  245 
  246         if ((phy0_id == 0xFFFF) && (phy1_id == 0x000F))
  247                 return (ASIX_GIGA_PHY);
  248         else if ((phy0_id == 0x0243) && (phy1_id == 0x0243))
  249                 return (TWO_SINGLE_PHY);
  250         else if ((phy0_id == 0xFFFF) && (phy1_id == 0x0007))
  251                 return (VSC8601_GIGA_PHY);
  252         else if ((phy0_id == 0x0243) && (phy1_id == 0xFFFF))
  253                 return (IC_PLUS_PHY);
  254 
  255         return (NOT_FOUND_PHY);
  256 }
  257 
  258 static int
  259 ece_probe(device_t dev)
  260 {
  261 
  262         device_set_desc(dev, "Econa Ethernet Controller");
  263         return (0);
  264 }
  265 
  266 
  267 static int
  268 ece_attach(device_t dev)
  269 {
  270         struct ece_softc *sc;
  271         struct ifnet *ifp = NULL;
  272         struct sysctl_ctx_list *sctx;
  273         struct sysctl_oid *soid;
  274         u_char eaddr[ETHER_ADDR_LEN];
  275         int err;
  276         int i, rid;
  277         uint32_t rnd;
  278 
  279         err = 0;
  280 
  281         sc = device_get_softc(dev);
  282 
  283         sc->dev = dev;
  284 
  285         rid = 0;
  286         sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
  287                     RF_ACTIVE);
  288         if (sc->mem_res == NULL)
  289                 goto out;
  290 
  291         power_on_network_interface();
  292 
  293         rid = 0;
  294         sc->irq_res_status = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
  295             RF_ACTIVE);
  296         if (sc->irq_res_status == NULL)
  297                 goto out;
  298 
  299         rid = 1;
  300         /*TSTC: Fm-Switch-Tx-Complete*/
  301         sc->irq_res_tx = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
  302             RF_ACTIVE);
  303         if (sc->irq_res_tx == NULL)
  304                 goto out;
  305 
  306         rid = 2;
  307         /*FSRC: Fm-Switch-Rx-Complete*/
  308         sc->irq_res_rec = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
  309             RF_ACTIVE);
  310         if (sc->irq_res_rec == NULL)
  311                 goto out;
  312 
  313         rid = 4;
  314         /*FSQF: Fm-Switch-Queue-Full*/
  315         sc->irq_res_qf = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
  316             RF_ACTIVE);
  317         if (sc->irq_res_qf == NULL)
  318                 goto out;
  319 
  320         err = ece_activate(dev);
  321         if (err)
  322                 goto out;
  323 
  324         /* Sysctls */
  325         sctx = device_get_sysctl_ctx(dev);
  326         soid = device_get_sysctl_tree(dev);
  327 
  328         ECE_LOCK_INIT(sc);
  329 
  330         callout_init_mtx(&sc->tick_ch, &sc->sc_mtx, 0);
  331 
  332         if ((err = ece_get_mac(sc, eaddr)) != 0) {
  333                 /* No MAC address configured. Generate the random one. */
  334                 if (bootverbose)
  335                         device_printf(dev,
  336                             "Generating random ethernet address.\n");
  337                 rnd = arc4random();
  338 
  339                 /*from if_ae.c/if_ate.c*/
  340                 /*
  341                  * Set OUI to convenient locally assigned address. 'b'
  342                  * is 0x62, which has the locally assigned bit set, and
  343                  * the broadcast/multicast bit clear.
  344                  */
  345                 eaddr[0] = 'b';
  346                 eaddr[1] = 's';
  347                 eaddr[2] = 'd';
  348                 eaddr[3] = (rnd >> 16) & 0xff;
  349                 eaddr[4] = (rnd >> 8) & 0xff;
  350                 eaddr[5] = rnd & 0xff;
  351 
  352                 for (i = 0; i < ETHER_ADDR_LEN; i++)
  353                         eaddr[i] = vlan0_mac[i];
  354         }
  355         ece_set_mac(sc, eaddr);
  356         sc->ifp = ifp = if_alloc(IFT_ETHER);
  357         /* Only one PHY at address 0 in this device. */
  358         err = mii_attach(dev, &sc->miibus, ifp, ece_ifmedia_upd,
  359             ece_ifmedia_sts, BMSR_DEFCAPMASK, 0, MII_OFFSET_ANY, 0);
  360         if (err != 0) {
  361                 device_printf(dev, "attaching PHYs failed\n");
  362                 goto out;
  363         }
  364         ifp->if_softc = sc;
  365         if_initname(ifp, device_get_name(dev), device_get_unit(dev));
  366         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
  367 
  368         ifp->if_capabilities = IFCAP_HWCSUM;
  369 
  370         ifp->if_hwassist = (CSUM_IP | CSUM_TCP | CSUM_UDP);
  371         ifp->if_capenable = ifp->if_capabilities;
  372         ifp->if_start = ecestart;
  373         ifp->if_ioctl = eceioctl;
  374         ifp->if_init = eceinit;
  375         ifp->if_snd.ifq_drv_maxlen = ECE_MAX_TX_BUFFERS - 1;
  376         IFQ_SET_MAXLEN(&ifp->if_snd, ECE_MAX_TX_BUFFERS - 1);
  377         IFQ_SET_READY(&ifp->if_snd);
  378 
  379         /* Create local taskq. */
  380 
  381         TASK_INIT(&sc->sc_intr_task, 0, ece_intr_task, sc);
  382         TASK_INIT(&sc->sc_tx_task, 1, ece_tx_task, ifp);
  383         TASK_INIT(&sc->sc_cleanup_task, 2, ece_cleanup_task, sc);
  384         sc->sc_tq = taskqueue_create_fast("ece_taskq", M_WAITOK,
  385             taskqueue_thread_enqueue,
  386             &sc->sc_tq);
  387         if (sc->sc_tq == NULL) {
  388                 device_printf(sc->dev, "could not create taskqueue\n");
  389                 goto out;
  390         }
  391 
  392         ether_ifattach(ifp, eaddr);
  393 
  394         /*
  395          * Activate interrupts
  396          */
  397         err = bus_setup_intr(dev, sc->irq_res_rec, INTR_TYPE_NET | INTR_MPSAFE,
  398             NULL, ece_intr, sc, &sc->intrhand);
  399         if (err) {
  400                 ether_ifdetach(ifp);
  401                 ECE_LOCK_DESTROY(sc);
  402                 goto out;
  403         }
  404 
  405         err = bus_setup_intr(dev, sc->irq_res_status,
  406             INTR_TYPE_NET | INTR_MPSAFE,
  407             NULL, ece_intr_status, sc, &sc->intrhand_status);
  408         if (err) {
  409                 ether_ifdetach(ifp);
  410                 ECE_LOCK_DESTROY(sc);
  411                 goto out;
  412         }
  413 
  414         err = bus_setup_intr(dev, sc->irq_res_qf, INTR_TYPE_NET | INTR_MPSAFE,
  415             NULL,ece_intr_qf, sc, &sc->intrhand_qf);
  416 
  417         if (err) {
  418                 ether_ifdetach(ifp);
  419                 ECE_LOCK_DESTROY(sc);
  420                 goto out;
  421         }
  422 
  423         err = bus_setup_intr(dev, sc->irq_res_tx, INTR_TYPE_NET | INTR_MPSAFE,
  424             NULL, ece_intr_tx, sc, &sc->intrhand_tx);
  425 
  426         if (err) {
  427                 ether_ifdetach(ifp);
  428                 ECE_LOCK_DESTROY(sc);
  429                 goto out;
  430         }
  431 
  432         ECE_TXLOCK_INIT(sc);
  433         ECE_RXLOCK_INIT(sc);
  434         ECE_CLEANUPLOCK_INIT(sc);
  435 
  436         /* Enable all interrupt sources. */
  437         write_4(sc, INTERRUPT_MASK, 0x00000000);
  438 
  439         /* Enable port 0. */
  440         write_4(sc, PORT_0_CONFIG, read_4(sc, PORT_0_CONFIG) & ~(PORT_DISABLE));
  441 
  442         taskqueue_start_threads(&sc->sc_tq, 1, PI_NET, "%s taskq",
  443             device_get_nameunit(sc->dev));
  444 
  445 out:
  446         if (err)
  447                 ece_deactivate(dev);
  448         if (err && ifp)
  449                 if_free(ifp);
  450         return (err);
  451 }
  452 
  453 static int
  454 ece_detach(device_t dev)
  455 {
  456         struct ece_softc *sc = device_get_softc(dev);
  457         struct ifnet *ifp = sc->ifp;
  458 
  459         ecestop(sc);
  460         if (ifp != NULL) {
  461                 ether_ifdetach(ifp);
  462                 if_free(ifp);
  463         }
  464         ece_deactivate(dev);
  465         return (0);
  466 }
  467 
  468 static void
  469 ece_getaddr(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
  470 {
  471         u_int32_t *paddr;
  472         KASSERT(nsegs == 1, ("wrong number of segments, should be 1"));
  473         paddr = arg;
  474         *paddr = segs->ds_addr;
  475 }
  476 
  477 static int
  478 ece_alloc_desc_dma_tx(struct ece_softc *sc)
  479 {
  480         int i;
  481         int error;
  482 
  483         /* Allocate a busdma tag and DMA safe memory for TX/RX descriptors. */
  484         error = bus_dma_tag_create(sc->sc_parent_tag,   /* parent */
  485             16, 0, /* alignment, boundary */
  486             BUS_SPACE_MAXADDR_32BIT,    /* lowaddr */
  487             BUS_SPACE_MAXADDR,  /* highaddr */
  488             NULL, NULL, /* filtfunc, filtfuncarg */
  489             sizeof(eth_tx_desc_t)*ECE_MAX_TX_BUFFERS, /* max size */
  490             1, /*nsegments */
  491             sizeof(eth_tx_desc_t)*ECE_MAX_TX_BUFFERS,
  492             0, /* flags */
  493             NULL, NULL, /* lockfunc, lockfuncarg */
  494             &sc->dmatag_data_tx); /* dmat */
  495 
  496         /* Allocate memory for TX ring. */
  497         error = bus_dmamem_alloc(sc->dmatag_data_tx,
  498             (void**)&(sc->desc_tx),
  499             BUS_DMA_NOWAIT | BUS_DMA_ZERO |
  500             BUS_DMA_COHERENT,
  501             &(sc->dmamap_ring_tx));
  502 
  503         if (error) {
  504                 if_printf(sc->ifp, "failed to allocate DMA memory\n");
  505                 bus_dma_tag_destroy(sc->dmatag_data_tx);
  506                 sc->dmatag_data_tx = 0;
  507                 return (ENXIO);
  508         }
  509 
  510         /* Load Ring DMA. */
  511         error = bus_dmamap_load(sc->dmatag_data_tx, sc->dmamap_ring_tx,
  512             sc->desc_tx,
  513             sizeof(eth_tx_desc_t)*ECE_MAX_TX_BUFFERS,
  514             ece_getaddr,
  515             &(sc->ring_paddr_tx), BUS_DMA_NOWAIT);
  516 
  517         if (error) {
  518                 if_printf(sc->ifp, "can't load descriptor\n");
  519                 bus_dmamem_free(sc->dmatag_data_tx, sc->desc_tx,
  520                     sc->dmamap_ring_tx);
  521                 sc->desc_tx = NULL;
  522                 bus_dma_tag_destroy(sc->dmatag_data_tx);
  523                 sc->dmatag_data_tx = 0;
  524                 return (ENXIO);
  525         }
  526 
  527         /* Allocate a busdma tag for mbufs. Alignment is 2 bytes */
  528         error = bus_dma_tag_create(sc->sc_parent_tag,   /* parent */
  529             1, 0,                       /* alignment, boundary */
  530             BUS_SPACE_MAXADDR_32BIT,    /* lowaddr */
  531             BUS_SPACE_MAXADDR,          /* highaddr */
  532             NULL, NULL,         /* filtfunc, filtfuncarg */
  533            MCLBYTES*MAX_FRAGMENT,       /* maxsize */
  534            MAX_FRAGMENT,                 /* nsegments */
  535             MCLBYTES, 0,                /* maxsegsz, flags */
  536             NULL, NULL,         /* lockfunc, lockfuncarg */
  537             &sc->dmatag_ring_tx);       /* dmat */
  538 
  539         if (error) {
  540                 if_printf(sc->ifp, "failed to create busdma tag for mbufs\n");
  541                 return (ENXIO);
  542         }
  543 
  544         for (i = 0; i < ECE_MAX_TX_BUFFERS; i++) {
  545                 /* Create dma map for each descriptor. */
  546                 error = bus_dmamap_create(sc->dmatag_ring_tx, 0,
  547                     &(sc->tx_desc[i].dmamap));
  548                 if (error) {
  549                         if_printf(sc->ifp, "failed to create map for mbuf\n");
  550                         return (ENXIO);
  551                 }
  552         }
  553         return (0);
  554 }
  555 
  556 static void
  557 ece_free_desc_dma_tx(struct ece_softc *sc)
  558 {
  559         int i;
  560 
  561         for (i = 0; i < ECE_MAX_TX_BUFFERS; i++) {
  562                 if (sc->tx_desc[i].buff) {
  563                         m_freem(sc->tx_desc[i].buff);
  564                         sc->tx_desc[i].buff= 0;
  565                 }
  566         }
  567 
  568         if (sc->dmamap_ring_tx) {
  569                 bus_dmamap_unload(sc->dmatag_data_tx, sc->dmamap_ring_tx);
  570                 if (sc->desc_tx) {
  571                         bus_dmamem_free(sc->dmatag_data_tx,
  572                             sc->desc_tx, sc->dmamap_ring_tx);
  573                 }
  574                 sc->dmamap_ring_tx = 0;
  575         }
  576 
  577         if (sc->dmatag_data_tx) {
  578                 bus_dma_tag_destroy(sc->dmatag_data_tx);
  579                 sc->dmatag_data_tx = 0;
  580         }
  581 
  582         if (sc->dmatag_ring_tx) {
  583                 for (i = 0; i<ECE_MAX_TX_BUFFERS; i++) {
  584                         bus_dmamap_destroy(sc->dmatag_ring_tx,
  585                             sc->tx_desc[i].dmamap);
  586                         sc->tx_desc[i].dmamap = 0;
  587                 }
  588                 bus_dma_tag_destroy(sc->dmatag_ring_tx);
  589                 sc->dmatag_ring_tx = 0;
  590         }
  591 }
  592 
  593 static int
  594 ece_alloc_desc_dma_rx(struct ece_softc *sc)
  595 {
  596         int error;
  597         int i;
  598 
  599         /* Allocate a busdma tag and DMA safe memory for RX descriptors. */
  600         error = bus_dma_tag_create(sc->sc_parent_tag,   /* parent */
  601             16, 0,                      /* alignment, boundary */
  602             BUS_SPACE_MAXADDR_32BIT,    /* lowaddr */
  603             BUS_SPACE_MAXADDR,          /* highaddr */
  604             NULL, NULL,         /* filtfunc, filtfuncarg */
  605             /* maxsize, nsegments */
  606             sizeof(eth_rx_desc_t)*ECE_MAX_RX_BUFFERS, 1,
  607             /* maxsegsz, flags */
  608             sizeof(eth_rx_desc_t)*ECE_MAX_RX_BUFFERS, 0,
  609             NULL, NULL,         /* lockfunc, lockfuncarg */
  610             &sc->dmatag_data_rx);       /* dmat */
  611 
  612         /* Allocate RX ring. */
  613         error = bus_dmamem_alloc(sc->dmatag_data_rx,
  614             (void**)&(sc->desc_rx),
  615             BUS_DMA_NOWAIT | BUS_DMA_ZERO |
  616             BUS_DMA_COHERENT,
  617             &(sc->dmamap_ring_rx));
  618 
  619         if (error) {
  620                 if_printf(sc->ifp, "failed to allocate DMA memory\n");
  621                 return (ENXIO);
  622         }
  623 
  624         /* Load dmamap. */
  625         error = bus_dmamap_load(sc->dmatag_data_rx, sc->dmamap_ring_rx,
  626             sc->desc_rx,
  627             sizeof(eth_rx_desc_t)*ECE_MAX_RX_BUFFERS,
  628             ece_getaddr,
  629             &(sc->ring_paddr_rx), BUS_DMA_NOWAIT);
  630 
  631         if (error) {
  632                 if_printf(sc->ifp, "can't load descriptor\n");
  633                 bus_dmamem_free(sc->dmatag_data_rx, sc->desc_rx,
  634                     sc->dmamap_ring_rx);
  635                 bus_dma_tag_destroy(sc->dmatag_data_rx);
  636                 sc->desc_rx = NULL;
  637                 return (ENXIO);
  638         }
  639 
  640         /* Allocate a busdma tag for mbufs. */
  641         error = bus_dma_tag_create(sc->sc_parent_tag,/* parent */
  642             16, 0,                      /* alignment, boundary */
  643             BUS_SPACE_MAXADDR_32BIT,    /* lowaddr */
  644             BUS_SPACE_MAXADDR,          /* highaddr */
  645             NULL, NULL,         /* filtfunc, filtfuncarg */
  646             MCLBYTES, 1,                /* maxsize, nsegments */
  647             MCLBYTES, 0,                /* maxsegsz, flags */
  648             NULL, NULL,         /* lockfunc, lockfuncarg */
  649             &sc->dmatag_ring_rx);       /* dmat */
  650 
  651         if (error) {
  652                 if_printf(sc->ifp, "failed to create busdma tag for mbufs\n");
  653                 return (ENXIO);
  654         }
  655 
  656         for (i = 0; i<ECE_MAX_RX_BUFFERS; i++) {
  657                 error = bus_dmamap_create(sc->dmatag_ring_rx, 0,
  658                     &sc->rx_desc[i].dmamap);
  659                 if (error) {
  660                         if_printf(sc->ifp, "failed to create map for mbuf\n");
  661                         return (ENXIO);
  662                 }
  663         }
  664 
  665         error = bus_dmamap_create(sc->dmatag_ring_rx, 0, &sc->rx_sparemap);
  666         if (error) {
  667                 if_printf(sc->ifp, "failed to create spare map\n");
  668                 return (ENXIO);
  669         }
  670 
  671         return (0);
  672 }
  673 
  674 static void
  675 ece_free_desc_dma_rx(struct ece_softc *sc)
  676 {
  677         int i;
  678 
  679         for (i = 0; i < ECE_MAX_RX_BUFFERS; i++) {
  680                 if (sc->rx_desc[i].buff) {
  681                         m_freem(sc->rx_desc[i].buff);
  682                         sc->rx_desc[i].buff= 0;
  683                 }
  684         }
  685 
  686         if (sc->dmatag_data_rx) {
  687                 bus_dmamap_unload(sc->dmatag_data_rx, sc->dmamap_ring_rx);
  688                 bus_dmamem_free(sc->dmatag_data_rx, sc->desc_rx,
  689                     sc->dmamap_ring_rx);
  690                 bus_dma_tag_destroy(sc->dmatag_data_rx);
  691                 sc->dmatag_data_rx = 0;
  692                 sc->dmamap_ring_rx = 0;
  693                 sc->desc_rx = 0;
  694         }
  695 
  696         if (sc->dmatag_ring_rx) {
  697                 for (i = 0; i < ECE_MAX_RX_BUFFERS; i++)
  698                         bus_dmamap_destroy(sc->dmatag_ring_rx,
  699                             sc->rx_desc[i].dmamap);
  700                 bus_dmamap_destroy(sc->dmatag_ring_rx, sc->rx_sparemap);
  701                 bus_dma_tag_destroy(sc->dmatag_ring_rx);
  702                 sc->dmatag_ring_rx = 0;
  703         }
  704 }
  705 
  706 static int
  707 ece_new_rxbuf(struct ece_softc *sc, struct rx_desc_info* descinfo)
  708 {
  709         struct mbuf *new_mbuf;
  710         bus_dma_segment_t seg[1];
  711         bus_dmamap_t map;
  712         int error;
  713         int nsegs;
  714         bus_dma_tag_t tag;
  715 
  716         tag = sc->dmatag_ring_rx;
  717 
  718         new_mbuf = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
  719 
  720         if (new_mbuf == NULL)
  721                 return (ENOBUFS);
  722 
  723         new_mbuf->m_len = new_mbuf->m_pkthdr.len = MCLBYTES;
  724 
  725         error = bus_dmamap_load_mbuf_sg(tag, sc->rx_sparemap, new_mbuf,
  726             seg, &nsegs, BUS_DMA_NOWAIT);
  727 
  728         KASSERT(nsegs == 1, ("Too many segments returned!"));
  729 
  730         if (nsegs != 1 || error) {
  731                 m_free(new_mbuf);
  732                 return (ENOBUFS);
  733         }
  734 
  735         if (descinfo->buff != NULL) {
  736                 bus_dmamap_sync(tag, descinfo->dmamap, BUS_DMASYNC_POSTREAD);
  737                 bus_dmamap_unload(tag, descinfo->dmamap);
  738         }
  739 
  740         map = descinfo->dmamap;
  741         descinfo->dmamap = sc->rx_sparemap;
  742         sc->rx_sparemap = map;
  743 
  744         bus_dmamap_sync(tag, descinfo->dmamap, BUS_DMASYNC_PREREAD);
  745 
  746         descinfo->buff = new_mbuf;
  747         descinfo->desc->data_ptr = seg->ds_addr;
  748         descinfo->desc->length = seg->ds_len - 2;
  749 
  750         return (0);
  751 }
  752 
  753 static int
  754 ece_allocate_dma(struct ece_softc *sc)
  755 {
  756         eth_tx_desc_t *desctx;
  757         eth_rx_desc_t *descrx;
  758         int i;
  759         int error;
  760 
  761         /* Create parent tag for tx and rx */
  762         error = bus_dma_tag_create(
  763             bus_get_dma_tag(sc->dev),/* parent */
  764             1, 0,               /* alignment, boundary */
  765             BUS_SPACE_MAXADDR,  /* lowaddr */
  766             BUS_SPACE_MAXADDR,  /* highaddr */
  767             NULL, NULL, /* filter, filterarg */
  768             BUS_SPACE_MAXSIZE_32BIT, 0,/* maxsize, nsegments */
  769             BUS_SPACE_MAXSIZE_32BIT,    /* maxsegsize */
  770             0,                  /* flags */
  771             NULL, NULL, /* lockfunc, lockarg */
  772             &sc->sc_parent_tag);
  773 
  774         ece_alloc_desc_dma_tx(sc);
  775 
  776         for (i = 0; i < ECE_MAX_TX_BUFFERS; i++) {
  777                 desctx = (eth_tx_desc_t *)(&sc->desc_tx[i]);
  778                 memset(desctx, 0, sizeof(eth_tx_desc_t));
  779                 desctx->length = MAX_PACKET_LEN;
  780                 desctx->cown = 1;
  781                 if (i == ECE_MAX_TX_BUFFERS - 1)
  782                         desctx->eor = 1;
  783         }
  784 
  785         ece_alloc_desc_dma_rx(sc);
  786 
  787         for (i = 0; i < ECE_MAX_RX_BUFFERS; i++) {
  788                 descrx = &(sc->desc_rx[i]);
  789                 memset(descrx, 0, sizeof(eth_rx_desc_t));
  790                 sc->rx_desc[i].desc = descrx;
  791                 sc->rx_desc[i].buff = 0;
  792                 ece_new_rxbuf(sc, &(sc->rx_desc[i]));
  793 
  794                 if (i == ECE_MAX_RX_BUFFERS - 1)
  795                         descrx->eor = 1;
  796         }
  797         sc->tx_prod = 0;
  798         sc->tx_cons = 0;
  799         sc->last_rx = 0;
  800         sc->desc_curr_tx = 0;
  801 
  802         return (0);
  803 }
  804 
  805 static int
  806 ece_activate(device_t dev)
  807 {
  808         struct ece_softc *sc;
  809         int err;
  810         uint32_t mac_port_config;
  811         struct ifnet *ifp;
  812 
  813         sc = device_get_softc(dev);
  814         ifp = sc->ifp;
  815 
  816         initial_switch_config = read_4(sc, SWITCH_CONFIG);
  817         initial_cpu_config = read_4(sc, CPU_PORT_CONFIG);
  818         initial_port0_config = read_4(sc, MAC_PORT_0_CONFIG);
  819         initial_port1_config = read_4(sc, MAC_PORT_1_CONFIG);
  820 
  821         /* Disable Port 0 */
  822         mac_port_config = read_4(sc, MAC_PORT_0_CONFIG);
  823         mac_port_config |= (PORT_DISABLE);
  824         write_4(sc, MAC_PORT_0_CONFIG, mac_port_config);
  825 
  826         /* Disable Port 1 */
  827         mac_port_config = read_4(sc, MAC_PORT_1_CONFIG);
  828         mac_port_config |= (PORT_DISABLE);
  829         write_4(sc, MAC_PORT_1_CONFIG, mac_port_config);
  830 
  831         err = ece_allocate_dma(sc);
  832         if (err) {
  833                 if_printf(sc->ifp, "failed allocating dma\n");
  834                 goto out;
  835         }
  836 
  837         write_4(sc, TS_DESCRIPTOR_POINTER, sc->ring_paddr_tx);
  838         write_4(sc, TS_DESCRIPTOR_BASE_ADDR, sc->ring_paddr_tx);
  839 
  840         write_4(sc, FS_DESCRIPTOR_POINTER, sc->ring_paddr_rx);
  841         write_4(sc, FS_DESCRIPTOR_BASE_ADDR, sc->ring_paddr_rx);
  842 
  843         write_4(sc, FS_DMA_CONTROL, 1);
  844 
  845         return (0);
  846 out:
  847         return (ENXIO);
  848 
  849 }
  850 
  851 static void
  852 ece_deactivate(device_t dev)
  853 {
  854         struct ece_softc *sc;
  855 
  856         sc = device_get_softc(dev);
  857 
  858         if (sc->intrhand)
  859                 bus_teardown_intr(dev, sc->irq_res_rec, sc->intrhand);
  860 
  861         sc->intrhand = 0;
  862 
  863         if (sc->intrhand_qf)
  864                 bus_teardown_intr(dev, sc->irq_res_qf, sc->intrhand_qf);
  865 
  866         sc->intrhand_qf = 0;
  867 
  868         bus_generic_detach(sc->dev);
  869         if (sc->miibus)
  870                 device_delete_child(sc->dev, sc->miibus);
  871         if (sc->mem_res)
  872                 bus_release_resource(dev, SYS_RES_IOPORT,
  873                     rman_get_rid(sc->mem_res), sc->mem_res);
  874         sc->mem_res = 0;
  875 
  876         if (sc->irq_res_rec)
  877                 bus_release_resource(dev, SYS_RES_IRQ,
  878                     rman_get_rid(sc->irq_res_rec), sc->irq_res_rec);
  879 
  880         if (sc->irq_res_qf)
  881                 bus_release_resource(dev, SYS_RES_IRQ,
  882                     rman_get_rid(sc->irq_res_qf), sc->irq_res_qf);
  883 
  884         if (sc->irq_res_qf)
  885                 bus_release_resource(dev, SYS_RES_IRQ,
  886                     rman_get_rid(sc->irq_res_status), sc->irq_res_status);
  887 
  888         sc->irq_res_rec = 0;
  889         sc->irq_res_qf = 0;
  890         sc->irq_res_status = 0;
  891         ECE_TXLOCK_DESTROY(sc);
  892         ECE_RXLOCK_DESTROY(sc);
  893 
  894         ece_free_desc_dma_tx(sc);
  895         ece_free_desc_dma_rx(sc);
  896 
  897         return;
  898 }
  899 
  900 /*
  901  * Change media according to request.
  902  */
  903 static int
  904 ece_ifmedia_upd(struct ifnet *ifp)
  905 {
  906         struct ece_softc *sc = ifp->if_softc;
  907         struct mii_data *mii;
  908         int error;
  909 
  910         mii = device_get_softc(sc->miibus);
  911         ECE_LOCK(sc);
  912         error = mii_mediachg(mii);
  913         ECE_UNLOCK(sc);
  914         return (error);
  915 }
  916 
  917 /*
  918  * Notify the world which media we're using.
  919  */
  920 static void
  921 ece_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
  922 {
  923         struct ece_softc *sc = ifp->if_softc;
  924         struct mii_data *mii;
  925 
  926         mii = device_get_softc(sc->miibus);
  927         ECE_LOCK(sc);
  928         mii_pollstat(mii);
  929         ifmr->ifm_active = mii->mii_media_active;
  930         ifmr->ifm_status = mii->mii_media_status;
  931         ECE_UNLOCK(sc);
  932 }
  933 
  934 static void
  935 ece_tick(void *xsc)
  936 {
  937         struct ece_softc *sc = xsc;
  938         struct mii_data *mii;
  939         int active;
  940 
  941         mii = device_get_softc(sc->miibus);
  942         active = mii->mii_media_active;
  943         mii_tick(mii);
  944 
  945         /*
  946          * Schedule another timeout one second from now.
  947          */
  948         callout_reset(&sc->tick_ch, hz, ece_tick, sc);
  949 }
  950 
  951 static uint32_t
  952 read_mac_entry(struct ece_softc *ec,
  953     uint8_t *mac_result,
  954     int first)
  955 {
  956         uint32_t ii;
  957         struct arl_table_entry_t entry;
  958         uint32_t *entry_val;
  959         write_4(ec, ARL_TABLE_ACCESS_CONTROL_0, 0);
  960         write_4(ec, ARL_TABLE_ACCESS_CONTROL_1, 0);
  961         write_4(ec, ARL_TABLE_ACCESS_CONTROL_2, 0);
  962         if (first)
  963                 write_4(ec, ARL_TABLE_ACCESS_CONTROL_0, 0x1);
  964         else
  965                 write_4(ec, ARL_TABLE_ACCESS_CONTROL_0, 0x2);
  966 
  967         for (ii = 0; ii < 0x1000; ii++)
  968                 if (read_4(ec, ARL_TABLE_ACCESS_CONTROL_1) & (0x1))
  969                         break;
  970 
  971         entry_val = (uint32_t*) (&entry);
  972         entry_val[0] = read_4(ec, ARL_TABLE_ACCESS_CONTROL_1);
  973         entry_val[1] = read_4(ec, ARL_TABLE_ACCESS_CONTROL_2);
  974 
  975         if (mac_result)
  976                 memcpy(mac_result, entry.mac_addr, ETHER_ADDR_LEN);
  977 
  978         return (entry.table_end);
  979 }
  980 
  981 static uint32_t
  982 write_arl_table_entry(struct ece_softc *ec,
  983     uint32_t filter,
  984     uint32_t vlan_mac,
  985     uint32_t vlan_gid,
  986     uint32_t age_field,
  987     uint32_t port_map,
  988     const uint8_t *mac_addr)
  989 {
  990         uint32_t ii;
  991         uint32_t *entry_val;
  992         struct arl_table_entry_t entry;
  993 
  994         memset(&entry, 0, sizeof(entry));
  995 
  996         entry.filter = filter;
  997         entry.vlan_mac = vlan_mac;
  998         entry.vlan_gid = vlan_gid;
  999         entry.age_field = age_field;
 1000         entry.port_map = port_map;
 1001         memcpy(entry.mac_addr, mac_addr, ETHER_ADDR_LEN);
 1002 
 1003         entry_val = (uint32_t*) (&entry);
 1004 
 1005         write_4(ec, ARL_TABLE_ACCESS_CONTROL_0, 0);
 1006         write_4(ec, ARL_TABLE_ACCESS_CONTROL_1, 0);
 1007         write_4(ec, ARL_TABLE_ACCESS_CONTROL_2, 0);
 1008 
 1009         write_4(ec, ARL_TABLE_ACCESS_CONTROL_1, entry_val[0]);
 1010         write_4(ec, ARL_TABLE_ACCESS_CONTROL_2, entry_val[1]);
 1011 
 1012         write_4(ec, ARL_TABLE_ACCESS_CONTROL_0, ARL_WRITE_COMMAND);
 1013 
 1014         for (ii = 0; ii < 0x1000; ii++)
 1015                 if (read_4(ec, ARL_TABLE_ACCESS_CONTROL_1) &
 1016                     ARL_COMMAND_COMPLETE)
 1017                         return (1); /* Write OK. */
 1018 
 1019         /* Write failed. */
 1020         return (0);
 1021 }
 1022 
 1023 static void
 1024 remove_mac_entry(struct ece_softc *sc,
 1025     uint8_t *mac)
 1026 {
 1027 
 1028         /* Invalid age_field mean erase this entry. */
 1029         write_arl_table_entry(sc, 0, 1, VLAN0_GROUP_ID,
 1030             INVALID_ENTRY, VLAN0_GROUP,
 1031             mac);
 1032 }
 1033 
 1034 static void
 1035 add_mac_entry(struct ece_softc *sc,
 1036     uint8_t *mac)
 1037 {
 1038 
 1039         write_arl_table_entry(sc, 0, 1, VLAN0_GROUP_ID,
 1040             NEW_ENTRY, VLAN0_GROUP,
 1041             mac);
 1042 }
 1043 
 1044 /**
 1045  * The behavior of ARL table reading and deletion is not well defined
 1046  * in the documentation. To be safe, all mac addresses are put to a
 1047  * list, then deleted.
 1048  *
 1049  */
 1050 static void
 1051 clear_mac_entries(struct ece_softc *ec, int include_this_mac)
 1052 {
 1053         int table_end;
 1054         struct mac_list * temp;
 1055         struct mac_list * mac_list_header;
 1056         struct mac_list * current;
 1057         char mac[ETHER_ADDR_LEN];
 1058 
 1059         current = 0;
 1060         mac_list_header = 0;
 1061 
 1062         table_end = read_mac_entry(ec, mac, 1);
 1063         while (!table_end) {
 1064                 if (!include_this_mac &&
 1065                     memcmp(mac, vlan0_mac, ETHER_ADDR_LEN) == 0) {
 1066                         /* Read next entry. */
 1067                         table_end = read_mac_entry(ec, mac, 0);
 1068                         continue;
 1069                 }
 1070 
 1071                 temp = (struct mac_list*)malloc(sizeof(struct mac_list),
 1072                     M_DEVBUF,
 1073                     M_NOWAIT | M_ZERO);
 1074                 memcpy(temp->mac_addr, mac, ETHER_ADDR_LEN);
 1075                 temp->next = 0;
 1076                 if (mac_list_header) {
 1077                         current->next = temp;
 1078                         current = temp;
 1079                 } else {
 1080                         mac_list_header = temp;
 1081                         current = temp;
 1082                 }
 1083                 /* Read next Entry */
 1084                 table_end = read_mac_entry(ec, mac, 0);
 1085         }
 1086 
 1087         current = mac_list_header;
 1088 
 1089         while (current) {
 1090                 remove_mac_entry(ec, current->mac_addr);
 1091                 temp = current;
 1092                 current = current->next;
 1093                 free(temp, M_DEVBUF);
 1094         }
 1095 }
 1096 
 1097 static int
 1098 configure_lan_port(struct ece_softc *sc, int phy_type)
 1099 {
 1100         uint32_t sw_config;
 1101         uint32_t mac_port_config;
 1102 
 1103         /*
 1104          * Configure switch
 1105          */
 1106         sw_config = read_4(sc, SWITCH_CONFIG);
 1107         /* Enable fast aging. */
 1108         sw_config |= FAST_AGING;
 1109         /* Enable IVL learning. */
 1110         sw_config |= IVL_LEARNING;
 1111         /* Disable hardware NAT. */
 1112         sw_config &= ~(HARDWARE_NAT);
 1113 
 1114         sw_config |= SKIP_L2_LOOKUP_PORT_0 | SKIP_L2_LOOKUP_PORT_1| NIC_MODE;
 1115 
 1116         write_4(sc, SWITCH_CONFIG, sw_config);
 1117 
 1118         sw_config = read_4(sc, SWITCH_CONFIG);
 1119 
 1120         mac_port_config = read_4(sc, MAC_PORT_0_CONFIG);
 1121 
 1122         if (!(mac_port_config & 0x1) || (mac_port_config & 0x2))
 1123                 if_printf(sc->ifp, "Link Down\n");
 1124         else
 1125                 write_4(sc, MAC_PORT_0_CONFIG, mac_port_config);
 1126         return (0);
 1127 }
 1128 
 1129 static void
 1130 set_pvid(struct ece_softc *sc, int port0, int port1, int cpu)
 1131 {
 1132         uint32_t val;
 1133         val = read_4(sc, VLAN_PORT_PVID) & (~(0x7 << 0));
 1134         write_4(sc, VLAN_PORT_PVID, val);
 1135         val = read_4(sc, VLAN_PORT_PVID) | ((port0) & 0x07);
 1136         write_4(sc, VLAN_PORT_PVID, val);
 1137         val = read_4(sc, VLAN_PORT_PVID) & (~(0x7 << 4));
 1138         write_4(sc, VLAN_PORT_PVID, val);
 1139         val = read_4(sc, VLAN_PORT_PVID) | (((port1) & 0x07) << 4);
 1140         write_4(sc, VLAN_PORT_PVID, val);
 1141 
 1142         val = read_4(sc, VLAN_PORT_PVID) & (~(0x7 << 8));
 1143         write_4(sc, VLAN_PORT_PVID, val);
 1144         val = read_4(sc, VLAN_PORT_PVID) | (((cpu) & 0x07) << 8);
 1145         write_4(sc, VLAN_PORT_PVID, val);
 1146 
 1147 }
 1148 
 1149 /* VLAN related functions */
 1150 static void
 1151 set_vlan_vid(struct ece_softc *sc, int vlan)
 1152 {
 1153         const uint32_t regs[] = {
 1154             VLAN_VID_0_1,
 1155             VLAN_VID_0_1,
 1156             VLAN_VID_2_3,
 1157             VLAN_VID_2_3,
 1158             VLAN_VID_4_5,
 1159             VLAN_VID_4_5,
 1160             VLAN_VID_6_7,
 1161             VLAN_VID_6_7
 1162         };
 1163 
 1164         const int vids[] = {
 1165             VLAN0_VID,
 1166             VLAN1_VID,
 1167             VLAN2_VID,
 1168             VLAN3_VID,
 1169             VLAN4_VID,
 1170             VLAN5_VID,
 1171             VLAN6_VID,
 1172             VLAN7_VID
 1173         };
 1174 
 1175         uint32_t val;
 1176         uint32_t reg;
 1177         int vid;
 1178 
 1179         reg = regs[vlan];
 1180         vid = vids[vlan];
 1181 
 1182         if (vlan & 1) {
 1183                 val = read_4(sc, reg);
 1184                 write_4(sc, reg, val & (~(0xFFF << 0)));
 1185                 val = read_4(sc, reg);
 1186                 write_4(sc, reg, val|((vid & 0xFFF) << 0));
 1187         } else {
 1188                 val = read_4(sc, reg);
 1189                 write_4(sc, reg, val & (~(0xFFF << 12)));
 1190                 val = read_4(sc, reg);
 1191                 write_4(sc, reg, val|((vid & 0xFFF) << 12));
 1192         }
 1193 }
 1194 
 1195 static void
 1196 set_vlan_member(struct ece_softc *sc, int vlan)
 1197 {
 1198         unsigned char shift;
 1199         uint32_t val;
 1200         int group;
 1201         const int groups[] = {
 1202             VLAN0_GROUP,
 1203             VLAN1_GROUP,
 1204             VLAN2_GROUP,
 1205             VLAN3_GROUP,
 1206             VLAN4_GROUP,
 1207             VLAN5_GROUP,
 1208             VLAN6_GROUP,
 1209             VLAN7_GROUP
 1210         };
 1211 
 1212         group = groups[vlan];
 1213 
 1214         shift = vlan*3;
 1215         val = read_4(sc, VLAN_MEMBER_PORT_MAP) & (~(0x7 << shift));
 1216         write_4(sc, VLAN_MEMBER_PORT_MAP, val);
 1217         val = read_4(sc, VLAN_MEMBER_PORT_MAP);
 1218         write_4(sc, VLAN_MEMBER_PORT_MAP, val | ((group & 0x7) << shift));
 1219 }
 1220 
 1221 static void
 1222 set_vlan_tag(struct ece_softc *sc, int vlan)
 1223 {
 1224         unsigned char shift;
 1225         uint32_t val;
 1226 
 1227         int tag = 0;
 1228 
 1229         shift = vlan*3;
 1230         val = read_4(sc, VLAN_TAG_PORT_MAP) & (~(0x7 << shift));
 1231         write_4(sc, VLAN_TAG_PORT_MAP, val);
 1232         val = read_4(sc, VLAN_TAG_PORT_MAP);
 1233         write_4(sc, VLAN_TAG_PORT_MAP, val | ((tag & 0x7) << shift));
 1234 }
 1235 
 1236 static int
 1237 configure_cpu_port(struct ece_softc *sc)
 1238 {
 1239         uint32_t cpu_port_config;
 1240         int i;
 1241 
 1242         cpu_port_config = read_4(sc, CPU_PORT_CONFIG);
 1243         /* SA learning Disable */
 1244         cpu_port_config |= (SA_LEARNING_DISABLE);
 1245         /* set data offset + 2 */
 1246         cpu_port_config &= ~(1U << 31);
 1247 
 1248         write_4(sc, CPU_PORT_CONFIG, cpu_port_config);
 1249 
 1250         if (!write_arl_table_entry(sc, 0, 1, VLAN0_GROUP_ID,
 1251             STATIC_ENTRY, VLAN0_GROUP,
 1252             vlan0_mac))
 1253                 return (1);
 1254 
 1255         set_pvid(sc, PORT0_PVID, PORT1_PVID, CPU_PORT_PVID);
 1256 
 1257         for (i = 0; i < 8; i++) {
 1258                 set_vlan_vid(sc, i);
 1259                 set_vlan_member(sc, i);
 1260                 set_vlan_tag(sc, i);
 1261         }
 1262 
 1263         /* disable all interrupt status sources */
 1264         write_4(sc, INTERRUPT_MASK, 0xffff1fff);
 1265 
 1266         /* clear previous interrupt sources */
 1267         write_4(sc, INTERRUPT_STATUS, 0x00001FFF);
 1268 
 1269         write_4(sc, TS_DMA_CONTROL, 0);
 1270         write_4(sc, FS_DMA_CONTROL, 0);
 1271         return (0);
 1272 }
 1273 
 1274 static int
 1275 hardware_init(struct ece_softc *sc)
 1276 {
 1277         int status = 0;
 1278         static int gw_phy_type;
 1279 
 1280         gw_phy_type = get_phy_type(sc);
 1281         /* Currently only ic_plus phy is supported. */
 1282         if (gw_phy_type != IC_PLUS_PHY) {
 1283                 device_printf(sc->dev, "PHY type is not supported (%d)\n",
 1284                     gw_phy_type);
 1285                 return (-1);
 1286         }
 1287         status = configure_lan_port(sc, gw_phy_type);
 1288         configure_cpu_port(sc);
 1289         return (0);
 1290 }
 1291 
 1292 static void
 1293 set_mac_address(struct ece_softc *sc, const char *mac, int mac_len)
 1294 {
 1295 
 1296         /* Invalid age_field mean erase this entry. */
 1297         write_arl_table_entry(sc, 0, 1, VLAN0_GROUP_ID,
 1298             INVALID_ENTRY, VLAN0_GROUP,
 1299             mac);
 1300         memcpy(vlan0_mac, mac, ETHER_ADDR_LEN);
 1301 
 1302         write_arl_table_entry(sc, 0, 1, VLAN0_GROUP_ID,
 1303             STATIC_ENTRY, VLAN0_GROUP,
 1304             mac);
 1305 }
 1306 
 1307 static void
 1308 ece_set_mac(struct ece_softc *sc, u_char *eaddr)
 1309 {
 1310         memcpy(vlan0_mac, eaddr, ETHER_ADDR_LEN);
 1311         set_mac_address(sc, eaddr, ETHER_ADDR_LEN);
 1312 }
 1313 
 1314 /*
 1315  * TODO: the device doesn't have MAC stored, we should read the
 1316  * configuration stored in FLASH, but the format depends on the
 1317  * bootloader used.*
 1318  */
 1319 static int
 1320 ece_get_mac(struct ece_softc *sc, u_char *eaddr)
 1321 {
 1322         return (ENXIO);
 1323 }
 1324 
 1325 static void
 1326 ece_intr_rx_locked(struct ece_softc *sc, int count)
 1327 {
 1328         struct ifnet *ifp = sc->ifp;
 1329         struct mbuf *mb;
 1330         struct rx_desc_info *rxdesc;
 1331         eth_rx_desc_t *desc;
 1332 
 1333         int fssd_curr;
 1334         int fssd;
 1335         int i;
 1336         int idx;
 1337         int rxcount;
 1338         uint32_t status;
 1339 
 1340         fssd_curr = read_4(sc, FS_DESCRIPTOR_POINTER);
 1341 
 1342         fssd = (fssd_curr - (uint32_t)sc->ring_paddr_rx)>>4;
 1343 
 1344         desc = sc->rx_desc[sc->last_rx].desc;
 1345 
 1346         /* Prepare to read the data in the ring. */
 1347         bus_dmamap_sync(sc->dmatag_ring_rx,
 1348             sc->dmamap_ring_rx,
 1349             BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
 1350 
 1351         if (fssd > sc->last_rx)
 1352                 rxcount = fssd - sc->last_rx;
 1353         else if (fssd < sc->last_rx)
 1354                 rxcount = (ECE_MAX_RX_BUFFERS - sc->last_rx) + fssd;
 1355         else {
 1356                 if (desc->cown == 0)
 1357                         return;
 1358                 else
 1359                         rxcount = ECE_MAX_RX_BUFFERS;
 1360         }
 1361 
 1362         for (i= 0; i < rxcount; i++) {
 1363                 status = desc->cown;
 1364                 if (!status)
 1365                         break;
 1366 
 1367                 idx = sc->last_rx;
 1368                 rxdesc = &sc->rx_desc[idx];
 1369                 mb = rxdesc->buff;
 1370 
 1371                 if (desc->length < ETHER_MIN_LEN - ETHER_CRC_LEN ||
 1372                     desc->length > ETHER_MAX_LEN - ETHER_CRC_LEN +
 1373                     ETHER_VLAN_ENCAP_LEN) {
 1374                         ifp->if_ierrors++;
 1375                         desc->cown = 0;
 1376                         desc->length = MCLBYTES - 2;
 1377                         /* Invalid packet, skip and process next
 1378                          * packet.
 1379                          */
 1380                         continue;
 1381                 }
 1382 
 1383                 if (ece_new_rxbuf(sc, rxdesc) != 0) {
 1384                         ifp->if_iqdrops++;
 1385                         desc->cown = 0;
 1386                         desc->length = MCLBYTES - 2;
 1387                         break;
 1388                 }
 1389 
 1390                 /**
 1391                  * The device will write to addrress + 2 So we need to adjust
 1392                  * the address after the packet is received.
 1393                  */
 1394                 mb->m_data += 2;
 1395                 mb->m_len = mb->m_pkthdr.len = desc->length;
 1396 
 1397                 mb->m_flags |= M_PKTHDR;
 1398                 mb->m_pkthdr.rcvif = ifp;
 1399                 if ((ifp->if_capenable & IFCAP_RXCSUM) != 0) {
 1400                         /*check for valid checksum*/
 1401                         if ( (!desc->l4f)  && (desc->prot != 3)) {
 1402                                 mb->m_pkthdr.csum_flags |= CSUM_IP_CHECKED;
 1403                                 mb->m_pkthdr.csum_flags |= CSUM_IP_VALID;
 1404                                 mb->m_pkthdr.csum_data = 0xffff;
 1405                         }
 1406                 }
 1407                 ECE_RXUNLOCK(sc);
 1408                 (*ifp->if_input)(ifp, mb);
 1409                 ECE_RXLOCK(sc);
 1410 
 1411                 desc->cown = 0;
 1412                 desc->length = MCLBYTES - 2;
 1413 
 1414                 bus_dmamap_sync(sc->dmatag_ring_rx,
 1415                     sc->dmamap_ring_rx,
 1416                     BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 1417 
 1418                 if (sc->last_rx == ECE_MAX_RX_BUFFERS - 1)
 1419                         sc->last_rx = 0;
 1420                 else
 1421                         sc->last_rx++;
 1422 
 1423                 desc = sc->rx_desc[sc->last_rx].desc;
 1424         }
 1425 
 1426         /* Sync updated flags. */
 1427         bus_dmamap_sync(sc->dmatag_ring_rx,
 1428             sc->dmamap_ring_rx,
 1429             BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 1430 
 1431         return;
 1432 }
 1433 
 1434 static void
 1435 ece_intr_task(void *arg, int pending __unused)
 1436 {
 1437         struct ece_softc *sc = arg;
 1438         ECE_RXLOCK(sc);
 1439         ece_intr_rx_locked(sc, -1);
 1440         ECE_RXUNLOCK(sc);
 1441 }
 1442 
 1443 static void
 1444 ece_intr(void *xsc)
 1445 {
 1446         struct ece_softc *sc = xsc;
 1447         struct ifnet *ifp = sc->ifp;
 1448 
 1449         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
 1450                 write_4(sc, FS_DMA_CONTROL, 0);
 1451                 return;
 1452         }
 1453 
 1454         taskqueue_enqueue(sc->sc_tq, &sc->sc_intr_task);
 1455 
 1456         if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
 1457                 taskqueue_enqueue(sc->sc_tq, &sc->sc_tx_task);
 1458 }
 1459 
 1460 static void
 1461 ece_intr_status(void *xsc)
 1462 {
 1463         struct ece_softc *sc = xsc;
 1464         struct ifnet *ifp = sc->ifp;
 1465         int stat;
 1466 
 1467         stat = read_4(sc, INTERRUPT_STATUS);
 1468 
 1469         write_4(sc, INTERRUPT_STATUS, stat);
 1470 
 1471         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) {
 1472                 if ((stat & ERROR_MASK) != 0)
 1473                         ifp->if_iqdrops++;
 1474         }
 1475 }
 1476 
 1477 static void
 1478 ece_cleanup_locked(struct ece_softc *sc)
 1479 {
 1480         eth_tx_desc_t *desc;
 1481 
 1482         if (sc->tx_cons == sc->tx_prod) return;
 1483 
 1484         /* Prepare to read the ring (owner bit). */
 1485         bus_dmamap_sync(sc->dmatag_ring_tx,
 1486             sc->dmamap_ring_tx,
 1487             BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
 1488 
 1489         while (sc->tx_cons != sc->tx_prod) {
 1490                 desc = sc->tx_desc[sc->tx_cons].desc;
 1491                 if (desc->cown != 0) {
 1492                         struct tx_desc_info *td = &(sc->tx_desc[sc->tx_cons]);
 1493                         /* We are finished with this descriptor ... */
 1494                         bus_dmamap_sync(sc->dmatag_data_tx, td->dmamap,
 1495                             BUS_DMASYNC_POSTWRITE);
 1496                         /* ... and unload, so we can reuse. */
 1497                         bus_dmamap_unload(sc->dmatag_data_tx, td->dmamap);
 1498                         m_freem(td->buff);
 1499                         td->buff = 0;
 1500                         sc->tx_cons = (sc->tx_cons + 1) % ECE_MAX_TX_BUFFERS;
 1501                 } else {
 1502                         break;
 1503                 }
 1504         }
 1505 
 1506 }
 1507 
 1508 static void
 1509 ece_cleanup_task(void *arg, int pending __unused)
 1510 {
 1511         struct ece_softc *sc = arg;
 1512         ECE_CLEANUPLOCK(sc);
 1513         ece_cleanup_locked(sc);
 1514         ECE_CLEANUPUNLOCK(sc);
 1515 }
 1516 
 1517 static void
 1518 ece_intr_tx(void *xsc)
 1519 {
 1520         struct ece_softc *sc = xsc;
 1521         struct ifnet *ifp = sc->ifp;
 1522         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
 1523                 /* This should not happen, stop DMA. */
 1524                 write_4(sc, FS_DMA_CONTROL, 0);
 1525                 return;
 1526         }
 1527         taskqueue_enqueue(sc->sc_tq, &sc->sc_cleanup_task);
 1528 }
 1529 
 1530 static void
 1531 ece_intr_qf(void *xsc)
 1532 {
 1533         struct ece_softc *sc = xsc;
 1534         struct ifnet *ifp = sc->ifp;
 1535         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
 1536                 /* This should not happen, stop DMA. */
 1537                 write_4(sc, FS_DMA_CONTROL, 0);
 1538                 return;
 1539         }
 1540         taskqueue_enqueue(sc->sc_tq, &sc->sc_intr_task);
 1541         write_4(sc, FS_DMA_CONTROL, 1);
 1542 }
 1543 
 1544 /*
 1545  * Reset and initialize the chip
 1546  */
 1547 static void
 1548 eceinit_locked(void *xsc)
 1549 {
 1550         struct ece_softc *sc = xsc;
 1551         struct ifnet *ifp = sc->ifp;
 1552         struct mii_data *mii;
 1553         uint32_t cfg_reg;
 1554         uint32_t cpu_port_config;
 1555         uint32_t mac_port_config;
 1556 
 1557         while (1) {
 1558                 cfg_reg = read_4(sc, BIST_RESULT_TEST_0);
 1559                 if ((cfg_reg & (1<<17)))
 1560                         break;
 1561                 DELAY(100);
 1562         }
 1563         /* Set to default values. */
 1564         write_4(sc, SWITCH_CONFIG, 0x007AA7A1);
 1565         write_4(sc, MAC_PORT_0_CONFIG, 0x00423D00);
 1566         write_4(sc, MAC_PORT_1_CONFIG, 0x00423D80);
 1567         write_4(sc, CPU_PORT_CONFIG, 0x004C0000);
 1568 
 1569         hardware_init(sc);
 1570 
 1571         mac_port_config = read_4(sc, MAC_PORT_0_CONFIG);
 1572 
 1573          /* Enable Port 0 */
 1574         mac_port_config &= (~(PORT_DISABLE));
 1575         write_4(sc, MAC_PORT_0_CONFIG, mac_port_config);
 1576 
 1577         cpu_port_config = read_4(sc, CPU_PORT_CONFIG);
 1578         /* Enable CPU. */
 1579         cpu_port_config &= ~(PORT_DISABLE);
 1580         write_4(sc, CPU_PORT_CONFIG, cpu_port_config);
 1581 
 1582         /*
 1583          * Set 'running' flag, and clear output active flag
 1584          * and attempt to start the output
 1585          */
 1586         ifp->if_drv_flags |= IFF_DRV_RUNNING;
 1587         ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
 1588 
 1589         mii = device_get_softc(sc->miibus);
 1590         mii_pollstat(mii);
 1591         /* Enable DMA. */
 1592         write_4(sc, FS_DMA_CONTROL, 1);
 1593 
 1594         callout_reset(&sc->tick_ch, hz, ece_tick, sc);
 1595 }
 1596 
 1597 static inline int
 1598 ece_encap(struct ece_softc *sc, struct mbuf *m0)
 1599 {
 1600         struct ifnet *ifp;
 1601         bus_dma_segment_t segs[MAX_FRAGMENT];
 1602         bus_dmamap_t mapp;
 1603         eth_tx_desc_t *desc = 0;
 1604         int csum_flags;
 1605         int desc_no;
 1606         int error;
 1607         int nsegs;
 1608         int seg;
 1609 
 1610         ifp = sc->ifp;
 1611 
 1612         /* Fetch unused map */
 1613         mapp = sc->tx_desc[sc->tx_prod].dmamap;
 1614 
 1615         error = bus_dmamap_load_mbuf_sg(sc->dmatag_ring_tx, mapp,
 1616             m0, segs, &nsegs,
 1617             BUS_DMA_NOWAIT);
 1618 
 1619         if (error != 0) {
 1620                 bus_dmamap_unload(sc->dmatag_ring_tx, mapp);
 1621                 return ((error != 0) ? error : -1);
 1622         }
 1623 
 1624         desc = &(sc->desc_tx[sc->desc_curr_tx]);
 1625         sc->tx_desc[sc->tx_prod].desc = desc;
 1626         sc->tx_desc[sc->tx_prod].buff = m0;
 1627         desc_no = sc->desc_curr_tx;
 1628 
 1629         for (seg = 0; seg < nsegs; seg++) {
 1630                 if (desc->cown == 0 ) {
 1631                         if_printf(ifp, "ERROR: descriptor is still used\n");
 1632                         return (-1);
 1633                 }
 1634 
 1635                 desc->length = segs[seg].ds_len;
 1636                 desc->data_ptr = segs[seg].ds_addr;
 1637 
 1638                 if (seg == 0) {
 1639                         desc->fs = 1;
 1640                 } else {
 1641                         desc->fs = 0;
 1642                 }
 1643                 if (seg == nsegs - 1) {
 1644                         desc->ls = 1;
 1645                 } else {
 1646                         desc->ls = 0;
 1647                 }
 1648 
 1649                 csum_flags = m0->m_pkthdr.csum_flags;
 1650 
 1651                 desc->fr =  1;
 1652                 desc->pmap =  1;
 1653                 desc->insv =  0;
 1654                 desc->ico = 0;
 1655                 desc->tco = 0;
 1656                 desc->uco = 0;
 1657                 desc->interrupt = 1;
 1658 
 1659                 if (csum_flags & CSUM_IP) {
 1660                         desc->ico = 1;
 1661                         if (csum_flags & CSUM_TCP)
 1662                                 desc->tco = 1;
 1663                         if (csum_flags & CSUM_UDP)
 1664                                 desc->uco = 1;
 1665                 }
 1666 
 1667                 desc++;
 1668                 sc->desc_curr_tx = (sc->desc_curr_tx + 1) % ECE_MAX_TX_BUFFERS;
 1669                 if (sc->desc_curr_tx == 0) {
 1670                         desc = (eth_tx_desc_t *)&(sc->desc_tx[0]);
 1671                 }
 1672         }
 1673 
 1674         desc = sc->tx_desc[sc->tx_prod].desc;
 1675 
 1676         sc->tx_prod = (sc->tx_prod + 1) % ECE_MAX_TX_BUFFERS;
 1677 
 1678         /*
 1679          * After all descriptors are set, we set the flags to start the
 1680          * sending proces.
 1681          */
 1682         for (seg = 0; seg < nsegs; seg++) {
 1683                 desc->cown = 0;
 1684                 desc++;
 1685                 desc_no = (desc_no + 1) % ECE_MAX_TX_BUFFERS;
 1686                 if (desc_no == 0)
 1687                         desc = (eth_tx_desc_t *)&(sc->desc_tx[0]);
 1688         }
 1689 
 1690         bus_dmamap_sync(sc->dmatag_data_tx, mapp, BUS_DMASYNC_PREWRITE);
 1691         return (0);
 1692 }
 1693 
 1694 /*
 1695  * dequeu packets and transmit
 1696  */
 1697 static void
 1698 ecestart_locked(struct ifnet *ifp)
 1699 {
 1700         struct ece_softc *sc;
 1701         struct mbuf *m0;
 1702         uint32_t queued = 0;
 1703 
 1704         sc = ifp->if_softc;
 1705         if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
 1706             IFF_DRV_RUNNING)
 1707                 return;
 1708 
 1709         bus_dmamap_sync(sc->dmatag_ring_tx,
 1710             sc->dmamap_ring_tx,
 1711             BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
 1712 
 1713         for (;;) {
 1714                 /* Get packet from the queue */
 1715                 IF_DEQUEUE(&ifp->if_snd, m0);
 1716                 if (m0 == NULL)
 1717                         break;
 1718                 if (ece_encap(sc, m0)) {
 1719                         IF_PREPEND(&ifp->if_snd, m0);
 1720                         ifp->if_drv_flags |= IFF_DRV_OACTIVE;
 1721                         break;
 1722                 }
 1723                 queued++;
 1724                 BPF_MTAP(ifp, m0);
 1725         }
 1726         if (queued) {
 1727                 bus_dmamap_sync(sc->dmatag_ring_tx, sc->dmamap_ring_tx,
 1728                     BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
 1729                 write_4(sc, TS_DMA_CONTROL, 1);
 1730         }
 1731 }
 1732 
 1733 static void
 1734 eceinit(void *xsc)
 1735 {
 1736         struct ece_softc *sc = xsc;
 1737         ECE_LOCK(sc);
 1738         eceinit_locked(sc);
 1739         ECE_UNLOCK(sc);
 1740 }
 1741 
 1742 static void
 1743 ece_tx_task(void *arg, int pending __unused)
 1744 {
 1745         struct ifnet *ifp;
 1746         ifp = (struct ifnet *)arg;
 1747         ecestart(ifp);
 1748 }
 1749 
 1750 static void
 1751 ecestart(struct ifnet *ifp)
 1752 {
 1753         struct ece_softc *sc = ifp->if_softc;
 1754         ECE_TXLOCK(sc);
 1755         ecestart_locked(ifp);
 1756         ECE_TXUNLOCK(sc);
 1757 }
 1758 
 1759 /*
 1760  * Turn off interrupts, and stop the nic.  Can be called with sc->ifp
 1761  * NULL so be careful.
 1762  */
 1763 static void
 1764 ecestop(struct ece_softc *sc)
 1765 {
 1766         struct ifnet *ifp = sc->ifp;
 1767         uint32_t mac_port_config;
 1768 
 1769         write_4(sc, TS_DMA_CONTROL, 0);
 1770         write_4(sc, FS_DMA_CONTROL, 0);
 1771 
 1772         if (ifp)
 1773                 ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
 1774 
 1775         callout_stop(&sc->tick_ch);
 1776 
 1777         /*Disable Port 0 */
 1778         mac_port_config = read_4(sc, MAC_PORT_0_CONFIG);
 1779         mac_port_config |= (PORT_DISABLE);
 1780         write_4(sc, MAC_PORT_0_CONFIG, mac_port_config);
 1781 
 1782         /*Disable Port 1 */
 1783         mac_port_config = read_4(sc, MAC_PORT_1_CONFIG);
 1784         mac_port_config |= (PORT_DISABLE);
 1785         write_4(sc, MAC_PORT_1_CONFIG, mac_port_config);
 1786 
 1787         /* Disable all interrupt status sources. */
 1788         write_4(sc, INTERRUPT_MASK, 0x00001FFF);
 1789 
 1790         /* Clear previous interrupt sources. */
 1791         write_4(sc, INTERRUPT_STATUS, 0x00001FFF);
 1792 
 1793         write_4(sc, SWITCH_CONFIG, initial_switch_config);
 1794         write_4(sc, CPU_PORT_CONFIG, initial_cpu_config);
 1795         write_4(sc, MAC_PORT_0_CONFIG, initial_port0_config);
 1796         write_4(sc, MAC_PORT_1_CONFIG, initial_port1_config);
 1797 
 1798         clear_mac_entries(sc, 1);
 1799 }
 1800 
 1801 static void
 1802 ece_restart(struct ece_softc *sc)
 1803 {
 1804         struct ifnet *ifp = sc->ifp;
 1805 
 1806         ifp->if_drv_flags |= IFF_DRV_RUNNING;
 1807         ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
 1808         /* Enable port 0. */
 1809         write_4(sc, PORT_0_CONFIG,
 1810             read_4(sc, PORT_0_CONFIG) & ~(PORT_DISABLE));
 1811         write_4(sc, INTERRUPT_MASK, 0x00000000);
 1812         write_4(sc, FS_DMA_CONTROL, 1);
 1813         callout_reset(&sc->tick_ch, hz, ece_tick, sc);
 1814 }
 1815 
 1816 static void
 1817 set_filter(struct ece_softc *sc)
 1818 {
 1819         struct ifnet            *ifp;
 1820         struct ifmultiaddr      *ifma;
 1821         uint32_t mac_port_config;
 1822 
 1823         ifp = sc->ifp;
 1824 
 1825         clear_mac_entries(sc, 0);
 1826         if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) {
 1827                 mac_port_config = read_4(sc, MAC_PORT_0_CONFIG);
 1828                 mac_port_config &= ~(DISABLE_BROADCAST_PACKET);
 1829                 mac_port_config &= ~(DISABLE_MULTICAST_PACKET);
 1830                 write_4(sc, MAC_PORT_0_CONFIG, mac_port_config);
 1831                 return;
 1832         }
 1833         if_maddr_rlock(ifp);
 1834         TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
 1835                 if (ifma->ifma_addr->sa_family != AF_LINK)
 1836                         continue;
 1837                 add_mac_entry(sc,
 1838                     LLADDR((struct sockaddr_dl *)ifma->ifma_addr));
 1839         }
 1840         if_maddr_runlock(ifp);
 1841 }
 1842 
 1843 static int
 1844 eceioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
 1845 {
 1846         struct ece_softc *sc = ifp->if_softc;
 1847         struct mii_data *mii;
 1848         struct ifreq *ifr = (struct ifreq *)data;
 1849         int mask, error = 0;
 1850 
 1851         switch (cmd) {
 1852         case SIOCSIFFLAGS:
 1853                 ECE_LOCK(sc);
 1854                 if ((ifp->if_flags & IFF_UP) == 0 &&
 1855                     ifp->if_drv_flags & IFF_DRV_RUNNING) {
 1856                         ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
 1857                         ecestop(sc);
 1858                 } else {
 1859                         /* Reinitialize card on any parameter change. */
 1860                         if ((ifp->if_flags & IFF_UP) &&
 1861                             !(ifp->if_drv_flags & IFF_DRV_RUNNING))
 1862                                 ece_restart(sc);
 1863                 }
 1864                 ECE_UNLOCK(sc);
 1865                 break;
 1866 
 1867         case SIOCADDMULTI:
 1868         case SIOCDELMULTI:
 1869                 ECE_LOCK(sc);
 1870                 set_filter(sc);
 1871                 ECE_UNLOCK(sc);
 1872                 break;
 1873 
 1874         case SIOCSIFMEDIA:
 1875         case SIOCGIFMEDIA:
 1876                 mii = device_get_softc(sc->miibus);
 1877                 error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, cmd);
 1878                 break;
 1879         case SIOCSIFCAP:
 1880                 mask = ifp->if_capenable ^ ifr->ifr_reqcap;
 1881                 if (mask & IFCAP_VLAN_MTU) {
 1882                         ECE_LOCK(sc);
 1883                         ECE_UNLOCK(sc);
 1884                 }
 1885         default:
 1886                 error = ether_ioctl(ifp, cmd, data);
 1887                 break;
 1888         }
 1889         return (error);
 1890 }
 1891 
 1892 static void
 1893 ece_child_detached(device_t dev, device_t child)
 1894 {
 1895         struct ece_softc *sc;
 1896 
 1897         sc = device_get_softc(dev);
 1898         if (child == sc->miibus)
 1899                 sc->miibus = NULL;
 1900 }
 1901 
 1902 /*
 1903  * MII bus support routines.
 1904  */
 1905 static int
 1906 ece_miibus_readreg(device_t dev, int phy, int reg)
 1907 {
 1908         struct ece_softc *sc;
 1909         sc = device_get_softc(dev);
 1910         return (phy_read(sc, phy, reg));
 1911 }
 1912 
 1913 static int
 1914 ece_miibus_writereg(device_t dev, int phy, int reg, int data)
 1915 {
 1916         struct ece_softc *sc;
 1917         sc = device_get_softc(dev);
 1918         phy_write(sc, phy, reg, data);
 1919         return (0);
 1920 }
 1921 
 1922 static device_method_t ece_methods[] = {
 1923         /* Device interface */
 1924         DEVMETHOD(device_probe, ece_probe),
 1925         DEVMETHOD(device_attach,        ece_attach),
 1926         DEVMETHOD(device_detach,        ece_detach),
 1927 
 1928         /* Bus interface */
 1929         DEVMETHOD(bus_child_detached,   ece_child_detached),
 1930 
 1931         /* MII interface */
 1932         DEVMETHOD(miibus_readreg,       ece_miibus_readreg),
 1933         DEVMETHOD(miibus_writereg,      ece_miibus_writereg),
 1934 
 1935         { 0, 0 }
 1936 };
 1937 
 1938 static driver_t ece_driver = {
 1939         "ece",
 1940         ece_methods,
 1941         sizeof(struct ece_softc),
 1942 };
 1943 
 1944 DRIVER_MODULE(ece, econaarm, ece_driver, ece_devclass, 0, 0);
 1945 DRIVER_MODULE(miibus, ece, miibus_driver, miibus_devclass, 0, 0);
 1946 MODULE_DEPEND(ece, miibus, 1, 1, 1);
 1947 MODULE_DEPEND(ece, ether, 1, 1, 1);

Cache object: bdc1d68093a46f445e1830819eead8ef


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.