Home | History | Annotate | Line # | Download | only in pci
if_dge.c revision 1.1.2.2.2.1
      1      1.1.2.2   tron /*	$NetBSD: if_dge.c,v 1.1.2.2.2.1 2005/01/24 21:39:42 he Exp $ */
      2          1.1  ragge 
      3          1.1  ragge /*
      4          1.1  ragge  * Copyright (c) 2004, SUNET, Swedish University Computer Network.
      5          1.1  ragge  * All rights reserved.
      6          1.1  ragge  *
      7          1.1  ragge  * Written by Anders Magnusson for SUNET, Swedish University Computer Network.
      8          1.1  ragge  *
      9          1.1  ragge  * Redistribution and use in source and binary forms, with or without
     10          1.1  ragge  * modification, are permitted provided that the following conditions
     11          1.1  ragge  * are met:
     12          1.1  ragge  * 1. Redistributions of source code must retain the above copyright
     13          1.1  ragge  *    notice, this list of conditions and the following disclaimer.
     14          1.1  ragge  * 2. Redistributions in binary form must reproduce the above copyright
     15          1.1  ragge  *    notice, this list of conditions and the following disclaimer in the
     16          1.1  ragge  *    documentation and/or other materials provided with the distribution.
     17          1.1  ragge  * 3. All advertising materials mentioning features or use of this software
     18          1.1  ragge  *    must display the following acknowledgement:
     19          1.1  ragge  *	This product includes software developed for the NetBSD Project by
     20          1.1  ragge  *	SUNET, Swedish University Computer Network.
     21          1.1  ragge  * 4. The name of SUNET may not be used to endorse or promote products
     22          1.1  ragge  *    derived from this software without specific prior written permission.
     23          1.1  ragge  *
     24          1.1  ragge  * THIS SOFTWARE IS PROVIDED BY SUNET ``AS IS'' AND
     25          1.1  ragge  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     26          1.1  ragge  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     27          1.1  ragge  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
     28          1.1  ragge  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     29          1.1  ragge  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     30          1.1  ragge  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     31          1.1  ragge  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     32          1.1  ragge  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     33          1.1  ragge  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     34          1.1  ragge  * POSSIBILITY OF SUCH DAMAGE.
     35          1.1  ragge  */
     36          1.1  ragge 
     37          1.1  ragge /*
     38          1.1  ragge  * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc.
     39          1.1  ragge  * All rights reserved.
     40          1.1  ragge  *
     41          1.1  ragge  * Written by Jason R. Thorpe for Wasabi Systems, Inc.
     42          1.1  ragge  *
     43          1.1  ragge  * Redistribution and use in source and binary forms, with or without
     44          1.1  ragge  * modification, are permitted provided that the following conditions
     45          1.1  ragge  * are met:
     46          1.1  ragge  * 1. Redistributions of source code must retain the above copyright
     47          1.1  ragge  *    notice, this list of conditions and the following disclaimer.
     48          1.1  ragge  * 2. Redistributions in binary form must reproduce the above copyright
     49          1.1  ragge  *    notice, this list of conditions and the following disclaimer in the
     50          1.1  ragge  *    documentation and/or other materials provided with the distribution.
     51          1.1  ragge  * 3. All advertising materials mentioning features or use of this software
     52          1.1  ragge  *    must display the following acknowledgement:
     53          1.1  ragge  *	This product includes software developed for the NetBSD Project by
     54          1.1  ragge  *	Wasabi Systems, Inc.
     55          1.1  ragge  * 4. The name of Wasabi Systems, Inc. may not be used to endorse
     56          1.1  ragge  *    or promote products derived from this software without specific prior
     57          1.1  ragge  *    written permission.
     58          1.1  ragge  *
     59          1.1  ragge  * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
     60          1.1  ragge  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     61          1.1  ragge  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     62          1.1  ragge  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
     63          1.1  ragge  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     64          1.1  ragge  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     65          1.1  ragge  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     66          1.1  ragge  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     67          1.1  ragge  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     68          1.1  ragge  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     69          1.1  ragge  * POSSIBILITY OF SUCH DAMAGE.
     70          1.1  ragge  */
     71          1.1  ragge 
     72          1.1  ragge /*
     73          1.1  ragge  * Device driver for the Intel 82597EX Ten Gigabit Ethernet controller.
     74          1.1  ragge  *
     75          1.1  ragge  * TODO (in no specific order):
     76          1.1  ragge  *	HW VLAN support.
     77          1.1  ragge  *	TSE offloading (needs kernel changes...)
     78          1.1  ragge  *	RAIDC (receive interrupt delay adaptation)
     79          1.1  ragge  *	Use memory > 4GB.
     80          1.1  ragge  */
     81          1.1  ragge 
     82          1.1  ragge #include <sys/cdefs.h>
     83      1.1.2.1   tron __KERNEL_RCSID(0, "$NetBSD: if_dge.c,v 1.1.2.2.2.1 2005/01/24 21:39:42 he Exp $");
     84          1.1  ragge 
     85          1.1  ragge #include "bpfilter.h"
     86          1.1  ragge #include "rnd.h"
     87          1.1  ragge 
     88          1.1  ragge #include <sys/param.h>
     89          1.1  ragge #include <sys/systm.h>
     90          1.1  ragge #include <sys/callout.h>
     91          1.1  ragge #include <sys/mbuf.h>
     92          1.1  ragge #include <sys/malloc.h>
     93          1.1  ragge #include <sys/kernel.h>
     94          1.1  ragge #include <sys/socket.h>
     95          1.1  ragge #include <sys/ioctl.h>
     96          1.1  ragge #include <sys/errno.h>
     97          1.1  ragge #include <sys/device.h>
     98          1.1  ragge #include <sys/queue.h>
     99          1.1  ragge 
    100          1.1  ragge #include <uvm/uvm_extern.h>		/* for PAGE_SIZE */
    101          1.1  ragge 
    102          1.1  ragge #if NRND > 0
    103          1.1  ragge #include <sys/rnd.h>
    104          1.1  ragge #endif
    105          1.1  ragge 
    106          1.1  ragge #include <net/if.h>
    107          1.1  ragge #include <net/if_dl.h>
    108          1.1  ragge #include <net/if_media.h>
    109          1.1  ragge #include <net/if_ether.h>
    110          1.1  ragge 
    111          1.1  ragge #if NBPFILTER > 0
    112          1.1  ragge #include <net/bpf.h>
    113          1.1  ragge #endif
    114          1.1  ragge 
    115          1.1  ragge #include <netinet/in.h>			/* XXX for struct ip */
    116          1.1  ragge #include <netinet/in_systm.h>		/* XXX for struct ip */
    117          1.1  ragge #include <netinet/ip.h>			/* XXX for struct ip */
    118          1.1  ragge #include <netinet/tcp.h>		/* XXX for struct tcphdr */
    119          1.1  ragge 
    120          1.1  ragge #include <machine/bus.h>
    121          1.1  ragge #include <machine/intr.h>
    122          1.1  ragge #include <machine/endian.h>
    123          1.1  ragge 
    124          1.1  ragge #include <dev/mii/mii.h>
    125          1.1  ragge #include <dev/mii/miivar.h>
    126          1.1  ragge #include <dev/mii/mii_bitbang.h>
    127          1.1  ragge 
    128          1.1  ragge #include <dev/pci/pcireg.h>
    129          1.1  ragge #include <dev/pci/pcivar.h>
    130          1.1  ragge #include <dev/pci/pcidevs.h>
    131          1.1  ragge 
    132          1.1  ragge #include <dev/pci/if_dgereg.h>
    133          1.1  ragge 
    134      1.1.2.2   tron /*
    135      1.1.2.2   tron  * The receive engine may sometimes become off-by-one when writing back
    136      1.1.2.2   tron  * chained descriptors.	 Avoid this by allocating a large chunk of
    137      1.1.2.2   tron  * memory and use if instead (to avoid chained descriptors).
    138      1.1.2.2   tron  * This only happens with chained descriptors under heavy load.
    139      1.1.2.2   tron  */
    140      1.1.2.2   tron #define DGE_OFFBYONE_RXBUG
    141      1.1.2.2   tron 
    142          1.1  ragge #define DGE_EVENT_COUNTERS
    143          1.1  ragge #define DGE_DEBUG
    144          1.1  ragge 
    145          1.1  ragge #ifdef DGE_DEBUG
    146      1.1.2.2   tron #define DGE_DEBUG_LINK		0x01
    147      1.1.2.2   tron #define DGE_DEBUG_TX		0x02
    148      1.1.2.2   tron #define DGE_DEBUG_RX		0x04
    149      1.1.2.2   tron #define DGE_DEBUG_CKSUM		0x08
    150          1.1  ragge int	dge_debug = 0;
    151          1.1  ragge 
    152      1.1.2.2   tron #define DPRINTF(x, y)	if (dge_debug & (x)) printf y
    153          1.1  ragge #else
    154      1.1.2.2   tron #define DPRINTF(x, y)	/* nothing */
    155          1.1  ragge #endif /* DGE_DEBUG */
    156          1.1  ragge 
    157          1.1  ragge /*
    158          1.1  ragge  * Transmit descriptor list size. We allow up to 100 DMA segments per
    159          1.1  ragge  * packet (Intel reports of jumbo frame packets with as
    160          1.1  ragge  * many as 80 DMA segments when using 16k buffers).
    161          1.1  ragge  */
    162      1.1.2.2   tron #define DGE_NTXSEGS		100
    163      1.1.2.2   tron #define DGE_IFQUEUELEN		20000
    164      1.1.2.2   tron #define DGE_TXQUEUELEN		2048
    165      1.1.2.2   tron #define DGE_TXQUEUELEN_MASK	(DGE_TXQUEUELEN - 1)
    166      1.1.2.2   tron #define DGE_TXQUEUE_GC		(DGE_TXQUEUELEN / 8)
    167      1.1.2.2   tron #define DGE_NTXDESC		1024
    168      1.1.2.2   tron #define DGE_NTXDESC_MASK		(DGE_NTXDESC - 1)
    169      1.1.2.2   tron #define DGE_NEXTTX(x)		(((x) + 1) & DGE_NTXDESC_MASK)
    170      1.1.2.2   tron #define DGE_NEXTTXS(x)		(((x) + 1) & DGE_TXQUEUELEN_MASK)
    171          1.1  ragge 
    172          1.1  ragge /*
    173          1.1  ragge  * Receive descriptor list size.
    174          1.1  ragge  * Packet is of size MCLBYTES, and for jumbo packets buffers may
    175      1.1.2.2   tron  * be chained.	Due to the nature of the card (high-speed), keep this
    176          1.1  ragge  * ring large. With 2k buffers the ring can store 400 jumbo packets,
    177          1.1  ragge  * which at full speed will be received in just under 3ms.
    178          1.1  ragge  */
    179      1.1.2.2   tron #define DGE_NRXDESC		2048
    180      1.1.2.2   tron #define DGE_NRXDESC_MASK	(DGE_NRXDESC - 1)
    181      1.1.2.2   tron #define DGE_NEXTRX(x)		(((x) + 1) & DGE_NRXDESC_MASK)
    182          1.1  ragge /*
    183          1.1  ragge  * # of descriptors between head and written descriptors.
    184          1.1  ragge  * This is to work-around two erratas.
    185          1.1  ragge  */
    186          1.1  ragge #define DGE_RXSPACE		10
    187      1.1.2.2   tron #define DGE_PREVRX(x)		(((x) - DGE_RXSPACE) & DGE_NRXDESC_MASK)
    188          1.1  ragge /*
    189          1.1  ragge  * Receive descriptor fetch threshholds. These are values recommended
    190          1.1  ragge  * by Intel, do not touch them unless you know what you are doing.
    191          1.1  ragge  */
    192      1.1.2.2   tron #define RXDCTL_PTHRESH_VAL	128
    193      1.1.2.2   tron #define RXDCTL_HTHRESH_VAL	16
    194      1.1.2.2   tron #define RXDCTL_WTHRESH_VAL	16
    195          1.1  ragge 
    196          1.1  ragge 
    197          1.1  ragge /*
    198          1.1  ragge  * Tweakable parameters; default values.
    199          1.1  ragge  */
    200      1.1.2.2   tron #define FCRTH	0x30000 /* Send XOFF water mark */
    201      1.1.2.2   tron #define FCRTL	0x28000 /* Send XON water mark */
    202      1.1.2.2   tron #define RDTR	0x20	/* Interrupt delay after receive, .8192us units */
    203      1.1.2.2   tron #define TIDV	0x20	/* Interrupt delay after send, .8192us units */
    204          1.1  ragge 
    205          1.1  ragge /*
    206          1.1  ragge  * Control structures are DMA'd to the i82597 chip.  We allocate them in
    207          1.1  ragge  * a single clump that maps to a single DMA segment to make serveral things
    208          1.1  ragge  * easier.
    209          1.1  ragge  */
    210          1.1  ragge struct dge_control_data {
    211          1.1  ragge 	/*
    212          1.1  ragge 	 * The transmit descriptors.
    213          1.1  ragge 	 */
    214          1.1  ragge 	struct dge_tdes wcd_txdescs[DGE_NTXDESC];
    215          1.1  ragge 
    216          1.1  ragge 	/*
    217          1.1  ragge 	 * The receive descriptors.
    218          1.1  ragge 	 */
    219          1.1  ragge 	struct dge_rdes wcd_rxdescs[DGE_NRXDESC];
    220          1.1  ragge };
    221          1.1  ragge 
    222      1.1.2.2   tron #define DGE_CDOFF(x)	offsetof(struct dge_control_data, x)
    223      1.1.2.2   tron #define DGE_CDTXOFF(x)	DGE_CDOFF(wcd_txdescs[(x)])
    224      1.1.2.2   tron #define DGE_CDRXOFF(x)	DGE_CDOFF(wcd_rxdescs[(x)])
    225          1.1  ragge 
    226          1.1  ragge /*
    227      1.1.2.1   tron  * The DGE interface have a higher max MTU size than normal jumbo frames.
    228      1.1.2.1   tron  */
    229      1.1.2.2   tron #define DGE_MAX_MTU	16288	/* Max MTU size for this interface */
    230      1.1.2.1   tron 
    231      1.1.2.1   tron /*
    232          1.1  ragge  * Software state for transmit jobs.
    233          1.1  ragge  */
    234          1.1  ragge struct dge_txsoft {
    235          1.1  ragge 	struct mbuf *txs_mbuf;		/* head of our mbuf chain */
    236          1.1  ragge 	bus_dmamap_t txs_dmamap;	/* our DMA map */
    237          1.1  ragge 	int txs_firstdesc;		/* first descriptor in packet */
    238          1.1  ragge 	int txs_lastdesc;		/* last descriptor in packet */
    239          1.1  ragge 	int txs_ndesc;			/* # of descriptors used */
    240          1.1  ragge };
    241          1.1  ragge 
    242          1.1  ragge /*
    243      1.1.2.2   tron  * Software state for receive buffers.	Each descriptor gets a
    244      1.1.2.2   tron  * 2k (MCLBYTES) buffer and a DMA map.	For packets which fill
    245          1.1  ragge  * more than one buffer, we chain them together.
    246          1.1  ragge  */
    247          1.1  ragge struct dge_rxsoft {
    248          1.1  ragge 	struct mbuf *rxs_mbuf;		/* head of our mbuf chain */
    249          1.1  ragge 	bus_dmamap_t rxs_dmamap;	/* our DMA map */
    250          1.1  ragge };
    251          1.1  ragge 
    252          1.1  ragge /*
    253          1.1  ragge  * Software state per device.
    254          1.1  ragge  */
    255          1.1  ragge struct dge_softc {
    256          1.1  ragge 	struct device sc_dev;		/* generic device information */
    257          1.1  ragge 	bus_space_tag_t sc_st;		/* bus space tag */
    258          1.1  ragge 	bus_space_handle_t sc_sh;	/* bus space handle */
    259          1.1  ragge 	bus_dma_tag_t sc_dmat;		/* bus DMA tag */
    260          1.1  ragge 	struct ethercom sc_ethercom;	/* ethernet common data */
    261          1.1  ragge 	void *sc_sdhook;		/* shutdown hook */
    262          1.1  ragge 
    263          1.1  ragge 	int sc_flags;			/* flags; see below */
    264          1.1  ragge 	int sc_bus_speed;		/* PCI/PCIX bus speed */
    265          1.1  ragge 	int sc_pcix_offset;		/* PCIX capability register offset */
    266          1.1  ragge 
    267          1.1  ragge 	pci_chipset_tag_t sc_pc;
    268          1.1  ragge 	pcitag_t sc_pt;
    269          1.1  ragge 	int sc_mmrbc;			/* Max PCIX memory read byte count */
    270          1.1  ragge 
    271          1.1  ragge 	void *sc_ih;			/* interrupt cookie */
    272          1.1  ragge 
    273          1.1  ragge 	struct ifmedia sc_media;
    274          1.1  ragge 
    275          1.1  ragge 	bus_dmamap_t sc_cddmamap;	/* control data DMA map */
    276      1.1.2.2   tron #define sc_cddma	sc_cddmamap->dm_segs[0].ds_addr
    277          1.1  ragge 
    278          1.1  ragge 	int		sc_align_tweak;
    279          1.1  ragge 
    280          1.1  ragge 	/*
    281          1.1  ragge 	 * Software state for the transmit and receive descriptors.
    282          1.1  ragge 	 */
    283          1.1  ragge 	struct dge_txsoft sc_txsoft[DGE_TXQUEUELEN];
    284          1.1  ragge 	struct dge_rxsoft sc_rxsoft[DGE_NRXDESC];
    285          1.1  ragge 
    286          1.1  ragge 	/*
    287          1.1  ragge 	 * Control data structures.
    288          1.1  ragge 	 */
    289          1.1  ragge 	struct dge_control_data *sc_control_data;
    290      1.1.2.2   tron #define sc_txdescs	sc_control_data->wcd_txdescs
    291      1.1.2.2   tron #define sc_rxdescs	sc_control_data->wcd_rxdescs
    292          1.1  ragge 
    293          1.1  ragge #ifdef DGE_EVENT_COUNTERS
    294          1.1  ragge 	/* Event counters. */
    295          1.1  ragge 	struct evcnt sc_ev_txsstall;	/* Tx stalled due to no txs */
    296          1.1  ragge 	struct evcnt sc_ev_txdstall;	/* Tx stalled due to no txd */
    297      1.1.2.2   tron 	struct evcnt sc_ev_txforceintr; /* Tx interrupts forced */
    298          1.1  ragge 	struct evcnt sc_ev_txdw;	/* Tx descriptor interrupts */
    299          1.1  ragge 	struct evcnt sc_ev_txqe;	/* Tx queue empty interrupts */
    300          1.1  ragge 	struct evcnt sc_ev_rxintr;	/* Rx interrupts */
    301          1.1  ragge 	struct evcnt sc_ev_linkintr;	/* Link interrupts */
    302          1.1  ragge 
    303          1.1  ragge 	struct evcnt sc_ev_rxipsum;	/* IP checksums checked in-bound */
    304          1.1  ragge 	struct evcnt sc_ev_rxtusum;	/* TCP/UDP cksums checked in-bound */
    305          1.1  ragge 	struct evcnt sc_ev_txipsum;	/* IP checksums comp. out-bound */
    306          1.1  ragge 	struct evcnt sc_ev_txtusum;	/* TCP/UDP cksums comp. out-bound */
    307          1.1  ragge 
    308          1.1  ragge 	struct evcnt sc_ev_txctx_init;	/* Tx cksum context cache initialized */
    309          1.1  ragge 	struct evcnt sc_ev_txctx_hit;	/* Tx cksum context cache hit */
    310          1.1  ragge 	struct evcnt sc_ev_txctx_miss;	/* Tx cksum context cache miss */
    311          1.1  ragge 
    312          1.1  ragge 	struct evcnt sc_ev_txseg[DGE_NTXSEGS]; /* Tx packets w/ N segments */
    313          1.1  ragge 	struct evcnt sc_ev_txdrop;	/* Tx packets dropped (too many segs) */
    314          1.1  ragge #endif /* DGE_EVENT_COUNTERS */
    315          1.1  ragge 
    316          1.1  ragge 	int	sc_txfree;		/* number of free Tx descriptors */
    317          1.1  ragge 	int	sc_txnext;		/* next ready Tx descriptor */
    318          1.1  ragge 
    319          1.1  ragge 	int	sc_txsfree;		/* number of free Tx jobs */
    320          1.1  ragge 	int	sc_txsnext;		/* next free Tx job */
    321          1.1  ragge 	int	sc_txsdirty;		/* dirty Tx jobs */
    322          1.1  ragge 
    323          1.1  ragge 	uint32_t sc_txctx_ipcs;		/* cached Tx IP cksum ctx */
    324          1.1  ragge 	uint32_t sc_txctx_tucs;		/* cached Tx TCP/UDP cksum ctx */
    325          1.1  ragge 
    326          1.1  ragge 	int	sc_rxptr;		/* next ready Rx descriptor/queue ent */
    327          1.1  ragge 	int	sc_rxdiscard;
    328          1.1  ragge 	int	sc_rxlen;
    329          1.1  ragge 	struct mbuf *sc_rxhead;
    330          1.1  ragge 	struct mbuf *sc_rxtail;
    331          1.1  ragge 	struct mbuf **sc_rxtailp;
    332          1.1  ragge 
    333          1.1  ragge 	uint32_t sc_ctrl0;		/* prototype CTRL0 register */
    334          1.1  ragge 	uint32_t sc_icr;		/* prototype interrupt bits */
    335          1.1  ragge 	uint32_t sc_tctl;		/* prototype TCTL register */
    336          1.1  ragge 	uint32_t sc_rctl;		/* prototype RCTL register */
    337          1.1  ragge 
    338          1.1  ragge 	int sc_mchash_type;		/* multicast filter offset */
    339          1.1  ragge 
    340          1.1  ragge 	uint16_t sc_eeprom[EEPROM_SIZE];
    341          1.1  ragge 
    342          1.1  ragge #if NRND > 0
    343      1.1.2.2   tron 	rndsource_element_t rnd_source; /* random source */
    344      1.1.2.2   tron #endif
    345      1.1.2.2   tron #ifdef DGE_OFFBYONE_RXBUG
    346      1.1.2.2   tron 	caddr_t sc_bugbuf;
    347      1.1.2.2   tron 	SLIST_HEAD(, rxbugentry) sc_buglist;
    348      1.1.2.2   tron 	bus_dmamap_t sc_bugmap;
    349      1.1.2.2   tron 	struct rxbugentry *sc_entry;
    350          1.1  ragge #endif
    351          1.1  ragge };
    352          1.1  ragge 
    353      1.1.2.2   tron #define DGE_RXCHAIN_RESET(sc)						\
    354          1.1  ragge do {									\
    355          1.1  ragge 	(sc)->sc_rxtailp = &(sc)->sc_rxhead;				\
    356          1.1  ragge 	*(sc)->sc_rxtailp = NULL;					\
    357          1.1  ragge 	(sc)->sc_rxlen = 0;						\
    358          1.1  ragge } while (/*CONSTCOND*/0)
    359          1.1  ragge 
    360      1.1.2.2   tron #define DGE_RXCHAIN_LINK(sc, m)						\
    361          1.1  ragge do {									\
    362          1.1  ragge 	*(sc)->sc_rxtailp = (sc)->sc_rxtail = (m);			\
    363          1.1  ragge 	(sc)->sc_rxtailp = &(m)->m_next;				\
    364          1.1  ragge } while (/*CONSTCOND*/0)
    365          1.1  ragge 
    366          1.1  ragge /* sc_flags */
    367      1.1.2.2   tron #define DGE_F_BUS64		0x20	/* bus is 64-bit */
    368      1.1.2.2   tron #define DGE_F_PCIX		0x40	/* bus is PCI-X */
    369          1.1  ragge 
    370          1.1  ragge #ifdef DGE_EVENT_COUNTERS
    371      1.1.2.2   tron #define DGE_EVCNT_INCR(ev)	(ev)->ev_count++
    372          1.1  ragge #else
    373      1.1.2.2   tron #define DGE_EVCNT_INCR(ev)	/* nothing */
    374          1.1  ragge #endif
    375          1.1  ragge 
    376      1.1.2.2   tron #define CSR_READ(sc, reg)						\
    377          1.1  ragge 	bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg))
    378      1.1.2.2   tron #define CSR_WRITE(sc, reg, val)						\
    379          1.1  ragge 	bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val))
    380          1.1  ragge 
    381      1.1.2.2   tron #define DGE_CDTXADDR(sc, x)	((sc)->sc_cddma + DGE_CDTXOFF((x)))
    382      1.1.2.2   tron #define DGE_CDRXADDR(sc, x)	((sc)->sc_cddma + DGE_CDRXOFF((x)))
    383          1.1  ragge 
    384      1.1.2.2   tron #define DGE_CDTXSYNC(sc, x, n, ops)					\
    385          1.1  ragge do {									\
    386          1.1  ragge 	int __x, __n;							\
    387          1.1  ragge 									\
    388          1.1  ragge 	__x = (x);							\
    389          1.1  ragge 	__n = (n);							\
    390          1.1  ragge 									\
    391          1.1  ragge 	/* If it will wrap around, sync to the end of the ring. */	\
    392          1.1  ragge 	if ((__x + __n) > DGE_NTXDESC) {					\
    393          1.1  ragge 		bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap,	\
    394          1.1  ragge 		    DGE_CDTXOFF(__x), sizeof(struct dge_tdes) *		\
    395          1.1  ragge 		    (DGE_NTXDESC - __x), (ops));				\
    396          1.1  ragge 		__n -= (DGE_NTXDESC - __x);				\
    397          1.1  ragge 		__x = 0;						\
    398          1.1  ragge 	}								\
    399          1.1  ragge 									\
    400          1.1  ragge 	/* Now sync whatever is left. */				\
    401          1.1  ragge 	bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap,		\
    402          1.1  ragge 	    DGE_CDTXOFF(__x), sizeof(struct dge_tdes) * __n, (ops));	\
    403          1.1  ragge } while (/*CONSTCOND*/0)
    404          1.1  ragge 
    405      1.1.2.2   tron #define DGE_CDRXSYNC(sc, x, ops)						\
    406          1.1  ragge do {									\
    407          1.1  ragge 	bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap,		\
    408          1.1  ragge 	   DGE_CDRXOFF((x)), sizeof(struct dge_rdes), (ops));		\
    409          1.1  ragge } while (/*CONSTCOND*/0)
    410          1.1  ragge 
    411      1.1.2.2   tron #ifdef DGE_OFFBYONE_RXBUG
    412      1.1.2.2   tron #define DGE_INIT_RXDESC(sc, x)						\
    413      1.1.2.2   tron do {									\
    414      1.1.2.2   tron 	struct dge_rxsoft *__rxs = &(sc)->sc_rxsoft[(x)];		\
    415      1.1.2.2   tron 	struct dge_rdes *__rxd = &(sc)->sc_rxdescs[(x)];		\
    416      1.1.2.2   tron 	struct mbuf *__m = __rxs->rxs_mbuf;				\
    417      1.1.2.2   tron 									\
    418      1.1.2.2   tron 	__rxd->dr_baddrl = htole32(sc->sc_bugmap->dm_segs[0].ds_addr +	\
    419      1.1.2.2   tron 	    (mtod((__m), char *) - (char *)sc->sc_bugbuf));		\
    420      1.1.2.2   tron 	__rxd->dr_baddrh = 0;						\
    421      1.1.2.2   tron 	__rxd->dr_len = 0;						\
    422      1.1.2.2   tron 	__rxd->dr_cksum = 0;						\
    423      1.1.2.2   tron 	__rxd->dr_status = 0;						\
    424      1.1.2.2   tron 	__rxd->dr_errors = 0;						\
    425      1.1.2.2   tron 	__rxd->dr_special = 0;						\
    426      1.1.2.2   tron 	DGE_CDRXSYNC((sc), (x), BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); \
    427      1.1.2.2   tron 									\
    428      1.1.2.2   tron 	CSR_WRITE((sc), DGE_RDT, (x));					\
    429      1.1.2.2   tron } while (/*CONSTCOND*/0)
    430      1.1.2.2   tron #else
    431      1.1.2.2   tron #define DGE_INIT_RXDESC(sc, x)						\
    432          1.1  ragge do {									\
    433          1.1  ragge 	struct dge_rxsoft *__rxs = &(sc)->sc_rxsoft[(x)];		\
    434          1.1  ragge 	struct dge_rdes *__rxd = &(sc)->sc_rxdescs[(x)];		\
    435          1.1  ragge 	struct mbuf *__m = __rxs->rxs_mbuf;				\
    436          1.1  ragge 									\
    437          1.1  ragge 	/*								\
    438          1.1  ragge 	 * Note: We scoot the packet forward 2 bytes in the buffer	\
    439          1.1  ragge 	 * so that the payload after the Ethernet header is aligned	\
    440          1.1  ragge 	 * to a 4-byte boundary.					\
    441          1.1  ragge 	 *								\
    442          1.1  ragge 	 * XXX BRAINDAMAGE ALERT!					\
    443          1.1  ragge 	 * The stupid chip uses the same size for every buffer, which	\
    444      1.1.2.2   tron 	 * is set in the Receive Control register.  We are using the 2K \
    445          1.1  ragge 	 * size option, but what we REALLY want is (2K - 2)!  For this	\
    446          1.1  ragge 	 * reason, we can't "scoot" packets longer than the standard	\
    447          1.1  ragge 	 * Ethernet MTU.  On strict-alignment platforms, if the total	\
    448          1.1  ragge 	 * size exceeds (2K - 2) we set align_tweak to 0 and let	\
    449          1.1  ragge 	 * the upper layer copy the headers.				\
    450          1.1  ragge 	 */								\
    451          1.1  ragge 	__m->m_data = __m->m_ext.ext_buf + (sc)->sc_align_tweak;	\
    452          1.1  ragge 									\
    453          1.1  ragge 	__rxd->dr_baddrl =					\
    454      1.1.2.2   tron 	    htole32(__rxs->rxs_dmamap->dm_segs[0].ds_addr +		\
    455          1.1  ragge 		(sc)->sc_align_tweak);					\
    456          1.1  ragge 	__rxd->dr_baddrh = 0;					\
    457          1.1  ragge 	__rxd->dr_len = 0;						\
    458          1.1  ragge 	__rxd->dr_cksum = 0;						\
    459          1.1  ragge 	__rxd->dr_status = 0;						\
    460          1.1  ragge 	__rxd->dr_errors = 0;						\
    461          1.1  ragge 	__rxd->dr_special = 0;						\
    462          1.1  ragge 	DGE_CDRXSYNC((sc), (x), BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); \
    463          1.1  ragge 									\
    464          1.1  ragge 	CSR_WRITE((sc), DGE_RDT, (x));					\
    465          1.1  ragge } while (/*CONSTCOND*/0)
    466      1.1.2.2   tron #endif
    467      1.1.2.2   tron 
    468      1.1.2.2   tron #ifdef DGE_OFFBYONE_RXBUG
    469      1.1.2.2   tron /*
    470      1.1.2.2   tron  * Allocation constants.  Much memory may be used for this.
    471      1.1.2.2   tron  */
    472      1.1.2.2   tron #ifndef DGE_BUFFER_SIZE
    473      1.1.2.2   tron #define DGE_BUFFER_SIZE DGE_MAX_MTU
    474      1.1.2.2   tron #endif
    475      1.1.2.2   tron #define DGE_NBUFFERS	(4*DGE_NRXDESC)
    476      1.1.2.2   tron #define DGE_RXMEM	(DGE_NBUFFERS*DGE_BUFFER_SIZE)
    477      1.1.2.2   tron 
    478      1.1.2.2   tron struct rxbugentry {
    479      1.1.2.2   tron 	SLIST_ENTRY(rxbugentry) rb_entry;
    480      1.1.2.2   tron 	int rb_slot;
    481      1.1.2.2   tron };
    482      1.1.2.2   tron 
    483      1.1.2.2   tron static int
    484      1.1.2.2   tron dge_alloc_rcvmem(struct dge_softc *sc)
    485      1.1.2.2   tron {
    486      1.1.2.2   tron 	caddr_t	ptr, kva;
    487      1.1.2.2   tron 	bus_dma_segment_t seg;
    488      1.1.2.2   tron 	int i, rseg, state, error;
    489      1.1.2.2   tron 	struct rxbugentry *entry;
    490      1.1.2.2   tron 
    491      1.1.2.2   tron 	state = error = 0;
    492      1.1.2.2   tron 
    493      1.1.2.2   tron 	if (bus_dmamem_alloc(sc->sc_dmat, DGE_RXMEM, PAGE_SIZE, 0,
    494      1.1.2.2   tron 	     &seg, 1, &rseg, BUS_DMA_NOWAIT)) {
    495      1.1.2.2   tron 		printf("%s: can't alloc rx buffers\n", sc->sc_dev.dv_xname);
    496      1.1.2.2   tron 		return ENOBUFS;
    497      1.1.2.2   tron 	}
    498      1.1.2.2   tron 
    499      1.1.2.2   tron 	state = 1;
    500      1.1.2.2   tron 	if (bus_dmamem_map(sc->sc_dmat, &seg, rseg, DGE_RXMEM, &kva,
    501      1.1.2.2   tron 	    BUS_DMA_NOWAIT)) {
    502      1.1.2.2   tron 		printf("%s: can't map DMA buffers (%d bytes)\n",
    503      1.1.2.2   tron 		    sc->sc_dev.dv_xname, (int)DGE_RXMEM);
    504      1.1.2.2   tron 		error = ENOBUFS;
    505      1.1.2.2   tron 		goto out;
    506      1.1.2.2   tron 	}
    507      1.1.2.2   tron 
    508      1.1.2.2   tron 	state = 2;
    509      1.1.2.2   tron 	if (bus_dmamap_create(sc->sc_dmat, DGE_RXMEM, 1, DGE_RXMEM, 0,
    510      1.1.2.2   tron 	    BUS_DMA_NOWAIT, &sc->sc_bugmap)) {
    511      1.1.2.2   tron 		printf("%s: can't create DMA map\n", sc->sc_dev.dv_xname);
    512      1.1.2.2   tron 		error = ENOBUFS;
    513      1.1.2.2   tron 		goto out;
    514      1.1.2.2   tron 	}
    515      1.1.2.2   tron 
    516      1.1.2.2   tron 	state = 3;
    517      1.1.2.2   tron 	if (bus_dmamap_load(sc->sc_dmat, sc->sc_bugmap,
    518      1.1.2.2   tron 	    kva, DGE_RXMEM, NULL, BUS_DMA_NOWAIT)) {
    519      1.1.2.2   tron 		printf("%s: can't load DMA map\n", sc->sc_dev.dv_xname);
    520      1.1.2.2   tron 		error = ENOBUFS;
    521      1.1.2.2   tron 		goto out;
    522      1.1.2.2   tron 	}
    523      1.1.2.2   tron 
    524      1.1.2.2   tron 	state = 4;
    525      1.1.2.2   tron 	sc->sc_bugbuf = (caddr_t)kva;
    526      1.1.2.2   tron 	SLIST_INIT(&sc->sc_buglist);
    527      1.1.2.2   tron 
    528      1.1.2.2   tron 	/*
    529      1.1.2.2   tron 	 * Now divide it up into DGE_BUFFER_SIZE pieces and save the addresses
    530      1.1.2.2   tron 	 * in an array.
    531      1.1.2.2   tron 	 */
    532      1.1.2.2   tron 	ptr = sc->sc_bugbuf;
    533      1.1.2.2   tron 	if ((entry = malloc(sizeof(*entry) * DGE_NBUFFERS,
    534      1.1.2.2   tron 	    M_DEVBUF, M_NOWAIT)) == NULL) {
    535      1.1.2.2   tron 		error = ENOBUFS;
    536      1.1.2.2   tron 		goto out;
    537      1.1.2.2   tron 	}
    538      1.1.2.2   tron 	sc->sc_entry = entry;
    539      1.1.2.2   tron 	for (i = 0; i < DGE_NBUFFERS; i++) {
    540      1.1.2.2   tron 		entry[i].rb_slot = i;
    541      1.1.2.2   tron 		SLIST_INSERT_HEAD(&sc->sc_buglist, &entry[i], rb_entry);
    542      1.1.2.2   tron 	}
    543      1.1.2.2   tron out:
    544      1.1.2.2   tron 	if (error != 0) {
    545      1.1.2.2   tron 		switch (state) {
    546      1.1.2.2   tron 		case 4:
    547      1.1.2.2   tron 			bus_dmamap_unload(sc->sc_dmat, sc->sc_bugmap);
    548      1.1.2.2   tron 		case 3:
    549      1.1.2.2   tron 			bus_dmamap_destroy(sc->sc_dmat, sc->sc_bugmap);
    550      1.1.2.2   tron 		case 2:
    551      1.1.2.2   tron 			bus_dmamem_unmap(sc->sc_dmat, kva, DGE_RXMEM);
    552      1.1.2.2   tron 		case 1:
    553      1.1.2.2   tron 			bus_dmamem_free(sc->sc_dmat, &seg, rseg);
    554      1.1.2.2   tron 			break;
    555      1.1.2.2   tron 		default:
    556      1.1.2.2   tron 			break;
    557      1.1.2.2   tron 		}
    558      1.1.2.2   tron 	}
    559      1.1.2.2   tron 
    560      1.1.2.2   tron 	return error;
    561      1.1.2.2   tron }
    562      1.1.2.2   tron 
    563      1.1.2.2   tron /*
    564      1.1.2.2   tron  * Allocate a jumbo buffer.
    565      1.1.2.2   tron  */
    566      1.1.2.2   tron static void *
    567      1.1.2.2   tron dge_getbuf(struct dge_softc *sc)
    568      1.1.2.2   tron {
    569      1.1.2.2   tron 	struct rxbugentry *entry;
    570      1.1.2.2   tron 
    571      1.1.2.2   tron 	entry = SLIST_FIRST(&sc->sc_buglist);
    572      1.1.2.2   tron 
    573      1.1.2.2   tron 	if (entry == NULL) {
    574      1.1.2.2   tron 		printf("%s: no free RX buffers\n", sc->sc_dev.dv_xname);
    575      1.1.2.2   tron 		return(NULL);
    576      1.1.2.2   tron 	}
    577      1.1.2.2   tron 
    578      1.1.2.2   tron 	SLIST_REMOVE_HEAD(&sc->sc_buglist, rb_entry);
    579      1.1.2.2   tron 	return sc->sc_bugbuf + entry->rb_slot * DGE_BUFFER_SIZE;
    580      1.1.2.2   tron }
    581      1.1.2.2   tron 
    582      1.1.2.2   tron /*
    583      1.1.2.2   tron  * Release a jumbo buffer.
    584      1.1.2.2   tron  */
    585      1.1.2.2   tron static void
    586      1.1.2.2   tron dge_freebuf(struct mbuf *m, caddr_t buf, size_t size, void *arg)
    587      1.1.2.2   tron {
    588      1.1.2.2   tron 	struct rxbugentry *entry;
    589      1.1.2.2   tron 	struct dge_softc *sc;
    590      1.1.2.2   tron 	int i, s;
    591      1.1.2.2   tron 
    592      1.1.2.2   tron 	/* Extract the softc struct pointer. */
    593      1.1.2.2   tron 	sc = (struct dge_softc *)arg;
    594      1.1.2.2   tron 
    595      1.1.2.2   tron 	if (sc == NULL)
    596      1.1.2.2   tron 		panic("dge_freebuf: can't find softc pointer!");
    597      1.1.2.2   tron 
    598      1.1.2.2   tron 	/* calculate the slot this buffer belongs to */
    599      1.1.2.2   tron 
    600      1.1.2.2   tron 	i = (buf - sc->sc_bugbuf) / DGE_BUFFER_SIZE;
    601      1.1.2.2   tron 
    602      1.1.2.2   tron 	if ((i < 0) || (i >= DGE_NBUFFERS))
    603      1.1.2.2   tron 		panic("dge_freebuf: asked to free buffer %d!", i);
    604      1.1.2.2   tron 
    605      1.1.2.2   tron 	s = splvm();
    606      1.1.2.2   tron 	entry = sc->sc_entry + i;
    607      1.1.2.2   tron 	SLIST_INSERT_HEAD(&sc->sc_buglist, entry, rb_entry);
    608      1.1.2.2   tron 
    609      1.1.2.2   tron 	if (__predict_true(m != NULL))
    610      1.1.2.2   tron 		pool_cache_put(&mbpool_cache, m);
    611      1.1.2.2   tron 	splx(s);
    612      1.1.2.2   tron }
    613      1.1.2.2   tron #endif
    614          1.1  ragge 
    615          1.1  ragge static void	dge_start(struct ifnet *);
    616          1.1  ragge static void	dge_watchdog(struct ifnet *);
    617          1.1  ragge static int	dge_ioctl(struct ifnet *, u_long, caddr_t);
    618          1.1  ragge static int	dge_init(struct ifnet *);
    619          1.1  ragge static void	dge_stop(struct ifnet *, int);
    620          1.1  ragge 
    621          1.1  ragge static void	dge_shutdown(void *);
    622          1.1  ragge 
    623          1.1  ragge static void	dge_reset(struct dge_softc *);
    624          1.1  ragge static void	dge_rxdrain(struct dge_softc *);
    625          1.1  ragge static int	dge_add_rxbuf(struct dge_softc *, int);
    626          1.1  ragge 
    627          1.1  ragge static void	dge_set_filter(struct dge_softc *);
    628          1.1  ragge 
    629          1.1  ragge static int	dge_intr(void *);
    630          1.1  ragge static void	dge_txintr(struct dge_softc *);
    631          1.1  ragge static void	dge_rxintr(struct dge_softc *);
    632          1.1  ragge static void	dge_linkintr(struct dge_softc *, uint32_t);
    633          1.1  ragge 
    634          1.1  ragge static int	dge_match(struct device *, struct cfdata *, void *);
    635          1.1  ragge static void	dge_attach(struct device *, struct device *, void *);
    636          1.1  ragge 
    637          1.1  ragge static int	dge_read_eeprom(struct dge_softc *sc);
    638          1.1  ragge static int	dge_eeprom_clockin(struct dge_softc *sc);
    639          1.1  ragge static void	dge_eeprom_clockout(struct dge_softc *sc, int bit);
    640          1.1  ragge static uint16_t	dge_eeprom_word(struct dge_softc *sc, int addr);
    641          1.1  ragge static int	dge_xgmii_mediachange(struct ifnet *);
    642          1.1  ragge static void	dge_xgmii_mediastatus(struct ifnet *, struct ifmediareq *);
    643          1.1  ragge static void	dge_xgmii_reset(struct dge_softc *);
    644          1.1  ragge static void	dge_xgmii_writereg(struct device *, int, int, int);
    645          1.1  ragge 
    646          1.1  ragge 
    647          1.1  ragge CFATTACH_DECL(dge, sizeof(struct dge_softc),
    648          1.1  ragge     dge_match, dge_attach, NULL, NULL);
    649          1.1  ragge 
    650          1.1  ragge #ifdef DGE_EVENT_COUNTERS
    651          1.1  ragge #if DGE_NTXSEGS > 100
    652          1.1  ragge #error Update dge_txseg_evcnt_names
    653          1.1  ragge #endif
    654          1.1  ragge static char (*dge_txseg_evcnt_names)[DGE_NTXSEGS][8 /* "txseg00" + \0 */];
    655          1.1  ragge #endif /* DGE_EVENT_COUNTERS */
    656          1.1  ragge 
    657          1.1  ragge static int
    658          1.1  ragge dge_match(struct device *parent, struct cfdata *cf, void *aux)
    659          1.1  ragge {
    660          1.1  ragge 	struct pci_attach_args *pa = aux;
    661          1.1  ragge 
    662          1.1  ragge 	if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_INTEL &&
    663          1.1  ragge 	    PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_82597EX)
    664          1.1  ragge 		return (1);
    665          1.1  ragge 
    666          1.1  ragge 	return (0);
    667          1.1  ragge }
    668          1.1  ragge 
    669          1.1  ragge static void
    670          1.1  ragge dge_attach(struct device *parent, struct device *self, void *aux)
    671          1.1  ragge {
    672          1.1  ragge 	struct dge_softc *sc = (void *) self;
    673          1.1  ragge 	struct pci_attach_args *pa = aux;
    674          1.1  ragge 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
    675          1.1  ragge 	pci_chipset_tag_t pc = pa->pa_pc;
    676          1.1  ragge 	pci_intr_handle_t ih;
    677          1.1  ragge 	const char *intrstr = NULL;
    678          1.1  ragge 	bus_dma_segment_t seg;
    679          1.1  ragge 	int i, rseg, error;
    680          1.1  ragge 	uint8_t enaddr[ETHER_ADDR_LEN];
    681          1.1  ragge 	pcireg_t preg, memtype;
    682          1.1  ragge 	uint32_t reg;
    683          1.1  ragge 
    684          1.1  ragge 	sc->sc_dmat = pa->pa_dmat;
    685          1.1  ragge 	sc->sc_pc = pa->pa_pc;
    686          1.1  ragge 	sc->sc_pt = pa->pa_tag;
    687          1.1  ragge 
    688          1.1  ragge 	preg = PCI_REVISION(pci_conf_read(pc, pa->pa_tag, PCI_CLASS_REG));
    689          1.1  ragge 	aprint_naive(": Ethernet controller\n");
    690          1.1  ragge 	aprint_normal(": Intel i82597EX 10GbE-LR Ethernet, rev. %d\n", preg);
    691          1.1  ragge 
    692          1.1  ragge 	memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, DGE_PCI_BAR);
    693          1.1  ragge         if (pci_mapreg_map(pa, DGE_PCI_BAR, memtype, 0,
    694          1.1  ragge             &sc->sc_st, &sc->sc_sh, NULL, NULL)) {
    695          1.1  ragge                 aprint_error("%s: unable to map device registers\n",
    696          1.1  ragge                     sc->sc_dev.dv_xname);
    697          1.1  ragge                 return;
    698          1.1  ragge         }
    699          1.1  ragge 
    700          1.1  ragge 	/* Enable bus mastering */
    701          1.1  ragge 	preg = pci_conf_read(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
    702          1.1  ragge 	preg |= PCI_COMMAND_MASTER_ENABLE;
    703          1.1  ragge 	pci_conf_write(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, preg);
    704          1.1  ragge 
    705          1.1  ragge 	/*
    706          1.1  ragge 	 * Map and establish our interrupt.
    707          1.1  ragge 	 */
    708          1.1  ragge 	if (pci_intr_map(pa, &ih)) {
    709          1.1  ragge 		aprint_error("%s: unable to map interrupt\n",
    710          1.1  ragge 		    sc->sc_dev.dv_xname);
    711          1.1  ragge 		return;
    712          1.1  ragge 	}
    713          1.1  ragge 	intrstr = pci_intr_string(pc, ih);
    714          1.1  ragge 	sc->sc_ih = pci_intr_establish(pc, ih, IPL_NET, dge_intr, sc);
    715          1.1  ragge 	if (sc->sc_ih == NULL) {
    716          1.1  ragge 		aprint_error("%s: unable to establish interrupt",
    717          1.1  ragge 		    sc->sc_dev.dv_xname);
    718          1.1  ragge 		if (intrstr != NULL)
    719          1.1  ragge 			aprint_normal(" at %s", intrstr);
    720          1.1  ragge 		aprint_normal("\n");
    721          1.1  ragge 		return;
    722          1.1  ragge 	}
    723          1.1  ragge 	aprint_normal("%s: interrupting at %s\n", sc->sc_dev.dv_xname, intrstr);
    724          1.1  ragge 
    725          1.1  ragge 	/*
    726          1.1  ragge 	 * Determine a few things about the bus we're connected to.
    727          1.1  ragge 	 */
    728          1.1  ragge 	reg = CSR_READ(sc, DGE_STATUS);
    729          1.1  ragge 	if (reg & STATUS_BUS64)
    730          1.1  ragge 		sc->sc_flags |= DGE_F_BUS64;
    731          1.1  ragge 
    732          1.1  ragge 	sc->sc_flags |= DGE_F_PCIX;
    733          1.1  ragge 	if (pci_get_capability(pa->pa_pc, pa->pa_tag,
    734          1.1  ragge 			       PCI_CAP_PCIX,
    735          1.1  ragge 			       &sc->sc_pcix_offset, NULL) == 0)
    736          1.1  ragge 		aprint_error("%s: unable to find PCIX "
    737          1.1  ragge 		    "capability\n", sc->sc_dev.dv_xname);
    738          1.1  ragge 
    739          1.1  ragge 	if (sc->sc_flags & DGE_F_PCIX) {
    740          1.1  ragge 		switch (reg & STATUS_PCIX_MSK) {
    741          1.1  ragge 		case STATUS_PCIX_66:
    742          1.1  ragge 			sc->sc_bus_speed = 66;
    743          1.1  ragge 			break;
    744          1.1  ragge 		case STATUS_PCIX_100:
    745          1.1  ragge 			sc->sc_bus_speed = 100;
    746          1.1  ragge 			break;
    747          1.1  ragge 		case STATUS_PCIX_133:
    748          1.1  ragge 			sc->sc_bus_speed = 133;
    749          1.1  ragge 			break;
    750          1.1  ragge 		default:
    751          1.1  ragge 			aprint_error(
    752          1.1  ragge 			    "%s: unknown PCIXSPD %d; assuming 66MHz\n",
    753          1.1  ragge 			    sc->sc_dev.dv_xname,
    754          1.1  ragge 			    reg & STATUS_PCIX_MSK);
    755          1.1  ragge 			sc->sc_bus_speed = 66;
    756          1.1  ragge 		}
    757          1.1  ragge 	} else
    758          1.1  ragge 		sc->sc_bus_speed = (reg & STATUS_BUS64) ? 66 : 33;
    759          1.1  ragge 	aprint_verbose("%s: %d-bit %dMHz %s bus\n", sc->sc_dev.dv_xname,
    760          1.1  ragge 	    (sc->sc_flags & DGE_F_BUS64) ? 64 : 32, sc->sc_bus_speed,
    761          1.1  ragge 	    (sc->sc_flags & DGE_F_PCIX) ? "PCIX" : "PCI");
    762          1.1  ragge 
    763          1.1  ragge 	/*
    764          1.1  ragge 	 * Allocate the control data structures, and create and load the
    765          1.1  ragge 	 * DMA map for it.
    766          1.1  ragge 	 */
    767          1.1  ragge 	if ((error = bus_dmamem_alloc(sc->sc_dmat,
    768          1.1  ragge 	    sizeof(struct dge_control_data), PAGE_SIZE, 0, &seg, 1, &rseg,
    769          1.1  ragge 	    0)) != 0) {
    770          1.1  ragge 		aprint_error(
    771          1.1  ragge 		    "%s: unable to allocate control data, error = %d\n",
    772          1.1  ragge 		    sc->sc_dev.dv_xname, error);
    773          1.1  ragge 		goto fail_0;
    774          1.1  ragge 	}
    775          1.1  ragge 
    776          1.1  ragge 	if ((error = bus_dmamem_map(sc->sc_dmat, &seg, rseg,
    777          1.1  ragge 	    sizeof(struct dge_control_data), (caddr_t *)&sc->sc_control_data,
    778          1.1  ragge 	    0)) != 0) {
    779          1.1  ragge 		aprint_error("%s: unable to map control data, error = %d\n",
    780          1.1  ragge 		    sc->sc_dev.dv_xname, error);
    781          1.1  ragge 		goto fail_1;
    782          1.1  ragge 	}
    783          1.1  ragge 
    784          1.1  ragge 	if ((error = bus_dmamap_create(sc->sc_dmat,
    785          1.1  ragge 	    sizeof(struct dge_control_data), 1,
    786          1.1  ragge 	    sizeof(struct dge_control_data), 0, 0, &sc->sc_cddmamap)) != 0) {
    787          1.1  ragge 		aprint_error("%s: unable to create control data DMA map, "
    788          1.1  ragge 		    "error = %d\n", sc->sc_dev.dv_xname, error);
    789          1.1  ragge 		goto fail_2;
    790          1.1  ragge 	}
    791          1.1  ragge 
    792          1.1  ragge 	if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_cddmamap,
    793          1.1  ragge 	    sc->sc_control_data, sizeof(struct dge_control_data), NULL,
    794          1.1  ragge 	    0)) != 0) {
    795          1.1  ragge 		aprint_error(
    796          1.1  ragge 		    "%s: unable to load control data DMA map, error = %d\n",
    797          1.1  ragge 		    sc->sc_dev.dv_xname, error);
    798          1.1  ragge 		goto fail_3;
    799          1.1  ragge 	}
    800          1.1  ragge 
    801      1.1.2.2   tron #ifdef DGE_OFFBYONE_RXBUG
    802      1.1.2.2   tron 	if (dge_alloc_rcvmem(sc) != 0)
    803      1.1.2.2   tron 		return; /* Already complained */
    804      1.1.2.2   tron #endif
    805          1.1  ragge 	/*
    806          1.1  ragge 	 * Create the transmit buffer DMA maps.
    807          1.1  ragge 	 */
    808          1.1  ragge 	for (i = 0; i < DGE_TXQUEUELEN; i++) {
    809      1.1.2.1   tron 		if ((error = bus_dmamap_create(sc->sc_dmat, DGE_MAX_MTU,
    810          1.1  ragge 		    DGE_NTXSEGS, MCLBYTES, 0, 0,
    811          1.1  ragge 		    &sc->sc_txsoft[i].txs_dmamap)) != 0) {
    812          1.1  ragge 			aprint_error("%s: unable to create Tx DMA map %d, "
    813          1.1  ragge 			    "error = %d\n", sc->sc_dev.dv_xname, i, error);
    814          1.1  ragge 			goto fail_4;
    815          1.1  ragge 		}
    816          1.1  ragge 	}
    817          1.1  ragge 
    818          1.1  ragge 	/*
    819          1.1  ragge 	 * Create the receive buffer DMA maps.
    820          1.1  ragge 	 */
    821          1.1  ragge 	for (i = 0; i < DGE_NRXDESC; i++) {
    822      1.1.2.2   tron #ifdef DGE_OFFBYONE_RXBUG
    823      1.1.2.2   tron 		if ((error = bus_dmamap_create(sc->sc_dmat, DGE_BUFFER_SIZE, 1,
    824      1.1.2.2   tron 		    DGE_BUFFER_SIZE, 0, 0, &sc->sc_rxsoft[i].rxs_dmamap)) != 0) {
    825      1.1.2.2   tron #else
    826          1.1  ragge 		if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1,
    827          1.1  ragge 		    MCLBYTES, 0, 0, &sc->sc_rxsoft[i].rxs_dmamap)) != 0) {
    828      1.1.2.2   tron #endif
    829          1.1  ragge 			aprint_error("%s: unable to create Rx DMA map %d, "
    830          1.1  ragge 			    "error = %d\n", sc->sc_dev.dv_xname, i, error);
    831          1.1  ragge 			goto fail_5;
    832          1.1  ragge 		}
    833          1.1  ragge 		sc->sc_rxsoft[i].rxs_mbuf = NULL;
    834          1.1  ragge 	}
    835          1.1  ragge 
    836          1.1  ragge 	/*
    837          1.1  ragge 	 * Set bits in ctrl0 register.
    838          1.1  ragge 	 * Should get the software defined pins out of EEPROM?
    839          1.1  ragge 	 */
    840          1.1  ragge 	sc->sc_ctrl0 |= CTRL0_RPE | CTRL0_TPE; /* XON/XOFF */
    841          1.1  ragge 	sc->sc_ctrl0 |= CTRL0_SDP3_DIR | CTRL0_SDP2_DIR | CTRL0_SDP1_DIR |
    842          1.1  ragge 	    CTRL0_SDP0_DIR | CTRL0_SDP3 | CTRL0_SDP2 | CTRL0_SDP0;
    843          1.1  ragge 
    844          1.1  ragge 	/*
    845          1.1  ragge 	 * Reset the chip to a known state.
    846          1.1  ragge 	 */
    847          1.1  ragge 	dge_reset(sc);
    848          1.1  ragge 
    849          1.1  ragge 	/*
    850          1.1  ragge 	 * Reset the PHY.
    851          1.1  ragge 	 */
    852          1.1  ragge 	dge_xgmii_reset(sc);
    853          1.1  ragge 
    854          1.1  ragge 	/*
    855          1.1  ragge 	 * Read in EEPROM data.
    856          1.1  ragge 	 */
    857          1.1  ragge 	if (dge_read_eeprom(sc)) {
    858          1.1  ragge 		aprint_error("%s: couldn't read EEPROM\n", sc->sc_dev.dv_xname);
    859          1.1  ragge 		return;
    860          1.1  ragge 	}
    861          1.1  ragge 
    862          1.1  ragge 	/*
    863          1.1  ragge 	 * Get the ethernet address.
    864          1.1  ragge 	 */
    865          1.1  ragge 	enaddr[0] = sc->sc_eeprom[EE_ADDR01] & 0377;
    866          1.1  ragge 	enaddr[1] = sc->sc_eeprom[EE_ADDR01] >> 8;
    867          1.1  ragge 	enaddr[2] = sc->sc_eeprom[EE_ADDR23] & 0377;
    868          1.1  ragge 	enaddr[3] = sc->sc_eeprom[EE_ADDR23] >> 8;
    869          1.1  ragge 	enaddr[4] = sc->sc_eeprom[EE_ADDR45] & 0377;
    870          1.1  ragge 	enaddr[5] = sc->sc_eeprom[EE_ADDR45] >> 8;
    871          1.1  ragge 
    872          1.1  ragge 	aprint_normal("%s: Ethernet address %s\n", sc->sc_dev.dv_xname,
    873          1.1  ragge 	    ether_sprintf(enaddr));
    874          1.1  ragge 
    875          1.1  ragge 	/*
    876          1.1  ragge 	 * Setup media stuff.
    877          1.1  ragge 	 */
    878          1.1  ragge         ifmedia_init(&sc->sc_media, IFM_IMASK, dge_xgmii_mediachange,
    879          1.1  ragge             dge_xgmii_mediastatus);
    880          1.1  ragge         ifmedia_add(&sc->sc_media, IFM_ETHER|IFM_10G_LR, 0, NULL);
    881          1.1  ragge         ifmedia_set(&sc->sc_media, IFM_ETHER|IFM_10G_LR);
    882          1.1  ragge 
    883          1.1  ragge 	ifp = &sc->sc_ethercom.ec_if;
    884          1.1  ragge 	strcpy(ifp->if_xname, sc->sc_dev.dv_xname);
    885          1.1  ragge 	ifp->if_softc = sc;
    886          1.1  ragge 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
    887          1.1  ragge 	ifp->if_ioctl = dge_ioctl;
    888          1.1  ragge 	ifp->if_start = dge_start;
    889          1.1  ragge 	ifp->if_watchdog = dge_watchdog;
    890          1.1  ragge 	ifp->if_init = dge_init;
    891          1.1  ragge 	ifp->if_stop = dge_stop;
    892          1.1  ragge 	IFQ_SET_MAXLEN(&ifp->if_snd, max(DGE_IFQUEUELEN, IFQ_MAXLEN));
    893          1.1  ragge 	IFQ_SET_READY(&ifp->if_snd);
    894          1.1  ragge 
    895          1.1  ragge 	sc->sc_ethercom.ec_capabilities |=
    896          1.1  ragge 	    ETHERCAP_JUMBO_MTU | ETHERCAP_VLAN_MTU;
    897          1.1  ragge 
    898          1.1  ragge 	/*
    899          1.1  ragge 	 * We can perform TCPv4 and UDPv4 checkums in-bound.
    900          1.1  ragge 	 */
    901          1.1  ragge 	ifp->if_capabilities |=
    902          1.1  ragge 	    IFCAP_CSUM_IPv4 | IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4;
    903          1.1  ragge 
    904          1.1  ragge 	/*
    905          1.1  ragge 	 * Attach the interface.
    906          1.1  ragge 	 */
    907          1.1  ragge 	if_attach(ifp);
    908          1.1  ragge 	ether_ifattach(ifp, enaddr);
    909          1.1  ragge #if NRND > 0
    910          1.1  ragge 	rnd_attach_source(&sc->rnd_source, sc->sc_dev.dv_xname,
    911          1.1  ragge 	    RND_TYPE_NET, 0);
    912          1.1  ragge #endif
    913          1.1  ragge 
    914          1.1  ragge #ifdef DGE_EVENT_COUNTERS
    915          1.1  ragge 	/* Fix segment event naming */
    916          1.1  ragge 	if (dge_txseg_evcnt_names == NULL) {
    917          1.1  ragge 		dge_txseg_evcnt_names =
    918          1.1  ragge 		    malloc(sizeof(*dge_txseg_evcnt_names), M_DEVBUF, M_WAITOK);
    919          1.1  ragge 		for (i = 0; i < DGE_NTXSEGS; i++)
    920          1.1  ragge 			sprintf((*dge_txseg_evcnt_names)[i], "txseg%d", i);
    921          1.1  ragge 	}
    922          1.1  ragge 
    923          1.1  ragge 	/* Attach event counters. */
    924          1.1  ragge 	evcnt_attach_dynamic(&sc->sc_ev_txsstall, EVCNT_TYPE_MISC,
    925          1.1  ragge 	    NULL, sc->sc_dev.dv_xname, "txsstall");
    926          1.1  ragge 	evcnt_attach_dynamic(&sc->sc_ev_txdstall, EVCNT_TYPE_MISC,
    927          1.1  ragge 	    NULL, sc->sc_dev.dv_xname, "txdstall");
    928          1.1  ragge 	evcnt_attach_dynamic(&sc->sc_ev_txforceintr, EVCNT_TYPE_MISC,
    929          1.1  ragge 	    NULL, sc->sc_dev.dv_xname, "txforceintr");
    930          1.1  ragge 	evcnt_attach_dynamic(&sc->sc_ev_txdw, EVCNT_TYPE_INTR,
    931          1.1  ragge 	    NULL, sc->sc_dev.dv_xname, "txdw");
    932          1.1  ragge 	evcnt_attach_dynamic(&sc->sc_ev_txqe, EVCNT_TYPE_INTR,
    933          1.1  ragge 	    NULL, sc->sc_dev.dv_xname, "txqe");
    934          1.1  ragge 	evcnt_attach_dynamic(&sc->sc_ev_rxintr, EVCNT_TYPE_INTR,
    935          1.1  ragge 	    NULL, sc->sc_dev.dv_xname, "rxintr");
    936          1.1  ragge 	evcnt_attach_dynamic(&sc->sc_ev_linkintr, EVCNT_TYPE_INTR,
    937          1.1  ragge 	    NULL, sc->sc_dev.dv_xname, "linkintr");
    938          1.1  ragge 
    939          1.1  ragge 	evcnt_attach_dynamic(&sc->sc_ev_rxipsum, EVCNT_TYPE_MISC,
    940          1.1  ragge 	    NULL, sc->sc_dev.dv_xname, "rxipsum");
    941          1.1  ragge 	evcnt_attach_dynamic(&sc->sc_ev_rxtusum, EVCNT_TYPE_MISC,
    942          1.1  ragge 	    NULL, sc->sc_dev.dv_xname, "rxtusum");
    943          1.1  ragge 	evcnt_attach_dynamic(&sc->sc_ev_txipsum, EVCNT_TYPE_MISC,
    944          1.1  ragge 	    NULL, sc->sc_dev.dv_xname, "txipsum");
    945          1.1  ragge 	evcnt_attach_dynamic(&sc->sc_ev_txtusum, EVCNT_TYPE_MISC,
    946          1.1  ragge 	    NULL, sc->sc_dev.dv_xname, "txtusum");
    947          1.1  ragge 
    948          1.1  ragge 	evcnt_attach_dynamic(&sc->sc_ev_txctx_init, EVCNT_TYPE_MISC,
    949          1.1  ragge 	    NULL, sc->sc_dev.dv_xname, "txctx init");
    950          1.1  ragge 	evcnt_attach_dynamic(&sc->sc_ev_txctx_hit, EVCNT_TYPE_MISC,
    951          1.1  ragge 	    NULL, sc->sc_dev.dv_xname, "txctx hit");
    952          1.1  ragge 	evcnt_attach_dynamic(&sc->sc_ev_txctx_miss, EVCNT_TYPE_MISC,
    953          1.1  ragge 	    NULL, sc->sc_dev.dv_xname, "txctx miss");
    954          1.1  ragge 
    955          1.1  ragge 	for (i = 0; i < DGE_NTXSEGS; i++)
    956          1.1  ragge 		evcnt_attach_dynamic(&sc->sc_ev_txseg[i], EVCNT_TYPE_MISC,
    957          1.1  ragge 		    NULL, sc->sc_dev.dv_xname, (*dge_txseg_evcnt_names)[i]);
    958          1.1  ragge 
    959          1.1  ragge 	evcnt_attach_dynamic(&sc->sc_ev_txdrop, EVCNT_TYPE_MISC,
    960          1.1  ragge 	    NULL, sc->sc_dev.dv_xname, "txdrop");
    961          1.1  ragge 
    962          1.1  ragge #endif /* DGE_EVENT_COUNTERS */
    963          1.1  ragge 
    964          1.1  ragge 	/*
    965          1.1  ragge 	 * Make sure the interface is shutdown during reboot.
    966          1.1  ragge 	 */
    967          1.1  ragge 	sc->sc_sdhook = shutdownhook_establish(dge_shutdown, sc);
    968          1.1  ragge 	if (sc->sc_sdhook == NULL)
    969          1.1  ragge 		aprint_error("%s: WARNING: unable to establish shutdown hook\n",
    970          1.1  ragge 		    sc->sc_dev.dv_xname);
    971          1.1  ragge 	return;
    972          1.1  ragge 
    973          1.1  ragge 	/*
    974          1.1  ragge 	 * Free any resources we've allocated during the failed attach
    975          1.1  ragge 	 * attempt.  Do this in reverse order and fall through.
    976          1.1  ragge 	 */
    977          1.1  ragge  fail_5:
    978          1.1  ragge 	for (i = 0; i < DGE_NRXDESC; i++) {
    979          1.1  ragge 		if (sc->sc_rxsoft[i].rxs_dmamap != NULL)
    980          1.1  ragge 			bus_dmamap_destroy(sc->sc_dmat,
    981          1.1  ragge 			    sc->sc_rxsoft[i].rxs_dmamap);
    982          1.1  ragge 	}
    983          1.1  ragge  fail_4:
    984          1.1  ragge 	for (i = 0; i < DGE_TXQUEUELEN; i++) {
    985          1.1  ragge 		if (sc->sc_txsoft[i].txs_dmamap != NULL)
    986          1.1  ragge 			bus_dmamap_destroy(sc->sc_dmat,
    987          1.1  ragge 			    sc->sc_txsoft[i].txs_dmamap);
    988          1.1  ragge 	}
    989          1.1  ragge 	bus_dmamap_unload(sc->sc_dmat, sc->sc_cddmamap);
    990          1.1  ragge  fail_3:
    991          1.1  ragge 	bus_dmamap_destroy(sc->sc_dmat, sc->sc_cddmamap);
    992          1.1  ragge  fail_2:
    993          1.1  ragge 	bus_dmamem_unmap(sc->sc_dmat, (caddr_t)sc->sc_control_data,
    994          1.1  ragge 	    sizeof(struct dge_control_data));
    995          1.1  ragge  fail_1:
    996          1.1  ragge 	bus_dmamem_free(sc->sc_dmat, &seg, rseg);
    997          1.1  ragge  fail_0:
    998          1.1  ragge 	return;
    999          1.1  ragge }
   1000          1.1  ragge 
   1001          1.1  ragge /*
   1002          1.1  ragge  * dge_shutdown:
   1003          1.1  ragge  *
   1004          1.1  ragge  *	Make sure the interface is stopped at reboot time.
   1005          1.1  ragge  */
   1006          1.1  ragge static void
   1007          1.1  ragge dge_shutdown(void *arg)
   1008          1.1  ragge {
   1009          1.1  ragge 	struct dge_softc *sc = arg;
   1010          1.1  ragge 
   1011          1.1  ragge 	dge_stop(&sc->sc_ethercom.ec_if, 1);
   1012          1.1  ragge }
   1013          1.1  ragge 
   1014          1.1  ragge /*
   1015          1.1  ragge  * dge_tx_cksum:
   1016          1.1  ragge  *
   1017          1.1  ragge  *	Set up TCP/IP checksumming parameters for the
   1018          1.1  ragge  *	specified packet.
   1019          1.1  ragge  */
   1020          1.1  ragge static int
   1021          1.1  ragge dge_tx_cksum(struct dge_softc *sc, struct dge_txsoft *txs, uint8_t *fieldsp)
   1022          1.1  ragge {
   1023          1.1  ragge 	struct mbuf *m0 = txs->txs_mbuf;
   1024          1.1  ragge 	struct dge_ctdes *t;
   1025          1.1  ragge 	uint32_t ipcs, tucs;
   1026          1.1  ragge 	struct ip *ip;
   1027          1.1  ragge 	struct ether_header *eh;
   1028          1.1  ragge 	int offset, iphl;
   1029          1.1  ragge 	uint8_t fields = 0;
   1030          1.1  ragge 
   1031          1.1  ragge 	/*
   1032          1.1  ragge 	 * XXX It would be nice if the mbuf pkthdr had offset
   1033          1.1  ragge 	 * fields for the protocol headers.
   1034          1.1  ragge 	 */
   1035          1.1  ragge 
   1036          1.1  ragge 	eh = mtod(m0, struct ether_header *);
   1037          1.1  ragge 	switch (htons(eh->ether_type)) {
   1038          1.1  ragge 	case ETHERTYPE_IP:
   1039          1.1  ragge 		iphl = sizeof(struct ip);
   1040          1.1  ragge 		offset = ETHER_HDR_LEN;
   1041          1.1  ragge 		break;
   1042          1.1  ragge 
   1043          1.1  ragge 	case ETHERTYPE_VLAN:
   1044          1.1  ragge 		iphl = sizeof(struct ip);
   1045          1.1  ragge 		offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
   1046          1.1  ragge 		break;
   1047          1.1  ragge 
   1048          1.1  ragge 	default:
   1049          1.1  ragge 		/*
   1050          1.1  ragge 		 * Don't support this protocol or encapsulation.
   1051          1.1  ragge 		 */
   1052          1.1  ragge 		*fieldsp = 0;
   1053          1.1  ragge 		return (0);
   1054          1.1  ragge 	}
   1055          1.1  ragge 
   1056          1.1  ragge 	if (m0->m_len < (offset + iphl)) {
   1057          1.1  ragge 		if ((txs->txs_mbuf = m_pullup(m0, offset + iphl)) == NULL) {
   1058          1.1  ragge 			printf("%s: dge_tx_cksum: mbuf allocation failed, "
   1059          1.1  ragge 			    "packet dropped\n", sc->sc_dev.dv_xname);
   1060          1.1  ragge 			return (ENOMEM);
   1061          1.1  ragge 		}
   1062          1.1  ragge 		m0 = txs->txs_mbuf;
   1063          1.1  ragge 	}
   1064          1.1  ragge 
   1065          1.1  ragge 	ip = (struct ip *) (mtod(m0, caddr_t) + offset);
   1066          1.1  ragge 	iphl = ip->ip_hl << 2;
   1067          1.1  ragge 
   1068          1.1  ragge 	/*
   1069          1.1  ragge 	 * NOTE: Even if we're not using the IP or TCP/UDP checksum
   1070          1.1  ragge 	 * offload feature, if we load the context descriptor, we
   1071          1.1  ragge 	 * MUST provide valid values for IPCSS and TUCSS fields.
   1072          1.1  ragge 	 */
   1073          1.1  ragge 
   1074          1.1  ragge 	if (m0->m_pkthdr.csum_flags & M_CSUM_IPv4) {
   1075          1.1  ragge 		DGE_EVCNT_INCR(&sc->sc_ev_txipsum);
   1076          1.1  ragge 		fields |= TDESC_POPTS_IXSM;
   1077          1.1  ragge 		ipcs = DGE_TCPIP_IPCSS(offset) |
   1078          1.1  ragge 		    DGE_TCPIP_IPCSO(offset + offsetof(struct ip, ip_sum)) |
   1079          1.1  ragge 		    DGE_TCPIP_IPCSE(offset + iphl - 1);
   1080          1.1  ragge 	} else if (__predict_true(sc->sc_txctx_ipcs != 0xffffffff)) {
   1081          1.1  ragge 		/* Use the cached value. */
   1082          1.1  ragge 		ipcs = sc->sc_txctx_ipcs;
   1083          1.1  ragge 	} else {
   1084          1.1  ragge 		/* Just initialize it to the likely value anyway. */
   1085          1.1  ragge 		ipcs = DGE_TCPIP_IPCSS(offset) |
   1086          1.1  ragge 		    DGE_TCPIP_IPCSO(offset + offsetof(struct ip, ip_sum)) |
   1087          1.1  ragge 		    DGE_TCPIP_IPCSE(offset + iphl - 1);
   1088          1.1  ragge 	}
   1089          1.1  ragge 	DPRINTF(DGE_DEBUG_CKSUM,
   1090          1.1  ragge 	    ("%s: CKSUM: offset %d ipcs 0x%x\n",
   1091          1.1  ragge 	    sc->sc_dev.dv_xname, offset, ipcs));
   1092          1.1  ragge 
   1093          1.1  ragge 	offset += iphl;
   1094          1.1  ragge 
   1095          1.1  ragge 	if (m0->m_pkthdr.csum_flags & (M_CSUM_TCPv4|M_CSUM_UDPv4)) {
   1096          1.1  ragge 		DGE_EVCNT_INCR(&sc->sc_ev_txtusum);
   1097          1.1  ragge 		fields |= TDESC_POPTS_TXSM;
   1098          1.1  ragge 		tucs = DGE_TCPIP_TUCSS(offset) |
   1099          1.1  ragge 		    DGE_TCPIP_TUCSO(offset + m0->m_pkthdr.csum_data) |
   1100          1.1  ragge 		    DGE_TCPIP_TUCSE(0) /* rest of packet */;
   1101          1.1  ragge 	} else if (__predict_true(sc->sc_txctx_tucs != 0xffffffff)) {
   1102          1.1  ragge 		/* Use the cached value. */
   1103          1.1  ragge 		tucs = sc->sc_txctx_tucs;
   1104          1.1  ragge 	} else {
   1105          1.1  ragge 		/* Just initialize it to a valid TCP context. */
   1106          1.1  ragge 		tucs = DGE_TCPIP_TUCSS(offset) |
   1107          1.1  ragge 		    DGE_TCPIP_TUCSO(offset + offsetof(struct tcphdr, th_sum)) |
   1108          1.1  ragge 		    DGE_TCPIP_TUCSE(0) /* rest of packet */;
   1109          1.1  ragge 	}
   1110          1.1  ragge 
   1111          1.1  ragge 	DPRINTF(DGE_DEBUG_CKSUM,
   1112          1.1  ragge 	    ("%s: CKSUM: offset %d tucs 0x%x\n",
   1113          1.1  ragge 	    sc->sc_dev.dv_xname, offset, tucs));
   1114          1.1  ragge 
   1115          1.1  ragge 	if (sc->sc_txctx_ipcs == ipcs &&
   1116          1.1  ragge 	    sc->sc_txctx_tucs == tucs) {
   1117          1.1  ragge 		/* Cached context is fine. */
   1118          1.1  ragge 		DGE_EVCNT_INCR(&sc->sc_ev_txctx_hit);
   1119          1.1  ragge 	} else {
   1120          1.1  ragge 		/* Fill in the context descriptor. */
   1121          1.1  ragge #ifdef DGE_EVENT_COUNTERS
   1122          1.1  ragge 		if (sc->sc_txctx_ipcs == 0xffffffff &&
   1123          1.1  ragge 		    sc->sc_txctx_tucs == 0xffffffff)
   1124          1.1  ragge 			DGE_EVCNT_INCR(&sc->sc_ev_txctx_init);
   1125          1.1  ragge 		else
   1126          1.1  ragge 			DGE_EVCNT_INCR(&sc->sc_ev_txctx_miss);
   1127          1.1  ragge #endif
   1128          1.1  ragge 		t = (struct dge_ctdes *)&sc->sc_txdescs[sc->sc_txnext];
   1129          1.1  ragge 		t->dc_tcpip_ipcs = htole32(ipcs);
   1130          1.1  ragge 		t->dc_tcpip_tucs = htole32(tucs);
   1131          1.1  ragge 		t->dc_tcpip_cmdlen = htole32(TDESC_DTYP_CTD);
   1132          1.1  ragge 		t->dc_tcpip_seg = 0;
   1133          1.1  ragge 		DGE_CDTXSYNC(sc, sc->sc_txnext, 1, BUS_DMASYNC_PREWRITE);
   1134          1.1  ragge 
   1135          1.1  ragge 		sc->sc_txctx_ipcs = ipcs;
   1136          1.1  ragge 		sc->sc_txctx_tucs = tucs;
   1137          1.1  ragge 
   1138          1.1  ragge 		sc->sc_txnext = DGE_NEXTTX(sc->sc_txnext);
   1139          1.1  ragge 		txs->txs_ndesc++;
   1140          1.1  ragge 	}
   1141          1.1  ragge 
   1142          1.1  ragge 	*fieldsp = fields;
   1143          1.1  ragge 
   1144          1.1  ragge 	return (0);
   1145          1.1  ragge }
   1146          1.1  ragge 
   1147          1.1  ragge /*
   1148          1.1  ragge  * dge_start:		[ifnet interface function]
   1149          1.1  ragge  *
   1150          1.1  ragge  *	Start packet transmission on the interface.
   1151          1.1  ragge  */
   1152          1.1  ragge static void
   1153          1.1  ragge dge_start(struct ifnet *ifp)
   1154          1.1  ragge {
   1155          1.1  ragge 	struct dge_softc *sc = ifp->if_softc;
   1156          1.1  ragge 	struct mbuf *m0;
   1157          1.1  ragge 	struct dge_txsoft *txs;
   1158          1.1  ragge 	bus_dmamap_t dmamap;
   1159          1.1  ragge 	int error, nexttx, lasttx = -1, ofree, seg;
   1160          1.1  ragge 	uint32_t cksumcmd;
   1161          1.1  ragge 	uint8_t cksumfields;
   1162          1.1  ragge 
   1163          1.1  ragge 	if ((ifp->if_flags & (IFF_RUNNING|IFF_OACTIVE)) != IFF_RUNNING)
   1164          1.1  ragge 		return;
   1165          1.1  ragge 
   1166          1.1  ragge 	/*
   1167          1.1  ragge 	 * Remember the previous number of free descriptors.
   1168          1.1  ragge 	 */
   1169          1.1  ragge 	ofree = sc->sc_txfree;
   1170          1.1  ragge 
   1171          1.1  ragge 	/*
   1172          1.1  ragge 	 * Loop through the send queue, setting up transmit descriptors
   1173          1.1  ragge 	 * until we drain the queue, or use up all available transmit
   1174          1.1  ragge 	 * descriptors.
   1175          1.1  ragge 	 */
   1176          1.1  ragge 	for (;;) {
   1177          1.1  ragge 		/* Grab a packet off the queue. */
   1178          1.1  ragge 		IFQ_POLL(&ifp->if_snd, m0);
   1179          1.1  ragge 		if (m0 == NULL)
   1180          1.1  ragge 			break;
   1181          1.1  ragge 
   1182          1.1  ragge 		DPRINTF(DGE_DEBUG_TX,
   1183          1.1  ragge 		    ("%s: TX: have packet to transmit: %p\n",
   1184          1.1  ragge 		    sc->sc_dev.dv_xname, m0));
   1185          1.1  ragge 
   1186          1.1  ragge 		/* Get a work queue entry. */
   1187          1.1  ragge 		if (sc->sc_txsfree < DGE_TXQUEUE_GC) {
   1188          1.1  ragge 			dge_txintr(sc);
   1189          1.1  ragge 			if (sc->sc_txsfree == 0) {
   1190          1.1  ragge 				DPRINTF(DGE_DEBUG_TX,
   1191          1.1  ragge 				    ("%s: TX: no free job descriptors\n",
   1192          1.1  ragge 					sc->sc_dev.dv_xname));
   1193          1.1  ragge 				DGE_EVCNT_INCR(&sc->sc_ev_txsstall);
   1194          1.1  ragge 				break;
   1195          1.1  ragge 			}
   1196          1.1  ragge 		}
   1197          1.1  ragge 
   1198          1.1  ragge 		txs = &sc->sc_txsoft[sc->sc_txsnext];
   1199          1.1  ragge 		dmamap = txs->txs_dmamap;
   1200          1.1  ragge 
   1201          1.1  ragge 		/*
   1202          1.1  ragge 		 * Load the DMA map.  If this fails, the packet either
   1203          1.1  ragge 		 * didn't fit in the allotted number of segments, or we
   1204          1.1  ragge 		 * were short on resources.  For the too-many-segments
   1205          1.1  ragge 		 * case, we simply report an error and drop the packet,
   1206          1.1  ragge 		 * since we can't sanely copy a jumbo packet to a single
   1207          1.1  ragge 		 * buffer.
   1208          1.1  ragge 		 */
   1209          1.1  ragge 		error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0,
   1210          1.1  ragge 		    BUS_DMA_WRITE|BUS_DMA_NOWAIT);
   1211          1.1  ragge 		if (error) {
   1212          1.1  ragge 			if (error == EFBIG) {
   1213          1.1  ragge 				DGE_EVCNT_INCR(&sc->sc_ev_txdrop);
   1214          1.1  ragge 				printf("%s: Tx packet consumes too many "
   1215          1.1  ragge 				    "DMA segments, dropping...\n",
   1216          1.1  ragge 				    sc->sc_dev.dv_xname);
   1217          1.1  ragge 				IFQ_DEQUEUE(&ifp->if_snd, m0);
   1218          1.1  ragge 				m_freem(m0);
   1219          1.1  ragge 				continue;
   1220          1.1  ragge 			}
   1221          1.1  ragge 			/*
   1222          1.1  ragge 			 * Short on resources, just stop for now.
   1223          1.1  ragge 			 */
   1224          1.1  ragge 			DPRINTF(DGE_DEBUG_TX,
   1225          1.1  ragge 			    ("%s: TX: dmamap load failed: %d\n",
   1226          1.1  ragge 			    sc->sc_dev.dv_xname, error));
   1227          1.1  ragge 			break;
   1228          1.1  ragge 		}
   1229          1.1  ragge 
   1230          1.1  ragge 		/*
   1231          1.1  ragge 		 * Ensure we have enough descriptors free to describe
   1232          1.1  ragge 		 * the packet.  Note, we always reserve one descriptor
   1233          1.1  ragge 		 * at the end of the ring due to the semantics of the
   1234          1.1  ragge 		 * TDT register, plus one more in the event we need
   1235          1.1  ragge 		 * to re-load checksum offload context.
   1236          1.1  ragge 		 */
   1237          1.1  ragge 		if (dmamap->dm_nsegs > (sc->sc_txfree - 2)) {
   1238          1.1  ragge 			/*
   1239          1.1  ragge 			 * Not enough free descriptors to transmit this
   1240          1.1  ragge 			 * packet.  We haven't committed anything yet,
   1241          1.1  ragge 			 * so just unload the DMA map, put the packet
   1242          1.1  ragge 			 * pack on the queue, and punt.  Notify the upper
   1243          1.1  ragge 			 * layer that there are no more slots left.
   1244          1.1  ragge 			 */
   1245          1.1  ragge 			DPRINTF(DGE_DEBUG_TX,
   1246          1.1  ragge 			    ("%s: TX: need %d descriptors, have %d\n",
   1247          1.1  ragge 			    sc->sc_dev.dv_xname, dmamap->dm_nsegs,
   1248          1.1  ragge 			    sc->sc_txfree - 1));
   1249          1.1  ragge 			ifp->if_flags |= IFF_OACTIVE;
   1250          1.1  ragge 			bus_dmamap_unload(sc->sc_dmat, dmamap);
   1251          1.1  ragge 			DGE_EVCNT_INCR(&sc->sc_ev_txdstall);
   1252          1.1  ragge 			break;
   1253          1.1  ragge 		}
   1254          1.1  ragge 
   1255          1.1  ragge 		IFQ_DEQUEUE(&ifp->if_snd, m0);
   1256          1.1  ragge 
   1257          1.1  ragge 		/*
   1258          1.1  ragge 		 * WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET.
   1259          1.1  ragge 		 */
   1260          1.1  ragge 
   1261          1.1  ragge 		/* Sync the DMA map. */
   1262          1.1  ragge 		bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize,
   1263          1.1  ragge 		    BUS_DMASYNC_PREWRITE);
   1264          1.1  ragge 
   1265          1.1  ragge 		DPRINTF(DGE_DEBUG_TX,
   1266          1.1  ragge 		    ("%s: TX: packet has %d DMA segments\n",
   1267          1.1  ragge 		    sc->sc_dev.dv_xname, dmamap->dm_nsegs));
   1268          1.1  ragge 
   1269          1.1  ragge 		DGE_EVCNT_INCR(&sc->sc_ev_txseg[dmamap->dm_nsegs - 1]);
   1270          1.1  ragge 
   1271          1.1  ragge 		/*
   1272          1.1  ragge 		 * Store a pointer to the packet so that we can free it
   1273          1.1  ragge 		 * later.
   1274          1.1  ragge 		 *
   1275          1.1  ragge 		 * Initially, we consider the number of descriptors the
   1276          1.1  ragge 		 * packet uses the number of DMA segments.  This may be
   1277          1.1  ragge 		 * incremented by 1 if we do checksum offload (a descriptor
   1278          1.1  ragge 		 * is used to set the checksum context).
   1279          1.1  ragge 		 */
   1280          1.1  ragge 		txs->txs_mbuf = m0;
   1281          1.1  ragge 		txs->txs_firstdesc = sc->sc_txnext;
   1282          1.1  ragge 		txs->txs_ndesc = dmamap->dm_nsegs;
   1283          1.1  ragge 
   1284          1.1  ragge 		/*
   1285          1.1  ragge 		 * Set up checksum offload parameters for
   1286          1.1  ragge 		 * this packet.
   1287          1.1  ragge 		 */
   1288          1.1  ragge 		if (m0->m_pkthdr.csum_flags &
   1289          1.1  ragge 		    (M_CSUM_IPv4|M_CSUM_TCPv4|M_CSUM_UDPv4)) {
   1290          1.1  ragge 			if (dge_tx_cksum(sc, txs, &cksumfields) != 0) {
   1291          1.1  ragge 				/* Error message already displayed. */
   1292          1.1  ragge 				bus_dmamap_unload(sc->sc_dmat, dmamap);
   1293          1.1  ragge 				continue;
   1294          1.1  ragge 			}
   1295          1.1  ragge 		} else {
   1296          1.1  ragge 			cksumfields = 0;
   1297          1.1  ragge 		}
   1298          1.1  ragge 
   1299          1.1  ragge 		cksumcmd = TDESC_DCMD_IDE | TDESC_DTYP_DATA;
   1300          1.1  ragge 
   1301          1.1  ragge 		/*
   1302          1.1  ragge 		 * Initialize the transmit descriptor.
   1303          1.1  ragge 		 */
   1304          1.1  ragge 		for (nexttx = sc->sc_txnext, seg = 0;
   1305          1.1  ragge 		     seg < dmamap->dm_nsegs;
   1306          1.1  ragge 		     seg++, nexttx = DGE_NEXTTX(nexttx)) {
   1307          1.1  ragge 			/*
   1308          1.1  ragge 			 * Note: we currently only use 32-bit DMA
   1309          1.1  ragge 			 * addresses.
   1310          1.1  ragge 			 */
   1311          1.1  ragge 			sc->sc_txdescs[nexttx].dt_baddrh = 0;
   1312          1.1  ragge 			sc->sc_txdescs[nexttx].dt_baddrl =
   1313          1.1  ragge 			    htole32(dmamap->dm_segs[seg].ds_addr);
   1314          1.1  ragge 			sc->sc_txdescs[nexttx].dt_ctl =
   1315          1.1  ragge 			    htole32(cksumcmd | dmamap->dm_segs[seg].ds_len);
   1316          1.1  ragge 			sc->sc_txdescs[nexttx].dt_status = 0;
   1317          1.1  ragge 			sc->sc_txdescs[nexttx].dt_popts = cksumfields;
   1318          1.1  ragge 			sc->sc_txdescs[nexttx].dt_vlan = 0;
   1319          1.1  ragge 			lasttx = nexttx;
   1320          1.1  ragge 
   1321          1.1  ragge 			DPRINTF(DGE_DEBUG_TX,
   1322          1.1  ragge 			    ("%s: TX: desc %d: low 0x%08lx, len 0x%04lx\n",
   1323          1.1  ragge 			    sc->sc_dev.dv_xname, nexttx,
   1324          1.1  ragge 			    le32toh(dmamap->dm_segs[seg].ds_addr),
   1325          1.1  ragge 			    le32toh(dmamap->dm_segs[seg].ds_len)));
   1326          1.1  ragge 		}
   1327          1.1  ragge 
   1328          1.1  ragge 		KASSERT(lasttx != -1);
   1329          1.1  ragge 
   1330          1.1  ragge 		/*
   1331          1.1  ragge 		 * Set up the command byte on the last descriptor of
   1332          1.1  ragge 		 * the packet.  If we're in the interrupt delay window,
   1333          1.1  ragge 		 * delay the interrupt.
   1334          1.1  ragge 		 */
   1335          1.1  ragge 		sc->sc_txdescs[lasttx].dt_ctl |=
   1336          1.1  ragge 		    htole32(TDESC_DCMD_EOP | TDESC_DCMD_RS);
   1337          1.1  ragge 
   1338          1.1  ragge 		txs->txs_lastdesc = lasttx;
   1339          1.1  ragge 
   1340          1.1  ragge 		DPRINTF(DGE_DEBUG_TX,
   1341          1.1  ragge 		    ("%s: TX: desc %d: cmdlen 0x%08x\n", sc->sc_dev.dv_xname,
   1342          1.1  ragge 		    lasttx, le32toh(sc->sc_txdescs[lasttx].dt_ctl)));
   1343          1.1  ragge 
   1344          1.1  ragge 		/* Sync the descriptors we're using. */
   1345          1.1  ragge 		DGE_CDTXSYNC(sc, sc->sc_txnext, dmamap->dm_nsegs,
   1346          1.1  ragge 		    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
   1347          1.1  ragge 
   1348          1.1  ragge 		/* Give the packet to the chip. */
   1349          1.1  ragge 		CSR_WRITE(sc, DGE_TDT, nexttx);
   1350          1.1  ragge 
   1351          1.1  ragge 		DPRINTF(DGE_DEBUG_TX,
   1352          1.1  ragge 		    ("%s: TX: TDT -> %d\n", sc->sc_dev.dv_xname, nexttx));
   1353          1.1  ragge 
   1354          1.1  ragge 		DPRINTF(DGE_DEBUG_TX,
   1355          1.1  ragge 		    ("%s: TX: finished transmitting packet, job %d\n",
   1356          1.1  ragge 		    sc->sc_dev.dv_xname, sc->sc_txsnext));
   1357          1.1  ragge 
   1358          1.1  ragge 		/* Advance the tx pointer. */
   1359          1.1  ragge 		sc->sc_txfree -= txs->txs_ndesc;
   1360          1.1  ragge 		sc->sc_txnext = nexttx;
   1361          1.1  ragge 
   1362          1.1  ragge 		sc->sc_txsfree--;
   1363          1.1  ragge 		sc->sc_txsnext = DGE_NEXTTXS(sc->sc_txsnext);
   1364          1.1  ragge 
   1365          1.1  ragge #if NBPFILTER > 0
   1366          1.1  ragge 		/* Pass the packet to any BPF listeners. */
   1367          1.1  ragge 		if (ifp->if_bpf)
   1368          1.1  ragge 			bpf_mtap(ifp->if_bpf, m0);
   1369          1.1  ragge #endif /* NBPFILTER > 0 */
   1370          1.1  ragge 	}
   1371          1.1  ragge 
   1372          1.1  ragge 	if (sc->sc_txsfree == 0 || sc->sc_txfree <= 2) {
   1373          1.1  ragge 		/* No more slots; notify upper layer. */
   1374          1.1  ragge 		ifp->if_flags |= IFF_OACTIVE;
   1375          1.1  ragge 	}
   1376          1.1  ragge 
   1377          1.1  ragge 	if (sc->sc_txfree != ofree) {
   1378          1.1  ragge 		/* Set a watchdog timer in case the chip flakes out. */
   1379          1.1  ragge 		ifp->if_timer = 5;
   1380          1.1  ragge 	}
   1381          1.1  ragge }
   1382          1.1  ragge 
   1383          1.1  ragge /*
   1384          1.1  ragge  * dge_watchdog:		[ifnet interface function]
   1385          1.1  ragge  *
   1386          1.1  ragge  *	Watchdog timer handler.
   1387          1.1  ragge  */
   1388          1.1  ragge static void
   1389          1.1  ragge dge_watchdog(struct ifnet *ifp)
   1390          1.1  ragge {
   1391          1.1  ragge 	struct dge_softc *sc = ifp->if_softc;
   1392          1.1  ragge 
   1393          1.1  ragge 	/*
   1394          1.1  ragge 	 * Since we're using delayed interrupts, sweep up
   1395          1.1  ragge 	 * before we report an error.
   1396          1.1  ragge 	 */
   1397          1.1  ragge 	dge_txintr(sc);
   1398          1.1  ragge 
   1399          1.1  ragge 	if (sc->sc_txfree != DGE_NTXDESC) {
   1400          1.1  ragge 		printf("%s: device timeout (txfree %d txsfree %d txnext %d)\n",
   1401          1.1  ragge 		    sc->sc_dev.dv_xname, sc->sc_txfree, sc->sc_txsfree,
   1402          1.1  ragge 		    sc->sc_txnext);
   1403          1.1  ragge 		ifp->if_oerrors++;
   1404          1.1  ragge 
   1405          1.1  ragge 		/* Reset the interface. */
   1406          1.1  ragge 		(void) dge_init(ifp);
   1407          1.1  ragge 	}
   1408          1.1  ragge 
   1409          1.1  ragge 	/* Try to get more packets going. */
   1410          1.1  ragge 	dge_start(ifp);
   1411          1.1  ragge }
   1412          1.1  ragge 
   1413          1.1  ragge /*
   1414          1.1  ragge  * dge_ioctl:		[ifnet interface function]
   1415          1.1  ragge  *
   1416          1.1  ragge  *	Handle control requests from the operator.
   1417          1.1  ragge  */
   1418          1.1  ragge static int
   1419          1.1  ragge dge_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
   1420          1.1  ragge {
   1421          1.1  ragge 	struct dge_softc *sc = ifp->if_softc;
   1422          1.1  ragge 	struct ifreq *ifr = (struct ifreq *) data;
   1423          1.1  ragge 	pcireg_t preg;
   1424          1.1  ragge 	int s, error, mmrbc;
   1425          1.1  ragge 
   1426          1.1  ragge 	s = splnet();
   1427          1.1  ragge 
   1428          1.1  ragge 	switch (cmd) {
   1429          1.1  ragge 	case SIOCSIFMEDIA:
   1430          1.1  ragge 	case SIOCGIFMEDIA:
   1431          1.1  ragge 		error = ifmedia_ioctl(ifp, ifr, &sc->sc_media, cmd);
   1432          1.1  ragge 		break;
   1433          1.1  ragge 
   1434      1.1.2.1   tron 	case SIOCSIFMTU:
   1435      1.1.2.1   tron 		if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > DGE_MAX_MTU) {
   1436      1.1.2.1   tron 			error = EINVAL;
   1437      1.1.2.1   tron 		} else {
   1438      1.1.2.1   tron 			error = 0;
   1439      1.1.2.1   tron 			ifp->if_mtu = ifr->ifr_mtu;
   1440      1.1.2.1   tron 			if (ifp->if_flags & IFF_UP)
   1441      1.1.2.1   tron 				error = (*ifp->if_init)(ifp);
   1442      1.1.2.1   tron 		}
   1443      1.1.2.1   tron 		break;
   1444      1.1.2.1   tron 
   1445          1.1  ragge         case SIOCSIFFLAGS:
   1446          1.1  ragge 		/* extract link flags */
   1447          1.1  ragge 		if ((ifp->if_flags & IFF_LINK0) == 0 &&
   1448          1.1  ragge 		    (ifp->if_flags & IFF_LINK1) == 0)
   1449          1.1  ragge 			mmrbc = PCIX_MMRBC_512;
   1450          1.1  ragge 		else if ((ifp->if_flags & IFF_LINK0) == 0 &&
   1451          1.1  ragge 		    (ifp->if_flags & IFF_LINK1) != 0)
   1452          1.1  ragge 			mmrbc = PCIX_MMRBC_1024;
   1453          1.1  ragge 		else if ((ifp->if_flags & IFF_LINK0) != 0 &&
   1454          1.1  ragge 		    (ifp->if_flags & IFF_LINK1) == 0)
   1455          1.1  ragge 			mmrbc = PCIX_MMRBC_2048;
   1456          1.1  ragge 		else
   1457          1.1  ragge 			mmrbc = PCIX_MMRBC_4096;
   1458          1.1  ragge 		if (mmrbc != sc->sc_mmrbc) {
   1459          1.1  ragge 			preg = pci_conf_read(sc->sc_pc, sc->sc_pt,DGE_PCIX_CMD);
   1460          1.1  ragge 			preg &= ~PCIX_MMRBC_MSK;
   1461          1.1  ragge 			preg |= mmrbc;
   1462          1.1  ragge 			pci_conf_write(sc->sc_pc, sc->sc_pt,DGE_PCIX_CMD, preg);
   1463          1.1  ragge 			sc->sc_mmrbc = mmrbc;
   1464          1.1  ragge 		}
   1465          1.1  ragge                 /* FALLTHROUGH */
   1466          1.1  ragge 	default:
   1467          1.1  ragge 		error = ether_ioctl(ifp, cmd, data);
   1468          1.1  ragge 		if (error == ENETRESET) {
   1469          1.1  ragge 			/*
   1470          1.1  ragge 			 * Multicast list has changed; set the hardware filter
   1471          1.1  ragge 			 * accordingly.
   1472          1.1  ragge 			 */
   1473  1.1.2.2.2.1     he 			if (ifp->if_flags & IFF_RUNNING)
   1474  1.1.2.2.2.1     he 				dge_set_filter(sc);
   1475          1.1  ragge 			error = 0;
   1476          1.1  ragge 		}
   1477          1.1  ragge 		break;
   1478          1.1  ragge 	}
   1479          1.1  ragge 
   1480          1.1  ragge 	/* Try to get more packets going. */
   1481          1.1  ragge 	dge_start(ifp);
   1482          1.1  ragge 
   1483          1.1  ragge 	splx(s);
   1484          1.1  ragge 	return (error);
   1485          1.1  ragge }
   1486          1.1  ragge 
   1487          1.1  ragge /*
   1488          1.1  ragge  * dge_intr:
   1489          1.1  ragge  *
   1490          1.1  ragge  *	Interrupt service routine.
   1491          1.1  ragge  */
   1492          1.1  ragge static int
   1493          1.1  ragge dge_intr(void *arg)
   1494          1.1  ragge {
   1495          1.1  ragge 	struct dge_softc *sc = arg;
   1496          1.1  ragge 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
   1497          1.1  ragge 	uint32_t icr;
   1498          1.1  ragge 	int wantinit, handled = 0;
   1499          1.1  ragge 
   1500          1.1  ragge 	for (wantinit = 0; wantinit == 0;) {
   1501          1.1  ragge 		icr = CSR_READ(sc, DGE_ICR);
   1502          1.1  ragge 		if ((icr & sc->sc_icr) == 0)
   1503          1.1  ragge 			break;
   1504          1.1  ragge 
   1505          1.1  ragge #if 0 /*NRND > 0*/
   1506          1.1  ragge 		if (RND_ENABLED(&sc->rnd_source))
   1507          1.1  ragge 			rnd_add_uint32(&sc->rnd_source, icr);
   1508          1.1  ragge #endif
   1509          1.1  ragge 
   1510          1.1  ragge 		handled = 1;
   1511          1.1  ragge 
   1512          1.1  ragge #if defined(DGE_DEBUG) || defined(DGE_EVENT_COUNTERS)
   1513          1.1  ragge 		if (icr & (ICR_RXDMT0|ICR_RXT0)) {
   1514          1.1  ragge 			DPRINTF(DGE_DEBUG_RX,
   1515          1.1  ragge 			    ("%s: RX: got Rx intr 0x%08x\n",
   1516          1.1  ragge 			    sc->sc_dev.dv_xname,
   1517          1.1  ragge 			    icr & (ICR_RXDMT0|ICR_RXT0)));
   1518          1.1  ragge 			DGE_EVCNT_INCR(&sc->sc_ev_rxintr);
   1519          1.1  ragge 		}
   1520          1.1  ragge #endif
   1521          1.1  ragge 		dge_rxintr(sc);
   1522          1.1  ragge 
   1523          1.1  ragge #if defined(DGE_DEBUG) || defined(DGE_EVENT_COUNTERS)
   1524          1.1  ragge 		if (icr & ICR_TXDW) {
   1525          1.1  ragge 			DPRINTF(DGE_DEBUG_TX,
   1526          1.1  ragge 			    ("%s: TX: got TXDW interrupt\n",
   1527          1.1  ragge 			    sc->sc_dev.dv_xname));
   1528          1.1  ragge 			DGE_EVCNT_INCR(&sc->sc_ev_txdw);
   1529          1.1  ragge 		}
   1530          1.1  ragge 		if (icr & ICR_TXQE)
   1531          1.1  ragge 			DGE_EVCNT_INCR(&sc->sc_ev_txqe);
   1532          1.1  ragge #endif
   1533          1.1  ragge 		dge_txintr(sc);
   1534          1.1  ragge 
   1535          1.1  ragge 		if (icr & (ICR_LSC|ICR_RXSEQ)) {
   1536          1.1  ragge 			DGE_EVCNT_INCR(&sc->sc_ev_linkintr);
   1537          1.1  ragge 			dge_linkintr(sc, icr);
   1538          1.1  ragge 		}
   1539          1.1  ragge 
   1540          1.1  ragge 		if (icr & ICR_RXO) {
   1541          1.1  ragge 			printf("%s: Receive overrun\n", sc->sc_dev.dv_xname);
   1542          1.1  ragge 			wantinit = 1;
   1543          1.1  ragge 		}
   1544          1.1  ragge 	}
   1545          1.1  ragge 
   1546          1.1  ragge 	if (handled) {
   1547          1.1  ragge 		if (wantinit)
   1548          1.1  ragge 			dge_init(ifp);
   1549          1.1  ragge 
   1550          1.1  ragge 		/* Try to get more packets going. */
   1551          1.1  ragge 		dge_start(ifp);
   1552          1.1  ragge 	}
   1553          1.1  ragge 
   1554          1.1  ragge 	return (handled);
   1555          1.1  ragge }
   1556          1.1  ragge 
   1557          1.1  ragge /*
   1558          1.1  ragge  * dge_txintr:
   1559          1.1  ragge  *
   1560          1.1  ragge  *	Helper; handle transmit interrupts.
   1561          1.1  ragge  */
   1562          1.1  ragge static void
   1563          1.1  ragge dge_txintr(struct dge_softc *sc)
   1564          1.1  ragge {
   1565          1.1  ragge 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
   1566          1.1  ragge 	struct dge_txsoft *txs;
   1567          1.1  ragge 	uint8_t status;
   1568          1.1  ragge 	int i;
   1569          1.1  ragge 
   1570          1.1  ragge 	ifp->if_flags &= ~IFF_OACTIVE;
   1571          1.1  ragge 
   1572          1.1  ragge 	/*
   1573          1.1  ragge 	 * Go through the Tx list and free mbufs for those
   1574          1.1  ragge 	 * frames which have been transmitted.
   1575          1.1  ragge 	 */
   1576          1.1  ragge 	for (i = sc->sc_txsdirty; sc->sc_txsfree != DGE_TXQUEUELEN;
   1577          1.1  ragge 	     i = DGE_NEXTTXS(i), sc->sc_txsfree++) {
   1578          1.1  ragge 		txs = &sc->sc_txsoft[i];
   1579          1.1  ragge 
   1580          1.1  ragge 		DPRINTF(DGE_DEBUG_TX,
   1581          1.1  ragge 		    ("%s: TX: checking job %d\n", sc->sc_dev.dv_xname, i));
   1582          1.1  ragge 
   1583          1.1  ragge 		DGE_CDTXSYNC(sc, txs->txs_firstdesc, txs->txs_dmamap->dm_nsegs,
   1584          1.1  ragge 		    BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
   1585          1.1  ragge 
   1586          1.1  ragge 		status =
   1587          1.1  ragge 		    sc->sc_txdescs[txs->txs_lastdesc].dt_status;
   1588          1.1  ragge 		if ((status & TDESC_STA_DD) == 0) {
   1589          1.1  ragge 			DGE_CDTXSYNC(sc, txs->txs_lastdesc, 1,
   1590          1.1  ragge 			    BUS_DMASYNC_PREREAD);
   1591          1.1  ragge 			break;
   1592          1.1  ragge 		}
   1593          1.1  ragge 
   1594          1.1  ragge 		DPRINTF(DGE_DEBUG_TX,
   1595          1.1  ragge 		    ("%s: TX: job %d done: descs %d..%d\n",
   1596          1.1  ragge 		    sc->sc_dev.dv_xname, i, txs->txs_firstdesc,
   1597          1.1  ragge 		    txs->txs_lastdesc));
   1598          1.1  ragge 
   1599          1.1  ragge 		ifp->if_opackets++;
   1600          1.1  ragge 		sc->sc_txfree += txs->txs_ndesc;
   1601          1.1  ragge 		bus_dmamap_sync(sc->sc_dmat, txs->txs_dmamap,
   1602          1.1  ragge 		    0, txs->txs_dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE);
   1603          1.1  ragge 		bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap);
   1604          1.1  ragge 		m_freem(txs->txs_mbuf);
   1605          1.1  ragge 		txs->txs_mbuf = NULL;
   1606          1.1  ragge 	}
   1607          1.1  ragge 
   1608          1.1  ragge 	/* Update the dirty transmit buffer pointer. */
   1609          1.1  ragge 	sc->sc_txsdirty = i;
   1610          1.1  ragge 	DPRINTF(DGE_DEBUG_TX,
   1611          1.1  ragge 	    ("%s: TX: txsdirty -> %d\n", sc->sc_dev.dv_xname, i));
   1612          1.1  ragge 
   1613          1.1  ragge 	/*
   1614          1.1  ragge 	 * If there are no more pending transmissions, cancel the watchdog
   1615          1.1  ragge 	 * timer.
   1616          1.1  ragge 	 */
   1617          1.1  ragge 	if (sc->sc_txsfree == DGE_TXQUEUELEN)
   1618          1.1  ragge 		ifp->if_timer = 0;
   1619          1.1  ragge }
   1620          1.1  ragge 
   1621          1.1  ragge /*
   1622          1.1  ragge  * dge_rxintr:
   1623          1.1  ragge  *
   1624          1.1  ragge  *	Helper; handle receive interrupts.
   1625          1.1  ragge  */
   1626          1.1  ragge static void
   1627          1.1  ragge dge_rxintr(struct dge_softc *sc)
   1628          1.1  ragge {
   1629          1.1  ragge 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
   1630          1.1  ragge 	struct dge_rxsoft *rxs;
   1631          1.1  ragge 	struct mbuf *m;
   1632          1.1  ragge 	int i, len;
   1633          1.1  ragge 	uint8_t status, errors;
   1634          1.1  ragge 
   1635          1.1  ragge 	for (i = sc->sc_rxptr;; i = DGE_NEXTRX(i)) {
   1636          1.1  ragge 		rxs = &sc->sc_rxsoft[i];
   1637          1.1  ragge 
   1638          1.1  ragge 		DPRINTF(DGE_DEBUG_RX,
   1639          1.1  ragge 		    ("%s: RX: checking descriptor %d\n",
   1640          1.1  ragge 		    sc->sc_dev.dv_xname, i));
   1641          1.1  ragge 
   1642          1.1  ragge 		DGE_CDRXSYNC(sc, i, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
   1643          1.1  ragge 
   1644          1.1  ragge 		status = sc->sc_rxdescs[i].dr_status;
   1645          1.1  ragge 		errors = sc->sc_rxdescs[i].dr_errors;
   1646          1.1  ragge 		len = le16toh(sc->sc_rxdescs[i].dr_len);
   1647          1.1  ragge 
   1648          1.1  ragge 		if ((status & RDESC_STS_DD) == 0) {
   1649          1.1  ragge 			/*
   1650          1.1  ragge 			 * We have processed all of the receive descriptors.
   1651          1.1  ragge 			 */
   1652          1.1  ragge 			DGE_CDRXSYNC(sc, i, BUS_DMASYNC_PREREAD);
   1653          1.1  ragge 			break;
   1654          1.1  ragge 		}
   1655          1.1  ragge 
   1656          1.1  ragge 		if (__predict_false(sc->sc_rxdiscard)) {
   1657          1.1  ragge 			DPRINTF(DGE_DEBUG_RX,
   1658          1.1  ragge 			    ("%s: RX: discarding contents of descriptor %d\n",
   1659          1.1  ragge 			    sc->sc_dev.dv_xname, i));
   1660          1.1  ragge 			DGE_INIT_RXDESC(sc, i);
   1661          1.1  ragge 			if (status & RDESC_STS_EOP) {
   1662          1.1  ragge 				/* Reset our state. */
   1663          1.1  ragge 				DPRINTF(DGE_DEBUG_RX,
   1664          1.1  ragge 				    ("%s: RX: resetting rxdiscard -> 0\n",
   1665          1.1  ragge 				    sc->sc_dev.dv_xname));
   1666          1.1  ragge 				sc->sc_rxdiscard = 0;
   1667          1.1  ragge 			}
   1668          1.1  ragge 			continue;
   1669          1.1  ragge 		}
   1670          1.1  ragge 
   1671          1.1  ragge 		bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
   1672          1.1  ragge 		    rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD);
   1673          1.1  ragge 
   1674          1.1  ragge 		m = rxs->rxs_mbuf;
   1675          1.1  ragge 
   1676          1.1  ragge 		/*
   1677          1.1  ragge 		 * Add a new receive buffer to the ring.
   1678          1.1  ragge 		 */
   1679          1.1  ragge 		if (dge_add_rxbuf(sc, i) != 0) {
   1680          1.1  ragge 			/*
   1681          1.1  ragge 			 * Failed, throw away what we've done so
   1682          1.1  ragge 			 * far, and discard the rest of the packet.
   1683          1.1  ragge 			 */
   1684          1.1  ragge 			ifp->if_ierrors++;
   1685          1.1  ragge 			bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
   1686          1.1  ragge 			    rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
   1687          1.1  ragge 			DGE_INIT_RXDESC(sc, i);
   1688          1.1  ragge 			if ((status & RDESC_STS_EOP) == 0)
   1689          1.1  ragge 				sc->sc_rxdiscard = 1;
   1690          1.1  ragge 			if (sc->sc_rxhead != NULL)
   1691          1.1  ragge 				m_freem(sc->sc_rxhead);
   1692          1.1  ragge 			DGE_RXCHAIN_RESET(sc);
   1693          1.1  ragge 			DPRINTF(DGE_DEBUG_RX,
   1694          1.1  ragge 			    ("%s: RX: Rx buffer allocation failed, "
   1695          1.1  ragge 			    "dropping packet%s\n", sc->sc_dev.dv_xname,
   1696          1.1  ragge 			    sc->sc_rxdiscard ? " (discard)" : ""));
   1697          1.1  ragge 			continue;
   1698          1.1  ragge 		}
   1699          1.1  ragge 		DGE_INIT_RXDESC(sc, DGE_PREVRX(i)); /* Write the descriptor */
   1700          1.1  ragge 
   1701          1.1  ragge 		DGE_RXCHAIN_LINK(sc, m);
   1702          1.1  ragge 
   1703          1.1  ragge 		m->m_len = len;
   1704          1.1  ragge 
   1705          1.1  ragge 		DPRINTF(DGE_DEBUG_RX,
   1706          1.1  ragge 		    ("%s: RX: buffer at %p len %d\n",
   1707          1.1  ragge 		    sc->sc_dev.dv_xname, m->m_data, len));
   1708          1.1  ragge 
   1709          1.1  ragge 		/*
   1710          1.1  ragge 		 * If this is not the end of the packet, keep
   1711          1.1  ragge 		 * looking.
   1712          1.1  ragge 		 */
   1713          1.1  ragge 		if ((status & RDESC_STS_EOP) == 0) {
   1714          1.1  ragge 			sc->sc_rxlen += len;
   1715          1.1  ragge 			DPRINTF(DGE_DEBUG_RX,
   1716          1.1  ragge 			    ("%s: RX: not yet EOP, rxlen -> %d\n",
   1717          1.1  ragge 			    sc->sc_dev.dv_xname, sc->sc_rxlen));
   1718          1.1  ragge 			continue;
   1719          1.1  ragge 		}
   1720          1.1  ragge 
   1721          1.1  ragge 		/*
   1722          1.1  ragge 		 * Okay, we have the entire packet now...
   1723          1.1  ragge 		 */
   1724          1.1  ragge 		*sc->sc_rxtailp = NULL;
   1725          1.1  ragge 		m = sc->sc_rxhead;
   1726          1.1  ragge 		len += sc->sc_rxlen;
   1727          1.1  ragge 
   1728          1.1  ragge 		DGE_RXCHAIN_RESET(sc);
   1729          1.1  ragge 
   1730          1.1  ragge 		DPRINTF(DGE_DEBUG_RX,
   1731          1.1  ragge 		    ("%s: RX: have entire packet, len -> %d\n",
   1732          1.1  ragge 		    sc->sc_dev.dv_xname, len));
   1733          1.1  ragge 
   1734          1.1  ragge 		/*
   1735          1.1  ragge 		 * If an error occurred, update stats and drop the packet.
   1736          1.1  ragge 		 */
   1737          1.1  ragge 		if (errors &
   1738          1.1  ragge 		     (RDESC_ERR_CE|RDESC_ERR_SE|RDESC_ERR_P|RDESC_ERR_RXE)) {
   1739          1.1  ragge 			ifp->if_ierrors++;
   1740          1.1  ragge 			if (errors & RDESC_ERR_SE)
   1741          1.1  ragge 				printf("%s: symbol error\n",
   1742          1.1  ragge 				    sc->sc_dev.dv_xname);
   1743          1.1  ragge 			else if (errors & RDESC_ERR_P)
   1744          1.1  ragge 				printf("%s: parity error\n",
   1745          1.1  ragge 				    sc->sc_dev.dv_xname);
   1746          1.1  ragge 			else if (errors & RDESC_ERR_CE)
   1747          1.1  ragge 				printf("%s: CRC error\n",
   1748          1.1  ragge 				    sc->sc_dev.dv_xname);
   1749          1.1  ragge 			m_freem(m);
   1750          1.1  ragge 			continue;
   1751          1.1  ragge 		}
   1752          1.1  ragge 
   1753          1.1  ragge 		/*
   1754          1.1  ragge 		 * No errors.  Receive the packet.
   1755          1.1  ragge 		 */
   1756          1.1  ragge 		m->m_pkthdr.rcvif = ifp;
   1757          1.1  ragge 		m->m_pkthdr.len = len;
   1758          1.1  ragge 
   1759          1.1  ragge 		/*
   1760          1.1  ragge 		 * Set up checksum info for this packet.
   1761          1.1  ragge 		 */
   1762          1.1  ragge 		if (status & RDESC_STS_IPCS) {
   1763          1.1  ragge 			DGE_EVCNT_INCR(&sc->sc_ev_rxipsum);
   1764          1.1  ragge 			m->m_pkthdr.csum_flags |= M_CSUM_IPv4;
   1765          1.1  ragge 			if (errors & RDESC_ERR_IPE)
   1766          1.1  ragge 				m->m_pkthdr.csum_flags |= M_CSUM_IPv4_BAD;
   1767          1.1  ragge 		}
   1768          1.1  ragge 		if (status & RDESC_STS_TCPCS) {
   1769          1.1  ragge 			/*
   1770          1.1  ragge 			 * Note: we don't know if this was TCP or UDP,
   1771          1.1  ragge 			 * so we just set both bits, and expect the
   1772          1.1  ragge 			 * upper layers to deal.
   1773          1.1  ragge 			 */
   1774          1.1  ragge 			DGE_EVCNT_INCR(&sc->sc_ev_rxtusum);
   1775          1.1  ragge 			m->m_pkthdr.csum_flags |= M_CSUM_TCPv4|M_CSUM_UDPv4;
   1776          1.1  ragge 			if (errors & RDESC_ERR_TCPE)
   1777          1.1  ragge 				m->m_pkthdr.csum_flags |= M_CSUM_TCP_UDP_BAD;
   1778          1.1  ragge 		}
   1779          1.1  ragge 
   1780          1.1  ragge 		ifp->if_ipackets++;
   1781          1.1  ragge 
   1782          1.1  ragge #if NBPFILTER > 0
   1783          1.1  ragge 		/* Pass this up to any BPF listeners. */
   1784          1.1  ragge 		if (ifp->if_bpf)
   1785          1.1  ragge 			bpf_mtap(ifp->if_bpf, m);
   1786          1.1  ragge #endif /* NBPFILTER > 0 */
   1787          1.1  ragge 
   1788          1.1  ragge 		/* Pass it on. */
   1789          1.1  ragge 		(*ifp->if_input)(ifp, m);
   1790          1.1  ragge 	}
   1791          1.1  ragge 
   1792          1.1  ragge 	/* Update the receive pointer. */
   1793          1.1  ragge 	sc->sc_rxptr = i;
   1794          1.1  ragge 
   1795          1.1  ragge 	DPRINTF(DGE_DEBUG_RX,
   1796          1.1  ragge 	    ("%s: RX: rxptr -> %d\n", sc->sc_dev.dv_xname, i));
   1797          1.1  ragge }
   1798          1.1  ragge 
   1799          1.1  ragge /*
   1800          1.1  ragge  * dge_linkintr:
   1801          1.1  ragge  *
   1802          1.1  ragge  *	Helper; handle link interrupts.
   1803          1.1  ragge  */
   1804          1.1  ragge static void
   1805          1.1  ragge dge_linkintr(struct dge_softc *sc, uint32_t icr)
   1806          1.1  ragge {
   1807          1.1  ragge 	uint32_t status;
   1808          1.1  ragge 
   1809          1.1  ragge 	if (icr & ICR_LSC) {
   1810          1.1  ragge 		status = CSR_READ(sc, DGE_STATUS);
   1811          1.1  ragge 		if (status & STATUS_LINKUP) {
   1812          1.1  ragge 			DPRINTF(DGE_DEBUG_LINK, ("%s: LINK: LSC -> up\n",
   1813          1.1  ragge 			    sc->sc_dev.dv_xname));
   1814          1.1  ragge 		} else {
   1815          1.1  ragge 			DPRINTF(DGE_DEBUG_LINK, ("%s: LINK: LSC -> down\n",
   1816          1.1  ragge 			    sc->sc_dev.dv_xname));
   1817          1.1  ragge 		}
   1818          1.1  ragge 	} else if (icr & ICR_RXSEQ) {
   1819          1.1  ragge 		DPRINTF(DGE_DEBUG_LINK,
   1820          1.1  ragge 		    ("%s: LINK: Receive sequence error\n",
   1821          1.1  ragge 		    sc->sc_dev.dv_xname));
   1822          1.1  ragge 	}
   1823          1.1  ragge 	/* XXX - fix errata */
   1824          1.1  ragge }
   1825          1.1  ragge 
   1826          1.1  ragge /*
   1827          1.1  ragge  * dge_reset:
   1828          1.1  ragge  *
   1829          1.1  ragge  *	Reset the i82597 chip.
   1830          1.1  ragge  */
   1831          1.1  ragge static void
   1832          1.1  ragge dge_reset(struct dge_softc *sc)
   1833          1.1  ragge {
   1834          1.1  ragge 	int i;
   1835          1.1  ragge 
   1836          1.1  ragge 	/*
   1837          1.1  ragge 	 * Do a chip reset.
   1838          1.1  ragge 	 */
   1839          1.1  ragge 	CSR_WRITE(sc, DGE_CTRL0, CTRL0_RST | sc->sc_ctrl0);
   1840          1.1  ragge 
   1841          1.1  ragge 	delay(10000);
   1842          1.1  ragge 
   1843          1.1  ragge 	for (i = 0; i < 1000; i++) {
   1844          1.1  ragge 		if ((CSR_READ(sc, DGE_CTRL0) & CTRL0_RST) == 0)
   1845          1.1  ragge 			break;
   1846          1.1  ragge 		delay(20);
   1847          1.1  ragge 	}
   1848          1.1  ragge 
   1849          1.1  ragge 	if (CSR_READ(sc, DGE_CTRL0) & CTRL0_RST)
   1850          1.1  ragge 		printf("%s: WARNING: reset failed to complete\n",
   1851          1.1  ragge 		    sc->sc_dev.dv_xname);
   1852          1.1  ragge         /*
   1853          1.1  ragge          * Reset the EEPROM logic.
   1854          1.1  ragge          * This will cause the chip to reread its default values,
   1855          1.1  ragge 	 * which doesn't happen otherwise (errata).
   1856          1.1  ragge          */
   1857          1.1  ragge         CSR_WRITE(sc, DGE_CTRL1, CTRL1_EE_RST);
   1858          1.1  ragge         delay(10000);
   1859          1.1  ragge }
   1860          1.1  ragge 
   1861          1.1  ragge /*
   1862          1.1  ragge  * dge_init:		[ifnet interface function]
   1863          1.1  ragge  *
   1864          1.1  ragge  *	Initialize the interface.  Must be called at splnet().
   1865          1.1  ragge  */
   1866          1.1  ragge static int
   1867          1.1  ragge dge_init(struct ifnet *ifp)
   1868          1.1  ragge {
   1869          1.1  ragge 	struct dge_softc *sc = ifp->if_softc;
   1870          1.1  ragge 	struct dge_rxsoft *rxs;
   1871          1.1  ragge 	int i, error = 0;
   1872          1.1  ragge 	uint32_t reg;
   1873          1.1  ragge 
   1874          1.1  ragge 	/*
   1875          1.1  ragge 	 * *_HDR_ALIGNED_P is constant 1 if __NO_STRICT_ALIGMENT is set.
   1876          1.1  ragge 	 * There is a small but measurable benefit to avoiding the adjusment
   1877          1.1  ragge 	 * of the descriptor so that the headers are aligned, for normal mtu,
   1878          1.1  ragge 	 * on such platforms.  One possibility is that the DMA itself is
   1879          1.1  ragge 	 * slightly more efficient if the front of the entire packet (instead
   1880          1.1  ragge 	 * of the front of the headers) is aligned.
   1881          1.1  ragge 	 *
   1882          1.1  ragge 	 * Note we must always set align_tweak to 0 if we are using
   1883          1.1  ragge 	 * jumbo frames.
   1884          1.1  ragge 	 */
   1885          1.1  ragge #ifdef __NO_STRICT_ALIGNMENT
   1886          1.1  ragge 	sc->sc_align_tweak = 0;
   1887          1.1  ragge #else
   1888          1.1  ragge 	if ((ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN) > (MCLBYTES - 2))
   1889          1.1  ragge 		sc->sc_align_tweak = 0;
   1890          1.1  ragge 	else
   1891          1.1  ragge 		sc->sc_align_tweak = 2;
   1892          1.1  ragge #endif /* __NO_STRICT_ALIGNMENT */
   1893          1.1  ragge 
   1894          1.1  ragge 	/* Cancel any pending I/O. */
   1895          1.1  ragge 	dge_stop(ifp, 0);
   1896          1.1  ragge 
   1897          1.1  ragge 	/* Reset the chip to a known state. */
   1898          1.1  ragge 	dge_reset(sc);
   1899          1.1  ragge 
   1900          1.1  ragge 	/* Initialize the transmit descriptor ring. */
   1901          1.1  ragge 	memset(sc->sc_txdescs, 0, sizeof(sc->sc_txdescs));
   1902          1.1  ragge 	DGE_CDTXSYNC(sc, 0, DGE_NTXDESC,
   1903          1.1  ragge 	    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
   1904          1.1  ragge 	sc->sc_txfree = DGE_NTXDESC;
   1905          1.1  ragge 	sc->sc_txnext = 0;
   1906          1.1  ragge 
   1907          1.1  ragge 	sc->sc_txctx_ipcs = 0xffffffff;
   1908          1.1  ragge 	sc->sc_txctx_tucs = 0xffffffff;
   1909          1.1  ragge 
   1910          1.1  ragge 	CSR_WRITE(sc, DGE_TDBAH, 0);
   1911          1.1  ragge 	CSR_WRITE(sc, DGE_TDBAL, DGE_CDTXADDR(sc, 0));
   1912          1.1  ragge 	CSR_WRITE(sc, DGE_TDLEN, sizeof(sc->sc_txdescs));
   1913          1.1  ragge 	CSR_WRITE(sc, DGE_TDH, 0);
   1914          1.1  ragge 	CSR_WRITE(sc, DGE_TDT, 0);
   1915          1.1  ragge 	CSR_WRITE(sc, DGE_TIDV, TIDV);
   1916          1.1  ragge 
   1917          1.1  ragge #if 0
   1918          1.1  ragge 	CSR_WRITE(sc, DGE_TXDCTL, TXDCTL_PTHRESH(0) |
   1919          1.1  ragge 	    TXDCTL_HTHRESH(0) | TXDCTL_WTHRESH(0));
   1920          1.1  ragge #endif
   1921          1.1  ragge 	CSR_WRITE(sc, DGE_RXDCTL,
   1922          1.1  ragge 	    RXDCTL_PTHRESH(RXDCTL_PTHRESH_VAL) |
   1923          1.1  ragge 	    RXDCTL_HTHRESH(RXDCTL_HTHRESH_VAL) |
   1924          1.1  ragge 	    RXDCTL_WTHRESH(RXDCTL_WTHRESH_VAL));
   1925          1.1  ragge 
   1926          1.1  ragge 	/* Initialize the transmit job descriptors. */
   1927          1.1  ragge 	for (i = 0; i < DGE_TXQUEUELEN; i++)
   1928          1.1  ragge 		sc->sc_txsoft[i].txs_mbuf = NULL;
   1929          1.1  ragge 	sc->sc_txsfree = DGE_TXQUEUELEN;
   1930          1.1  ragge 	sc->sc_txsnext = 0;
   1931          1.1  ragge 	sc->sc_txsdirty = 0;
   1932          1.1  ragge 
   1933          1.1  ragge 	/*
   1934          1.1  ragge 	 * Initialize the receive descriptor and receive job
   1935          1.1  ragge 	 * descriptor rings.
   1936          1.1  ragge 	 */
   1937          1.1  ragge 	CSR_WRITE(sc, DGE_RDBAH, 0);
   1938          1.1  ragge 	CSR_WRITE(sc, DGE_RDBAL, DGE_CDRXADDR(sc, 0));
   1939          1.1  ragge 	CSR_WRITE(sc, DGE_RDLEN, sizeof(sc->sc_rxdescs));
   1940          1.1  ragge 	CSR_WRITE(sc, DGE_RDH, DGE_RXSPACE);
   1941          1.1  ragge 	CSR_WRITE(sc, DGE_RDT, 0);
   1942          1.1  ragge 	CSR_WRITE(sc, DGE_RDTR, RDTR | 0x80000000);
   1943          1.1  ragge 	CSR_WRITE(sc, DGE_FCRTL, FCRTL | FCRTL_XONE);
   1944          1.1  ragge 	CSR_WRITE(sc, DGE_FCRTH, FCRTH);
   1945          1.1  ragge 
   1946          1.1  ragge 	for (i = 0; i < DGE_NRXDESC; i++) {
   1947          1.1  ragge 		rxs = &sc->sc_rxsoft[i];
   1948          1.1  ragge 		if (rxs->rxs_mbuf == NULL) {
   1949          1.1  ragge 			if ((error = dge_add_rxbuf(sc, i)) != 0) {
   1950          1.1  ragge 				printf("%s: unable to allocate or map rx "
   1951          1.1  ragge 				    "buffer %d, error = %d\n",
   1952          1.1  ragge 				    sc->sc_dev.dv_xname, i, error);
   1953          1.1  ragge 				/*
   1954          1.1  ragge 				 * XXX Should attempt to run with fewer receive
   1955          1.1  ragge 				 * XXX buffers instead of just failing.
   1956          1.1  ragge 				 */
   1957          1.1  ragge 				dge_rxdrain(sc);
   1958          1.1  ragge 				goto out;
   1959          1.1  ragge 			}
   1960          1.1  ragge 		}
   1961          1.1  ragge 		DGE_INIT_RXDESC(sc, i);
   1962          1.1  ragge 	}
   1963          1.1  ragge 	sc->sc_rxptr = DGE_RXSPACE;
   1964          1.1  ragge 	sc->sc_rxdiscard = 0;
   1965          1.1  ragge 	DGE_RXCHAIN_RESET(sc);
   1966          1.1  ragge 
   1967          1.1  ragge 	if (sc->sc_ethercom.ec_capabilities & ETHERCAP_JUMBO_MTU) {
   1968          1.1  ragge 		sc->sc_ctrl0 |= CTRL0_JFE;
   1969          1.1  ragge 		CSR_WRITE(sc, DGE_MFS, ETHER_MAX_LEN_JUMBO << 16);
   1970          1.1  ragge 	}
   1971          1.1  ragge 
   1972          1.1  ragge 	/* Write the control registers. */
   1973          1.1  ragge 	CSR_WRITE(sc, DGE_CTRL0, sc->sc_ctrl0);
   1974          1.1  ragge 
   1975          1.1  ragge 	/*
   1976          1.1  ragge 	 * Set up checksum offload parameters.
   1977          1.1  ragge 	 */
   1978          1.1  ragge 	reg = CSR_READ(sc, DGE_RXCSUM);
   1979          1.1  ragge 	if (ifp->if_capenable & IFCAP_CSUM_IPv4)
   1980          1.1  ragge 		reg |= RXCSUM_IPOFL;
   1981          1.1  ragge 	else
   1982          1.1  ragge 		reg &= ~RXCSUM_IPOFL;
   1983          1.1  ragge 	if (ifp->if_capenable & (IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4))
   1984          1.1  ragge 		reg |= RXCSUM_IPOFL | RXCSUM_TUOFL;
   1985          1.1  ragge 	else {
   1986          1.1  ragge 		reg &= ~RXCSUM_TUOFL;
   1987          1.1  ragge 		if ((ifp->if_capenable & IFCAP_CSUM_IPv4) == 0)
   1988          1.1  ragge 			reg &= ~RXCSUM_IPOFL;
   1989          1.1  ragge 	}
   1990          1.1  ragge 	CSR_WRITE(sc, DGE_RXCSUM, reg);
   1991          1.1  ragge 
   1992          1.1  ragge 	/*
   1993          1.1  ragge 	 * Set up the interrupt registers.
   1994          1.1  ragge 	 */
   1995          1.1  ragge 	CSR_WRITE(sc, DGE_IMC, 0xffffffffU);
   1996          1.1  ragge 	sc->sc_icr = ICR_TXDW | ICR_LSC | ICR_RXSEQ | ICR_RXDMT0 |
   1997          1.1  ragge 	    ICR_RXO | ICR_RXT0;
   1998          1.1  ragge 
   1999          1.1  ragge 	CSR_WRITE(sc, DGE_IMS, sc->sc_icr);
   2000          1.1  ragge 
   2001          1.1  ragge 	/*
   2002          1.1  ragge 	 * Set up the transmit control register.
   2003          1.1  ragge 	 */
   2004          1.1  ragge 	sc->sc_tctl = TCTL_TCE|TCTL_TPDE|TCTL_TXEN;
   2005          1.1  ragge 	CSR_WRITE(sc, DGE_TCTL, sc->sc_tctl);
   2006          1.1  ragge 
   2007          1.1  ragge 	/*
   2008          1.1  ragge 	 * Set up the receive control register; we actually program
   2009          1.1  ragge 	 * the register when we set the receive filter.  Use multicast
   2010          1.1  ragge 	 * address offset type 0.
   2011          1.1  ragge 	 */
   2012          1.1  ragge 	sc->sc_mchash_type = 0;
   2013          1.1  ragge 
   2014          1.1  ragge 	sc->sc_rctl = RCTL_RXEN | RCTL_RDMTS_12 | RCTL_RPDA_MC |
   2015          1.1  ragge 	    RCTL_CFF | RCTL_SECRC | RCTL_MO(sc->sc_mchash_type);
   2016          1.1  ragge 
   2017      1.1.2.2   tron #ifdef DGE_OFFBYONE_RXBUG
   2018      1.1.2.2   tron 	sc->sc_rctl |= RCTL_BSIZE_16k;
   2019      1.1.2.2   tron #else
   2020          1.1  ragge 	switch(MCLBYTES) {
   2021          1.1  ragge 	case 2048:
   2022          1.1  ragge 		sc->sc_rctl |= RCTL_BSIZE_2k;
   2023          1.1  ragge 		break;
   2024          1.1  ragge 	case 4096:
   2025          1.1  ragge 		sc->sc_rctl |= RCTL_BSIZE_4k;
   2026          1.1  ragge 		break;
   2027          1.1  ragge 	case 8192:
   2028          1.1  ragge 		sc->sc_rctl |= RCTL_BSIZE_8k;
   2029          1.1  ragge 		break;
   2030          1.1  ragge 	case 16384:
   2031          1.1  ragge 		sc->sc_rctl |= RCTL_BSIZE_16k;
   2032          1.1  ragge 		break;
   2033          1.1  ragge 	default:
   2034          1.1  ragge 		panic("dge_init: MCLBYTES %d unsupported", MCLBYTES);
   2035          1.1  ragge 	}
   2036      1.1.2.2   tron #endif
   2037          1.1  ragge 
   2038          1.1  ragge 	/* Set the receive filter. */
   2039          1.1  ragge 	/* Also sets RCTL */
   2040          1.1  ragge 	dge_set_filter(sc);
   2041          1.1  ragge 
   2042          1.1  ragge 	/* ...all done! */
   2043          1.1  ragge 	ifp->if_flags |= IFF_RUNNING;
   2044          1.1  ragge 	ifp->if_flags &= ~IFF_OACTIVE;
   2045          1.1  ragge 
   2046          1.1  ragge  out:
   2047          1.1  ragge 	if (error)
   2048          1.1  ragge 		printf("%s: interface not running\n", sc->sc_dev.dv_xname);
   2049          1.1  ragge 	return (error);
   2050          1.1  ragge }
   2051          1.1  ragge 
   2052          1.1  ragge /*
   2053          1.1  ragge  * dge_rxdrain:
   2054          1.1  ragge  *
   2055          1.1  ragge  *	Drain the receive queue.
   2056          1.1  ragge  */
   2057          1.1  ragge static void
   2058          1.1  ragge dge_rxdrain(struct dge_softc *sc)
   2059          1.1  ragge {
   2060          1.1  ragge 	struct dge_rxsoft *rxs;
   2061          1.1  ragge 	int i;
   2062          1.1  ragge 
   2063          1.1  ragge 	for (i = 0; i < DGE_NRXDESC; i++) {
   2064          1.1  ragge 		rxs = &sc->sc_rxsoft[i];
   2065          1.1  ragge 		if (rxs->rxs_mbuf != NULL) {
   2066          1.1  ragge 			bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
   2067          1.1  ragge 			m_freem(rxs->rxs_mbuf);
   2068          1.1  ragge 			rxs->rxs_mbuf = NULL;
   2069          1.1  ragge 		}
   2070          1.1  ragge 	}
   2071          1.1  ragge }
   2072          1.1  ragge 
   2073          1.1  ragge /*
   2074          1.1  ragge  * dge_stop:		[ifnet interface function]
   2075          1.1  ragge  *
   2076          1.1  ragge  *	Stop transmission on the interface.
   2077          1.1  ragge  */
   2078          1.1  ragge static void
   2079          1.1  ragge dge_stop(struct ifnet *ifp, int disable)
   2080          1.1  ragge {
   2081          1.1  ragge 	struct dge_softc *sc = ifp->if_softc;
   2082          1.1  ragge 	struct dge_txsoft *txs;
   2083          1.1  ragge 	int i;
   2084          1.1  ragge 
   2085          1.1  ragge 	/* Stop the transmit and receive processes. */
   2086          1.1  ragge 	CSR_WRITE(sc, DGE_TCTL, 0);
   2087          1.1  ragge 	CSR_WRITE(sc, DGE_RCTL, 0);
   2088          1.1  ragge 
   2089          1.1  ragge 	/* Release any queued transmit buffers. */
   2090          1.1  ragge 	for (i = 0; i < DGE_TXQUEUELEN; i++) {
   2091          1.1  ragge 		txs = &sc->sc_txsoft[i];
   2092          1.1  ragge 		if (txs->txs_mbuf != NULL) {
   2093          1.1  ragge 			bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap);
   2094          1.1  ragge 			m_freem(txs->txs_mbuf);
   2095          1.1  ragge 			txs->txs_mbuf = NULL;
   2096          1.1  ragge 		}
   2097          1.1  ragge 	}
   2098          1.1  ragge 
   2099          1.1  ragge 	if (disable)
   2100          1.1  ragge 		dge_rxdrain(sc);
   2101          1.1  ragge 
   2102          1.1  ragge 	/* Mark the interface as down and cancel the watchdog timer. */
   2103          1.1  ragge 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
   2104          1.1  ragge 	ifp->if_timer = 0;
   2105          1.1  ragge }
   2106          1.1  ragge 
   2107          1.1  ragge /*
   2108          1.1  ragge  * dge_add_rxbuf:
   2109          1.1  ragge  *
   2110          1.1  ragge  *	Add a receive buffer to the indiciated descriptor.
   2111          1.1  ragge  */
   2112          1.1  ragge static int
   2113          1.1  ragge dge_add_rxbuf(struct dge_softc *sc, int idx)
   2114          1.1  ragge {
   2115          1.1  ragge 	struct dge_rxsoft *rxs = &sc->sc_rxsoft[idx];
   2116          1.1  ragge 	struct mbuf *m;
   2117          1.1  ragge 	int error;
   2118      1.1.2.2   tron #ifdef DGE_OFFBYONE_RXBUG
   2119      1.1.2.2   tron 	caddr_t buf;
   2120      1.1.2.2   tron #endif
   2121          1.1  ragge 
   2122          1.1  ragge 	MGETHDR(m, M_DONTWAIT, MT_DATA);
   2123          1.1  ragge 	if (m == NULL)
   2124          1.1  ragge 		return (ENOBUFS);
   2125          1.1  ragge 
   2126      1.1.2.2   tron #ifdef DGE_OFFBYONE_RXBUG
   2127      1.1.2.2   tron 	if ((buf = dge_getbuf(sc)) == NULL)
   2128      1.1.2.2   tron 		return ENOBUFS;
   2129      1.1.2.2   tron 
   2130      1.1.2.2   tron 	m->m_len = m->m_pkthdr.len = DGE_BUFFER_SIZE;
   2131      1.1.2.2   tron 	MEXTADD(m, buf, DGE_BUFFER_SIZE, M_DEVBUF, dge_freebuf, sc);
   2132      1.1.2.2   tron 
   2133      1.1.2.2   tron 	if (rxs->rxs_mbuf != NULL)
   2134      1.1.2.2   tron 		bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
   2135      1.1.2.2   tron 	rxs->rxs_mbuf = m;
   2136      1.1.2.2   tron 
   2137      1.1.2.2   tron 	error = bus_dmamap_load(sc->sc_dmat, rxs->rxs_dmamap, buf,
   2138      1.1.2.2   tron 	    DGE_BUFFER_SIZE, NULL, BUS_DMA_READ|BUS_DMA_NOWAIT);
   2139      1.1.2.2   tron #else
   2140          1.1  ragge 	MCLGET(m, M_DONTWAIT);
   2141          1.1  ragge 	if ((m->m_flags & M_EXT) == 0) {
   2142          1.1  ragge 		m_freem(m);
   2143          1.1  ragge 		return (ENOBUFS);
   2144          1.1  ragge 	}
   2145          1.1  ragge 
   2146          1.1  ragge 	if (rxs->rxs_mbuf != NULL)
   2147          1.1  ragge 		bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
   2148          1.1  ragge 
   2149          1.1  ragge 	rxs->rxs_mbuf = m;
   2150          1.1  ragge 
   2151          1.1  ragge 	m->m_len = m->m_pkthdr.len = m->m_ext.ext_size;
   2152          1.1  ragge 	error = bus_dmamap_load_mbuf(sc->sc_dmat, rxs->rxs_dmamap, m,
   2153          1.1  ragge 	    BUS_DMA_READ|BUS_DMA_NOWAIT);
   2154      1.1.2.2   tron #endif
   2155          1.1  ragge 	if (error) {
   2156          1.1  ragge 		printf("%s: unable to load rx DMA map %d, error = %d\n",
   2157          1.1  ragge 		    sc->sc_dev.dv_xname, idx, error);
   2158          1.1  ragge 		panic("dge_add_rxbuf");	/* XXX XXX XXX */
   2159          1.1  ragge 	}
   2160          1.1  ragge 	bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
   2161          1.1  ragge 	    rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
   2162          1.1  ragge 
   2163          1.1  ragge 	return (0);
   2164          1.1  ragge }
   2165          1.1  ragge 
   2166          1.1  ragge /*
   2167          1.1  ragge  * dge_set_ral:
   2168          1.1  ragge  *
   2169          1.1  ragge  *	Set an entry in the receive address list.
   2170          1.1  ragge  */
   2171          1.1  ragge static void
   2172          1.1  ragge dge_set_ral(struct dge_softc *sc, const uint8_t *enaddr, int idx)
   2173          1.1  ragge {
   2174          1.1  ragge 	uint32_t ral_lo, ral_hi;
   2175          1.1  ragge 
   2176          1.1  ragge 	if (enaddr != NULL) {
   2177          1.1  ragge 		ral_lo = enaddr[0] | (enaddr[1] << 8) | (enaddr[2] << 16) |
   2178          1.1  ragge 		    (enaddr[3] << 24);
   2179          1.1  ragge 		ral_hi = enaddr[4] | (enaddr[5] << 8);
   2180          1.1  ragge 		ral_hi |= RAH_AV;
   2181          1.1  ragge 	} else {
   2182          1.1  ragge 		ral_lo = 0;
   2183          1.1  ragge 		ral_hi = 0;
   2184          1.1  ragge 	}
   2185          1.1  ragge 	CSR_WRITE(sc, RA_ADDR(DGE_RAL, idx), ral_lo);
   2186          1.1  ragge 	CSR_WRITE(sc, RA_ADDR(DGE_RAH, idx), ral_hi);
   2187          1.1  ragge }
   2188          1.1  ragge 
   2189          1.1  ragge /*
   2190          1.1  ragge  * dge_mchash:
   2191          1.1  ragge  *
   2192          1.1  ragge  *	Compute the hash of the multicast address for the 4096-bit
   2193          1.1  ragge  *	multicast filter.
   2194          1.1  ragge  */
   2195          1.1  ragge static uint32_t
   2196          1.1  ragge dge_mchash(struct dge_softc *sc, const uint8_t *enaddr)
   2197          1.1  ragge {
   2198          1.1  ragge 	static const int lo_shift[4] = { 4, 3, 2, 0 };
   2199          1.1  ragge 	static const int hi_shift[4] = { 4, 5, 6, 8 };
   2200          1.1  ragge 	uint32_t hash;
   2201          1.1  ragge 
   2202          1.1  ragge 	hash = (enaddr[4] >> lo_shift[sc->sc_mchash_type]) |
   2203          1.1  ragge 	    (((uint16_t) enaddr[5]) << hi_shift[sc->sc_mchash_type]);
   2204          1.1  ragge 
   2205          1.1  ragge 	return (hash & 0xfff);
   2206          1.1  ragge }
   2207          1.1  ragge 
   2208          1.1  ragge /*
   2209          1.1  ragge  * dge_set_filter:
   2210          1.1  ragge  *
   2211          1.1  ragge  *	Set up the receive filter.
   2212          1.1  ragge  */
   2213          1.1  ragge static void
   2214          1.1  ragge dge_set_filter(struct dge_softc *sc)
   2215          1.1  ragge {
   2216          1.1  ragge 	struct ethercom *ec = &sc->sc_ethercom;
   2217          1.1  ragge 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
   2218          1.1  ragge 	struct ether_multi *enm;
   2219          1.1  ragge 	struct ether_multistep step;
   2220          1.1  ragge 	uint32_t hash, reg, bit;
   2221          1.1  ragge 	int i;
   2222          1.1  ragge 
   2223          1.1  ragge 	sc->sc_rctl &= ~(RCTL_BAM | RCTL_UPE | RCTL_MPE);
   2224          1.1  ragge 
   2225          1.1  ragge 	if (ifp->if_flags & IFF_BROADCAST)
   2226          1.1  ragge 		sc->sc_rctl |= RCTL_BAM;
   2227          1.1  ragge 	if (ifp->if_flags & IFF_PROMISC) {
   2228          1.1  ragge 		sc->sc_rctl |= RCTL_UPE;
   2229          1.1  ragge 		goto allmulti;
   2230          1.1  ragge 	}
   2231          1.1  ragge 
   2232          1.1  ragge 	/*
   2233          1.1  ragge 	 * Set the station address in the first RAL slot, and
   2234          1.1  ragge 	 * clear the remaining slots.
   2235          1.1  ragge 	 */
   2236          1.1  ragge 	dge_set_ral(sc, LLADDR(ifp->if_sadl), 0);
   2237          1.1  ragge 	for (i = 1; i < RA_TABSIZE; i++)
   2238          1.1  ragge 		dge_set_ral(sc, NULL, i);
   2239          1.1  ragge 
   2240          1.1  ragge 	/* Clear out the multicast table. */
   2241          1.1  ragge 	for (i = 0; i < MC_TABSIZE; i++)
   2242          1.1  ragge 		CSR_WRITE(sc, DGE_MTA + (i << 2), 0);
   2243          1.1  ragge 
   2244          1.1  ragge 	ETHER_FIRST_MULTI(step, ec, enm);
   2245          1.1  ragge 	while (enm != NULL) {
   2246          1.1  ragge 		if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
   2247          1.1  ragge 			/*
   2248          1.1  ragge 			 * We must listen to a range of multicast addresses.
   2249          1.1  ragge 			 * For now, just accept all multicasts, rather than
   2250          1.1  ragge 			 * trying to set only those filter bits needed to match
   2251          1.1  ragge 			 * the range.  (At this time, the only use of address
   2252          1.1  ragge 			 * ranges is for IP multicast routing, for which the
   2253          1.1  ragge 			 * range is big enough to require all bits set.)
   2254          1.1  ragge 			 */
   2255          1.1  ragge 			goto allmulti;
   2256          1.1  ragge 		}
   2257          1.1  ragge 
   2258          1.1  ragge 		hash = dge_mchash(sc, enm->enm_addrlo);
   2259          1.1  ragge 
   2260          1.1  ragge 		reg = (hash >> 5) & 0x7f;
   2261          1.1  ragge 		bit = hash & 0x1f;
   2262          1.1  ragge 
   2263          1.1  ragge 		hash = CSR_READ(sc, DGE_MTA + (reg << 2));
   2264          1.1  ragge 		hash |= 1U << bit;
   2265          1.1  ragge 
   2266          1.1  ragge 		CSR_WRITE(sc, DGE_MTA + (reg << 2), hash);
   2267          1.1  ragge 
   2268          1.1  ragge 		ETHER_NEXT_MULTI(step, enm);
   2269          1.1  ragge 	}
   2270          1.1  ragge 
   2271          1.1  ragge 	ifp->if_flags &= ~IFF_ALLMULTI;
   2272          1.1  ragge 	goto setit;
   2273          1.1  ragge 
   2274          1.1  ragge  allmulti:
   2275          1.1  ragge 	ifp->if_flags |= IFF_ALLMULTI;
   2276          1.1  ragge 	sc->sc_rctl |= RCTL_MPE;
   2277          1.1  ragge 
   2278          1.1  ragge  setit:
   2279          1.1  ragge 	CSR_WRITE(sc, DGE_RCTL, sc->sc_rctl);
   2280          1.1  ragge }
   2281          1.1  ragge 
   2282          1.1  ragge /*
   2283          1.1  ragge  * Read in the EEPROM info and verify checksum.
   2284          1.1  ragge  */
   2285          1.1  ragge int
   2286          1.1  ragge dge_read_eeprom(struct dge_softc *sc)
   2287          1.1  ragge {
   2288          1.1  ragge 	uint16_t cksum;
   2289          1.1  ragge 	int i;
   2290          1.1  ragge 
   2291          1.1  ragge 	cksum = 0;
   2292          1.1  ragge 	for (i = 0; i < EEPROM_SIZE; i++) {
   2293          1.1  ragge 		sc->sc_eeprom[i] = dge_eeprom_word(sc, i);
   2294          1.1  ragge 		cksum += sc->sc_eeprom[i];
   2295          1.1  ragge 	}
   2296          1.1  ragge 	return cksum != EEPROM_CKSUM;
   2297          1.1  ragge }
   2298          1.1  ragge 
   2299          1.1  ragge 
   2300          1.1  ragge /*
   2301          1.1  ragge  * Read a 16-bit word from address addr in the serial EEPROM.
   2302          1.1  ragge  */
   2303          1.1  ragge uint16_t
   2304          1.1  ragge dge_eeprom_word(struct dge_softc *sc, int addr)
   2305          1.1  ragge {
   2306          1.1  ragge 	uint32_t reg;
   2307          1.1  ragge 	uint16_t rval = 0;
   2308          1.1  ragge 	int i;
   2309          1.1  ragge 
   2310          1.1  ragge 	reg = CSR_READ(sc, DGE_EECD) & ~(EECD_SK|EECD_DI|EECD_CS);
   2311          1.1  ragge 
   2312          1.1  ragge 	/* Lower clock pulse (and data in to chip) */
   2313          1.1  ragge 	CSR_WRITE(sc, DGE_EECD, reg);
   2314          1.1  ragge 	/* Select chip */
   2315          1.1  ragge 	CSR_WRITE(sc, DGE_EECD, reg|EECD_CS);
   2316          1.1  ragge 
   2317          1.1  ragge 	/* Send read command */
   2318          1.1  ragge 	dge_eeprom_clockout(sc, 1);
   2319          1.1  ragge 	dge_eeprom_clockout(sc, 1);
   2320          1.1  ragge 	dge_eeprom_clockout(sc, 0);
   2321          1.1  ragge 
   2322          1.1  ragge 	/* Send address */
   2323          1.1  ragge 	for (i = 5; i >= 0; i--)
   2324          1.1  ragge 		dge_eeprom_clockout(sc, (addr >> i) & 1);
   2325          1.1  ragge 
   2326          1.1  ragge 	/* Read data */
   2327          1.1  ragge 	for (i = 0; i < 16; i++) {
   2328          1.1  ragge 		rval <<= 1;
   2329          1.1  ragge 		rval |= dge_eeprom_clockin(sc);
   2330          1.1  ragge 	}
   2331          1.1  ragge 
   2332          1.1  ragge 	/* Deselect chip */
   2333          1.1  ragge 	CSR_WRITE(sc, DGE_EECD, reg);
   2334          1.1  ragge 
   2335          1.1  ragge 	return rval;
   2336          1.1  ragge }
   2337          1.1  ragge 
   2338          1.1  ragge /*
   2339          1.1  ragge  * Clock out a single bit to the EEPROM.
   2340          1.1  ragge  */
   2341          1.1  ragge void
   2342          1.1  ragge dge_eeprom_clockout(struct dge_softc *sc, int bit)
   2343          1.1  ragge {
   2344          1.1  ragge 	int reg;
   2345          1.1  ragge 
   2346          1.1  ragge 	reg = CSR_READ(sc, DGE_EECD) & ~(EECD_DI|EECD_SK);
   2347          1.1  ragge 	if (bit)
   2348          1.1  ragge 		reg |= EECD_DI;
   2349          1.1  ragge 
   2350          1.1  ragge 	CSR_WRITE(sc, DGE_EECD, reg);
   2351          1.1  ragge 	delay(2);
   2352          1.1  ragge 	CSR_WRITE(sc, DGE_EECD, reg|EECD_SK);
   2353          1.1  ragge 	delay(2);
   2354          1.1  ragge 	CSR_WRITE(sc, DGE_EECD, reg);
   2355          1.1  ragge 	delay(2);
   2356          1.1  ragge }
   2357          1.1  ragge 
   2358          1.1  ragge /*
   2359          1.1  ragge  * Clock in a single bit from EEPROM.
   2360          1.1  ragge  */
   2361          1.1  ragge int
   2362          1.1  ragge dge_eeprom_clockin(struct dge_softc *sc)
   2363          1.1  ragge {
   2364          1.1  ragge 	int reg, rv;
   2365          1.1  ragge 
   2366          1.1  ragge 	reg = CSR_READ(sc, DGE_EECD) & ~(EECD_DI|EECD_DO|EECD_SK);
   2367          1.1  ragge 
   2368          1.1  ragge 	CSR_WRITE(sc, DGE_EECD, reg|EECD_SK); /* Raise clock */
   2369          1.1  ragge 	delay(2);
   2370          1.1  ragge 	rv = (CSR_READ(sc, DGE_EECD) & EECD_DO) != 0; /* Get bit */
   2371          1.1  ragge 	CSR_WRITE(sc, DGE_EECD, reg); /* Lower clock */
   2372          1.1  ragge 	delay(2);
   2373          1.1  ragge 
   2374          1.1  ragge 	return rv;
   2375          1.1  ragge }
   2376          1.1  ragge 
   2377          1.1  ragge static void
   2378          1.1  ragge dge_xgmii_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
   2379          1.1  ragge {
   2380          1.1  ragge 	struct dge_softc *sc = ifp->if_softc;
   2381          1.1  ragge 
   2382          1.1  ragge 	ifmr->ifm_status = IFM_AVALID;
   2383          1.1  ragge 	ifmr->ifm_active = IFM_ETHER|IFM_10G_LR;
   2384          1.1  ragge 
   2385          1.1  ragge 	if (CSR_READ(sc, DGE_STATUS) & STATUS_LINKUP)
   2386          1.1  ragge 		ifmr->ifm_status |= IFM_ACTIVE;
   2387          1.1  ragge }
   2388          1.1  ragge 
   2389          1.1  ragge static inline int
   2390          1.1  ragge phwait(struct dge_softc *sc, int p, int r, int d, int type)
   2391          1.1  ragge {
   2392          1.1  ragge         int i, mdic;
   2393          1.1  ragge 
   2394          1.1  ragge         CSR_WRITE(sc, DGE_MDIO,
   2395          1.1  ragge 	    MDIO_PHY(p) | MDIO_REG(r) | MDIO_DEV(d) | type | MDIO_CMD);
   2396          1.1  ragge         for (i = 0; i < 10; i++) {
   2397          1.1  ragge                 delay(10);
   2398          1.1  ragge                 if (((mdic = CSR_READ(sc, DGE_MDIO)) & MDIO_CMD) == 0)
   2399          1.1  ragge                         break;
   2400          1.1  ragge         }
   2401          1.1  ragge         return mdic;
   2402          1.1  ragge }
   2403          1.1  ragge 
   2404          1.1  ragge 
   2405          1.1  ragge static void
   2406          1.1  ragge dge_xgmii_writereg(struct device *self, int phy, int reg, int val)
   2407          1.1  ragge {
   2408          1.1  ragge 	struct dge_softc *sc = (void *) self;
   2409          1.1  ragge 	int mdic;
   2410          1.1  ragge 
   2411          1.1  ragge 	CSR_WRITE(sc, DGE_MDIRW, val);
   2412          1.1  ragge 	if (((mdic = phwait(sc, phy, reg, 1, MDIO_ADDR)) & MDIO_CMD)) {
   2413          1.1  ragge 		printf("%s: address cycle timeout; phy %d reg %d\n",
   2414          1.1  ragge 		    sc->sc_dev.dv_xname, phy, reg);
   2415          1.1  ragge 		return;
   2416          1.1  ragge 	}
   2417          1.1  ragge 	if (((mdic = phwait(sc, phy, reg, 1, MDIO_WRITE)) & MDIO_CMD)) {
   2418          1.1  ragge 		printf("%s: read cycle timeout; phy %d reg %d\n",
   2419          1.1  ragge 		    sc->sc_dev.dv_xname, phy, reg);
   2420          1.1  ragge 		return;
   2421          1.1  ragge 	}
   2422          1.1  ragge }
   2423          1.1  ragge 
   2424          1.1  ragge static void
   2425          1.1  ragge dge_xgmii_reset(struct dge_softc *sc)
   2426          1.1  ragge {
   2427          1.1  ragge 	dge_xgmii_writereg((void *)sc, 0, 0, BMCR_RESET);
   2428          1.1  ragge }
   2429          1.1  ragge 
   2430          1.1  ragge static int
   2431          1.1  ragge dge_xgmii_mediachange(struct ifnet *ifp)
   2432          1.1  ragge {
   2433          1.1  ragge 	return 0;
   2434          1.1  ragge }
   2435          1.1  ragge 
   2436