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