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