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