Home | History | Annotate | Line # | Download | only in pci
if_xge.c revision 1.19.6.1
      1 /*      $NetBSD: if_xge.c,v 1.19.6.1 2015/06/06 14:40:09 skrll Exp $ */
      2 
      3 /*
      4  * Copyright (c) 2004, SUNET, Swedish University Computer Network.
      5  * All rights reserved.
      6  *
      7  * Written by Anders Magnusson for SUNET, Swedish University Computer Network.
      8  *
      9  * Redistribution and use in source and binary forms, with or without
     10  * modification, are permitted provided that the following conditions
     11  * are met:
     12  * 1. Redistributions of source code must retain the above copyright
     13  *    notice, this list of conditions and the following disclaimer.
     14  * 2. Redistributions in binary form must reproduce the above copyright
     15  *    notice, this list of conditions and the following disclaimer in the
     16  *    documentation and/or other materials provided with the distribution.
     17  * 3. All advertising materials mentioning features or use of this software
     18  *    must display the following acknowledgement:
     19  *      This product includes software developed for the NetBSD Project by
     20  *      SUNET, Swedish University Computer Network.
     21  * 4. The name of SUNET may not be used to endorse or promote products
     22  *    derived from this software without specific prior written permission.
     23  *
     24  * THIS SOFTWARE IS PROVIDED BY SUNET ``AS IS'' AND
     25  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     26  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     27  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL SUNET
     28  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     29  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     30  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     31  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     32  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     33  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     34  * POSSIBILITY OF SUCH DAMAGE.
     35  */
     36 
     37 /*
     38  * Device driver for the S2io Xframe Ten Gigabit Ethernet controller.
     39  *
     40  * TODO (in no specific order):
     41  *	HW VLAN support.
     42  *	IPv6 HW cksum.
     43  */
     44 
     45 #include <sys/cdefs.h>
     46 __KERNEL_RCSID(0, "$NetBSD: if_xge.c,v 1.19.6.1 2015/06/06 14:40:09 skrll Exp $");
     47 
     48 
     49 #include <sys/param.h>
     50 #include <sys/systm.h>
     51 #include <sys/mbuf.h>
     52 #include <sys/malloc.h>
     53 #include <sys/kernel.h>
     54 #include <sys/socket.h>
     55 #include <sys/device.h>
     56 
     57 #include <net/if.h>
     58 #include <net/if_dl.h>
     59 #include <net/if_media.h>
     60 #include <net/if_ether.h>
     61 
     62 #include <net/bpf.h>
     63 
     64 #include <sys/bus.h>
     65 #include <sys/intr.h>
     66 #include <machine/endian.h>
     67 
     68 #include <dev/mii/mii.h>
     69 #include <dev/mii/miivar.h>
     70 
     71 #include <dev/pci/pcivar.h>
     72 #include <dev/pci/pcireg.h>
     73 #include <dev/pci/pcidevs.h>
     74 
     75 #include <sys/proc.h>
     76 
     77 #include <dev/pci/if_xgereg.h>
     78 
     79 /*
     80  * Some tunable constants, tune with care!
     81  */
     82 #define RX_MODE		RX_MODE_1  /* Receive mode (buffer usage, see below) */
     83 #define NRXDESCS	1016	   /* # of receive descriptors (requested) */
     84 #define NTXDESCS	8192	   /* Number of transmit descriptors */
     85 #define NTXFRAGS	100	   /* Max fragments per packet */
     86 #define XGE_EVENT_COUNTERS	   /* Instrumentation */
     87 
     88 /*
     89  * Receive buffer modes; 1, 3 or 5 buffers.
     90  */
     91 #define RX_MODE_1 1
     92 #define RX_MODE_3 3
     93 #define RX_MODE_5 5
     94 
     95 /*
     96  * Use clever macros to avoid a bunch of #ifdef's.
     97  */
     98 #define XCONCAT3(x,y,z) x ## y ## z
     99 #define CONCAT3(x,y,z) XCONCAT3(x,y,z)
    100 #define NDESC_BUFMODE CONCAT3(NDESC_,RX_MODE,BUFMODE)
    101 #define rxd_4k CONCAT3(rxd,RX_MODE,_4k)
    102 #define rxdesc ___CONCAT(rxd,RX_MODE)
    103 
    104 #define NEXTTX(x)	(((x)+1) % NTXDESCS)
    105 #define NRXFRAGS	RX_MODE /* hardware imposed frags */
    106 #define NRXPAGES	((NRXDESCS/NDESC_BUFMODE)+1)
    107 #define NRXREAL		(NRXPAGES*NDESC_BUFMODE)
    108 #define RXMAPSZ		(NRXPAGES*PAGE_SIZE)
    109 
    110 #ifdef XGE_EVENT_COUNTERS
    111 #define XGE_EVCNT_INCR(ev)	(ev)->ev_count++
    112 #else
    113 #define XGE_EVCNT_INCR(ev)	/* nothing */
    114 #endif
    115 
    116 /*
    117  * Magics to fix a bug when the mac address can't be read correctly.
    118  * Comes from the Linux driver.
    119  */
    120 static uint64_t fix_mac[] = {
    121 	0x0060000000000000ULL, 0x0060600000000000ULL,
    122 	0x0040600000000000ULL, 0x0000600000000000ULL,
    123 	0x0020600000000000ULL, 0x0060600000000000ULL,
    124 	0x0020600000000000ULL, 0x0060600000000000ULL,
    125 	0x0020600000000000ULL, 0x0060600000000000ULL,
    126 	0x0020600000000000ULL, 0x0060600000000000ULL,
    127 	0x0020600000000000ULL, 0x0060600000000000ULL,
    128 	0x0020600000000000ULL, 0x0060600000000000ULL,
    129 	0x0020600000000000ULL, 0x0060600000000000ULL,
    130 	0x0020600000000000ULL, 0x0060600000000000ULL,
    131 	0x0020600000000000ULL, 0x0060600000000000ULL,
    132 	0x0020600000000000ULL, 0x0060600000000000ULL,
    133 	0x0020600000000000ULL, 0x0000600000000000ULL,
    134 	0x0040600000000000ULL, 0x0060600000000000ULL,
    135 };
    136 
    137 
    138 struct xge_softc {
    139 	device_t sc_dev;
    140 	struct ethercom sc_ethercom;
    141 #define sc_if sc_ethercom.ec_if
    142 	bus_dma_tag_t sc_dmat;
    143 	bus_space_tag_t sc_st;
    144 	bus_space_handle_t sc_sh;
    145 	bus_space_tag_t sc_txt;
    146 	bus_space_handle_t sc_txh;
    147 	void *sc_ih;
    148 
    149 	struct ifmedia xena_media;
    150 	pcireg_t sc_pciregs[16];
    151 
    152 	/* Transmit structures */
    153 	struct txd *sc_txd[NTXDESCS];	/* transmit frags array */
    154 	bus_addr_t sc_txdp[NTXDESCS];	/* bus address of transmit frags */
    155 	bus_dmamap_t sc_txm[NTXDESCS];	/* transmit frags map */
    156 	struct mbuf *sc_txb[NTXDESCS];	/* transmit mbuf pointer */
    157 	int sc_nexttx, sc_lasttx;
    158 	bus_dmamap_t sc_txmap;		/* transmit descriptor map */
    159 
    160 	/* Receive data */
    161 	bus_dmamap_t sc_rxmap;		/* receive descriptor map */
    162 	struct rxd_4k *sc_rxd_4k[NRXPAGES]; /* receive desc pages */
    163 	bus_dmamap_t sc_rxm[NRXREAL];	/* receive buffer map */
    164 	struct mbuf *sc_rxb[NRXREAL];	/* mbufs on receive descriptors */
    165 	int sc_nextrx;			/* next descriptor to check */
    166 
    167 #ifdef XGE_EVENT_COUNTERS
    168 	struct evcnt sc_intr;	/* # of interrupts */
    169 	struct evcnt sc_txintr;	/* # of transmit interrupts */
    170 	struct evcnt sc_rxintr;	/* # of receive interrupts */
    171 	struct evcnt sc_txqe;	/* # of xmit intrs when board queue empty */
    172 #endif
    173 };
    174 
    175 static int xge_match(device_t parent, cfdata_t cf, void *aux);
    176 static void xge_attach(device_t parent, device_t self, void *aux);
    177 static int xge_alloc_txmem(struct xge_softc *);
    178 static int xge_alloc_rxmem(struct xge_softc *);
    179 static void xge_start(struct ifnet *);
    180 static void xge_stop(struct ifnet *, int);
    181 static int xge_add_rxbuf(struct xge_softc *, int);
    182 static void xge_mcast_filter(struct xge_softc *sc);
    183 static int xge_setup_xgxs(struct xge_softc *sc);
    184 static int xge_ioctl(struct ifnet *ifp, u_long cmd, void *data);
    185 static int xge_init(struct ifnet *ifp);
    186 static void xge_ifmedia_status(struct ifnet *, struct ifmediareq *);
    187 static int xge_xgmii_mediachange(struct ifnet *);
    188 static int xge_intr(void  *);
    189 
    190 /*
    191  * Helpers to address registers.
    192  */
    193 #define PIF_WCSR(csr, val)	pif_wcsr(sc, csr, val)
    194 #define PIF_RCSR(csr)		pif_rcsr(sc, csr)
    195 #define TXP_WCSR(csr, val)	txp_wcsr(sc, csr, val)
    196 #define PIF_WKEY(csr, val)	pif_wkey(sc, csr, val)
    197 
    198 static inline void
    199 pif_wcsr(struct xge_softc *sc, bus_size_t csr, uint64_t val)
    200 {
    201 	uint32_t lval, hval;
    202 
    203 	lval = val&0xffffffff;
    204 	hval = val>>32;
    205 	bus_space_write_4(sc->sc_st, sc->sc_sh, csr, lval);
    206 	bus_space_write_4(sc->sc_st, sc->sc_sh, csr+4, hval);
    207 }
    208 
    209 static inline uint64_t
    210 pif_rcsr(struct xge_softc *sc, bus_size_t csr)
    211 {
    212 	uint64_t val, val2;
    213 	val = bus_space_read_4(sc->sc_st, sc->sc_sh, csr);
    214 	val2 = bus_space_read_4(sc->sc_st, sc->sc_sh, csr+4);
    215 	val |= (val2 << 32);
    216 	return val;
    217 }
    218 
    219 static inline void
    220 txp_wcsr(struct xge_softc *sc, bus_size_t csr, uint64_t val)
    221 {
    222 	uint32_t lval, hval;
    223 
    224 	lval = val&0xffffffff;
    225 	hval = val>>32;
    226 	bus_space_write_4(sc->sc_txt, sc->sc_txh, csr, lval);
    227 	bus_space_write_4(sc->sc_txt, sc->sc_txh, csr+4, hval);
    228 }
    229 
    230 
    231 static inline void
    232 pif_wkey(struct xge_softc *sc, bus_size_t csr, uint64_t val)
    233 {
    234 	uint32_t lval, hval;
    235 
    236 	lval = val&0xffffffff;
    237 	hval = val>>32;
    238 	PIF_WCSR(RMAC_CFG_KEY, RMAC_KEY_VALUE);
    239 	bus_space_write_4(sc->sc_st, sc->sc_sh, csr, lval);
    240 	PIF_WCSR(RMAC_CFG_KEY, RMAC_KEY_VALUE);
    241 	bus_space_write_4(sc->sc_st, sc->sc_sh, csr+4, hval);
    242 }
    243 
    244 
    245 CFATTACH_DECL_NEW(xge, sizeof(struct xge_softc),
    246     xge_match, xge_attach, NULL, NULL);
    247 
    248 #define XNAME device_xname(sc->sc_dev)
    249 
    250 #define XGE_RXSYNC(desc, what) \
    251 	bus_dmamap_sync(sc->sc_dmat, sc->sc_rxmap, \
    252 	(desc/NDESC_BUFMODE) * XGE_PAGE + sizeof(struct rxdesc) * \
    253 	(desc%NDESC_BUFMODE), sizeof(struct rxdesc), what)
    254 #define XGE_RXD(desc)	&sc->sc_rxd_4k[desc/NDESC_BUFMODE]-> \
    255 	r4_rxd[desc%NDESC_BUFMODE]
    256 
    257 /*
    258  * Non-tunable constants.
    259  */
    260 #define XGE_MAX_MTU		9600
    261 #define	XGE_IP_MAXPACKET	65535	/* same as IP_MAXPACKET */
    262 
    263 static int
    264 xge_match(device_t parent, cfdata_t cf, void *aux)
    265 {
    266 	struct pci_attach_args *pa = aux;
    267 
    268 	if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_S2IO &&
    269 	    PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_S2IO_XFRAME)
    270 		return (1);
    271 
    272 	return (0);
    273 }
    274 
    275 void
    276 xge_attach(device_t parent, device_t self, void *aux)
    277 {
    278 	struct pci_attach_args *pa = aux;
    279 	struct xge_softc *sc;
    280 	struct ifnet *ifp;
    281 	pcireg_t memtype;
    282 	pci_intr_handle_t ih;
    283 	const char *intrstr = NULL;
    284 	pci_chipset_tag_t pc = pa->pa_pc;
    285 	uint8_t enaddr[ETHER_ADDR_LEN];
    286 	uint64_t val;
    287 	int i;
    288 	char intrbuf[PCI_INTRSTR_LEN];
    289 
    290 	sc = device_private(self);
    291 	sc->sc_dev = self;
    292 	sc->sc_dmat = pa->pa_dmat;
    293 
    294 	/* Get BAR0 address */
    295 	memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, XGE_PIF_BAR);
    296 	if (pci_mapreg_map(pa, XGE_PIF_BAR, memtype, 0,
    297 	    &sc->sc_st, &sc->sc_sh, 0, 0)) {
    298 		aprint_error("%s: unable to map PIF BAR registers\n", XNAME);
    299 		return;
    300 	}
    301 
    302 	memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, XGE_TXP_BAR);
    303 	if (pci_mapreg_map(pa, XGE_TXP_BAR, memtype, 0,
    304 	    &sc->sc_txt, &sc->sc_txh, 0, 0)) {
    305 		aprint_error("%s: unable to map TXP BAR registers\n", XNAME);
    306 		return;
    307 	}
    308 
    309 	/* Save PCI config space */
    310 	for (i = 0; i < 64; i += 4)
    311 		sc->sc_pciregs[i/4] = pci_conf_read(pa->pa_pc, pa->pa_tag, i);
    312 
    313 #if BYTE_ORDER == LITTLE_ENDIAN
    314 	val = (uint64_t)0xFFFFFFFFFFFFFFFFULL;
    315 	val &= ~(TxF_R_SE|RxF_W_SE);
    316 	PIF_WCSR(SWAPPER_CTRL, val);
    317 	PIF_WCSR(SWAPPER_CTRL, val);
    318 #elif BYTE_ORDER == BIG_ENDIAN
    319 	/* do nothing */
    320 #else
    321 #error bad endianness!
    322 #endif
    323 
    324 	if ((val = PIF_RCSR(PIF_RD_SWAPPER_Fb)) != SWAPPER_MAGIC)
    325 		return printf("%s: failed configuring endian, %llx != %llx!\n",
    326 		    XNAME, (unsigned long long)val, SWAPPER_MAGIC);
    327 
    328 	/*
    329 	 * The MAC addr may be all FF's, which is not good.
    330 	 * Resolve it by writing some magics to GPIO_CONTROL and
    331 	 * force a chip reset to read in the serial eeprom again.
    332 	 */
    333 	for (i = 0; i < sizeof(fix_mac)/sizeof(fix_mac[0]); i++) {
    334 		PIF_WCSR(GPIO_CONTROL, fix_mac[i]);
    335 		PIF_RCSR(GPIO_CONTROL);
    336 	}
    337 
    338 	/*
    339 	 * Reset the chip and restore the PCI registers.
    340 	 */
    341 	PIF_WCSR(SW_RESET, 0xa5a5a50000000000ULL);
    342 	DELAY(500000);
    343 	for (i = 0; i < 64; i += 4)
    344 		pci_conf_write(pa->pa_pc, pa->pa_tag, i, sc->sc_pciregs[i/4]);
    345 
    346 	/*
    347 	 * Restore the byte order registers.
    348 	 */
    349 #if BYTE_ORDER == LITTLE_ENDIAN
    350 	val = (uint64_t)0xFFFFFFFFFFFFFFFFULL;
    351 	val &= ~(TxF_R_SE|RxF_W_SE);
    352 	PIF_WCSR(SWAPPER_CTRL, val);
    353 	PIF_WCSR(SWAPPER_CTRL, val);
    354 #elif BYTE_ORDER == BIG_ENDIAN
    355 	/* do nothing */
    356 #else
    357 #error bad endianness!
    358 #endif
    359 
    360 	if ((val = PIF_RCSR(PIF_RD_SWAPPER_Fb)) != SWAPPER_MAGIC)
    361 		return printf("%s: failed configuring endian2, %llx != %llx!\n",
    362 		    XNAME, (unsigned long long)val, SWAPPER_MAGIC);
    363 
    364 	/*
    365 	 * XGXS initialization.
    366 	 */
    367 	/* 29, reset */
    368 	PIF_WCSR(SW_RESET, 0);
    369 	DELAY(500000);
    370 
    371 	/* 30, configure XGXS transceiver */
    372 	xge_setup_xgxs(sc);
    373 
    374 	/* 33, program MAC address (not needed here) */
    375 	/* Get ethernet address */
    376 	PIF_WCSR(RMAC_ADDR_CMD_MEM,
    377 	    RMAC_ADDR_CMD_MEM_STR|RMAC_ADDR_CMD_MEM_OFF(0));
    378 	while (PIF_RCSR(RMAC_ADDR_CMD_MEM) & RMAC_ADDR_CMD_MEM_STR)
    379 		;
    380 	val = PIF_RCSR(RMAC_ADDR_DATA0_MEM);
    381 	for (i = 0; i < ETHER_ADDR_LEN; i++)
    382 		enaddr[i] = (uint8_t)(val >> (56 - (8*i)));
    383 
    384 	/*
    385 	 * Get memory for transmit descriptor lists.
    386 	 */
    387 	if (xge_alloc_txmem(sc))
    388 		return printf("%s: failed allocating txmem.\n", XNAME);
    389 
    390 	/* 9 and 10 - set FIFO number/prio */
    391 	PIF_WCSR(TX_FIFO_P0, TX_FIFO_LEN0(NTXDESCS));
    392 	PIF_WCSR(TX_FIFO_P1, 0ULL);
    393 	PIF_WCSR(TX_FIFO_P2, 0ULL);
    394 	PIF_WCSR(TX_FIFO_P3, 0ULL);
    395 
    396 	/* 11, XXX set round-robin prio? */
    397 
    398 	/* 12, enable transmit FIFO */
    399 	val = PIF_RCSR(TX_FIFO_P0);
    400 	val |= TX_FIFO_ENABLE;
    401 	PIF_WCSR(TX_FIFO_P0, val);
    402 
    403 	/* 13, disable some error checks */
    404 	PIF_WCSR(TX_PA_CFG,
    405 	    TX_PA_CFG_IFR|TX_PA_CFG_ISO|TX_PA_CFG_ILC|TX_PA_CFG_ILE);
    406 
    407 	/*
    408 	 * Create transmit DMA maps.
    409 	 * Make them large for TSO.
    410 	 */
    411 	for (i = 0; i < NTXDESCS; i++) {
    412 		if (bus_dmamap_create(sc->sc_dmat, XGE_IP_MAXPACKET,
    413 		    NTXFRAGS, MCLBYTES, 0, 0, &sc->sc_txm[i]))
    414 			return printf("%s: cannot create TX DMA maps\n", XNAME);
    415 	}
    416 
    417 	sc->sc_lasttx = NTXDESCS-1;
    418 
    419 	/*
    420 	 * RxDMA initialization.
    421 	 * Only use one out of 8 possible receive queues.
    422 	 */
    423 	if (xge_alloc_rxmem(sc))	/* allocate rx descriptor memory */
    424 		return printf("%s: failed allocating rxmem\n", XNAME);
    425 
    426 	/* Create receive buffer DMA maps */
    427 	for (i = 0; i < NRXREAL; i++) {
    428 		if (bus_dmamap_create(sc->sc_dmat, XGE_MAX_MTU,
    429 		    NRXFRAGS, MCLBYTES, 0, 0, &sc->sc_rxm[i]))
    430 			return printf("%s: cannot create RX DMA maps\n", XNAME);
    431 	}
    432 
    433 	/* allocate mbufs to receive descriptors */
    434 	for (i = 0; i < NRXREAL; i++)
    435 		if (xge_add_rxbuf(sc, i))
    436 			panic("out of mbufs too early");
    437 
    438 	/* 14, setup receive ring priority */
    439 	PIF_WCSR(RX_QUEUE_PRIORITY, 0ULL); /* only use one ring */
    440 
    441 	/* 15, setup receive ring round-robin calendar */
    442 	PIF_WCSR(RX_W_ROUND_ROBIN_0, 0ULL); /* only use one ring */
    443 	PIF_WCSR(RX_W_ROUND_ROBIN_1, 0ULL);
    444 	PIF_WCSR(RX_W_ROUND_ROBIN_2, 0ULL);
    445 	PIF_WCSR(RX_W_ROUND_ROBIN_3, 0ULL);
    446 	PIF_WCSR(RX_W_ROUND_ROBIN_4, 0ULL);
    447 
    448 	/* 16, write receive ring start address */
    449 	PIF_WCSR(PRC_RXD0_0, (uint64_t)sc->sc_rxmap->dm_segs[0].ds_addr);
    450 	/* PRC_RXD0_[1-7] are not used */
    451 
    452 	/* 17, Setup alarm registers */
    453 	PIF_WCSR(PRC_ALARM_ACTION, 0ULL); /* Default everything to retry */
    454 
    455 	/* 18, init receive ring controller */
    456 #if RX_MODE == RX_MODE_1
    457 	val = RING_MODE_1;
    458 #elif RX_MODE == RX_MODE_3
    459 	val = RING_MODE_3;
    460 #else /* RX_MODE == RX_MODE_5 */
    461 	val = RING_MODE_5;
    462 #endif
    463 	PIF_WCSR(PRC_CTRL_0, RC_IN_SVC|val);
    464 	/* leave 1-7 disabled */
    465 	/* XXXX snoop configuration? */
    466 
    467 	/* 19, set chip memory assigned to the queue */
    468 	PIF_WCSR(RX_QUEUE_CFG, MC_QUEUE(0, 64)); /* all 64M to queue 0 */
    469 
    470 	/* 20, setup RLDRAM parameters */
    471 	/* do not touch it for now */
    472 
    473 	/* 21, setup pause frame thresholds */
    474 	/* so not touch the defaults */
    475 	/* XXX - must 0xff be written as stated in the manual? */
    476 
    477 	/* 22, configure RED */
    478 	/* we do not want to drop packets, so ignore */
    479 
    480 	/* 23, initiate RLDRAM */
    481 	val = PIF_RCSR(MC_RLDRAM_MRS);
    482 	val |= MC_QUEUE_SIZE_ENABLE|MC_RLDRAM_MRS_ENABLE;
    483 	PIF_WCSR(MC_RLDRAM_MRS, val);
    484 	DELAY(1000);
    485 
    486 	/*
    487 	 * Setup interrupt policies.
    488 	 */
    489 	/* 40, Transmit interrupts */
    490 	PIF_WCSR(TTI_DATA1_MEM, TX_TIMER_VAL(0x1ff) | TX_TIMER_AC |
    491 	    TX_URNG_A(5) | TX_URNG_B(20) | TX_URNG_C(48));
    492 	PIF_WCSR(TTI_DATA2_MEM,
    493 	    TX_UFC_A(25) | TX_UFC_B(64) | TX_UFC_C(128) | TX_UFC_D(512));
    494 	PIF_WCSR(TTI_COMMAND_MEM, TTI_CMD_MEM_WE | TTI_CMD_MEM_STROBE);
    495 	while (PIF_RCSR(TTI_COMMAND_MEM) & TTI_CMD_MEM_STROBE)
    496 		;
    497 
    498 	/* 41, Receive interrupts */
    499 	PIF_WCSR(RTI_DATA1_MEM, RX_TIMER_VAL(0x800) | RX_TIMER_AC |
    500 	    RX_URNG_A(5) | RX_URNG_B(20) | RX_URNG_C(50));
    501 	PIF_WCSR(RTI_DATA2_MEM,
    502 	    RX_UFC_A(64) | RX_UFC_B(128) | RX_UFC_C(256) | RX_UFC_D(512));
    503 	PIF_WCSR(RTI_COMMAND_MEM, RTI_CMD_MEM_WE | RTI_CMD_MEM_STROBE);
    504 	while (PIF_RCSR(RTI_COMMAND_MEM) & RTI_CMD_MEM_STROBE)
    505 		;
    506 
    507 	/*
    508 	 * Setup media stuff.
    509 	 */
    510 	ifmedia_init(&sc->xena_media, IFM_IMASK, xge_xgmii_mediachange,
    511 	    xge_ifmedia_status);
    512 	ifmedia_add(&sc->xena_media, IFM_ETHER|IFM_10G_LR, 0, NULL);
    513 	ifmedia_set(&sc->xena_media, IFM_ETHER|IFM_10G_LR);
    514 
    515 	aprint_normal("%s: Ethernet address %s\n", XNAME,
    516 	    ether_sprintf(enaddr));
    517 
    518 	ifp = &sc->sc_ethercom.ec_if;
    519 	strlcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
    520 	ifp->if_baudrate = 10000000000LL;
    521 	ifp->if_init = xge_init;
    522 	ifp->if_stop = xge_stop;
    523 	ifp->if_softc = sc;
    524 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
    525 	ifp->if_ioctl = xge_ioctl;
    526 	ifp->if_start = xge_start;
    527 	IFQ_SET_MAXLEN(&ifp->if_snd, max(NTXDESCS - 1, IFQ_MAXLEN));
    528 	IFQ_SET_READY(&ifp->if_snd);
    529 
    530 	/*
    531 	 * Offloading capabilities.
    532 	 */
    533 	sc->sc_ethercom.ec_capabilities |=
    534 	    ETHERCAP_JUMBO_MTU | ETHERCAP_VLAN_MTU;
    535 	ifp->if_capabilities |=
    536 	    IFCAP_CSUM_IPv4_Rx | IFCAP_CSUM_IPv4_Tx |
    537 	    IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_TCPv4_Tx |
    538 	    IFCAP_CSUM_UDPv4_Rx | IFCAP_CSUM_UDPv4_Tx | IFCAP_TSOv4;
    539 
    540 	/*
    541 	 * Attach the interface.
    542 	 */
    543 	if_attach(ifp);
    544 	ether_ifattach(ifp, enaddr);
    545 
    546 	/*
    547 	 * Setup interrupt vector before initializing.
    548 	 */
    549 	if (pci_intr_map(pa, &ih))
    550 		return aprint_error_dev(sc->sc_dev, "unable to map interrupt\n");
    551 	intrstr = pci_intr_string(pc, ih, intrbuf, sizeof(intrbuf));
    552 	if ((sc->sc_ih =
    553 	    pci_intr_establish(pc, ih, IPL_NET, xge_intr, sc)) == NULL)
    554 		return aprint_error_dev(sc->sc_dev, "unable to establish interrupt at %s\n",
    555 		    intrstr ? intrstr : "<unknown>");
    556 	aprint_normal_dev(sc->sc_dev, "interrupting at %s\n", intrstr);
    557 
    558 #ifdef XGE_EVENT_COUNTERS
    559 	evcnt_attach_dynamic(&sc->sc_intr, EVCNT_TYPE_MISC,
    560 	    NULL, XNAME, "intr");
    561 	evcnt_attach_dynamic(&sc->sc_txintr, EVCNT_TYPE_MISC,
    562 	    NULL, XNAME, "txintr");
    563 	evcnt_attach_dynamic(&sc->sc_rxintr, EVCNT_TYPE_MISC,
    564 	    NULL, XNAME, "rxintr");
    565 	evcnt_attach_dynamic(&sc->sc_txqe, EVCNT_TYPE_MISC,
    566 	    NULL, XNAME, "txqe");
    567 #endif
    568 }
    569 
    570 void
    571 xge_ifmedia_status(struct ifnet *ifp, struct ifmediareq *ifmr)
    572 {
    573 	struct xge_softc *sc = ifp->if_softc;
    574 	uint64_t reg;
    575 
    576 	ifmr->ifm_status = IFM_AVALID;
    577 	ifmr->ifm_active = IFM_ETHER|IFM_10G_LR;
    578 
    579 	reg = PIF_RCSR(ADAPTER_STATUS);
    580 	if ((reg & (RMAC_REMOTE_FAULT|RMAC_LOCAL_FAULT)) == 0)
    581 		ifmr->ifm_status |= IFM_ACTIVE;
    582 }
    583 
    584 int
    585 xge_xgmii_mediachange(struct ifnet *ifp)
    586 {
    587 	return 0;
    588 }
    589 
    590 static void
    591 xge_enable(struct xge_softc *sc)
    592 {
    593 	uint64_t val;
    594 
    595 	/* 2, enable adapter */
    596 	val = PIF_RCSR(ADAPTER_CONTROL);
    597 	val |= ADAPTER_EN;
    598 	PIF_WCSR(ADAPTER_CONTROL, val);
    599 
    600 	/* 3, light the card enable led */
    601 	val = PIF_RCSR(ADAPTER_CONTROL);
    602 	val |= LED_ON;
    603 	PIF_WCSR(ADAPTER_CONTROL, val);
    604 	printf("%s: link up\n", XNAME);
    605 
    606 }
    607 
    608 int
    609 xge_init(struct ifnet *ifp)
    610 {
    611 	struct xge_softc *sc = ifp->if_softc;
    612 	uint64_t val;
    613 
    614 	if (ifp->if_flags & IFF_RUNNING)
    615 		return 0;
    616 
    617 	/* 31+32, setup MAC config */
    618 	PIF_WKEY(MAC_CFG, TMAC_EN|RMAC_EN|TMAC_APPEND_PAD|RMAC_STRIP_FCS|
    619 	    RMAC_BCAST_EN|RMAC_DISCARD_PFRM|RMAC_PROM_EN);
    620 
    621 	DELAY(1000);
    622 
    623 	/* 54, ensure that the adapter is 'quiescent' */
    624 	val = PIF_RCSR(ADAPTER_STATUS);
    625 	if ((val & QUIESCENT) != QUIESCENT) {
    626 		char buf[200];
    627 		printf("%s: adapter not quiescent, aborting\n", XNAME);
    628 		val = (val & QUIESCENT) ^ QUIESCENT;
    629 		snprintb(buf, sizeof buf, QUIESCENT_BMSK, val);
    630 		printf("%s: ADAPTER_STATUS missing bits %s\n", XNAME, buf);
    631 		return 1;
    632 	}
    633 
    634 	/* 56, enable the transmit laser */
    635 	val = PIF_RCSR(ADAPTER_CONTROL);
    636 	val |= EOI_TX_ON;
    637 	PIF_WCSR(ADAPTER_CONTROL, val);
    638 
    639 	xge_enable(sc);
    640 	/*
    641 	 * Enable all interrupts
    642 	 */
    643 	PIF_WCSR(TX_TRAFFIC_MASK, 0);
    644 	PIF_WCSR(RX_TRAFFIC_MASK, 0);
    645 	PIF_WCSR(GENERAL_INT_MASK, 0);
    646 	PIF_WCSR(TXPIC_INT_MASK, 0);
    647 	PIF_WCSR(RXPIC_INT_MASK, 0);
    648 	PIF_WCSR(MAC_INT_MASK, MAC_TMAC_INT); /* only from RMAC */
    649 	PIF_WCSR(MAC_RMAC_ERR_MASK, ~RMAC_LINK_STATE_CHANGE_INT);
    650 
    651 
    652 	/* Done... */
    653 	ifp->if_flags |= IFF_RUNNING;
    654 	ifp->if_flags &= ~IFF_OACTIVE;
    655 
    656 	return 0;
    657 }
    658 
    659 static void
    660 xge_stop(struct ifnet *ifp, int disable)
    661 {
    662 	struct xge_softc *sc = ifp->if_softc;
    663 	uint64_t val;
    664 
    665 	val = PIF_RCSR(ADAPTER_CONTROL);
    666 	val &= ~ADAPTER_EN;
    667 	PIF_WCSR(ADAPTER_CONTROL, val);
    668 
    669 	while ((PIF_RCSR(ADAPTER_STATUS) & QUIESCENT) != QUIESCENT)
    670 		;
    671 }
    672 
    673 int
    674 xge_intr(void *pv)
    675 {
    676 	struct xge_softc *sc = pv;
    677 	struct txd *txd;
    678 	struct ifnet *ifp = &sc->sc_if;
    679 	bus_dmamap_t dmp;
    680 	uint64_t val;
    681 	int i, lasttx, plen;
    682 
    683 	val = PIF_RCSR(GENERAL_INT_STATUS);
    684 	if (val == 0)
    685 		return 0; /* no interrupt here */
    686 
    687 	XGE_EVCNT_INCR(&sc->sc_intr);
    688 
    689 	PIF_WCSR(GENERAL_INT_STATUS, val);
    690 
    691 	if ((val = PIF_RCSR(MAC_RMAC_ERR_REG)) & RMAC_LINK_STATE_CHANGE_INT) {
    692 		/* Wait for quiescence */
    693 		printf("%s: link down\n", XNAME);
    694 		while ((PIF_RCSR(ADAPTER_STATUS) & QUIESCENT) != QUIESCENT)
    695 			;
    696 		PIF_WCSR(MAC_RMAC_ERR_REG, RMAC_LINK_STATE_CHANGE_INT);
    697 
    698 		val = PIF_RCSR(ADAPTER_STATUS);
    699 		if ((val & (RMAC_REMOTE_FAULT|RMAC_LOCAL_FAULT)) == 0)
    700 			xge_enable(sc); /* Only if link restored */
    701 	}
    702 
    703 	if ((val = PIF_RCSR(TX_TRAFFIC_INT))) {
    704 		XGE_EVCNT_INCR(&sc->sc_txintr);
    705 		PIF_WCSR(TX_TRAFFIC_INT, val); /* clear interrupt bits */
    706 	}
    707 	/*
    708 	 * Collect sent packets.
    709 	 */
    710 	lasttx = sc->sc_lasttx;
    711 	while ((i = NEXTTX(sc->sc_lasttx)) != sc->sc_nexttx) {
    712 		txd = sc->sc_txd[i];
    713 		dmp = sc->sc_txm[i];
    714 
    715 		bus_dmamap_sync(sc->sc_dmat, dmp, 0,
    716 		    dmp->dm_mapsize,
    717 		    BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
    718 
    719 		if (txd->txd_control1 & TXD_CTL1_OWN) {
    720 			bus_dmamap_sync(sc->sc_dmat, dmp, 0,
    721 			    dmp->dm_mapsize, BUS_DMASYNC_PREREAD);
    722 			break;
    723 		}
    724 		bus_dmamap_unload(sc->sc_dmat, dmp);
    725 		m_freem(sc->sc_txb[i]);
    726 		ifp->if_opackets++;
    727 		sc->sc_lasttx = i;
    728 	}
    729 	if (i == sc->sc_nexttx) {
    730 		XGE_EVCNT_INCR(&sc->sc_txqe);
    731 	}
    732 
    733 	if (sc->sc_lasttx != lasttx)
    734 		ifp->if_flags &= ~IFF_OACTIVE;
    735 
    736 	xge_start(ifp); /* Try to get more packets on the wire */
    737 
    738 	if ((val = PIF_RCSR(RX_TRAFFIC_INT))) {
    739 		XGE_EVCNT_INCR(&sc->sc_rxintr);
    740 		PIF_WCSR(RX_TRAFFIC_INT, val); /* clear interrupt bits */
    741 	}
    742 
    743 	for (;;) {
    744 		struct rxdesc *rxd;
    745 		struct mbuf *m;
    746 
    747 		XGE_RXSYNC(sc->sc_nextrx,
    748 		    BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
    749 
    750 		rxd = XGE_RXD(sc->sc_nextrx);
    751 		if (rxd->rxd_control1 & RXD_CTL1_OWN) {
    752 			XGE_RXSYNC(sc->sc_nextrx, BUS_DMASYNC_PREREAD);
    753 			break;
    754 		}
    755 
    756 		/* got a packet */
    757 		m = sc->sc_rxb[sc->sc_nextrx];
    758 #if RX_MODE == RX_MODE_1
    759 		plen = m->m_len = RXD_CTL2_BUF0SIZ(rxd->rxd_control2);
    760 #elif RX_MODE == RX_MODE_3
    761 #error Fix rxmodes in xge_intr
    762 #elif RX_MODE == RX_MODE_5
    763 		plen = m->m_len = RXD_CTL2_BUF0SIZ(rxd->rxd_control2);
    764 		plen += m->m_next->m_len = RXD_CTL2_BUF1SIZ(rxd->rxd_control2);
    765 		plen += m->m_next->m_next->m_len =
    766 		    RXD_CTL2_BUF2SIZ(rxd->rxd_control2);
    767 		plen += m->m_next->m_next->m_next->m_len =
    768 		    RXD_CTL3_BUF3SIZ(rxd->rxd_control3);
    769 		plen += m->m_next->m_next->m_next->m_next->m_len =
    770 		    RXD_CTL3_BUF4SIZ(rxd->rxd_control3);
    771 #endif
    772 		m->m_pkthdr.rcvif = ifp;
    773 		m->m_pkthdr.len = plen;
    774 
    775 		val = rxd->rxd_control1;
    776 
    777 		if (xge_add_rxbuf(sc, sc->sc_nextrx)) {
    778 			/* Failed, recycle this mbuf */
    779 #if RX_MODE == RX_MODE_1
    780 			rxd->rxd_control2 = RXD_MKCTL2(MCLBYTES, 0, 0);
    781 			rxd->rxd_control1 = RXD_CTL1_OWN;
    782 #elif RX_MODE == RX_MODE_3
    783 #elif RX_MODE == RX_MODE_5
    784 #endif
    785 			XGE_RXSYNC(sc->sc_nextrx,
    786 			    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
    787 			ifp->if_ierrors++;
    788 			break;
    789 		}
    790 
    791 		ifp->if_ipackets++;
    792 
    793 		if (RXD_CTL1_PROTOS(val) & (RXD_CTL1_P_IPv4|RXD_CTL1_P_IPv6)) {
    794 			m->m_pkthdr.csum_flags |= M_CSUM_IPv4;
    795 			if (RXD_CTL1_L3CSUM(val) != 0xffff)
    796 				m->m_pkthdr.csum_flags |= M_CSUM_IPv4_BAD;
    797 		}
    798 		if (RXD_CTL1_PROTOS(val) & RXD_CTL1_P_TCP) {
    799 			m->m_pkthdr.csum_flags |= M_CSUM_TCPv4|M_CSUM_TCPv6;
    800 			if (RXD_CTL1_L4CSUM(val) != 0xffff)
    801 				m->m_pkthdr.csum_flags |= M_CSUM_TCP_UDP_BAD;
    802 		}
    803 		if (RXD_CTL1_PROTOS(val) & RXD_CTL1_P_UDP) {
    804 			m->m_pkthdr.csum_flags |= M_CSUM_UDPv4|M_CSUM_UDPv6;
    805 			if (RXD_CTL1_L4CSUM(val) != 0xffff)
    806 				m->m_pkthdr.csum_flags |= M_CSUM_TCP_UDP_BAD;
    807 		}
    808 
    809 		bpf_mtap(ifp, m);
    810 
    811 		(*ifp->if_input)(ifp, m);
    812 
    813 		if (++sc->sc_nextrx == NRXREAL)
    814 			sc->sc_nextrx = 0;
    815 
    816 	}
    817 
    818 	return 0;
    819 }
    820 
    821 int
    822 xge_ioctl(struct ifnet *ifp, u_long cmd, void *data)
    823 {
    824 	struct xge_softc *sc = ifp->if_softc;
    825 	struct ifreq *ifr = (struct ifreq *) data;
    826 	int s, error = 0;
    827 
    828 	s = splnet();
    829 
    830 	switch (cmd) {
    831 	case SIOCSIFMTU:
    832 		if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > XGE_MAX_MTU)
    833 			error = EINVAL;
    834 		else if ((error = ifioctl_common(ifp, cmd, data)) == ENETRESET){
    835 			PIF_WCSR(RMAC_MAX_PYLD_LEN,
    836 			    RMAC_PYLD_LEN(ifr->ifr_mtu));
    837 			error = 0;
    838 		}
    839 		break;
    840 
    841 	case SIOCGIFMEDIA:
    842 	case SIOCSIFMEDIA:
    843 		error = ifmedia_ioctl(ifp, ifr, &sc->xena_media, cmd);
    844 		break;
    845 
    846 	default:
    847 		if ((error = ether_ioctl(ifp, cmd, data)) != ENETRESET)
    848 			break;
    849 
    850 		error = 0;
    851 
    852 		if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI)
    853 			;
    854 		else if (ifp->if_flags & IFF_RUNNING) {
    855 			/* Change multicast list */
    856 			xge_mcast_filter(sc);
    857 		}
    858 		break;
    859 	}
    860 
    861 	splx(s);
    862 	return(error);
    863 }
    864 
    865 void
    866 xge_mcast_filter(struct xge_softc *sc)
    867 {
    868 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
    869 	struct ethercom *ec = &sc->sc_ethercom;
    870 	struct ether_multi *enm;
    871 	struct ether_multistep step;
    872 	int i, numaddr = 1; /* first slot used for card unicast address */
    873 	uint64_t val;
    874 
    875 	ETHER_FIRST_MULTI(step, ec, enm);
    876 	while (enm != NULL) {
    877 		if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
    878 			/* Skip ranges */
    879 			goto allmulti;
    880 		}
    881 		if (numaddr == MAX_MCAST_ADDR)
    882 			goto allmulti;
    883 		for (val = 0, i = 0; i < ETHER_ADDR_LEN; i++) {
    884 			val <<= 8;
    885 			val |= enm->enm_addrlo[i];
    886 		}
    887 		PIF_WCSR(RMAC_ADDR_DATA0_MEM, val << 16);
    888 		PIF_WCSR(RMAC_ADDR_DATA1_MEM, 0xFFFFFFFFFFFFFFFFULL);
    889 		PIF_WCSR(RMAC_ADDR_CMD_MEM, RMAC_ADDR_CMD_MEM_WE|
    890 		    RMAC_ADDR_CMD_MEM_STR|RMAC_ADDR_CMD_MEM_OFF(numaddr));
    891 		while (PIF_RCSR(RMAC_ADDR_CMD_MEM) & RMAC_ADDR_CMD_MEM_STR)
    892 			;
    893 		numaddr++;
    894 		ETHER_NEXT_MULTI(step, enm);
    895 	}
    896 	/* set the remaining entries to the broadcast address */
    897 	for (i = numaddr; i < MAX_MCAST_ADDR; i++) {
    898 		PIF_WCSR(RMAC_ADDR_DATA0_MEM, 0xffffffffffff0000ULL);
    899 		PIF_WCSR(RMAC_ADDR_DATA1_MEM, 0xFFFFFFFFFFFFFFFFULL);
    900 		PIF_WCSR(RMAC_ADDR_CMD_MEM, RMAC_ADDR_CMD_MEM_WE|
    901 		    RMAC_ADDR_CMD_MEM_STR|RMAC_ADDR_CMD_MEM_OFF(i));
    902 		while (PIF_RCSR(RMAC_ADDR_CMD_MEM) & RMAC_ADDR_CMD_MEM_STR)
    903 			;
    904 	}
    905 	ifp->if_flags &= ~IFF_ALLMULTI;
    906 	return;
    907 
    908 allmulti:
    909 	/* Just receive everything with the multicast bit set */
    910 	ifp->if_flags |= IFF_ALLMULTI;
    911 	PIF_WCSR(RMAC_ADDR_DATA0_MEM, 0x8000000000000000ULL);
    912 	PIF_WCSR(RMAC_ADDR_DATA1_MEM, 0xF000000000000000ULL);
    913 	PIF_WCSR(RMAC_ADDR_CMD_MEM, RMAC_ADDR_CMD_MEM_WE|
    914 	    RMAC_ADDR_CMD_MEM_STR|RMAC_ADDR_CMD_MEM_OFF(1));
    915 	while (PIF_RCSR(RMAC_ADDR_CMD_MEM) & RMAC_ADDR_CMD_MEM_STR)
    916 		;
    917 }
    918 
    919 void
    920 xge_start(struct ifnet *ifp)
    921 {
    922 	struct xge_softc *sc = ifp->if_softc;
    923 	struct txd *txd = NULL; /* XXX - gcc */
    924 	bus_dmamap_t dmp;
    925 	struct	mbuf *m;
    926 	uint64_t par, lcr;
    927 	int nexttx = 0, ntxd, error, i;
    928 
    929 	if ((ifp->if_flags & (IFF_RUNNING|IFF_OACTIVE)) != IFF_RUNNING)
    930 		return;
    931 
    932 	par = lcr = 0;
    933 	for (;;) {
    934 		IFQ_POLL(&ifp->if_snd, m);
    935 		if (m == NULL)
    936 			break;	/* out of packets */
    937 
    938 		if (sc->sc_nexttx == sc->sc_lasttx)
    939 			break;	/* No more space */
    940 
    941 		nexttx = sc->sc_nexttx;
    942 		dmp = sc->sc_txm[nexttx];
    943 
    944 		if ((error = bus_dmamap_load_mbuf(sc->sc_dmat, dmp, m,
    945 		    BUS_DMA_WRITE|BUS_DMA_NOWAIT)) != 0) {
    946 			printf("%s: bus_dmamap_load_mbuf error %d\n",
    947 			    XNAME, error);
    948 			break;
    949 		}
    950 		IFQ_DEQUEUE(&ifp->if_snd, m);
    951 
    952 		bus_dmamap_sync(sc->sc_dmat, dmp, 0, dmp->dm_mapsize,
    953 		    BUS_DMASYNC_PREWRITE);
    954 
    955 		txd = sc->sc_txd[nexttx];
    956 		sc->sc_txb[nexttx] = m;
    957 		for (i = 0; i < dmp->dm_nsegs; i++) {
    958 			if (dmp->dm_segs[i].ds_len == 0)
    959 				continue;
    960 			txd->txd_control1 = dmp->dm_segs[i].ds_len;
    961 			txd->txd_control2 = 0;
    962 			txd->txd_bufaddr = dmp->dm_segs[i].ds_addr;
    963 			txd++;
    964 		}
    965 		ntxd = txd - sc->sc_txd[nexttx] - 1;
    966 		txd = sc->sc_txd[nexttx];
    967 		txd->txd_control1 |= TXD_CTL1_OWN|TXD_CTL1_GCF;
    968 		txd->txd_control2 = TXD_CTL2_UTIL;
    969 		if (m->m_pkthdr.csum_flags & M_CSUM_TSOv4) {
    970 			txd->txd_control1 |= TXD_CTL1_MSS(m->m_pkthdr.segsz);
    971 			txd->txd_control1 |= TXD_CTL1_LSO;
    972 		}
    973 
    974 		if (m->m_pkthdr.csum_flags & M_CSUM_IPv4)
    975 			txd->txd_control2 |= TXD_CTL2_CIPv4;
    976 		if (m->m_pkthdr.csum_flags & M_CSUM_TCPv4)
    977 			txd->txd_control2 |= TXD_CTL2_CTCP;
    978 		if (m->m_pkthdr.csum_flags & M_CSUM_UDPv4)
    979 			txd->txd_control2 |= TXD_CTL2_CUDP;
    980 		txd[ntxd].txd_control1 |= TXD_CTL1_GCL;
    981 
    982 		bus_dmamap_sync(sc->sc_dmat, dmp, 0, dmp->dm_mapsize,
    983 		    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
    984 
    985 		par = sc->sc_txdp[nexttx];
    986 		lcr = TXDL_NUMTXD(ntxd) | TXDL_LGC_FIRST | TXDL_LGC_LAST;
    987 		if (m->m_pkthdr.csum_flags & M_CSUM_TSOv4)
    988 			lcr |= TXDL_SFF;
    989 		TXP_WCSR(TXDL_PAR, par);
    990 		TXP_WCSR(TXDL_LCR, lcr);
    991 
    992 		bpf_mtap(ifp, m);
    993 
    994 		sc->sc_nexttx = NEXTTX(nexttx);
    995 	}
    996 }
    997 
    998 /*
    999  * Allocate DMA memory for transmit descriptor fragments.
   1000  * Only one map is used for all descriptors.
   1001  */
   1002 int
   1003 xge_alloc_txmem(struct xge_softc *sc)
   1004 {
   1005 	struct txd *txp;
   1006 	bus_dma_segment_t seg;
   1007 	bus_addr_t txdp;
   1008 	void *kva;
   1009 	int i, rseg, state;
   1010 
   1011 #define TXMAPSZ (NTXDESCS*NTXFRAGS*sizeof(struct txd))
   1012 	state = 0;
   1013 	if (bus_dmamem_alloc(sc->sc_dmat, TXMAPSZ, PAGE_SIZE, 0,
   1014 	    &seg, 1, &rseg, BUS_DMA_NOWAIT))
   1015 		goto err;
   1016 	state++;
   1017 	if (bus_dmamem_map(sc->sc_dmat, &seg, rseg, TXMAPSZ, &kva,
   1018 	    BUS_DMA_NOWAIT))
   1019 		goto err;
   1020 
   1021 	state++;
   1022 	if (bus_dmamap_create(sc->sc_dmat, TXMAPSZ, 1, TXMAPSZ, 0,
   1023 	    BUS_DMA_NOWAIT, &sc->sc_txmap))
   1024 		goto err;
   1025 	state++;
   1026 	if (bus_dmamap_load(sc->sc_dmat, sc->sc_txmap,
   1027 	    kva, TXMAPSZ, NULL, BUS_DMA_NOWAIT))
   1028 		goto err;
   1029 
   1030 	/* setup transmit array pointers */
   1031 	txp = (struct txd *)kva;
   1032 	txdp = seg.ds_addr;
   1033 	for (txp = (struct txd *)kva, i = 0; i < NTXDESCS; i++) {
   1034 		sc->sc_txd[i] = txp;
   1035 		sc->sc_txdp[i] = txdp;
   1036 		txp += NTXFRAGS;
   1037 		txdp += (NTXFRAGS * sizeof(struct txd));
   1038 	}
   1039 
   1040 	return 0;
   1041 
   1042 err:
   1043 	if (state > 2)
   1044 		bus_dmamap_destroy(sc->sc_dmat, sc->sc_txmap);
   1045 	if (state > 1)
   1046 		bus_dmamem_unmap(sc->sc_dmat, kva, TXMAPSZ);
   1047 	if (state > 0)
   1048 		bus_dmamem_free(sc->sc_dmat, &seg, rseg);
   1049 	return ENOBUFS;
   1050 }
   1051 
   1052 /*
   1053  * Allocate DMA memory for receive descriptor,
   1054  * only one map is used for all descriptors.
   1055  * link receive descriptor pages together.
   1056  */
   1057 int
   1058 xge_alloc_rxmem(struct xge_softc *sc)
   1059 {
   1060 	struct rxd_4k *rxpp;
   1061 	bus_dma_segment_t seg;
   1062 	void *kva;
   1063 	int i, rseg, state;
   1064 
   1065 	/* sanity check */
   1066 	if (sizeof(struct rxd_4k) != XGE_PAGE) {
   1067 		printf("bad compiler struct alignment, %d != %d\n",
   1068 		    (int)sizeof(struct rxd_4k), XGE_PAGE);
   1069 		return EINVAL;
   1070 	}
   1071 
   1072 	state = 0;
   1073 	if (bus_dmamem_alloc(sc->sc_dmat, RXMAPSZ, PAGE_SIZE, 0,
   1074 	    &seg, 1, &rseg, BUS_DMA_NOWAIT))
   1075 		goto err;
   1076 	state++;
   1077 	if (bus_dmamem_map(sc->sc_dmat, &seg, rseg, RXMAPSZ, &kva,
   1078 	    BUS_DMA_NOWAIT))
   1079 		goto err;
   1080 
   1081 	state++;
   1082 	if (bus_dmamap_create(sc->sc_dmat, RXMAPSZ, 1, RXMAPSZ, 0,
   1083 	    BUS_DMA_NOWAIT, &sc->sc_rxmap))
   1084 		goto err;
   1085 	state++;
   1086 	if (bus_dmamap_load(sc->sc_dmat, sc->sc_rxmap,
   1087 	    kva, RXMAPSZ, NULL, BUS_DMA_NOWAIT))
   1088 		goto err;
   1089 
   1090 	/* setup receive page link pointers */
   1091 	for (rxpp = (struct rxd_4k *)kva, i = 0; i < NRXPAGES; i++, rxpp++) {
   1092 		sc->sc_rxd_4k[i] = rxpp;
   1093 		rxpp->r4_next = (uint64_t)sc->sc_rxmap->dm_segs[0].ds_addr +
   1094 		    (i*sizeof(struct rxd_4k)) + sizeof(struct rxd_4k);
   1095 	}
   1096 	sc->sc_rxd_4k[NRXPAGES-1]->r4_next =
   1097 	    (uint64_t)sc->sc_rxmap->dm_segs[0].ds_addr;
   1098 
   1099 	return 0;
   1100 
   1101 err:
   1102 	if (state > 2)
   1103 		bus_dmamap_destroy(sc->sc_dmat, sc->sc_txmap);
   1104 	if (state > 1)
   1105 		bus_dmamem_unmap(sc->sc_dmat, kva, TXMAPSZ);
   1106 	if (state > 0)
   1107 		bus_dmamem_free(sc->sc_dmat, &seg, rseg);
   1108 	return ENOBUFS;
   1109 }
   1110 
   1111 
   1112 /*
   1113  * Add a new mbuf chain to descriptor id.
   1114  */
   1115 int
   1116 xge_add_rxbuf(struct xge_softc *sc, int id)
   1117 {
   1118 	struct rxdesc *rxd;
   1119 	struct mbuf *m[5];
   1120 	int page, desc, error;
   1121 #if RX_MODE == RX_MODE_5
   1122 	int i;
   1123 #endif
   1124 
   1125 	page = id/NDESC_BUFMODE;
   1126 	desc = id%NDESC_BUFMODE;
   1127 
   1128 	rxd = &sc->sc_rxd_4k[page]->r4_rxd[desc];
   1129 
   1130 	/*
   1131 	 * Allocate mbufs.
   1132 	 * Currently five mbufs and two clusters are used,
   1133 	 * the hardware will put (ethernet, ip, tcp/udp) headers in
   1134 	 * their own buffer and the clusters are only used for data.
   1135 	 */
   1136 #if RX_MODE == RX_MODE_1
   1137 	MGETHDR(m[0], M_DONTWAIT, MT_DATA);
   1138 	if (m[0] == NULL)
   1139 		return ENOBUFS;
   1140 	MCLGET(m[0], M_DONTWAIT);
   1141 	if ((m[0]->m_flags & M_EXT) == 0) {
   1142 		m_freem(m[0]);
   1143 		return ENOBUFS;
   1144 	}
   1145 	m[0]->m_len = m[0]->m_pkthdr.len = m[0]->m_ext.ext_size;
   1146 #elif RX_MODE == RX_MODE_3
   1147 #error missing rxmode 3.
   1148 #elif RX_MODE == RX_MODE_5
   1149 	MGETHDR(m[0], M_DONTWAIT, MT_DATA);
   1150 	for (i = 1; i < 5; i++) {
   1151 		MGET(m[i], M_DONTWAIT, MT_DATA);
   1152 	}
   1153 	if (m[3])
   1154 		MCLGET(m[3], M_DONTWAIT);
   1155 	if (m[4])
   1156 		MCLGET(m[4], M_DONTWAIT);
   1157 	if (!m[0] || !m[1] || !m[2] || !m[3] || !m[4] ||
   1158 	    ((m[3]->m_flags & M_EXT) == 0) || ((m[4]->m_flags & M_EXT) == 0)) {
   1159 		/* Out of something */
   1160 		for (i = 0; i < 5; i++)
   1161 			if (m[i] != NULL)
   1162 				m_free(m[i]);
   1163 		return ENOBUFS;
   1164 	}
   1165 	/* Link'em together */
   1166 	m[0]->m_next = m[1];
   1167 	m[1]->m_next = m[2];
   1168 	m[2]->m_next = m[3];
   1169 	m[3]->m_next = m[4];
   1170 #else
   1171 #error bad mode RX_MODE
   1172 #endif
   1173 
   1174 	if (sc->sc_rxb[id])
   1175 		bus_dmamap_unload(sc->sc_dmat, sc->sc_rxm[id]);
   1176 	sc->sc_rxb[id] = m[0];
   1177 
   1178 	error = bus_dmamap_load_mbuf(sc->sc_dmat, sc->sc_rxm[id], m[0],
   1179 	    BUS_DMA_READ|BUS_DMA_NOWAIT);
   1180 	if (error)
   1181 		return error;
   1182 	bus_dmamap_sync(sc->sc_dmat, sc->sc_rxm[id], 0,
   1183 	    sc->sc_rxm[id]->dm_mapsize, BUS_DMASYNC_PREREAD);
   1184 
   1185 #if RX_MODE == RX_MODE_1
   1186 	rxd->rxd_control2 = RXD_MKCTL2(m[0]->m_len, 0, 0);
   1187 	rxd->rxd_buf0 = (uint64_t)sc->sc_rxm[id]->dm_segs[0].ds_addr;
   1188 	rxd->rxd_control1 = RXD_CTL1_OWN;
   1189 #elif RX_MODE == RX_MODE_3
   1190 #elif RX_MODE == RX_MODE_5
   1191 	rxd->rxd_control3 = RXD_MKCTL3(0, m[3]->m_len, m[4]->m_len);
   1192 	rxd->rxd_control2 = RXD_MKCTL2(m[0]->m_len, m[1]->m_len, m[2]->m_len);
   1193 	rxd->rxd_buf0 = (uint64_t)sc->sc_rxm[id]->dm_segs[0].ds_addr;
   1194 	rxd->rxd_buf1 = (uint64_t)sc->sc_rxm[id]->dm_segs[1].ds_addr;
   1195 	rxd->rxd_buf2 = (uint64_t)sc->sc_rxm[id]->dm_segs[2].ds_addr;
   1196 	rxd->rxd_buf3 = (uint64_t)sc->sc_rxm[id]->dm_segs[3].ds_addr;
   1197 	rxd->rxd_buf4 = (uint64_t)sc->sc_rxm[id]->dm_segs[4].ds_addr;
   1198 	rxd->rxd_control1 = RXD_CTL1_OWN;
   1199 #endif
   1200 
   1201 	XGE_RXSYNC(id, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
   1202 	return 0;
   1203 }
   1204 
   1205 /*
   1206  * These magics comes from the FreeBSD driver.
   1207  */
   1208 int
   1209 xge_setup_xgxs(struct xge_softc *sc)
   1210 {
   1211 	/* The magic numbers are described in the users guide */
   1212 
   1213 	/* Writing to MDIO 0x8000 (Global Config 0) */
   1214 	PIF_WCSR(DTX_CONTROL, 0x8000051500000000ULL); DELAY(50);
   1215 	PIF_WCSR(DTX_CONTROL, 0x80000515000000E0ULL); DELAY(50);
   1216 	PIF_WCSR(DTX_CONTROL, 0x80000515D93500E4ULL); DELAY(50);
   1217 
   1218 	/* Writing to MDIO 0x8000 (Global Config 1) */
   1219 	PIF_WCSR(DTX_CONTROL, 0x8001051500000000ULL); DELAY(50);
   1220 	PIF_WCSR(DTX_CONTROL, 0x80010515000000e0ULL); DELAY(50);
   1221 	PIF_WCSR(DTX_CONTROL, 0x80010515001e00e4ULL); DELAY(50);
   1222 
   1223 	/* Reset the Gigablaze */
   1224 	PIF_WCSR(DTX_CONTROL, 0x8002051500000000ULL); DELAY(50);
   1225 	PIF_WCSR(DTX_CONTROL, 0x80020515000000E0ULL); DELAY(50);
   1226 	PIF_WCSR(DTX_CONTROL, 0x80020515F21000E4ULL); DELAY(50);
   1227 
   1228 	/* read the pole settings */
   1229 	PIF_WCSR(DTX_CONTROL, 0x8000051500000000ULL); DELAY(50);
   1230 	PIF_WCSR(DTX_CONTROL, 0x80000515000000e0ULL); DELAY(50);
   1231 	PIF_WCSR(DTX_CONTROL, 0x80000515000000ecULL); DELAY(50);
   1232 
   1233 	PIF_WCSR(DTX_CONTROL, 0x8001051500000000ULL); DELAY(50);
   1234 	PIF_WCSR(DTX_CONTROL, 0x80010515000000e0ULL); DELAY(50);
   1235 	PIF_WCSR(DTX_CONTROL, 0x80010515000000ecULL); DELAY(50);
   1236 
   1237 	PIF_WCSR(DTX_CONTROL, 0x8002051500000000ULL); DELAY(50);
   1238 	PIF_WCSR(DTX_CONTROL, 0x80020515000000e0ULL); DELAY(50);
   1239 	PIF_WCSR(DTX_CONTROL, 0x80020515000000ecULL); DELAY(50);
   1240 
   1241 	/* Workaround for TX Lane XAUI initialization error.
   1242 	   Read Xpak PHY register 24 for XAUI lane status */
   1243 	PIF_WCSR(DTX_CONTROL, 0x0018040000000000ULL); DELAY(50);
   1244 	PIF_WCSR(DTX_CONTROL, 0x00180400000000e0ULL); DELAY(50);
   1245 	PIF_WCSR(DTX_CONTROL, 0x00180400000000ecULL); DELAY(50);
   1246 
   1247 	/*
   1248 	 * Reading the MDIO control with value 0x1804001c0F001c
   1249 	 * means the TxLanes were already in sync
   1250 	 * Reading the MDIO control with value 0x1804000c0x001c
   1251 	 * means some TxLanes are not in sync where x is a 4-bit
   1252 	 * value representing each lanes
   1253 	 */
   1254 #if 0
   1255 	val = PIF_RCSR(MDIO_CONTROL);
   1256 	if (val != 0x1804001c0F001cULL) {
   1257 		printf("%s: MDIO_CONTROL: %llx != %llx\n",
   1258 		    XNAME, val, 0x1804001c0F001cULL);
   1259 		return 1;
   1260 	}
   1261 #endif
   1262 
   1263 	/* Set and remove the DTE XS INTLoopBackN */
   1264 	PIF_WCSR(DTX_CONTROL, 0x0000051500000000ULL); DELAY(50);
   1265 	PIF_WCSR(DTX_CONTROL, 0x00000515604000e0ULL); DELAY(50);
   1266 	PIF_WCSR(DTX_CONTROL, 0x00000515604000e4ULL); DELAY(50);
   1267 	PIF_WCSR(DTX_CONTROL, 0x00000515204000e4ULL); DELAY(50);
   1268 	PIF_WCSR(DTX_CONTROL, 0x00000515204000ecULL); DELAY(50);
   1269 
   1270 #if 0
   1271 	/* Reading the DTX control register Should be 0x5152040001c */
   1272 	val = PIF_RCSR(DTX_CONTROL);
   1273 	if (val != 0x5152040001cULL) {
   1274 		printf("%s: DTX_CONTROL: %llx != %llx\n",
   1275 		    XNAME, val, 0x5152040001cULL);
   1276 		return 1;
   1277 	}
   1278 #endif
   1279 
   1280 	PIF_WCSR(MDIO_CONTROL, 0x0018040000000000ULL); DELAY(50);
   1281 	PIF_WCSR(MDIO_CONTROL, 0x00180400000000e0ULL); DELAY(50);
   1282 	PIF_WCSR(MDIO_CONTROL, 0x00180400000000ecULL); DELAY(50);
   1283 
   1284 #if 0
   1285 	/* Reading the MIOD control should be 0x1804001c0f001c */
   1286 	val = PIF_RCSR(MDIO_CONTROL);
   1287 	if (val != 0x1804001c0f001cULL) {
   1288 		printf("%s: MDIO_CONTROL2: %llx != %llx\n",
   1289 		    XNAME, val, 0x1804001c0f001cULL);
   1290 		return 1;
   1291 	}
   1292 #endif
   1293 	return 0;
   1294 }
   1295