xref: /netbsd-src/sys/dev/pci/if_xge.c (revision 8b0f9554ff8762542c4defc4f70e1eb76fb508fa)
1 /*      $NetBSD: if_xge.c,v 1.6 2007/10/19 12:00:50 ad 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.6 2007/10/19 12:00:50 ad 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 <sys/bus.h>
73 #include <sys/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, void *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, void *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 	void *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 	void *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