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