1 /* $OpenBSD: re.c,v 1.216 2023/11/10 15:51:20 bluhm Exp $ */ 2 /* $FreeBSD: if_re.c,v 1.31 2004/09/04 07:54:05 ru Exp $ */ 3 /* 4 * Copyright (c) 1997, 1998-2003 5 * Bill Paul <wpaul@windriver.com>. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by Bill Paul. 18 * 4. Neither the name of the author nor the names of any co-contributors 19 * may be used to endorse or promote products derived from this software 20 * without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND 23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD 26 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 32 * THE POSSIBILITY OF SUCH DAMAGE. 33 */ 34 35 /* 36 * Realtek 8139C+/8169/8169S/8110S PCI NIC driver 37 * 38 * Written by Bill Paul <wpaul@windriver.com> 39 * Senior Networking Software Engineer 40 * Wind River Systems 41 */ 42 43 /* 44 * This driver is designed to support Realtek's next generation of 45 * 10/100 and 10/100/1000 PCI ethernet controllers. There are currently 46 * seven devices in this family: the RTL8139C+, the RTL8169, the RTL8169S, 47 * RTL8110S, the RTL8168, the RTL8111 and the RTL8101E. 48 * 49 * The 8139C+ is a 10/100 ethernet chip. It is backwards compatible 50 * with the older 8139 family, however it also supports a special 51 * C+ mode of operation that provides several new performance enhancing 52 * features. These include: 53 * 54 * o Descriptor based DMA mechanism. Each descriptor represents 55 * a single packet fragment. Data buffers may be aligned on 56 * any byte boundary. 57 * 58 * o 64-bit DMA 59 * 60 * o TCP/IP checksum offload for both RX and TX 61 * 62 * o High and normal priority transmit DMA rings 63 * 64 * o VLAN tag insertion and extraction 65 * 66 * o TCP large send (segmentation offload) 67 * 68 * Like the 8139, the 8139C+ also has a built-in 10/100 PHY. The C+ 69 * programming API is fairly straightforward. The RX filtering, EEPROM 70 * access and PHY access is the same as it is on the older 8139 series 71 * chips. 72 * 73 * The 8169 is a 64-bit 10/100/1000 gigabit ethernet MAC. It has almost the 74 * same programming API and feature set as the 8139C+ with the following 75 * differences and additions: 76 * 77 * o 1000Mbps mode 78 * 79 * o Jumbo frames 80 * 81 * o GMII and TBI ports/registers for interfacing with copper 82 * or fiber PHYs 83 * 84 * o RX and TX DMA rings can have up to 1024 descriptors 85 * (the 8139C+ allows a maximum of 64) 86 * 87 * o Slight differences in register layout from the 8139C+ 88 * 89 * The TX start and timer interrupt registers are at different locations 90 * on the 8169 than they are on the 8139C+. Also, the status word in the 91 * RX descriptor has a slightly different bit layout. The 8169 does not 92 * have a built-in PHY. Most reference boards use a Marvell 88E1000 'Alaska' 93 * copper gigE PHY. 94 * 95 * The 8169S/8110S 10/100/1000 devices have built-in copper gigE PHYs 96 * (the 'S' stands for 'single-chip'). These devices have the same 97 * programming API as the older 8169, but also have some vendor-specific 98 * registers for the on-board PHY. The 8110S is a LAN-on-motherboard 99 * part designed to be pin-compatible with the Realtek 8100 10/100 chip. 100 * 101 * This driver takes advantage of the RX and TX checksum offload and 102 * VLAN tag insertion/extraction features. It also implements TX 103 * interrupt moderation using the timer interrupt registers, which 104 * significantly reduces TX interrupt load. There is also support 105 * for jumbo frames, however the 8169/8169S/8110S can not transmit 106 * jumbo frames larger than 7440, so the max MTU possible with this 107 * driver is 7422 bytes. 108 */ 109 110 #include "bpfilter.h" 111 #include "vlan.h" 112 #include "kstat.h" 113 114 #include <sys/param.h> 115 #include <sys/endian.h> 116 #include <sys/systm.h> 117 #include <sys/sockio.h> 118 #include <sys/mbuf.h> 119 #include <sys/malloc.h> 120 #include <sys/kernel.h> 121 #include <sys/device.h> 122 #include <sys/timeout.h> 123 #include <sys/socket.h> 124 #include <sys/atomic.h> 125 126 #include <machine/bus.h> 127 128 #include <net/if.h> 129 #include <net/if_media.h> 130 131 #include <netinet/in.h> 132 #include <netinet/ip.h> 133 #include <netinet/if_ether.h> 134 135 #if NBPFILTER > 0 136 #include <net/bpf.h> 137 #endif 138 139 #if NKSTAT > 0 140 #include <sys/kstat.h> 141 #endif 142 143 #include <dev/mii/mii.h> 144 #include <dev/mii/miivar.h> 145 146 #include <dev/pci/pcidevs.h> 147 148 #include <dev/ic/rtl81x9reg.h> 149 #include <dev/ic/revar.h> 150 151 #ifdef RE_DEBUG 152 int redebug = 0; 153 #define DPRINTF(x) do { if (redebug) printf x; } while (0) 154 #else 155 #define DPRINTF(x) 156 #endif 157 158 static inline void re_set_bufaddr(struct rl_desc *, bus_addr_t); 159 160 int re_encap(struct rl_softc *, unsigned int, struct mbuf *); 161 162 int re_newbuf(struct rl_softc *); 163 int re_rx_list_init(struct rl_softc *); 164 void re_rx_list_fill(struct rl_softc *); 165 int re_tx_list_init(struct rl_softc *); 166 int re_rxeof(struct rl_softc *); 167 int re_txeof(struct rl_softc *); 168 void re_tick(void *); 169 void re_start(struct ifqueue *); 170 void re_txstart(void *); 171 int re_ioctl(struct ifnet *, u_long, caddr_t); 172 void re_watchdog(struct ifnet *); 173 int re_ifmedia_upd(struct ifnet *); 174 void re_ifmedia_sts(struct ifnet *, struct ifmediareq *); 175 176 void re_set_jumbo(struct rl_softc *); 177 178 void re_eeprom_putbyte(struct rl_softc *, int); 179 void re_eeprom_getword(struct rl_softc *, int, u_int16_t *); 180 void re_read_eeprom(struct rl_softc *, caddr_t, int, int); 181 182 int re_gmii_readreg(struct device *, int, int); 183 void re_gmii_writereg(struct device *, int, int, int); 184 185 int re_miibus_readreg(struct device *, int, int); 186 void re_miibus_writereg(struct device *, int, int, int); 187 void re_miibus_statchg(struct device *); 188 189 void re_iff(struct rl_softc *); 190 191 void re_setup_hw_im(struct rl_softc *); 192 void re_setup_sim_im(struct rl_softc *); 193 void re_disable_hw_im(struct rl_softc *); 194 void re_disable_sim_im(struct rl_softc *); 195 void re_config_imtype(struct rl_softc *, int); 196 void re_setup_intr(struct rl_softc *, int, int); 197 #ifndef SMALL_KERNEL 198 int re_wol(struct ifnet*, int); 199 #endif 200 #if NKSTAT > 0 201 void re_kstat_attach(struct rl_softc *); 202 #endif 203 204 void in_delayed_cksum(struct mbuf *); 205 206 struct cfdriver re_cd = { 207 0, "re", DV_IFNET 208 }; 209 210 #define EE_SET(x) \ 211 CSR_WRITE_1(sc, RL_EECMD, \ 212 CSR_READ_1(sc, RL_EECMD) | x) 213 214 #define EE_CLR(x) \ 215 CSR_WRITE_1(sc, RL_EECMD, \ 216 CSR_READ_1(sc, RL_EECMD) & ~x) 217 218 #define RL_FRAMELEN(mtu) \ 219 (mtu + ETHER_HDR_LEN + ETHER_CRC_LEN + \ 220 ETHER_VLAN_ENCAP_LEN) 221 222 static const struct re_revision { 223 u_int32_t re_chipid; 224 const char *re_name; 225 } re_revisions[] = { 226 { RL_HWREV_8100, "RTL8100" }, 227 { RL_HWREV_8100E, "RTL8100E" }, 228 { RL_HWREV_8100E_SPIN2, "RTL8100E 2" }, 229 { RL_HWREV_8101, "RTL8101" }, 230 { RL_HWREV_8101E, "RTL8101E" }, 231 { RL_HWREV_8102E, "RTL8102E" }, 232 { RL_HWREV_8106E, "RTL8106E" }, 233 { RL_HWREV_8401E, "RTL8401E" }, 234 { RL_HWREV_8402, "RTL8402" }, 235 { RL_HWREV_8411, "RTL8411" }, 236 { RL_HWREV_8411B, "RTL8411B" }, 237 { RL_HWREV_8102EL, "RTL8102EL" }, 238 { RL_HWREV_8102EL_SPIN1, "RTL8102EL 1" }, 239 { RL_HWREV_8103E, "RTL8103E" }, 240 { RL_HWREV_8110S, "RTL8110S" }, 241 { RL_HWREV_8139CPLUS, "RTL8139C+" }, 242 { RL_HWREV_8168B_SPIN1, "RTL8168 1" }, 243 { RL_HWREV_8168B_SPIN2, "RTL8168 2" }, 244 { RL_HWREV_8168B_SPIN3, "RTL8168 3" }, 245 { RL_HWREV_8168C, "RTL8168C/8111C" }, 246 { RL_HWREV_8168C_SPIN2, "RTL8168C/8111C" }, 247 { RL_HWREV_8168CP, "RTL8168CP/8111CP" }, 248 { RL_HWREV_8168F, "RTL8168F/8111F" }, 249 { RL_HWREV_8168G, "RTL8168G/8111G" }, 250 { RL_HWREV_8168GU, "RTL8168GU/8111GU" }, 251 { RL_HWREV_8168H, "RTL8168H/8111H" }, 252 { RL_HWREV_8105E, "RTL8105E" }, 253 { RL_HWREV_8105E_SPIN1, "RTL8105E" }, 254 { RL_HWREV_8168D, "RTL8168D/8111D" }, 255 { RL_HWREV_8168DP, "RTL8168DP/8111DP" }, 256 { RL_HWREV_8168E, "RTL8168E/8111E" }, 257 { RL_HWREV_8168E_VL, "RTL8168E/8111E-VL" }, 258 { RL_HWREV_8168EP, "RTL8168EP/8111EP" }, 259 { RL_HWREV_8168FP, "RTL8168FP/8111FP" }, 260 { RL_HWREV_8169, "RTL8169" }, 261 { RL_HWREV_8169_8110SB, "RTL8169/8110SB" }, 262 { RL_HWREV_8169_8110SBL, "RTL8169SBL" }, 263 { RL_HWREV_8169_8110SCd, "RTL8169/8110SCd" }, 264 { RL_HWREV_8169_8110SCe, "RTL8169/8110SCe" }, 265 { RL_HWREV_8169S, "RTL8169S" }, 266 267 { 0, NULL } 268 }; 269 270 271 static inline void 272 re_set_bufaddr(struct rl_desc *d, bus_addr_t addr) 273 { 274 d->rl_bufaddr_lo = htole32((uint32_t)addr); 275 if (sizeof(bus_addr_t) == sizeof(uint64_t)) 276 d->rl_bufaddr_hi = htole32((uint64_t)addr >> 32); 277 else 278 d->rl_bufaddr_hi = 0; 279 } 280 281 /* 282 * Send a read command and address to the EEPROM, check for ACK. 283 */ 284 void 285 re_eeprom_putbyte(struct rl_softc *sc, int addr) 286 { 287 int d, i; 288 289 d = addr | (RL_9346_READ << sc->rl_eewidth); 290 291 /* 292 * Feed in each bit and strobe the clock. 293 */ 294 295 for (i = 1 << (sc->rl_eewidth + 3); i; i >>= 1) { 296 if (d & i) 297 EE_SET(RL_EE_DATAIN); 298 else 299 EE_CLR(RL_EE_DATAIN); 300 DELAY(100); 301 EE_SET(RL_EE_CLK); 302 DELAY(150); 303 EE_CLR(RL_EE_CLK); 304 DELAY(100); 305 } 306 } 307 308 /* 309 * Read a word of data stored in the EEPROM at address 'addr.' 310 */ 311 void 312 re_eeprom_getword(struct rl_softc *sc, int addr, u_int16_t *dest) 313 { 314 int i; 315 u_int16_t word = 0; 316 317 /* 318 * Send address of word we want to read. 319 */ 320 re_eeprom_putbyte(sc, addr); 321 322 /* 323 * Start reading bits from EEPROM. 324 */ 325 for (i = 0x8000; i; i >>= 1) { 326 EE_SET(RL_EE_CLK); 327 DELAY(100); 328 if (CSR_READ_1(sc, RL_EECMD) & RL_EE_DATAOUT) 329 word |= i; 330 EE_CLR(RL_EE_CLK); 331 DELAY(100); 332 } 333 334 *dest = word; 335 } 336 337 /* 338 * Read a sequence of words from the EEPROM. 339 */ 340 void 341 re_read_eeprom(struct rl_softc *sc, caddr_t dest, int off, int cnt) 342 { 343 int i; 344 u_int16_t word = 0, *ptr; 345 346 CSR_SETBIT_1(sc, RL_EECMD, RL_EEMODE_PROGRAM); 347 348 DELAY(100); 349 350 for (i = 0; i < cnt; i++) { 351 CSR_SETBIT_1(sc, RL_EECMD, RL_EE_SEL); 352 re_eeprom_getword(sc, off + i, &word); 353 CSR_CLRBIT_1(sc, RL_EECMD, RL_EE_SEL); 354 ptr = (u_int16_t *)(dest + (i * 2)); 355 *ptr = word; 356 } 357 358 CSR_CLRBIT_1(sc, RL_EECMD, RL_EEMODE_PROGRAM); 359 } 360 361 int 362 re_gmii_readreg(struct device *self, int phy, int reg) 363 { 364 struct rl_softc *sc = (struct rl_softc *)self; 365 u_int32_t rval; 366 int i; 367 368 if (phy != 7) 369 return (0); 370 371 /* Let the rgephy driver read the GMEDIASTAT register */ 372 373 if (reg == RL_GMEDIASTAT) { 374 rval = CSR_READ_1(sc, RL_GMEDIASTAT); 375 return (rval); 376 } 377 378 CSR_WRITE_4(sc, RL_PHYAR, reg << 16); 379 380 for (i = 0; i < RL_PHY_TIMEOUT; i++) { 381 rval = CSR_READ_4(sc, RL_PHYAR); 382 if (rval & RL_PHYAR_BUSY) 383 break; 384 DELAY(25); 385 } 386 387 if (i == RL_PHY_TIMEOUT) { 388 printf ("%s: PHY read failed\n", sc->sc_dev.dv_xname); 389 return (0); 390 } 391 392 DELAY(20); 393 394 return (rval & RL_PHYAR_PHYDATA); 395 } 396 397 void 398 re_gmii_writereg(struct device *dev, int phy, int reg, int data) 399 { 400 struct rl_softc *sc = (struct rl_softc *)dev; 401 u_int32_t rval; 402 int i; 403 404 CSR_WRITE_4(sc, RL_PHYAR, (reg << 16) | 405 (data & RL_PHYAR_PHYDATA) | RL_PHYAR_BUSY); 406 407 for (i = 0; i < RL_PHY_TIMEOUT; i++) { 408 rval = CSR_READ_4(sc, RL_PHYAR); 409 if (!(rval & RL_PHYAR_BUSY)) 410 break; 411 DELAY(25); 412 } 413 414 if (i == RL_PHY_TIMEOUT) 415 printf ("%s: PHY write failed\n", sc->sc_dev.dv_xname); 416 417 DELAY(20); 418 } 419 420 int 421 re_miibus_readreg(struct device *dev, int phy, int reg) 422 { 423 struct rl_softc *sc = (struct rl_softc *)dev; 424 u_int16_t rval = 0; 425 u_int16_t re8139_reg = 0; 426 int s; 427 428 s = splnet(); 429 430 if (sc->sc_hwrev != RL_HWREV_8139CPLUS) { 431 rval = re_gmii_readreg(dev, phy, reg); 432 splx(s); 433 return (rval); 434 } 435 436 /* Pretend the internal PHY is only at address 0 */ 437 if (phy) { 438 splx(s); 439 return (0); 440 } 441 switch(reg) { 442 case MII_BMCR: 443 re8139_reg = RL_BMCR; 444 break; 445 case MII_BMSR: 446 re8139_reg = RL_BMSR; 447 break; 448 case MII_ANAR: 449 re8139_reg = RL_ANAR; 450 break; 451 case MII_ANER: 452 re8139_reg = RL_ANER; 453 break; 454 case MII_ANLPAR: 455 re8139_reg = RL_LPAR; 456 break; 457 case MII_PHYIDR1: 458 case MII_PHYIDR2: 459 splx(s); 460 return (0); 461 /* 462 * Allow the rlphy driver to read the media status 463 * register. If we have a link partner which does not 464 * support NWAY, this is the register which will tell 465 * us the results of parallel detection. 466 */ 467 case RL_MEDIASTAT: 468 rval = CSR_READ_1(sc, RL_MEDIASTAT); 469 splx(s); 470 return (rval); 471 default: 472 printf("%s: bad phy register %x\n", sc->sc_dev.dv_xname, reg); 473 splx(s); 474 return (0); 475 } 476 rval = CSR_READ_2(sc, re8139_reg); 477 if (re8139_reg == RL_BMCR) { 478 /* 8139C+ has different bit layout. */ 479 rval &= ~(BMCR_LOOP | BMCR_ISO); 480 } 481 splx(s); 482 return (rval); 483 } 484 485 void 486 re_miibus_writereg(struct device *dev, int phy, int reg, int data) 487 { 488 struct rl_softc *sc = (struct rl_softc *)dev; 489 u_int16_t re8139_reg = 0; 490 int s; 491 492 s = splnet(); 493 494 if (sc->sc_hwrev != RL_HWREV_8139CPLUS) { 495 re_gmii_writereg(dev, phy, reg, data); 496 splx(s); 497 return; 498 } 499 500 /* Pretend the internal PHY is only at address 0 */ 501 if (phy) { 502 splx(s); 503 return; 504 } 505 switch(reg) { 506 case MII_BMCR: 507 re8139_reg = RL_BMCR; 508 /* 8139C+ has different bit layout. */ 509 data &= ~(BMCR_LOOP | BMCR_ISO); 510 break; 511 case MII_BMSR: 512 re8139_reg = RL_BMSR; 513 break; 514 case MII_ANAR: 515 re8139_reg = RL_ANAR; 516 break; 517 case MII_ANER: 518 re8139_reg = RL_ANER; 519 break; 520 case MII_ANLPAR: 521 re8139_reg = RL_LPAR; 522 break; 523 case MII_PHYIDR1: 524 case MII_PHYIDR2: 525 splx(s); 526 return; 527 break; 528 default: 529 printf("%s: bad phy register %x\n", sc->sc_dev.dv_xname, reg); 530 splx(s); 531 return; 532 } 533 CSR_WRITE_2(sc, re8139_reg, data); 534 splx(s); 535 } 536 537 void 538 re_miibus_statchg(struct device *dev) 539 { 540 struct rl_softc *sc = (struct rl_softc *)dev; 541 struct ifnet *ifp = &sc->sc_arpcom.ac_if; 542 struct mii_data *mii = &sc->sc_mii; 543 544 if ((ifp->if_flags & IFF_RUNNING) == 0) 545 return; 546 547 sc->rl_flags &= ~RL_FLAG_LINK; 548 if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) == 549 (IFM_ACTIVE | IFM_AVALID)) { 550 switch (IFM_SUBTYPE(mii->mii_media_active)) { 551 case IFM_10_T: 552 case IFM_100_TX: 553 sc->rl_flags |= RL_FLAG_LINK; 554 break; 555 case IFM_1000_T: 556 if ((sc->rl_flags & RL_FLAG_FASTETHER) != 0) 557 break; 558 sc->rl_flags |= RL_FLAG_LINK; 559 break; 560 default: 561 break; 562 } 563 } 564 565 /* 566 * Realtek controllers do not provide an interface to 567 * Tx/Rx MACs for resolved speed, duplex and flow-control 568 * parameters. 569 */ 570 } 571 572 void 573 re_iff(struct rl_softc *sc) 574 { 575 struct ifnet *ifp = &sc->sc_arpcom.ac_if; 576 int h = 0; 577 u_int32_t hashes[2]; 578 u_int32_t rxfilt; 579 struct arpcom *ac = &sc->sc_arpcom; 580 struct ether_multi *enm; 581 struct ether_multistep step; 582 583 rxfilt = CSR_READ_4(sc, RL_RXCFG); 584 rxfilt &= ~(RL_RXCFG_RX_ALLPHYS | RL_RXCFG_RX_BROAD | 585 RL_RXCFG_RX_INDIV | RL_RXCFG_RX_MULTI); 586 ifp->if_flags &= ~IFF_ALLMULTI; 587 588 /* 589 * Always accept frames destined to our station address. 590 * Always accept broadcast frames. 591 */ 592 rxfilt |= RL_RXCFG_RX_INDIV | RL_RXCFG_RX_BROAD; 593 594 if (ifp->if_flags & IFF_PROMISC || ac->ac_multirangecnt > 0) { 595 ifp->if_flags |= IFF_ALLMULTI; 596 rxfilt |= RL_RXCFG_RX_MULTI; 597 if (ifp->if_flags & IFF_PROMISC) 598 rxfilt |= RL_RXCFG_RX_ALLPHYS; 599 hashes[0] = hashes[1] = 0xFFFFFFFF; 600 } else { 601 rxfilt |= RL_RXCFG_RX_MULTI; 602 /* Program new filter. */ 603 bzero(hashes, sizeof(hashes)); 604 605 ETHER_FIRST_MULTI(step, ac, enm); 606 while (enm != NULL) { 607 h = ether_crc32_be(enm->enm_addrlo, 608 ETHER_ADDR_LEN) >> 26; 609 610 if (h < 32) 611 hashes[0] |= (1 << h); 612 else 613 hashes[1] |= (1 << (h - 32)); 614 615 ETHER_NEXT_MULTI(step, enm); 616 } 617 } 618 619 /* 620 * For some unfathomable reason, Realtek decided to reverse 621 * the order of the multicast hash registers in the PCI Express 622 * parts. This means we have to write the hash pattern in reverse 623 * order for those devices. 624 */ 625 if (sc->rl_flags & RL_FLAG_PCIE) { 626 CSR_WRITE_4(sc, RL_MAR0, swap32(hashes[1])); 627 CSR_WRITE_4(sc, RL_MAR4, swap32(hashes[0])); 628 } else { 629 CSR_WRITE_4(sc, RL_MAR0, hashes[0]); 630 CSR_WRITE_4(sc, RL_MAR4, hashes[1]); 631 } 632 633 CSR_WRITE_4(sc, RL_RXCFG, rxfilt); 634 } 635 636 void 637 re_reset(struct rl_softc *sc) 638 { 639 int i; 640 641 CSR_WRITE_1(sc, RL_COMMAND, RL_CMD_RESET); 642 643 for (i = 0; i < RL_TIMEOUT; i++) { 644 DELAY(10); 645 if (!(CSR_READ_1(sc, RL_COMMAND) & RL_CMD_RESET)) 646 break; 647 } 648 if (i == RL_TIMEOUT) 649 printf("%s: reset never completed!\n", sc->sc_dev.dv_xname); 650 651 if (sc->rl_flags & RL_FLAG_MACRESET) 652 CSR_WRITE_1(sc, RL_LDPS, 1); 653 } 654 655 /* 656 * Attach the interface. Allocate softc structures, do ifmedia 657 * setup and ethernet/BPF attach. 658 */ 659 int 660 re_attach(struct rl_softc *sc, const char *intrstr) 661 { 662 u_char eaddr[ETHER_ADDR_LEN]; 663 u_int16_t as[ETHER_ADDR_LEN / 2]; 664 struct ifnet *ifp; 665 u_int16_t re_did = 0; 666 int error = 0, i; 667 const struct re_revision *rr; 668 const char *re_name = NULL; 669 670 sc->sc_hwrev = CSR_READ_4(sc, RL_TXCFG) & RL_TXCFG_HWREV; 671 672 switch (sc->sc_hwrev) { 673 case RL_HWREV_8139CPLUS: 674 sc->rl_flags |= RL_FLAG_FASTETHER | RL_FLAG_AUTOPAD; 675 sc->rl_max_mtu = RL_MTU; 676 break; 677 case RL_HWREV_8100E: 678 case RL_HWREV_8100E_SPIN2: 679 case RL_HWREV_8101E: 680 sc->rl_flags |= RL_FLAG_PHYWAKE | RL_FLAG_FASTETHER; 681 sc->rl_max_mtu = RL_MTU; 682 break; 683 case RL_HWREV_8103E: 684 sc->rl_flags |= RL_FLAG_MACSLEEP; 685 /* FALLTHROUGH */ 686 case RL_HWREV_8102E: 687 case RL_HWREV_8102EL: 688 case RL_HWREV_8102EL_SPIN1: 689 sc->rl_flags |= RL_FLAG_PHYWAKE | RL_FLAG_PAR | 690 RL_FLAG_DESCV2 | RL_FLAG_MACSTAT | RL_FLAG_FASTETHER | 691 RL_FLAG_CMDSTOP | RL_FLAG_AUTOPAD; 692 sc->rl_max_mtu = RL_MTU; 693 break; 694 case RL_HWREV_8401E: 695 case RL_HWREV_8105E: 696 case RL_HWREV_8105E_SPIN1: 697 case RL_HWREV_8106E: 698 sc->rl_flags |= RL_FLAG_PHYWAKE | RL_FLAG_PHYWAKE_PM | 699 RL_FLAG_PAR | RL_FLAG_DESCV2 | RL_FLAG_MACSTAT | 700 RL_FLAG_FASTETHER | RL_FLAG_CMDSTOP | RL_FLAG_AUTOPAD; 701 sc->rl_max_mtu = RL_MTU; 702 break; 703 case RL_HWREV_8402: 704 sc->rl_flags |= RL_FLAG_PHYWAKE | RL_FLAG_PHYWAKE_PM | 705 RL_FLAG_PAR | RL_FLAG_DESCV2 | RL_FLAG_MACSTAT | 706 RL_FLAG_FASTETHER | RL_FLAG_CMDSTOP | RL_FLAG_AUTOPAD | 707 RL_FLAG_CMDSTOP_WAIT_TXQ; 708 sc->rl_max_mtu = RL_MTU; 709 break; 710 case RL_HWREV_8168B_SPIN1: 711 case RL_HWREV_8168B_SPIN2: 712 sc->rl_flags |= RL_FLAG_WOLRXENB; 713 /* FALLTHROUGH */ 714 case RL_HWREV_8168B_SPIN3: 715 sc->rl_flags |= RL_FLAG_PHYWAKE | RL_FLAG_MACSTAT; 716 sc->rl_max_mtu = RL_MTU; 717 break; 718 case RL_HWREV_8168C_SPIN2: 719 sc->rl_flags |= RL_FLAG_MACSLEEP; 720 /* FALLTHROUGH */ 721 case RL_HWREV_8168C: 722 case RL_HWREV_8168CP: 723 sc->rl_flags |= RL_FLAG_PHYWAKE | RL_FLAG_PAR | 724 RL_FLAG_DESCV2 | RL_FLAG_MACSTAT | RL_FLAG_CMDSTOP | 725 RL_FLAG_AUTOPAD | RL_FLAG_JUMBOV2 | RL_FLAG_WOL_MANLINK; 726 sc->rl_max_mtu = RL_JUMBO_MTU_6K; 727 break; 728 case RL_HWREV_8168D: 729 sc->rl_flags |= RL_FLAG_PHYWAKE | RL_FLAG_PHYWAKE_PM | 730 RL_FLAG_PAR | RL_FLAG_DESCV2 | RL_FLAG_MACSTAT | 731 RL_FLAG_CMDSTOP | RL_FLAG_AUTOPAD | RL_FLAG_JUMBOV2 | 732 RL_FLAG_WOL_MANLINK; 733 sc->rl_max_mtu = RL_JUMBO_MTU_9K; 734 break; 735 case RL_HWREV_8168DP: 736 sc->rl_flags |= RL_FLAG_PHYWAKE | RL_FLAG_PAR | 737 RL_FLAG_DESCV2 | RL_FLAG_MACSTAT | RL_FLAG_AUTOPAD | 738 RL_FLAG_JUMBOV2 | RL_FLAG_WAIT_TXPOLL | RL_FLAG_WOL_MANLINK; 739 sc->rl_max_mtu = RL_JUMBO_MTU_9K; 740 break; 741 case RL_HWREV_8168E: 742 sc->rl_flags |= RL_FLAG_PHYWAKE | RL_FLAG_PHYWAKE_PM | 743 RL_FLAG_PAR | RL_FLAG_DESCV2 | RL_FLAG_MACSTAT | 744 RL_FLAG_CMDSTOP | RL_FLAG_AUTOPAD | RL_FLAG_JUMBOV2 | 745 RL_FLAG_WOL_MANLINK; 746 sc->rl_max_mtu = RL_JUMBO_MTU_9K; 747 break; 748 case RL_HWREV_8168E_VL: 749 sc->rl_flags |= RL_FLAG_EARLYOFF | RL_FLAG_PHYWAKE | RL_FLAG_PAR | 750 RL_FLAG_DESCV2 | RL_FLAG_MACSTAT | RL_FLAG_CMDSTOP | 751 RL_FLAG_AUTOPAD | RL_FLAG_JUMBOV2 | RL_FLAG_CMDSTOP_WAIT_TXQ | 752 RL_FLAG_WOL_MANLINK; 753 sc->rl_max_mtu = RL_JUMBO_MTU_6K; 754 break; 755 case RL_HWREV_8168F: 756 sc->rl_flags |= RL_FLAG_EARLYOFF; 757 /* FALLTHROUGH */ 758 case RL_HWREV_8411: 759 sc->rl_flags |= RL_FLAG_PHYWAKE | RL_FLAG_PAR | 760 RL_FLAG_DESCV2 | RL_FLAG_MACSTAT | RL_FLAG_CMDSTOP | 761 RL_FLAG_AUTOPAD | RL_FLAG_JUMBOV2 | RL_FLAG_CMDSTOP_WAIT_TXQ | 762 RL_FLAG_WOL_MANLINK; 763 sc->rl_max_mtu = RL_JUMBO_MTU_9K; 764 break; 765 case RL_HWREV_8168EP: 766 case RL_HWREV_8168FP: 767 case RL_HWREV_8168G: 768 case RL_HWREV_8168GU: 769 case RL_HWREV_8168H: 770 case RL_HWREV_8411B: 771 if (sc->sc_product == PCI_PRODUCT_REALTEK_RT8101E) { 772 /* RTL8106EUS */ 773 sc->rl_flags |= RL_FLAG_FASTETHER; 774 sc->rl_max_mtu = RL_MTU; 775 } else { 776 sc->rl_flags |= RL_FLAG_JUMBOV2 | RL_FLAG_WOL_MANLINK; 777 sc->rl_max_mtu = RL_JUMBO_MTU_9K; 778 } 779 780 sc->rl_flags |= RL_FLAG_PHYWAKE | RL_FLAG_PAR | 781 RL_FLAG_DESCV2 | RL_FLAG_MACSTAT | RL_FLAG_CMDSTOP | 782 RL_FLAG_AUTOPAD | RL_FLAG_CMDSTOP_WAIT_TXQ | 783 RL_FLAG_EARLYOFFV2 | RL_FLAG_RXDV_GATED; 784 break; 785 case RL_HWREV_8169_8110SB: 786 case RL_HWREV_8169_8110SBL: 787 case RL_HWREV_8169_8110SCd: 788 case RL_HWREV_8169_8110SCe: 789 sc->rl_flags |= RL_FLAG_PHYWAKE; 790 /* FALLTHROUGH */ 791 case RL_HWREV_8169: 792 case RL_HWREV_8169S: 793 case RL_HWREV_8110S: 794 sc->rl_flags |= RL_FLAG_MACRESET; 795 sc->rl_max_mtu = RL_JUMBO_MTU_7K; 796 break; 797 default: 798 break; 799 } 800 801 if (sc->sc_hwrev == RL_HWREV_8139CPLUS) { 802 sc->rl_cfg0 = RL_8139_CFG0; 803 sc->rl_cfg1 = RL_8139_CFG1; 804 sc->rl_cfg2 = 0; 805 sc->rl_cfg3 = RL_8139_CFG3; 806 sc->rl_cfg4 = RL_8139_CFG4; 807 sc->rl_cfg5 = RL_8139_CFG5; 808 } else { 809 sc->rl_cfg0 = RL_CFG0; 810 sc->rl_cfg1 = RL_CFG1; 811 sc->rl_cfg2 = RL_CFG2; 812 sc->rl_cfg3 = RL_CFG3; 813 sc->rl_cfg4 = RL_CFG4; 814 sc->rl_cfg5 = RL_CFG5; 815 } 816 817 /* Reset the adapter. */ 818 re_reset(sc); 819 820 sc->rl_tx_time = 5; /* 125us */ 821 sc->rl_rx_time = 2; /* 50us */ 822 if (sc->rl_flags & RL_FLAG_PCIE) 823 sc->rl_sim_time = 75; /* 75us */ 824 else 825 sc->rl_sim_time = 125; /* 125us */ 826 sc->rl_imtype = RL_IMTYPE_SIM; /* simulated interrupt moderation */ 827 828 if (sc->sc_hwrev == RL_HWREV_8139CPLUS) 829 sc->rl_bus_speed = 33; /* XXX */ 830 else if (sc->rl_flags & RL_FLAG_PCIE) 831 sc->rl_bus_speed = 125; 832 else { 833 u_int8_t cfg2; 834 835 cfg2 = CSR_READ_1(sc, sc->rl_cfg2); 836 switch (cfg2 & RL_CFG2_PCI_MASK) { 837 case RL_CFG2_PCI_33MHZ: 838 sc->rl_bus_speed = 33; 839 break; 840 case RL_CFG2_PCI_66MHZ: 841 sc->rl_bus_speed = 66; 842 break; 843 default: 844 printf("%s: unknown bus speed, assume 33MHz\n", 845 sc->sc_dev.dv_xname); 846 sc->rl_bus_speed = 33; 847 break; 848 } 849 850 if (cfg2 & RL_CFG2_PCI_64BIT) 851 sc->rl_flags |= RL_FLAG_PCI64; 852 } 853 854 re_config_imtype(sc, sc->rl_imtype); 855 856 if (sc->rl_flags & RL_FLAG_PAR) { 857 /* 858 * XXX Should have a better way to extract station 859 * address from EEPROM. 860 */ 861 for (i = 0; i < ETHER_ADDR_LEN; i++) 862 eaddr[i] = CSR_READ_1(sc, RL_IDR0 + i); 863 } else { 864 sc->rl_eewidth = RL_9356_ADDR_LEN; 865 re_read_eeprom(sc, (caddr_t)&re_did, 0, 1); 866 if (re_did != 0x8129) 867 sc->rl_eewidth = RL_9346_ADDR_LEN; 868 869 /* 870 * Get station address from the EEPROM. 871 */ 872 re_read_eeprom(sc, (caddr_t)as, RL_EE_EADDR, 3); 873 for (i = 0; i < ETHER_ADDR_LEN / 2; i++) 874 as[i] = letoh16(as[i]); 875 bcopy(as, eaddr, ETHER_ADDR_LEN); 876 } 877 878 /* 879 * Set RX length mask, TX poll request register 880 * and descriptor count. 881 */ 882 if (sc->sc_hwrev == RL_HWREV_8139CPLUS) { 883 sc->rl_rxlenmask = RL_RDESC_STAT_FRAGLEN; 884 sc->rl_txstart = RL_TXSTART; 885 sc->rl_ldata.rl_tx_desc_cnt = RL_8139_TX_DESC_CNT; 886 sc->rl_ldata.rl_rx_desc_cnt = RL_8139_RX_DESC_CNT; 887 sc->rl_ldata.rl_tx_ndescs = RL_8139_NTXSEGS; 888 } else { 889 sc->rl_rxlenmask = RL_RDESC_STAT_GFRAGLEN; 890 sc->rl_txstart = RL_GTXSTART; 891 sc->rl_ldata.rl_tx_desc_cnt = RL_8169_TX_DESC_CNT; 892 sc->rl_ldata.rl_rx_desc_cnt = RL_8169_RX_DESC_CNT; 893 sc->rl_ldata.rl_tx_ndescs = RL_8169_NTXSEGS; 894 } 895 896 bcopy(eaddr, (char *)&sc->sc_arpcom.ac_enaddr, ETHER_ADDR_LEN); 897 898 for (rr = re_revisions; rr->re_name != NULL; rr++) { 899 if (rr->re_chipid == sc->sc_hwrev) 900 re_name = rr->re_name; 901 } 902 903 if (re_name == NULL) 904 printf(": unknown ASIC (0x%04x)", sc->sc_hwrev >> 16); 905 else 906 printf(": %s (0x%04x)", re_name, sc->sc_hwrev >> 16); 907 908 printf(", %s, address %s\n", intrstr, 909 ether_sprintf(sc->sc_arpcom.ac_enaddr)); 910 911 /* Allocate DMA'able memory for the TX ring */ 912 if ((error = bus_dmamem_alloc(sc->sc_dmat, RL_TX_LIST_SZ(sc), 913 RL_RING_ALIGN, 0, &sc->rl_ldata.rl_tx_listseg, 1, 914 &sc->rl_ldata.rl_tx_listnseg, BUS_DMA_NOWAIT | 915 BUS_DMA_ZERO)) != 0) { 916 printf("%s: can't allocate tx listseg, error = %d\n", 917 sc->sc_dev.dv_xname, error); 918 goto fail_0; 919 } 920 921 /* Load the map for the TX ring. */ 922 if ((error = bus_dmamem_map(sc->sc_dmat, &sc->rl_ldata.rl_tx_listseg, 923 sc->rl_ldata.rl_tx_listnseg, RL_TX_LIST_SZ(sc), 924 (caddr_t *)&sc->rl_ldata.rl_tx_list, 925 BUS_DMA_COHERENT | BUS_DMA_NOWAIT)) != 0) { 926 printf("%s: can't map tx list, error = %d\n", 927 sc->sc_dev.dv_xname, error); 928 goto fail_1; 929 } 930 931 if ((error = bus_dmamap_create(sc->sc_dmat, RL_TX_LIST_SZ(sc), 1, 932 RL_TX_LIST_SZ(sc), 0, 0, 933 &sc->rl_ldata.rl_tx_list_map)) != 0) { 934 printf("%s: can't create tx list map, error = %d\n", 935 sc->sc_dev.dv_xname, error); 936 goto fail_2; 937 } 938 939 if ((error = bus_dmamap_load(sc->sc_dmat, 940 sc->rl_ldata.rl_tx_list_map, sc->rl_ldata.rl_tx_list, 941 RL_TX_LIST_SZ(sc), NULL, BUS_DMA_NOWAIT)) != 0) { 942 printf("%s: can't load tx list, error = %d\n", 943 sc->sc_dev.dv_xname, error); 944 goto fail_3; 945 } 946 947 /* Create DMA maps for TX buffers */ 948 for (i = 0; i < sc->rl_ldata.rl_tx_desc_cnt; i++) { 949 error = bus_dmamap_create(sc->sc_dmat, 950 RL_JUMBO_FRAMELEN, sc->rl_ldata.rl_tx_ndescs, 951 RL_JUMBO_FRAMELEN, 0, 0, 952 &sc->rl_ldata.rl_txq[i].txq_dmamap); 953 if (error) { 954 printf("%s: can't create DMA map for TX\n", 955 sc->sc_dev.dv_xname); 956 goto fail_4; 957 } 958 } 959 960 /* Allocate DMA'able memory for the RX ring */ 961 if ((error = bus_dmamem_alloc(sc->sc_dmat, RL_RX_DMAMEM_SZ(sc), 962 RL_RING_ALIGN, 0, &sc->rl_ldata.rl_rx_listseg, 1, 963 &sc->rl_ldata.rl_rx_listnseg, BUS_DMA_NOWAIT | 964 BUS_DMA_ZERO)) != 0) { 965 printf("%s: can't allocate rx listnseg, error = %d\n", 966 sc->sc_dev.dv_xname, error); 967 goto fail_4; 968 } 969 970 /* Load the map for the RX ring. */ 971 if ((error = bus_dmamem_map(sc->sc_dmat, &sc->rl_ldata.rl_rx_listseg, 972 sc->rl_ldata.rl_rx_listnseg, RL_RX_DMAMEM_SZ(sc), 973 (caddr_t *)&sc->rl_ldata.rl_rx_list, 974 BUS_DMA_COHERENT | BUS_DMA_NOWAIT)) != 0) { 975 printf("%s: can't map rx list, error = %d\n", 976 sc->sc_dev.dv_xname, error); 977 goto fail_5; 978 979 } 980 981 if ((error = bus_dmamap_create(sc->sc_dmat, RL_RX_DMAMEM_SZ(sc), 1, 982 RL_RX_DMAMEM_SZ(sc), 0, 0, 983 &sc->rl_ldata.rl_rx_list_map)) != 0) { 984 printf("%s: can't create rx list map, error = %d\n", 985 sc->sc_dev.dv_xname, error); 986 goto fail_6; 987 } 988 989 if ((error = bus_dmamap_load(sc->sc_dmat, 990 sc->rl_ldata.rl_rx_list_map, sc->rl_ldata.rl_rx_list, 991 RL_RX_DMAMEM_SZ(sc), NULL, BUS_DMA_NOWAIT)) != 0) { 992 printf("%s: can't load rx list, error = %d\n", 993 sc->sc_dev.dv_xname, error); 994 goto fail_7; 995 } 996 997 /* Create DMA maps for RX buffers */ 998 for (i = 0; i < sc->rl_ldata.rl_rx_desc_cnt; i++) { 999 error = bus_dmamap_create(sc->sc_dmat, 1000 RL_FRAMELEN(sc->rl_max_mtu), 1, 1001 RL_FRAMELEN(sc->rl_max_mtu), 0, 0, 1002 &sc->rl_ldata.rl_rxsoft[i].rxs_dmamap); 1003 if (error) { 1004 printf("%s: can't create DMA map for RX\n", 1005 sc->sc_dev.dv_xname); 1006 goto fail_8; 1007 } 1008 } 1009 1010 ifp = &sc->sc_arpcom.ac_if; 1011 ifp->if_softc = sc; 1012 strlcpy(ifp->if_xname, sc->sc_dev.dv_xname, IFNAMSIZ); 1013 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 1014 ifp->if_xflags = IFXF_MPSAFE; 1015 ifp->if_ioctl = re_ioctl; 1016 ifp->if_qstart = re_start; 1017 ifp->if_watchdog = re_watchdog; 1018 ifp->if_hardmtu = sc->rl_max_mtu; 1019 ifq_init_maxlen(&ifp->if_snd, sc->rl_ldata.rl_tx_desc_cnt); 1020 1021 ifp->if_capabilities = IFCAP_VLAN_MTU | IFCAP_CSUM_TCPv4 | 1022 IFCAP_CSUM_UDPv4; 1023 1024 /* 1025 * RTL8168/8111C generates wrong IP checksummed frame if the 1026 * packet has IP options so disable TX IP checksum offloading. 1027 */ 1028 switch (sc->sc_hwrev) { 1029 case RL_HWREV_8168C: 1030 case RL_HWREV_8168C_SPIN2: 1031 case RL_HWREV_8168CP: 1032 break; 1033 default: 1034 ifp->if_capabilities |= IFCAP_CSUM_IPv4; 1035 } 1036 1037 #if NVLAN > 0 1038 ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING; 1039 #endif 1040 1041 #ifndef SMALL_KERNEL 1042 ifp->if_capabilities |= IFCAP_WOL; 1043 ifp->if_wol = re_wol; 1044 re_wol(ifp, 0); 1045 #endif 1046 timeout_set(&sc->timer_handle, re_tick, sc); 1047 task_set(&sc->rl_start, re_txstart, sc); 1048 1049 /* Take PHY out of power down mode. */ 1050 if (sc->rl_flags & RL_FLAG_PHYWAKE_PM) { 1051 CSR_WRITE_1(sc, RL_PMCH, CSR_READ_1(sc, RL_PMCH) | 0x80); 1052 if (sc->sc_hwrev == RL_HWREV_8401E) 1053 CSR_WRITE_1(sc, 0xD1, CSR_READ_1(sc, 0xD1) & ~0x08); 1054 } 1055 if (sc->rl_flags & RL_FLAG_PHYWAKE) { 1056 re_gmii_writereg((struct device *)sc, 1, 0x1f, 0); 1057 re_gmii_writereg((struct device *)sc, 1, 0x0e, 0); 1058 } 1059 1060 /* Do MII setup */ 1061 sc->sc_mii.mii_ifp = ifp; 1062 sc->sc_mii.mii_readreg = re_miibus_readreg; 1063 sc->sc_mii.mii_writereg = re_miibus_writereg; 1064 sc->sc_mii.mii_statchg = re_miibus_statchg; 1065 ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK, re_ifmedia_upd, 1066 re_ifmedia_sts); 1067 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, 1068 MII_OFFSET_ANY, MIIF_DOPAUSE); 1069 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) { 1070 printf("%s: no PHY found!\n", sc->sc_dev.dv_xname); 1071 ifmedia_add(&sc->sc_mii.mii_media, 1072 IFM_ETHER|IFM_NONE, 0, NULL); 1073 ifmedia_set(&sc->sc_mii.mii_media, 1074 IFM_ETHER|IFM_NONE); 1075 } else 1076 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); 1077 1078 /* 1079 * Call MI attach routine. 1080 */ 1081 if_attach(ifp); 1082 ether_ifattach(ifp); 1083 1084 #if NKSTAT > 0 1085 re_kstat_attach(sc); 1086 #endif 1087 1088 return (0); 1089 1090 fail_8: 1091 /* Destroy DMA maps for RX buffers. */ 1092 for (i = 0; i < sc->rl_ldata.rl_rx_desc_cnt; i++) { 1093 if (sc->rl_ldata.rl_rxsoft[i].rxs_dmamap != NULL) 1094 bus_dmamap_destroy(sc->sc_dmat, 1095 sc->rl_ldata.rl_rxsoft[i].rxs_dmamap); 1096 } 1097 1098 /* Free DMA'able memory for the RX ring. */ 1099 bus_dmamap_unload(sc->sc_dmat, sc->rl_ldata.rl_rx_list_map); 1100 fail_7: 1101 bus_dmamap_destroy(sc->sc_dmat, sc->rl_ldata.rl_rx_list_map); 1102 fail_6: 1103 bus_dmamem_unmap(sc->sc_dmat, 1104 (caddr_t)sc->rl_ldata.rl_rx_list, RL_RX_DMAMEM_SZ(sc)); 1105 fail_5: 1106 bus_dmamem_free(sc->sc_dmat, 1107 &sc->rl_ldata.rl_rx_listseg, sc->rl_ldata.rl_rx_listnseg); 1108 1109 fail_4: 1110 /* Destroy DMA maps for TX buffers. */ 1111 for (i = 0; i < sc->rl_ldata.rl_tx_desc_cnt; i++) { 1112 if (sc->rl_ldata.rl_txq[i].txq_dmamap != NULL) 1113 bus_dmamap_destroy(sc->sc_dmat, 1114 sc->rl_ldata.rl_txq[i].txq_dmamap); 1115 } 1116 1117 /* Free DMA'able memory for the TX ring. */ 1118 bus_dmamap_unload(sc->sc_dmat, sc->rl_ldata.rl_tx_list_map); 1119 fail_3: 1120 bus_dmamap_destroy(sc->sc_dmat, sc->rl_ldata.rl_tx_list_map); 1121 fail_2: 1122 bus_dmamem_unmap(sc->sc_dmat, 1123 (caddr_t)sc->rl_ldata.rl_tx_list, RL_TX_LIST_SZ(sc)); 1124 fail_1: 1125 bus_dmamem_free(sc->sc_dmat, 1126 &sc->rl_ldata.rl_tx_listseg, sc->rl_ldata.rl_tx_listnseg); 1127 fail_0: 1128 return (1); 1129 } 1130 1131 1132 int 1133 re_newbuf(struct rl_softc *sc) 1134 { 1135 struct mbuf *m; 1136 bus_dmamap_t map; 1137 struct rl_desc *d; 1138 struct rl_rxsoft *rxs; 1139 u_int32_t cmdstat; 1140 int error, idx; 1141 1142 m = MCLGETL(NULL, M_DONTWAIT, RL_FRAMELEN(sc->rl_max_mtu)); 1143 if (!m) 1144 return (ENOBUFS); 1145 1146 /* 1147 * Initialize mbuf length fields and fixup 1148 * alignment so that the frame payload is 1149 * longword aligned on strict alignment archs. 1150 */ 1151 m->m_len = m->m_pkthdr.len = RL_FRAMELEN(sc->rl_max_mtu); 1152 m->m_data += RE_ETHER_ALIGN; 1153 1154 idx = sc->rl_ldata.rl_rx_prodidx; 1155 rxs = &sc->rl_ldata.rl_rxsoft[idx]; 1156 map = rxs->rxs_dmamap; 1157 error = bus_dmamap_load_mbuf(sc->sc_dmat, map, m, 1158 BUS_DMA_READ|BUS_DMA_NOWAIT); 1159 if (error) { 1160 m_freem(m); 1161 return (ENOBUFS); 1162 } 1163 1164 bus_dmamap_sync(sc->sc_dmat, map, 0, map->dm_mapsize, 1165 BUS_DMASYNC_PREREAD); 1166 1167 d = &sc->rl_ldata.rl_rx_list[idx]; 1168 RL_RXDESCSYNC(sc, idx, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); 1169 cmdstat = letoh32(d->rl_cmdstat); 1170 RL_RXDESCSYNC(sc, idx, BUS_DMASYNC_PREREAD); 1171 if (cmdstat & RL_RDESC_STAT_OWN) { 1172 printf("%s: tried to map busy RX descriptor\n", 1173 sc->sc_dev.dv_xname); 1174 m_freem(m); 1175 return (ENOBUFS); 1176 } 1177 1178 rxs->rxs_mbuf = m; 1179 1180 d->rl_vlanctl = 0; 1181 cmdstat = map->dm_segs[0].ds_len; 1182 if (idx == sc->rl_ldata.rl_rx_desc_cnt - 1) 1183 cmdstat |= RL_RDESC_CMD_EOR; 1184 re_set_bufaddr(d, map->dm_segs[0].ds_addr); 1185 d->rl_cmdstat = htole32(cmdstat); 1186 RL_RXDESCSYNC(sc, idx, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 1187 cmdstat |= RL_RDESC_CMD_OWN; 1188 d->rl_cmdstat = htole32(cmdstat); 1189 RL_RXDESCSYNC(sc, idx, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 1190 1191 sc->rl_ldata.rl_rx_prodidx = RL_NEXT_RX_DESC(sc, idx); 1192 1193 return (0); 1194 } 1195 1196 1197 int 1198 re_tx_list_init(struct rl_softc *sc) 1199 { 1200 int i; 1201 1202 memset(sc->rl_ldata.rl_tx_list, 0, RL_TX_LIST_SZ(sc)); 1203 for (i = 0; i < sc->rl_ldata.rl_tx_desc_cnt; i++) { 1204 sc->rl_ldata.rl_txq[i].txq_mbuf = NULL; 1205 } 1206 1207 bus_dmamap_sync(sc->sc_dmat, 1208 sc->rl_ldata.rl_tx_list_map, 0, 1209 sc->rl_ldata.rl_tx_list_map->dm_mapsize, 1210 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 1211 sc->rl_ldata.rl_txq_prodidx = 0; 1212 sc->rl_ldata.rl_txq_considx = 0; 1213 sc->rl_ldata.rl_tx_free = sc->rl_ldata.rl_tx_desc_cnt; 1214 sc->rl_ldata.rl_tx_nextfree = 0; 1215 1216 return (0); 1217 } 1218 1219 int 1220 re_rx_list_init(struct rl_softc *sc) 1221 { 1222 bzero(sc->rl_ldata.rl_rx_list, RL_RX_LIST_SZ(sc)); 1223 1224 sc->rl_ldata.rl_rx_prodidx = 0; 1225 sc->rl_ldata.rl_rx_considx = 0; 1226 sc->rl_head = sc->rl_tail = NULL; 1227 1228 if_rxr_init(&sc->rl_ldata.rl_rx_ring, 2, 1229 sc->rl_ldata.rl_rx_desc_cnt - 1); 1230 re_rx_list_fill(sc); 1231 1232 return (0); 1233 } 1234 1235 void 1236 re_rx_list_fill(struct rl_softc *sc) 1237 { 1238 u_int slots; 1239 1240 for (slots = if_rxr_get(&sc->rl_ldata.rl_rx_ring, 1241 sc->rl_ldata.rl_rx_desc_cnt); 1242 slots > 0; slots--) { 1243 if (re_newbuf(sc) == ENOBUFS) 1244 break; 1245 } 1246 if_rxr_put(&sc->rl_ldata.rl_rx_ring, slots); 1247 } 1248 1249 /* 1250 * RX handler for C+ and 8169. For the gigE chips, we support 1251 * the reception of jumbo frames that have been fragmented 1252 * across multiple 2K mbuf cluster buffers. 1253 */ 1254 int 1255 re_rxeof(struct rl_softc *sc) 1256 { 1257 struct mbuf_list ml = MBUF_LIST_INITIALIZER(); 1258 struct mbuf *m; 1259 struct ifnet *ifp; 1260 int i, total_len, rx = 0; 1261 struct rl_desc *cur_rx; 1262 struct rl_rxsoft *rxs; 1263 u_int32_t rxstat, rxvlan; 1264 1265 ifp = &sc->sc_arpcom.ac_if; 1266 1267 for (i = sc->rl_ldata.rl_rx_considx; 1268 if_rxr_inuse(&sc->rl_ldata.rl_rx_ring) > 0; 1269 i = RL_NEXT_RX_DESC(sc, i)) { 1270 cur_rx = &sc->rl_ldata.rl_rx_list[i]; 1271 RL_RXDESCSYNC(sc, i, 1272 BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); 1273 rxstat = letoh32(cur_rx->rl_cmdstat); 1274 rxvlan = letoh32(cur_rx->rl_vlanctl); 1275 RL_RXDESCSYNC(sc, i, BUS_DMASYNC_PREREAD); 1276 if ((rxstat & RL_RDESC_STAT_OWN) != 0) 1277 break; 1278 total_len = rxstat & sc->rl_rxlenmask; 1279 rxs = &sc->rl_ldata.rl_rxsoft[i]; 1280 m = rxs->rxs_mbuf; 1281 rxs->rxs_mbuf = NULL; 1282 if_rxr_put(&sc->rl_ldata.rl_rx_ring, 1); 1283 rx = 1; 1284 1285 /* Invalidate the RX mbuf and unload its map */ 1286 1287 bus_dmamap_sync(sc->sc_dmat, 1288 rxs->rxs_dmamap, 0, rxs->rxs_dmamap->dm_mapsize, 1289 BUS_DMASYNC_POSTREAD); 1290 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap); 1291 1292 if ((sc->rl_flags & RL_FLAG_JUMBOV2) != 0 && 1293 (rxstat & (RL_RDESC_STAT_SOF | RL_RDESC_STAT_EOF)) != 1294 (RL_RDESC_STAT_SOF | RL_RDESC_STAT_EOF)) { 1295 ifp->if_ierrors++; 1296 m_freem(m); 1297 continue; 1298 } else if (!(rxstat & RL_RDESC_STAT_EOF)) { 1299 m->m_len = RL_FRAMELEN(sc->rl_max_mtu); 1300 if (sc->rl_head == NULL) 1301 sc->rl_head = sc->rl_tail = m; 1302 else { 1303 m->m_flags &= ~M_PKTHDR; 1304 sc->rl_tail->m_next = m; 1305 sc->rl_tail = m; 1306 } 1307 continue; 1308 } 1309 1310 /* 1311 * NOTE: for the 8139C+, the frame length field 1312 * is always 12 bits in size, but for the gigE chips, 1313 * it is 13 bits (since the max RX frame length is 16K). 1314 * Unfortunately, all 32 bits in the status word 1315 * were already used, so to make room for the extra 1316 * length bit, Realtek took out the 'frame alignment 1317 * error' bit and shifted the other status bits 1318 * over one slot. The OWN, EOR, FS and LS bits are 1319 * still in the same places. We have already extracted 1320 * the frame length and checked the OWN bit, so rather 1321 * than using an alternate bit mapping, we shift the 1322 * status bits one space to the right so we can evaluate 1323 * them using the 8169 status as though it was in the 1324 * same format as that of the 8139C+. 1325 */ 1326 if (sc->sc_hwrev != RL_HWREV_8139CPLUS) 1327 rxstat >>= 1; 1328 1329 /* 1330 * if total_len > 2^13-1, both _RXERRSUM and _GIANT will be 1331 * set, but if CRC is clear, it will still be a valid frame. 1332 */ 1333 if ((rxstat & RL_RDESC_STAT_RXERRSUM) != 0 && 1334 !(rxstat & RL_RDESC_STAT_RXERRSUM && !(total_len > 8191 && 1335 (rxstat & RL_RDESC_STAT_ERRS) == RL_RDESC_STAT_GIANT))) { 1336 ifp->if_ierrors++; 1337 /* 1338 * If this is part of a multi-fragment packet, 1339 * discard all the pieces. 1340 */ 1341 if (sc->rl_head != NULL) { 1342 m_freem(sc->rl_head); 1343 sc->rl_head = sc->rl_tail = NULL; 1344 } 1345 m_freem(m); 1346 continue; 1347 } 1348 1349 if (sc->rl_head != NULL) { 1350 m->m_len = total_len % RL_FRAMELEN(sc->rl_max_mtu); 1351 if (m->m_len == 0) 1352 m->m_len = RL_FRAMELEN(sc->rl_max_mtu); 1353 /* 1354 * Special case: if there's 4 bytes or less 1355 * in this buffer, the mbuf can be discarded: 1356 * the last 4 bytes is the CRC, which we don't 1357 * care about anyway. 1358 */ 1359 if (m->m_len <= ETHER_CRC_LEN) { 1360 sc->rl_tail->m_len -= 1361 (ETHER_CRC_LEN - m->m_len); 1362 m_freem(m); 1363 } else { 1364 m->m_len -= ETHER_CRC_LEN; 1365 m->m_flags &= ~M_PKTHDR; 1366 sc->rl_tail->m_next = m; 1367 } 1368 m = sc->rl_head; 1369 sc->rl_head = sc->rl_tail = NULL; 1370 m->m_pkthdr.len = total_len - ETHER_CRC_LEN; 1371 } else 1372 m->m_pkthdr.len = m->m_len = 1373 (total_len - ETHER_CRC_LEN); 1374 1375 /* Do RX checksumming */ 1376 1377 if (sc->rl_flags & RL_FLAG_DESCV2) { 1378 /* Check IP header checksum */ 1379 if ((rxvlan & RL_RDESC_IPV4) && 1380 !(rxstat & RL_RDESC_STAT_IPSUMBAD)) 1381 m->m_pkthdr.csum_flags |= M_IPV4_CSUM_IN_OK; 1382 1383 /* Check TCP/UDP checksum */ 1384 if ((rxvlan & (RL_RDESC_IPV4|RL_RDESC_IPV6)) && 1385 (((rxstat & RL_RDESC_STAT_TCP) && 1386 !(rxstat & RL_RDESC_STAT_TCPSUMBAD)) || 1387 ((rxstat & RL_RDESC_STAT_UDP) && 1388 !(rxstat & RL_RDESC_STAT_UDPSUMBAD)))) 1389 m->m_pkthdr.csum_flags |= M_TCP_CSUM_IN_OK | 1390 M_UDP_CSUM_IN_OK; 1391 } else { 1392 /* Check IP header checksum */ 1393 if ((rxstat & RL_RDESC_STAT_PROTOID) && 1394 !(rxstat & RL_RDESC_STAT_IPSUMBAD)) 1395 m->m_pkthdr.csum_flags |= M_IPV4_CSUM_IN_OK; 1396 1397 /* Check TCP/UDP checksum */ 1398 if ((RL_TCPPKT(rxstat) && 1399 !(rxstat & RL_RDESC_STAT_TCPSUMBAD)) || 1400 (RL_UDPPKT(rxstat) && 1401 !(rxstat & RL_RDESC_STAT_UDPSUMBAD))) 1402 m->m_pkthdr.csum_flags |= M_TCP_CSUM_IN_OK | 1403 M_UDP_CSUM_IN_OK; 1404 } 1405 #if NVLAN > 0 1406 if (rxvlan & RL_RDESC_VLANCTL_TAG) { 1407 m->m_pkthdr.ether_vtag = 1408 ntohs((rxvlan & RL_RDESC_VLANCTL_DATA)); 1409 m->m_flags |= M_VLANTAG; 1410 } 1411 #endif 1412 1413 ml_enqueue(&ml, m); 1414 } 1415 1416 if (ifiq_input(&ifp->if_rcv, &ml)) 1417 if_rxr_livelocked(&sc->rl_ldata.rl_rx_ring); 1418 1419 sc->rl_ldata.rl_rx_considx = i; 1420 re_rx_list_fill(sc); 1421 1422 1423 return (rx); 1424 } 1425 1426 int 1427 re_txeof(struct rl_softc *sc) 1428 { 1429 struct ifnet *ifp = &sc->sc_arpcom.ac_if; 1430 struct rl_txq *txq; 1431 uint32_t txstat; 1432 unsigned int prod, cons; 1433 unsigned int idx; 1434 int free = 0; 1435 1436 prod = sc->rl_ldata.rl_txq_prodidx; 1437 cons = sc->rl_ldata.rl_txq_considx; 1438 1439 while (prod != cons) { 1440 txq = &sc->rl_ldata.rl_txq[cons]; 1441 1442 idx = txq->txq_descidx; 1443 RL_TXDESCSYNC(sc, idx, BUS_DMASYNC_POSTREAD); 1444 txstat = letoh32(sc->rl_ldata.rl_tx_list[idx].rl_cmdstat); 1445 RL_TXDESCSYNC(sc, idx, BUS_DMASYNC_PREREAD); 1446 if (ISSET(txstat, RL_TDESC_CMD_OWN)) { 1447 free = 2; 1448 break; 1449 } 1450 1451 bus_dmamap_sync(sc->sc_dmat, txq->txq_dmamap, 1452 0, txq->txq_dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE); 1453 bus_dmamap_unload(sc->sc_dmat, txq->txq_dmamap); 1454 m_freem(txq->txq_mbuf); 1455 txq->txq_mbuf = NULL; 1456 1457 if (txstat & (RL_TDESC_STAT_EXCESSCOL | RL_TDESC_STAT_COLCNT)) 1458 ifp->if_collisions++; 1459 if (txstat & RL_TDESC_STAT_TXERRSUM) 1460 ifp->if_oerrors++; 1461 1462 cons = RL_NEXT_TX_DESC(sc, idx); 1463 free = 1; 1464 } 1465 1466 if (free == 0) 1467 return (0); 1468 1469 sc->rl_ldata.rl_txq_considx = cons; 1470 1471 /* 1472 * Some chips will ignore a second TX request issued while an 1473 * existing transmission is in progress. If the transmitter goes 1474 * idle but there are still packets waiting to be sent, we need 1475 * to restart the channel here to flush them out. This only 1476 * seems to be required with the PCIe devices. 1477 */ 1478 if (ifq_is_oactive(&ifp->if_snd)) 1479 ifq_restart(&ifp->if_snd); 1480 else if (free == 2) 1481 ifq_serialize(&ifp->if_snd, &sc->rl_start); 1482 else 1483 ifp->if_timer = 0; 1484 1485 return (1); 1486 } 1487 1488 void 1489 re_tick(void *xsc) 1490 { 1491 struct rl_softc *sc = xsc; 1492 struct mii_data *mii; 1493 int s; 1494 1495 mii = &sc->sc_mii; 1496 1497 s = splnet(); 1498 1499 mii_tick(mii); 1500 1501 if ((sc->rl_flags & RL_FLAG_LINK) == 0) 1502 re_miibus_statchg(&sc->sc_dev); 1503 1504 splx(s); 1505 1506 timeout_add_sec(&sc->timer_handle, 1); 1507 } 1508 1509 int 1510 re_intr(void *arg) 1511 { 1512 struct rl_softc *sc = arg; 1513 struct ifnet *ifp; 1514 u_int16_t status; 1515 int claimed = 0, rx, tx; 1516 1517 ifp = &sc->sc_arpcom.ac_if; 1518 1519 if (!(ifp->if_flags & IFF_RUNNING)) 1520 return (0); 1521 1522 /* Disable interrupts. */ 1523 CSR_WRITE_2(sc, RL_IMR, 0); 1524 1525 rx = tx = 0; 1526 status = CSR_READ_2(sc, RL_ISR); 1527 /* If the card has gone away the read returns 0xffff. */ 1528 if (status == 0xffff) 1529 return (0); 1530 if (status) 1531 CSR_WRITE_2(sc, RL_ISR, status); 1532 1533 if (status & RL_ISR_TIMEOUT_EXPIRED) 1534 claimed = 1; 1535 1536 if (status & RL_INTRS_CPLUS) { 1537 if (status & 1538 (sc->rl_rx_ack | RL_ISR_RX_ERR | RL_ISR_FIFO_OFLOW)) { 1539 rx |= re_rxeof(sc); 1540 claimed = 1; 1541 } 1542 1543 if (status & (sc->rl_tx_ack | RL_ISR_TX_ERR)) { 1544 tx |= re_txeof(sc); 1545 claimed = 1; 1546 } 1547 1548 if (status & RL_ISR_SYSTEM_ERR) { 1549 KERNEL_LOCK(); 1550 re_init(ifp); 1551 KERNEL_UNLOCK(); 1552 claimed = 1; 1553 } 1554 } 1555 1556 if (sc->rl_imtype == RL_IMTYPE_SIM) { 1557 if (sc->rl_timerintr) { 1558 if ((tx | rx) == 0) { 1559 /* 1560 * Nothing needs to be processed, fallback 1561 * to use TX/RX interrupts. 1562 */ 1563 re_setup_intr(sc, 1, RL_IMTYPE_NONE); 1564 1565 /* 1566 * Recollect, mainly to avoid the possible 1567 * race introduced by changing interrupt 1568 * masks. 1569 */ 1570 re_rxeof(sc); 1571 re_txeof(sc); 1572 } else 1573 CSR_WRITE_4(sc, RL_TIMERCNT, 1); /* reload */ 1574 } else if (tx | rx) { 1575 /* 1576 * Assume that using simulated interrupt moderation 1577 * (hardware timer based) could reduce the interrupt 1578 * rate. 1579 */ 1580 re_setup_intr(sc, 1, RL_IMTYPE_SIM); 1581 } 1582 } 1583 1584 CSR_WRITE_2(sc, RL_IMR, sc->rl_intrs); 1585 1586 return (claimed); 1587 } 1588 1589 int 1590 re_encap(struct rl_softc *sc, unsigned int idx, struct mbuf *m) 1591 { 1592 struct rl_txq *txq; 1593 bus_dmamap_t map; 1594 int error, seg, nsegs, curidx, lastidx, pad; 1595 int off; 1596 struct ip *ip; 1597 struct rl_desc *d; 1598 u_int32_t cmdstat, vlanctl = 0, csum_flags = 0; 1599 1600 /* 1601 * Set up checksum offload. Note: checksum offload bits must 1602 * appear in all descriptors of a multi-descriptor transmit 1603 * attempt. This is according to testing done with an 8169 1604 * chip. This is a requirement. 1605 */ 1606 1607 /* 1608 * Set RL_TDESC_CMD_IPCSUM if any checksum offloading 1609 * is requested. Otherwise, RL_TDESC_CMD_TCPCSUM/ 1610 * RL_TDESC_CMD_UDPCSUM does not take affect. 1611 */ 1612 1613 if ((sc->rl_flags & RL_FLAG_JUMBOV2) && 1614 m->m_pkthdr.len > RL_MTU && 1615 (m->m_pkthdr.csum_flags & 1616 (M_IPV4_CSUM_OUT|M_TCP_CSUM_OUT|M_UDP_CSUM_OUT)) != 0) { 1617 struct mbuf mh, *mp; 1618 1619 mp = m_getptr(m, ETHER_HDR_LEN, &off); 1620 mh.m_flags = 0; 1621 mh.m_data = mtod(mp, caddr_t) + off; 1622 mh.m_next = mp->m_next; 1623 mh.m_pkthdr.len = mp->m_pkthdr.len - ETHER_HDR_LEN; 1624 mh.m_len = mp->m_len - off; 1625 ip = (struct ip *)mh.m_data; 1626 1627 if (m->m_pkthdr.csum_flags & M_IPV4_CSUM_OUT) 1628 ip->ip_sum = in_cksum(&mh, sizeof(struct ip)); 1629 if (m->m_pkthdr.csum_flags & (M_TCP_CSUM_OUT|M_UDP_CSUM_OUT)) 1630 in_delayed_cksum(&mh); 1631 1632 m->m_pkthdr.csum_flags &= 1633 ~(M_IPV4_CSUM_OUT|M_TCP_CSUM_OUT|M_UDP_CSUM_OUT); 1634 } 1635 1636 if ((m->m_pkthdr.csum_flags & 1637 (M_IPV4_CSUM_OUT|M_TCP_CSUM_OUT|M_UDP_CSUM_OUT)) != 0) { 1638 if (sc->rl_flags & RL_FLAG_DESCV2) { 1639 vlanctl |= RL_TDESC_CMD_IPCSUMV2; 1640 if (m->m_pkthdr.csum_flags & M_TCP_CSUM_OUT) 1641 vlanctl |= RL_TDESC_CMD_TCPCSUMV2; 1642 if (m->m_pkthdr.csum_flags & M_UDP_CSUM_OUT) 1643 vlanctl |= RL_TDESC_CMD_UDPCSUMV2; 1644 } else { 1645 csum_flags |= RL_TDESC_CMD_IPCSUM; 1646 if (m->m_pkthdr.csum_flags & M_TCP_CSUM_OUT) 1647 csum_flags |= RL_TDESC_CMD_TCPCSUM; 1648 if (m->m_pkthdr.csum_flags & M_UDP_CSUM_OUT) 1649 csum_flags |= RL_TDESC_CMD_UDPCSUM; 1650 } 1651 } 1652 1653 txq = &sc->rl_ldata.rl_txq[idx]; 1654 map = txq->txq_dmamap; 1655 1656 error = bus_dmamap_load_mbuf(sc->sc_dmat, map, m, 1657 BUS_DMA_WRITE|BUS_DMA_NOWAIT); 1658 switch (error) { 1659 case 0: 1660 break; 1661 1662 case EFBIG: 1663 if (m_defrag(m, M_DONTWAIT) == 0 && 1664 bus_dmamap_load_mbuf(sc->sc_dmat, map, m, 1665 BUS_DMA_WRITE|BUS_DMA_NOWAIT) == 0) 1666 break; 1667 1668 /* FALLTHROUGH */ 1669 default: 1670 return (0); 1671 } 1672 1673 bus_dmamap_sync(sc->sc_dmat, map, 0, map->dm_mapsize, 1674 BUS_DMASYNC_PREWRITE); 1675 1676 nsegs = map->dm_nsegs; 1677 pad = 0; 1678 1679 /* 1680 * With some of the Realtek chips, using the checksum offload 1681 * support in conjunction with the autopadding feature results 1682 * in the transmission of corrupt frames. For example, if we 1683 * need to send a really small IP fragment that's less than 60 1684 * bytes in size, and IP header checksumming is enabled, the 1685 * resulting ethernet frame that appears on the wire will 1686 * have garbled payload. To work around this, if TX IP checksum 1687 * offload is enabled, we always manually pad short frames out 1688 * to the minimum ethernet frame size. 1689 */ 1690 if ((sc->rl_flags & RL_FLAG_AUTOPAD) == 0 && 1691 m->m_pkthdr.len < RL_IP4CSUMTX_PADLEN && 1692 (m->m_pkthdr.csum_flags & M_IPV4_CSUM_OUT) != 0) { 1693 pad = 1; 1694 nsegs++; 1695 } 1696 1697 /* 1698 * Set up hardware VLAN tagging. Note: vlan tag info must 1699 * appear in all descriptors of a multi-descriptor 1700 * transmission attempt. 1701 */ 1702 #if NVLAN > 0 1703 if (m->m_flags & M_VLANTAG) 1704 vlanctl |= swap16(m->m_pkthdr.ether_vtag) | 1705 RL_TDESC_VLANCTL_TAG; 1706 #endif 1707 1708 /* 1709 * Map the segment array into descriptors. Note that we set the 1710 * start-of-frame and end-of-frame markers for either TX or RX, but 1711 * they really only have meaning in the TX case. (In the RX case, 1712 * it's the chip that tells us where packets begin and end.) 1713 * We also keep track of the end of the ring and set the 1714 * end-of-ring bits as needed, and we set the ownership bits 1715 * in all except the very first descriptor. (The caller will 1716 * set this descriptor later when it start transmission or 1717 * reception.) 1718 */ 1719 curidx = idx; 1720 cmdstat = RL_TDESC_CMD_SOF; 1721 1722 for (seg = 0; seg < map->dm_nsegs; seg++) { 1723 d = &sc->rl_ldata.rl_tx_list[curidx]; 1724 1725 RL_TXDESCSYNC(sc, curidx, BUS_DMASYNC_POSTWRITE); 1726 1727 d->rl_vlanctl = htole32(vlanctl); 1728 re_set_bufaddr(d, map->dm_segs[seg].ds_addr); 1729 cmdstat |= csum_flags | map->dm_segs[seg].ds_len; 1730 1731 if (curidx == sc->rl_ldata.rl_tx_desc_cnt - 1) 1732 cmdstat |= RL_TDESC_CMD_EOR; 1733 1734 d->rl_cmdstat = htole32(cmdstat); 1735 1736 RL_TXDESCSYNC(sc, curidx, BUS_DMASYNC_PREWRITE); 1737 1738 lastidx = curidx; 1739 cmdstat = RL_TDESC_CMD_OWN; 1740 curidx = RL_NEXT_TX_DESC(sc, curidx); 1741 } 1742 1743 if (pad) { 1744 d = &sc->rl_ldata.rl_tx_list[curidx]; 1745 1746 RL_TXDESCSYNC(sc, curidx, BUS_DMASYNC_POSTWRITE); 1747 1748 d->rl_vlanctl = htole32(vlanctl); 1749 re_set_bufaddr(d, RL_TXPADDADDR(sc)); 1750 cmdstat = csum_flags | 1751 RL_TDESC_CMD_OWN | RL_TDESC_CMD_EOF | 1752 (RL_IP4CSUMTX_PADLEN + 1 - m->m_pkthdr.len); 1753 1754 if (curidx == sc->rl_ldata.rl_tx_desc_cnt - 1) 1755 cmdstat |= RL_TDESC_CMD_EOR; 1756 1757 d->rl_cmdstat = htole32(cmdstat); 1758 1759 RL_TXDESCSYNC(sc, curidx, BUS_DMASYNC_PREWRITE); 1760 1761 lastidx = curidx; 1762 } 1763 1764 /* d is already pointing at the last descriptor */ 1765 d->rl_cmdstat |= htole32(RL_TDESC_CMD_EOF); 1766 1767 /* Transfer ownership of packet to the chip. */ 1768 d = &sc->rl_ldata.rl_tx_list[idx]; 1769 1770 RL_TXDESCSYNC(sc, curidx, BUS_DMASYNC_POSTWRITE); 1771 d->rl_cmdstat |= htole32(RL_TDESC_CMD_OWN); 1772 RL_TXDESCSYNC(sc, curidx, BUS_DMASYNC_PREWRITE); 1773 1774 /* update info of TX queue and descriptors */ 1775 txq->txq_mbuf = m; 1776 txq->txq_descidx = lastidx; 1777 1778 return (nsegs); 1779 } 1780 1781 void 1782 re_txstart(void *xsc) 1783 { 1784 struct rl_softc *sc = xsc; 1785 1786 CSR_WRITE_1(sc, sc->rl_txstart, RL_TXSTART_START); 1787 } 1788 1789 /* 1790 * Main transmit routine for C+ and gigE NICs. 1791 */ 1792 1793 void 1794 re_start(struct ifqueue *ifq) 1795 { 1796 struct ifnet *ifp = ifq->ifq_if; 1797 struct rl_softc *sc = ifp->if_softc; 1798 struct mbuf *m; 1799 unsigned int idx; 1800 unsigned int free, used; 1801 int post = 0; 1802 1803 if (!ISSET(sc->rl_flags, RL_FLAG_LINK)) { 1804 ifq_purge(ifq); 1805 return; 1806 } 1807 1808 free = sc->rl_ldata.rl_txq_considx; 1809 idx = sc->rl_ldata.rl_txq_prodidx; 1810 if (free <= idx) 1811 free += sc->rl_ldata.rl_tx_desc_cnt; 1812 free -= idx; 1813 1814 for (;;) { 1815 if (sc->rl_ldata.rl_tx_ndescs >= free + 2) { 1816 ifq_set_oactive(ifq); 1817 break; 1818 } 1819 1820 m = ifq_dequeue(ifq); 1821 if (m == NULL) 1822 break; 1823 1824 used = re_encap(sc, idx, m); 1825 if (used == 0) { 1826 m_freem(m); 1827 continue; 1828 } 1829 1830 #if NBPFILTER > 0 1831 if (ifp->if_bpf) 1832 bpf_mtap_ether(ifp->if_bpf, m, BPF_DIRECTION_OUT); 1833 #endif 1834 1835 KASSERT(used <= free); 1836 free -= used; 1837 1838 idx += used; 1839 if (idx >= sc->rl_ldata.rl_tx_desc_cnt) 1840 idx -= sc->rl_ldata.rl_tx_desc_cnt; 1841 1842 post = 1; 1843 } 1844 1845 if (post == 0) 1846 return; 1847 1848 ifp->if_timer = 5; 1849 sc->rl_ldata.rl_txq_prodidx = idx; 1850 ifq_serialize(ifq, &sc->rl_start); 1851 } 1852 1853 int 1854 re_init(struct ifnet *ifp) 1855 { 1856 struct rl_softc *sc = ifp->if_softc; 1857 u_int16_t cfg; 1858 uint32_t rxcfg; 1859 int s; 1860 union { 1861 u_int32_t align_dummy; 1862 u_char eaddr[ETHER_ADDR_LEN]; 1863 } eaddr; 1864 1865 s = splnet(); 1866 1867 /* 1868 * Cancel pending I/O and free all RX/TX buffers. 1869 */ 1870 re_stop(ifp); 1871 1872 /* Put controller into known state. */ 1873 re_reset(sc); 1874 1875 /* 1876 * Enable C+ RX and TX mode, as well as VLAN stripping and 1877 * RX checksum offload. We must configure the C+ register 1878 * before all others. 1879 */ 1880 cfg = RL_CPLUSCMD_TXENB | RL_CPLUSCMD_PCI_MRW | 1881 RL_CPLUSCMD_RXCSUM_ENB; 1882 1883 if (ifp->if_capabilities & IFCAP_VLAN_HWTAGGING) 1884 cfg |= RL_CPLUSCMD_VLANSTRIP; 1885 1886 if (sc->rl_flags & RL_FLAG_MACSTAT) 1887 cfg |= RL_CPLUSCMD_MACSTAT_DIS; 1888 else 1889 cfg |= RL_CPLUSCMD_RXENB; 1890 1891 CSR_WRITE_2(sc, RL_CPLUS_CMD, cfg); 1892 1893 /* 1894 * Init our MAC address. Even though the chipset 1895 * documentation doesn't mention it, we need to enter "Config 1896 * register write enable" mode to modify the ID registers. 1897 */ 1898 bcopy(sc->sc_arpcom.ac_enaddr, eaddr.eaddr, ETHER_ADDR_LEN); 1899 CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_WRITECFG); 1900 CSR_WRITE_4(sc, RL_IDR4, 1901 htole32(*(u_int32_t *)(&eaddr.eaddr[4]))); 1902 CSR_WRITE_4(sc, RL_IDR0, 1903 htole32(*(u_int32_t *)(&eaddr.eaddr[0]))); 1904 /* 1905 * Default on PC Engines APU1 is to have all LEDs off unless 1906 * there is network activity. Override to provide a link status 1907 * LED. 1908 */ 1909 if (sc->sc_hwrev == RL_HWREV_8168E && 1910 hw_vendor != NULL && hw_prod != NULL && 1911 strcmp(hw_vendor, "PC Engines") == 0 && 1912 strcmp(hw_prod, "APU") == 0) { 1913 CSR_SETBIT_1(sc, RL_CFG4, RL_CFG4_CUSTOM_LED); 1914 CSR_WRITE_1(sc, RL_LEDSEL, RL_LED_LINK | RL_LED_ACT << 4); 1915 } 1916 /* 1917 * Protect config register again 1918 */ 1919 CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_OFF); 1920 1921 if ((sc->rl_flags & RL_FLAG_JUMBOV2) != 0) 1922 re_set_jumbo(sc); 1923 1924 /* 1925 * For C+ mode, initialize the RX descriptors and mbufs. 1926 */ 1927 re_rx_list_init(sc); 1928 re_tx_list_init(sc); 1929 1930 /* 1931 * Load the addresses of the RX and TX lists into the chip. 1932 */ 1933 CSR_WRITE_4(sc, RL_RXLIST_ADDR_HI, 1934 RL_ADDR_HI(sc->rl_ldata.rl_rx_list_map->dm_segs[0].ds_addr)); 1935 CSR_WRITE_4(sc, RL_RXLIST_ADDR_LO, 1936 RL_ADDR_LO(sc->rl_ldata.rl_rx_list_map->dm_segs[0].ds_addr)); 1937 1938 CSR_WRITE_4(sc, RL_TXLIST_ADDR_HI, 1939 RL_ADDR_HI(sc->rl_ldata.rl_tx_list_map->dm_segs[0].ds_addr)); 1940 CSR_WRITE_4(sc, RL_TXLIST_ADDR_LO, 1941 RL_ADDR_LO(sc->rl_ldata.rl_tx_list_map->dm_segs[0].ds_addr)); 1942 1943 if (sc->rl_flags & RL_FLAG_RXDV_GATED) 1944 CSR_WRITE_4(sc, RL_MISC, CSR_READ_4(sc, RL_MISC) & 1945 ~0x00080000); 1946 1947 /* 1948 * Set the initial TX and RX configuration. 1949 */ 1950 CSR_WRITE_4(sc, RL_TXCFG, RL_TXCFG_CONFIG); 1951 1952 CSR_WRITE_1(sc, RL_EARLY_TX_THRESH, 16); 1953 1954 rxcfg = RL_RXCFG_CONFIG; 1955 if (sc->rl_flags & RL_FLAG_EARLYOFF) 1956 rxcfg |= RL_RXCFG_EARLYOFF; 1957 else if (sc->rl_flags & RL_FLAG_EARLYOFFV2) 1958 rxcfg |= RL_RXCFG_EARLYOFFV2; 1959 CSR_WRITE_4(sc, RL_RXCFG, rxcfg); 1960 1961 /* 1962 * Enable transmit and receive. 1963 */ 1964 CSR_WRITE_1(sc, RL_COMMAND, RL_CMD_TX_ENB | RL_CMD_RX_ENB); 1965 1966 /* Program promiscuous mode and multicast filters. */ 1967 re_iff(sc); 1968 1969 /* 1970 * Enable interrupts. 1971 */ 1972 re_setup_intr(sc, 1, sc->rl_imtype); 1973 CSR_WRITE_2(sc, RL_ISR, sc->rl_intrs); 1974 1975 /* Start RX/TX process. */ 1976 CSR_WRITE_4(sc, RL_MISSEDPKT, 0); 1977 1978 /* 1979 * For 8169 gigE NICs, set the max allowed RX packet 1980 * size so we can receive jumbo frames. 1981 */ 1982 if (sc->sc_hwrev != RL_HWREV_8139CPLUS) { 1983 if (sc->rl_flags & RL_FLAG_PCIE && 1984 (sc->rl_flags & RL_FLAG_JUMBOV2) == 0) 1985 CSR_WRITE_2(sc, RL_MAXRXPKTLEN, RE_RX_DESC_BUFLEN); 1986 else 1987 CSR_WRITE_2(sc, RL_MAXRXPKTLEN, 16383); 1988 } 1989 1990 CSR_WRITE_1(sc, sc->rl_cfg1, CSR_READ_1(sc, sc->rl_cfg1) | 1991 RL_CFG1_DRVLOAD); 1992 1993 ifp->if_flags |= IFF_RUNNING; 1994 ifq_clr_oactive(&ifp->if_snd); 1995 1996 splx(s); 1997 1998 sc->rl_flags &= ~RL_FLAG_LINK; 1999 mii_mediachg(&sc->sc_mii); 2000 2001 timeout_add_sec(&sc->timer_handle, 1); 2002 2003 return (0); 2004 } 2005 2006 /* 2007 * Set media options. 2008 */ 2009 int 2010 re_ifmedia_upd(struct ifnet *ifp) 2011 { 2012 struct rl_softc *sc; 2013 2014 sc = ifp->if_softc; 2015 2016 return (mii_mediachg(&sc->sc_mii)); 2017 } 2018 2019 /* 2020 * Report current media status. 2021 */ 2022 void 2023 re_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) 2024 { 2025 struct rl_softc *sc; 2026 2027 sc = ifp->if_softc; 2028 2029 mii_pollstat(&sc->sc_mii); 2030 ifmr->ifm_active = sc->sc_mii.mii_media_active; 2031 ifmr->ifm_status = sc->sc_mii.mii_media_status; 2032 } 2033 2034 int 2035 re_ioctl(struct ifnet *ifp, u_long command, caddr_t data) 2036 { 2037 struct rl_softc *sc = ifp->if_softc; 2038 struct ifreq *ifr = (struct ifreq *) data; 2039 int s, error = 0; 2040 2041 s = splnet(); 2042 2043 switch(command) { 2044 case SIOCSIFADDR: 2045 ifp->if_flags |= IFF_UP; 2046 if (!(ifp->if_flags & IFF_RUNNING)) 2047 re_init(ifp); 2048 break; 2049 case SIOCSIFFLAGS: 2050 if (ifp->if_flags & IFF_UP) { 2051 if (ifp->if_flags & IFF_RUNNING) 2052 error = ENETRESET; 2053 else 2054 re_init(ifp); 2055 } else { 2056 if (ifp->if_flags & IFF_RUNNING) 2057 re_stop(ifp); 2058 } 2059 break; 2060 case SIOCGIFMEDIA: 2061 case SIOCSIFMEDIA: 2062 error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, command); 2063 break; 2064 case SIOCGIFRXR: 2065 error = if_rxr_ioctl((struct if_rxrinfo *)ifr->ifr_data, 2066 NULL, RL_FRAMELEN(sc->rl_max_mtu), &sc->rl_ldata.rl_rx_ring); 2067 break; 2068 default: 2069 error = ether_ioctl(ifp, &sc->sc_arpcom, command, data); 2070 } 2071 2072 if (error == ENETRESET) { 2073 if (ifp->if_flags & IFF_RUNNING) 2074 re_iff(sc); 2075 error = 0; 2076 } 2077 2078 splx(s); 2079 return (error); 2080 } 2081 2082 void 2083 re_watchdog(struct ifnet *ifp) 2084 { 2085 struct rl_softc *sc; 2086 int s; 2087 2088 sc = ifp->if_softc; 2089 s = splnet(); 2090 printf("%s: watchdog timeout\n", sc->sc_dev.dv_xname); 2091 2092 re_init(ifp); 2093 2094 splx(s); 2095 } 2096 2097 /* 2098 * Stop the adapter and free any mbufs allocated to the 2099 * RX and TX lists. 2100 */ 2101 void 2102 re_stop(struct ifnet *ifp) 2103 { 2104 struct rl_softc *sc; 2105 int i; 2106 2107 sc = ifp->if_softc; 2108 2109 ifp->if_timer = 0; 2110 sc->rl_flags &= ~RL_FLAG_LINK; 2111 sc->rl_timerintr = 0; 2112 2113 timeout_del(&sc->timer_handle); 2114 ifp->if_flags &= ~IFF_RUNNING; 2115 2116 /* 2117 * Disable accepting frames to put RX MAC into idle state. 2118 * Otherwise it's possible to get frames while stop command 2119 * execution is in progress and controller can DMA the frame 2120 * to already freed RX buffer during that period. 2121 */ 2122 CSR_WRITE_4(sc, RL_RXCFG, CSR_READ_4(sc, RL_RXCFG) & 2123 ~(RL_RXCFG_RX_ALLPHYS | RL_RXCFG_RX_BROAD | RL_RXCFG_RX_INDIV | 2124 RL_RXCFG_RX_MULTI)); 2125 2126 if (sc->rl_flags & RL_FLAG_WAIT_TXPOLL) { 2127 for (i = RL_TIMEOUT; i > 0; i--) { 2128 if ((CSR_READ_1(sc, sc->rl_txstart) & 2129 RL_TXSTART_START) == 0) 2130 break; 2131 DELAY(20); 2132 } 2133 if (i == 0) 2134 printf("%s: stopping TX poll timed out!\n", 2135 sc->sc_dev.dv_xname); 2136 CSR_WRITE_1(sc, RL_COMMAND, 0x00); 2137 } else if (sc->rl_flags & RL_FLAG_CMDSTOP) { 2138 CSR_WRITE_1(sc, RL_COMMAND, RL_CMD_STOPREQ | RL_CMD_TX_ENB | 2139 RL_CMD_RX_ENB); 2140 if (sc->rl_flags & RL_FLAG_CMDSTOP_WAIT_TXQ) { 2141 for (i = RL_TIMEOUT; i > 0; i--) { 2142 if ((CSR_READ_4(sc, RL_TXCFG) & 2143 RL_TXCFG_QUEUE_EMPTY) != 0) 2144 break; 2145 DELAY(100); 2146 } 2147 if (i == 0) 2148 printf("%s: stopping TXQ timed out!\n", 2149 sc->sc_dev.dv_xname); 2150 } 2151 } else 2152 CSR_WRITE_1(sc, RL_COMMAND, 0x00); 2153 DELAY(1000); 2154 CSR_WRITE_2(sc, RL_IMR, 0x0000); 2155 CSR_WRITE_2(sc, RL_ISR, 0xFFFF); 2156 2157 intr_barrier(sc->sc_ih); 2158 ifq_barrier(&ifp->if_snd); 2159 2160 ifq_clr_oactive(&ifp->if_snd); 2161 mii_down(&sc->sc_mii); 2162 2163 if (sc->rl_head != NULL) { 2164 m_freem(sc->rl_head); 2165 sc->rl_head = sc->rl_tail = NULL; 2166 } 2167 2168 /* Free the TX list buffers. */ 2169 for (i = 0; i < sc->rl_ldata.rl_tx_desc_cnt; i++) { 2170 if (sc->rl_ldata.rl_txq[i].txq_mbuf != NULL) { 2171 bus_dmamap_unload(sc->sc_dmat, 2172 sc->rl_ldata.rl_txq[i].txq_dmamap); 2173 m_freem(sc->rl_ldata.rl_txq[i].txq_mbuf); 2174 sc->rl_ldata.rl_txq[i].txq_mbuf = NULL; 2175 } 2176 } 2177 2178 /* Free the RX list buffers. */ 2179 for (i = 0; i < sc->rl_ldata.rl_rx_desc_cnt; i++) { 2180 if (sc->rl_ldata.rl_rxsoft[i].rxs_mbuf != NULL) { 2181 bus_dmamap_unload(sc->sc_dmat, 2182 sc->rl_ldata.rl_rxsoft[i].rxs_dmamap); 2183 m_freem(sc->rl_ldata.rl_rxsoft[i].rxs_mbuf); 2184 sc->rl_ldata.rl_rxsoft[i].rxs_mbuf = NULL; 2185 } 2186 } 2187 } 2188 2189 void 2190 re_setup_hw_im(struct rl_softc *sc) 2191 { 2192 KASSERT(sc->rl_flags & RL_FLAG_HWIM); 2193 2194 /* 2195 * Interrupt moderation 2196 * 2197 * 0xABCD 2198 * A - unknown (maybe TX related) 2199 * B - TX timer (unit: 25us) 2200 * C - unknown (maybe RX related) 2201 * D - RX timer (unit: 25us) 2202 * 2203 * 2204 * re(4)'s interrupt moderation is actually controlled by 2205 * two variables, like most other NICs (bge, bnx etc.) 2206 * o timer 2207 * o number of packets [P] 2208 * 2209 * The logic relationship between these two variables is 2210 * similar to other NICs too: 2211 * if (timer expire || packets > [P]) 2212 * Interrupt is delivered 2213 * 2214 * Currently we only know how to set 'timer', but not 2215 * 'number of packets', which should be ~30, as far as I 2216 * tested (sink ~900Kpps, interrupt rate is 30KHz) 2217 */ 2218 CSR_WRITE_2(sc, RL_IM, 2219 RL_IM_RXTIME(sc->rl_rx_time) | 2220 RL_IM_TXTIME(sc->rl_tx_time) | 2221 RL_IM_MAGIC); 2222 } 2223 2224 void 2225 re_disable_hw_im(struct rl_softc *sc) 2226 { 2227 if (sc->rl_flags & RL_FLAG_HWIM) 2228 CSR_WRITE_2(sc, RL_IM, 0); 2229 } 2230 2231 void 2232 re_setup_sim_im(struct rl_softc *sc) 2233 { 2234 if (sc->sc_hwrev == RL_HWREV_8139CPLUS) 2235 CSR_WRITE_4(sc, RL_TIMERINT, 0x400); /* XXX */ 2236 else { 2237 u_int32_t nticks; 2238 2239 /* 2240 * Datasheet says tick decreases at bus speed, 2241 * but it seems the clock runs a little bit 2242 * faster, so we do some compensation here. 2243 */ 2244 nticks = (sc->rl_sim_time * sc->rl_bus_speed * 8) / 5; 2245 CSR_WRITE_4(sc, RL_TIMERINT_8169, nticks); 2246 } 2247 CSR_WRITE_4(sc, RL_TIMERCNT, 1); /* reload */ 2248 sc->rl_timerintr = 1; 2249 } 2250 2251 void 2252 re_disable_sim_im(struct rl_softc *sc) 2253 { 2254 if (sc->sc_hwrev == RL_HWREV_8139CPLUS) 2255 CSR_WRITE_4(sc, RL_TIMERINT, 0); 2256 else 2257 CSR_WRITE_4(sc, RL_TIMERINT_8169, 0); 2258 sc->rl_timerintr = 0; 2259 } 2260 2261 void 2262 re_config_imtype(struct rl_softc *sc, int imtype) 2263 { 2264 switch (imtype) { 2265 case RL_IMTYPE_HW: 2266 KASSERT(sc->rl_flags & RL_FLAG_HWIM); 2267 /* FALLTHROUGH */ 2268 case RL_IMTYPE_NONE: 2269 sc->rl_intrs = RL_INTRS_CPLUS; 2270 sc->rl_rx_ack = RL_ISR_RX_OK | RL_ISR_FIFO_OFLOW | 2271 RL_ISR_RX_OVERRUN; 2272 sc->rl_tx_ack = RL_ISR_TX_OK; 2273 break; 2274 2275 case RL_IMTYPE_SIM: 2276 sc->rl_intrs = RL_INTRS_TIMER; 2277 sc->rl_rx_ack = RL_ISR_TIMEOUT_EXPIRED; 2278 sc->rl_tx_ack = RL_ISR_TIMEOUT_EXPIRED; 2279 break; 2280 2281 default: 2282 panic("%s: unknown imtype %d", 2283 sc->sc_dev.dv_xname, imtype); 2284 } 2285 } 2286 2287 void 2288 re_set_jumbo(struct rl_softc *sc) 2289 { 2290 CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_WRITECFG); 2291 CSR_WRITE_1(sc, RL_CFG3, CSR_READ_1(sc, RL_CFG3) | 2292 RL_CFG3_JUMBO_EN0); 2293 2294 switch (sc->sc_hwrev) { 2295 case RL_HWREV_8168DP: 2296 break; 2297 case RL_HWREV_8168E: 2298 CSR_WRITE_1(sc, RL_CFG4, CSR_READ_1(sc, RL_CFG4) | 2299 RL_CFG4_8168E_JUMBO_EN1); 2300 break; 2301 default: 2302 CSR_WRITE_1(sc, RL_CFG4, CSR_READ_1(sc, RL_CFG4) | 2303 RL_CFG4_JUMBO_EN1); 2304 break; 2305 } 2306 2307 CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_OFF); 2308 } 2309 2310 void 2311 re_setup_intr(struct rl_softc *sc, int enable_intrs, int imtype) 2312 { 2313 re_config_imtype(sc, imtype); 2314 2315 if (enable_intrs) 2316 CSR_WRITE_2(sc, RL_IMR, sc->rl_intrs); 2317 else 2318 CSR_WRITE_2(sc, RL_IMR, 0); 2319 2320 switch (imtype) { 2321 case RL_IMTYPE_NONE: 2322 re_disable_sim_im(sc); 2323 re_disable_hw_im(sc); 2324 break; 2325 2326 case RL_IMTYPE_HW: 2327 KASSERT(sc->rl_flags & RL_FLAG_HWIM); 2328 re_disable_sim_im(sc); 2329 re_setup_hw_im(sc); 2330 break; 2331 2332 case RL_IMTYPE_SIM: 2333 re_disable_hw_im(sc); 2334 re_setup_sim_im(sc); 2335 break; 2336 2337 default: 2338 panic("%s: unknown imtype %d", 2339 sc->sc_dev.dv_xname, imtype); 2340 } 2341 } 2342 2343 #ifndef SMALL_KERNEL 2344 int 2345 re_wol(struct ifnet *ifp, int enable) 2346 { 2347 struct rl_softc *sc = ifp->if_softc; 2348 u_int8_t val; 2349 2350 if (enable) { 2351 if ((CSR_READ_1(sc, sc->rl_cfg1) & RL_CFG1_PME) == 0) { 2352 printf("%s: power management is disabled, " 2353 "cannot do WOL\n", sc->sc_dev.dv_xname); 2354 return (ENOTSUP); 2355 } 2356 if ((CSR_READ_1(sc, sc->rl_cfg2) & RL_CFG2_AUXPWR) == 0) 2357 printf("%s: no auxiliary power, cannot do WOL from D3 " 2358 "(power-off) state\n", sc->sc_dev.dv_xname); 2359 } 2360 2361 re_iff(sc); 2362 2363 /* Temporarily enable write to configuration registers. */ 2364 CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_WRITECFG); 2365 2366 /* Always disable all wake events except magic packet. */ 2367 if (enable) { 2368 val = CSR_READ_1(sc, sc->rl_cfg5); 2369 val &= ~(RL_CFG5_WOL_UCAST | RL_CFG5_WOL_MCAST | 2370 RL_CFG5_WOL_BCAST); 2371 CSR_WRITE_1(sc, sc->rl_cfg5, val); 2372 2373 val = CSR_READ_1(sc, sc->rl_cfg3); 2374 val |= RL_CFG3_WOL_MAGIC; 2375 val &= ~RL_CFG3_WOL_LINK; 2376 CSR_WRITE_1(sc, sc->rl_cfg3, val); 2377 } else { 2378 val = CSR_READ_1(sc, sc->rl_cfg5); 2379 val &= ~(RL_CFG5_WOL_UCAST | RL_CFG5_WOL_MCAST | 2380 RL_CFG5_WOL_BCAST); 2381 CSR_WRITE_1(sc, sc->rl_cfg5, val); 2382 2383 val = CSR_READ_1(sc, sc->rl_cfg3); 2384 val &= ~(RL_CFG3_WOL_MAGIC | RL_CFG3_WOL_LINK); 2385 CSR_WRITE_1(sc, sc->rl_cfg3, val); 2386 } 2387 2388 CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_OFF); 2389 2390 return (0); 2391 } 2392 #endif 2393 2394 #if NKSTAT > 0 2395 2396 #define RE_DTCCR_CMD (1U << 3) 2397 #define RE_DTCCR_LO 0x10 2398 #define RE_DTCCR_HI 0x14 2399 2400 struct re_kstats { 2401 struct kstat_kv tx_ok; 2402 struct kstat_kv rx_ok; 2403 struct kstat_kv tx_er; 2404 struct kstat_kv rx_er; 2405 struct kstat_kv miss_pkt; 2406 struct kstat_kv fae; 2407 struct kstat_kv tx_1col; 2408 struct kstat_kv tx_mcol; 2409 struct kstat_kv rx_ok_phy; 2410 struct kstat_kv rx_ok_brd; 2411 struct kstat_kv rx_ok_mul; 2412 struct kstat_kv tx_abt; 2413 struct kstat_kv tx_undrn; 2414 }; 2415 2416 static const struct re_kstats re_kstats_tpl = { 2417 .tx_ok = KSTAT_KV_UNIT_INITIALIZER("TxOk", 2418 KSTAT_KV_T_COUNTER64, KSTAT_KV_U_PACKETS), 2419 .rx_ok = KSTAT_KV_UNIT_INITIALIZER("RxOk", 2420 KSTAT_KV_T_COUNTER64, KSTAT_KV_U_PACKETS), 2421 .tx_er = KSTAT_KV_UNIT_INITIALIZER("TxEr", 2422 KSTAT_KV_T_COUNTER64, KSTAT_KV_U_PACKETS), 2423 .rx_er = KSTAT_KV_UNIT_INITIALIZER("RxEr", 2424 KSTAT_KV_T_COUNTER32, KSTAT_KV_U_PACKETS), 2425 .miss_pkt = KSTAT_KV_UNIT_INITIALIZER("MissPkt", 2426 KSTAT_KV_T_COUNTER16, KSTAT_KV_U_PACKETS), 2427 .fae = KSTAT_KV_UNIT_INITIALIZER("FAE", 2428 KSTAT_KV_T_COUNTER16, KSTAT_KV_U_PACKETS), 2429 .tx_1col = KSTAT_KV_UNIT_INITIALIZER("Tx1Col", 2430 KSTAT_KV_T_COUNTER32, KSTAT_KV_U_PACKETS), 2431 .tx_mcol = KSTAT_KV_UNIT_INITIALIZER("TxMCol", 2432 KSTAT_KV_T_COUNTER32, KSTAT_KV_U_PACKETS), 2433 .rx_ok_phy = KSTAT_KV_UNIT_INITIALIZER("RxOkPhy", 2434 KSTAT_KV_T_COUNTER64, KSTAT_KV_U_PACKETS), 2435 .rx_ok_brd = KSTAT_KV_UNIT_INITIALIZER("RxOkBrd", 2436 KSTAT_KV_T_COUNTER64, KSTAT_KV_U_PACKETS), 2437 .rx_ok_mul = KSTAT_KV_UNIT_INITIALIZER("RxOkMul", 2438 KSTAT_KV_T_COUNTER32, KSTAT_KV_U_PACKETS), 2439 .tx_abt = KSTAT_KV_UNIT_INITIALIZER("TxAbt", 2440 KSTAT_KV_T_COUNTER16, KSTAT_KV_U_PACKETS), 2441 .tx_undrn = KSTAT_KV_UNIT_INITIALIZER("TxUndrn", 2442 KSTAT_KV_T_COUNTER16, KSTAT_KV_U_PACKETS), 2443 }; 2444 2445 struct re_kstat_softc { 2446 struct re_stats *re_ks_sc_stats; 2447 2448 bus_dmamap_t re_ks_sc_map; 2449 bus_dma_segment_t re_ks_sc_seg; 2450 int re_ks_sc_nsegs; 2451 2452 struct rwlock re_ks_sc_rwl; 2453 }; 2454 2455 static int 2456 re_kstat_read(struct kstat *ks) 2457 { 2458 struct rl_softc *sc = ks->ks_softc; 2459 struct re_kstat_softc *re_ks_sc = ks->ks_ptr; 2460 bus_dmamap_t map; 2461 uint64_t cmd; 2462 uint32_t reg; 2463 uint8_t command; 2464 int tmo; 2465 2466 command = CSR_READ_1(sc, RL_COMMAND); 2467 if (!ISSET(command, RL_CMD_RX_ENB) || command == 0xff) 2468 return (ENETDOWN); 2469 2470 map = re_ks_sc->re_ks_sc_map; 2471 cmd = map->dm_segs[0].ds_addr | RE_DTCCR_CMD; 2472 2473 bus_dmamap_sync(sc->sc_dmat, map, 0, map->dm_mapsize, 2474 BUS_DMASYNC_PREREAD); 2475 2476 CSR_WRITE_4(sc, RE_DTCCR_HI, cmd >> 32); 2477 bus_space_barrier(sc->rl_btag, sc->rl_bhandle, RE_DTCCR_HI, 8, 2478 BUS_SPACE_BARRIER_WRITE); 2479 CSR_WRITE_4(sc, RE_DTCCR_LO, cmd); 2480 bus_space_barrier(sc->rl_btag, sc->rl_bhandle, RE_DTCCR_LO, 4, 2481 BUS_SPACE_BARRIER_READ|BUS_SPACE_BARRIER_WRITE); 2482 2483 tmo = 1000; 2484 do { 2485 reg = CSR_READ_4(sc, RE_DTCCR_LO); 2486 if (!ISSET(reg, RE_DTCCR_CMD)) 2487 break; 2488 2489 delay(10); 2490 bus_space_barrier(sc->rl_btag, sc->rl_bhandle, RE_DTCCR_LO, 4, 2491 BUS_SPACE_BARRIER_READ); 2492 } while (--tmo); 2493 2494 bus_dmamap_sync(sc->sc_dmat, map, 0, map->dm_mapsize, 2495 BUS_DMASYNC_POSTREAD); 2496 2497 if (ISSET(reg, RE_DTCCR_CMD)) 2498 return (EIO); 2499 2500 nanouptime(&ks->ks_updated); 2501 2502 return (0); 2503 } 2504 2505 static int 2506 re_kstat_copy(struct kstat *ks, void *dst) 2507 { 2508 struct re_kstat_softc *re_ks_sc = ks->ks_ptr; 2509 struct re_stats *rs = re_ks_sc->re_ks_sc_stats; 2510 struct re_kstats *kvs = dst; 2511 2512 *kvs = re_kstats_tpl; 2513 kstat_kv_u64(&kvs->tx_ok) = lemtoh64(&rs->re_tx_ok); 2514 kstat_kv_u64(&kvs->rx_ok) = lemtoh64(&rs->re_rx_ok); 2515 kstat_kv_u64(&kvs->tx_er) = lemtoh64(&rs->re_tx_er); 2516 kstat_kv_u32(&kvs->rx_er) = lemtoh32(&rs->re_rx_er); 2517 kstat_kv_u16(&kvs->miss_pkt) = lemtoh16(&rs->re_miss_pkt); 2518 kstat_kv_u16(&kvs->fae) = lemtoh16(&rs->re_fae); 2519 kstat_kv_u32(&kvs->tx_1col) = lemtoh32(&rs->re_tx_1col); 2520 kstat_kv_u32(&kvs->tx_mcol) = lemtoh32(&rs->re_tx_mcol); 2521 kstat_kv_u64(&kvs->rx_ok_phy) = lemtoh64(&rs->re_rx_ok_phy); 2522 kstat_kv_u64(&kvs->rx_ok_brd) = lemtoh64(&rs->re_rx_ok_brd); 2523 kstat_kv_u32(&kvs->rx_ok_mul) = lemtoh32(&rs->re_rx_ok_mul); 2524 kstat_kv_u16(&kvs->tx_abt) = lemtoh16(&rs->re_tx_abt); 2525 kstat_kv_u16(&kvs->tx_undrn) = lemtoh16(&rs->re_tx_undrn); 2526 2527 return (0); 2528 } 2529 2530 void 2531 re_kstat_attach(struct rl_softc *sc) 2532 { 2533 struct re_kstat_softc *re_ks_sc; 2534 struct kstat *ks; 2535 2536 re_ks_sc = malloc(sizeof(*re_ks_sc), M_DEVBUF, M_NOWAIT); 2537 if (re_ks_sc == NULL) { 2538 printf("%s: cannot allocate kstat softc\n", 2539 sc->sc_dev.dv_xname); 2540 return; 2541 } 2542 2543 if (bus_dmamap_create(sc->sc_dmat, 2544 sizeof(struct re_stats), 1, sizeof(struct re_stats), 0, 2545 BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW | BUS_DMA_64BIT, 2546 &re_ks_sc->re_ks_sc_map) != 0) { 2547 printf("%s: cannot create counter dma memory map\n", 2548 sc->sc_dev.dv_xname); 2549 goto free; 2550 } 2551 2552 if (bus_dmamem_alloc(sc->sc_dmat, 2553 sizeof(struct re_stats), RE_STATS_ALIGNMENT, 0, 2554 &re_ks_sc->re_ks_sc_seg, 1, &re_ks_sc->re_ks_sc_nsegs, 2555 BUS_DMA_NOWAIT | BUS_DMA_ZERO) != 0) { 2556 printf("%s: cannot allocate counter dma memory\n", 2557 sc->sc_dev.dv_xname); 2558 goto destroy; 2559 } 2560 2561 if (bus_dmamem_map(sc->sc_dmat, 2562 &re_ks_sc->re_ks_sc_seg, re_ks_sc->re_ks_sc_nsegs, 2563 sizeof(struct re_stats), (caddr_t *)&re_ks_sc->re_ks_sc_stats, 2564 BUS_DMA_NOWAIT) != 0) { 2565 printf("%s: cannot map counter dma memory\n", 2566 sc->sc_dev.dv_xname); 2567 goto freedma; 2568 } 2569 2570 if (bus_dmamap_load(sc->sc_dmat, re_ks_sc->re_ks_sc_map, 2571 (caddr_t)re_ks_sc->re_ks_sc_stats, sizeof(struct re_stats), 2572 NULL, BUS_DMA_NOWAIT) != 0) { 2573 printf("%s: cannot load counter dma memory\n", 2574 sc->sc_dev.dv_xname); 2575 goto unmap; 2576 } 2577 2578 ks = kstat_create(sc->sc_dev.dv_xname, 0, "re-stats", 0, 2579 KSTAT_T_KV, 0); 2580 if (ks == NULL) { 2581 printf("%s: cannot create re-stats kstat\n", 2582 sc->sc_dev.dv_xname); 2583 goto unload; 2584 } 2585 2586 ks->ks_datalen = sizeof(re_kstats_tpl); 2587 2588 rw_init(&re_ks_sc->re_ks_sc_rwl, "restats"); 2589 kstat_set_wlock(ks, &re_ks_sc->re_ks_sc_rwl); 2590 ks->ks_softc = sc; 2591 ks->ks_ptr = re_ks_sc; 2592 ks->ks_read = re_kstat_read; 2593 ks->ks_copy = re_kstat_copy; 2594 2595 kstat_install(ks); 2596 2597 sc->rl_kstat = ks; 2598 2599 return; 2600 2601 unload: 2602 bus_dmamap_unload(sc->sc_dmat, re_ks_sc->re_ks_sc_map); 2603 unmap: 2604 bus_dmamem_unmap(sc->sc_dmat, 2605 (caddr_t)re_ks_sc->re_ks_sc_stats, sizeof(struct re_stats)); 2606 freedma: 2607 bus_dmamem_free(sc->sc_dmat, &re_ks_sc->re_ks_sc_seg, 1); 2608 destroy: 2609 bus_dmamap_destroy(sc->sc_dmat, re_ks_sc->re_ks_sc_map); 2610 free: 2611 free(re_ks_sc, M_DEVBUF, sizeof(*re_ks_sc)); 2612 } 2613 #endif /* NKSTAT > 0 */ 2614