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