Annotation of sys/dev/pci/if_em.c, Revision 1.1
1.1 ! nbrk 1: /**************************************************************************
! 2:
! 3: Copyright (c) 2001-2003, Intel Corporation
! 4: All rights reserved.
! 5:
! 6: Redistribution and use in source and binary forms, with or without
! 7: modification, are permitted provided that the following conditions are met:
! 8:
! 9: 1. Redistributions of source code must retain the above copyright notice,
! 10: this list of conditions and the following disclaimer.
! 11:
! 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:
! 16: 3. Neither the name of the Intel Corporation nor the names of its
! 17: contributors may be used to endorse or promote products derived from
! 18: this software without specific prior written permission.
! 19:
! 20: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
! 21: AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 22: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 23: ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
! 24: LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
! 25: CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
! 26: SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
! 27: INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
! 28: CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
! 29: ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
! 30: POSSIBILITY OF SUCH DAMAGE.
! 31:
! 32: ***************************************************************************/
! 33:
! 34: /* $OpenBSD: if_em.c,v 1.172 2007/05/31 01:04:57 henning Exp $ */
! 35: /* $FreeBSD: if_em.c,v 1.46 2004/09/29 18:28:28 mlaier Exp $ */
! 36:
! 37: #include <dev/pci/if_em.h>
! 38:
! 39: /*********************************************************************
! 40: * Set this to one to display debug statistics
! 41: *********************************************************************/
! 42: int em_display_debug_stats = 0;
! 43:
! 44: /*********************************************************************
! 45: * Driver version
! 46: *********************************************************************/
! 47:
! 48: char em_driver_version[] = "6.2.9";
! 49:
! 50: /*********************************************************************
! 51: * PCI Device ID Table
! 52: *********************************************************************/
! 53: const struct pci_matchid em_devices[] = {
! 54: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80003ES2LAN_CPR_DPT },
! 55: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80003ES2LAN_SDS_DPT },
! 56: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80003ES2LAN_CPR_SPT },
! 57: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80003ES2LAN_SDS_SPT },
! 58: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EM },
! 59: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EM_LOM },
! 60: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP },
! 61: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP_LOM },
! 62: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP_LP },
! 63: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541EI },
! 64: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541EI_MOBILE },
! 65: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541ER },
! 66: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541ER_LOM },
! 67: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI },
! 68: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI_LF },
! 69: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI_MOBILE },
! 70: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82542 },
! 71: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82543GC_COPPER },
! 72: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82543GC_FIBER },
! 73: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544EI_COPPER },
! 74: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544EI_FIBER },
! 75: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544GC_COPPER },
! 76: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544GC_LOM },
! 77: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545EM_COPPER },
! 78: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545EM_FIBER },
! 79: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_COPPER },
! 80: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_FIBER },
! 81: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_SERDES },
! 82: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_COPPER },
! 83: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_FIBER },
! 84: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_QUAD_CPR },
! 85: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_COPPER },
! 86: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_FIBER },
! 87: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_PCIE },
! 88: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_CPR },
! 89: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_CPR_K },
! 90: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_SERDES },
! 91: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_2 },
! 92: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547EI },
! 93: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547EI_MOBILE },
! 94: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547GI },
! 95: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_AF },
! 96: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_AT },
! 97: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_COPPER },
! 98: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_FIBER },
! 99: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_CPR },
! 100: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_CPR_LP },
! 101: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_FBR },
! 102: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_SERDES },
! 103: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_COPPER },
! 104: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_FIBER },
! 105: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_SERDES },
! 106: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI },
! 107: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E },
! 108: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E_IAMT },
! 109: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E_PM },
! 110: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573L },
! 111: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573L_PL_1 },
! 112: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573L_PL_2 },
! 113: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573V_PM },
! 114: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_ICH8_IGP_M_AMT },
! 115: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_ICH8_IGP_AMT },
! 116: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_ICH8_IGP_C },
! 117: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_ICH8_IFE },
! 118: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_ICH8_IFE_G },
! 119: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_ICH8_IFE_GT },
! 120: { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_ICH8_IGP_M }
! 121: };
! 122:
! 123: /*********************************************************************
! 124: * Function prototypes
! 125: *********************************************************************/
! 126: int em_probe(struct device *, void *, void *);
! 127: void em_attach(struct device *, struct device *, void *);
! 128: void em_shutdown(void *);
! 129: int em_intr(void *);
! 130: void em_power(int, void *);
! 131: void em_start(struct ifnet *);
! 132: int em_ioctl(struct ifnet *, u_long, caddr_t);
! 133: void em_watchdog(struct ifnet *);
! 134: void em_init(void *);
! 135: void em_stop(void *);
! 136: void em_media_status(struct ifnet *, struct ifmediareq *);
! 137: int em_media_change(struct ifnet *);
! 138: void em_identify_hardware(struct em_softc *);
! 139: int em_allocate_pci_resources(struct em_softc *);
! 140: void em_free_pci_resources(struct em_softc *);
! 141: void em_local_timer(void *);
! 142: int em_hardware_init(struct em_softc *);
! 143: void em_setup_interface(struct em_softc *);
! 144: int em_setup_transmit_structures(struct em_softc *);
! 145: void em_initialize_transmit_unit(struct em_softc *);
! 146: int em_setup_receive_structures(struct em_softc *);
! 147: void em_initialize_receive_unit(struct em_softc *);
! 148: void em_enable_intr(struct em_softc *);
! 149: void em_disable_intr(struct em_softc *);
! 150: void em_free_transmit_structures(struct em_softc *);
! 151: void em_free_receive_structures(struct em_softc *);
! 152: void em_update_stats_counters(struct em_softc *);
! 153: void em_txeof(struct em_softc *);
! 154: int em_allocate_receive_structures(struct em_softc *);
! 155: int em_allocate_transmit_structures(struct em_softc *);
! 156: void em_rxeof(struct em_softc *, int);
! 157: void em_receive_checksum(struct em_softc *, struct em_rx_desc *,
! 158: struct mbuf *);
! 159: #ifdef EM_CSUM_OFFLOAD
! 160: void em_transmit_checksum_setup(struct em_softc *, struct mbuf *,
! 161: u_int32_t *, u_int32_t *);
! 162: #endif
! 163: void em_set_promisc(struct em_softc *);
! 164: void em_set_multi(struct em_softc *);
! 165: void em_print_hw_stats(struct em_softc *);
! 166: void em_update_link_status(struct em_softc *);
! 167: int em_get_buf(struct em_softc *, int);
! 168: int em_encap(struct em_softc *, struct mbuf *);
! 169: void em_smartspeed(struct em_softc *);
! 170: int em_82547_fifo_workaround(struct em_softc *, int);
! 171: void em_82547_update_fifo_head(struct em_softc *, int);
! 172: int em_82547_tx_fifo_reset(struct em_softc *);
! 173: void em_82547_move_tail(void *arg);
! 174: void em_82547_move_tail_locked(struct em_softc *);
! 175: int em_dma_malloc(struct em_softc *, bus_size_t, struct em_dma_alloc *,
! 176: int);
! 177: void em_dma_free(struct em_softc *, struct em_dma_alloc *);
! 178: int em_is_valid_ether_addr(u_int8_t *);
! 179: u_int32_t em_fill_descriptors(u_int64_t address, u_int32_t length,
! 180: PDESC_ARRAY desc_array);
! 181:
! 182: /*********************************************************************
! 183: * OpenBSD Device Interface Entry Points
! 184: *********************************************************************/
! 185:
! 186: struct cfattach em_ca = {
! 187: sizeof(struct em_softc), em_probe, em_attach
! 188: };
! 189:
! 190: struct cfdriver em_cd = {
! 191: 0, "em", DV_IFNET
! 192: };
! 193:
! 194: static int em_smart_pwr_down = FALSE;
! 195:
! 196: /*********************************************************************
! 197: * Device identification routine
! 198: *
! 199: * em_probe determines if the driver should be loaded on
! 200: * adapter based on PCI vendor/device id of the adapter.
! 201: *
! 202: * return 0 on no match, positive on match
! 203: *********************************************************************/
! 204:
! 205: int
! 206: em_probe(struct device *parent, void *match, void *aux)
! 207: {
! 208: INIT_DEBUGOUT("em_probe: begin");
! 209:
! 210: return (pci_matchbyid((struct pci_attach_args *)aux, em_devices,
! 211: sizeof(em_devices)/sizeof(em_devices[0])));
! 212: }
! 213:
! 214: /*********************************************************************
! 215: * Device initialization routine
! 216: *
! 217: * The attach entry point is called when the driver is being loaded.
! 218: * This routine identifies the type of hardware, allocates all resources
! 219: * and initializes the hardware.
! 220: *
! 221: *********************************************************************/
! 222:
! 223: void
! 224: em_attach(struct device *parent, struct device *self, void *aux)
! 225: {
! 226: struct pci_attach_args *pa = aux;
! 227: struct em_softc *sc;
! 228: int tsize, rsize;
! 229:
! 230: INIT_DEBUGOUT("em_attach: begin");
! 231:
! 232: sc = (struct em_softc *)self;
! 233: sc->osdep.em_pa = *pa;
! 234:
! 235: timeout_set(&sc->timer_handle, em_local_timer, sc);
! 236: timeout_set(&sc->tx_fifo_timer_handle, em_82547_move_tail, sc);
! 237:
! 238: /* Determine hardware revision */
! 239: em_identify_hardware(sc);
! 240:
! 241: /* Parameters (to be read from user) */
! 242: sc->num_tx_desc = EM_MIN_TXD;
! 243: sc->num_rx_desc = EM_MIN_RXD;
! 244: sc->tx_int_delay = EM_TIDV;
! 245: sc->tx_abs_int_delay = EM_TADV;
! 246: sc->rx_int_delay = EM_RDTR;
! 247: sc->rx_abs_int_delay = EM_RADV;
! 248: sc->hw.autoneg = DO_AUTO_NEG;
! 249: sc->hw.wait_autoneg_complete = WAIT_FOR_AUTO_NEG_DEFAULT;
! 250: sc->hw.autoneg_advertised = AUTONEG_ADV_DEFAULT;
! 251: sc->hw.tbi_compatibility_en = TRUE;
! 252: sc->rx_buffer_len = EM_RXBUFFER_2048;
! 253:
! 254: sc->hw.phy_init_script = 1;
! 255: sc->hw.phy_reset_disable = FALSE;
! 256:
! 257: #ifndef EM_MASTER_SLAVE
! 258: sc->hw.master_slave = em_ms_hw_default;
! 259: #else
! 260: sc->hw.master_slave = EM_MASTER_SLAVE;
! 261: #endif
! 262:
! 263: /*
! 264: * This controls when hardware reports transmit completion
! 265: * status.
! 266: */
! 267: sc->hw.report_tx_early = 1;
! 268:
! 269: if (em_allocate_pci_resources(sc)) {
! 270: printf("%s: Allocation of PCI resources failed\n",
! 271: sc->sc_dv.dv_xname);
! 272: goto err_pci;
! 273: }
! 274:
! 275: /* Initialize eeprom parameters */
! 276: em_init_eeprom_params(&sc->hw);
! 277:
! 278: /*
! 279: * Set the max frame size assuming standard Ethernet
! 280: * sized frames.
! 281: */
! 282: switch (sc->hw.mac_type) {
! 283: case em_82573:
! 284: {
! 285: uint16_t eeprom_data = 0;
! 286:
! 287: /*
! 288: * 82573 only supports Jumbo frames
! 289: * if ASPM is disabled.
! 290: */
! 291: em_read_eeprom(&sc->hw, EEPROM_INIT_3GIO_3,
! 292: 1, &eeprom_data);
! 293: if (eeprom_data & EEPROM_WORD1A_ASPM_MASK) {
! 294: sc->hw.max_frame_size = ETHER_MAX_LEN;
! 295: break;
! 296: }
! 297: /* Allow Jumbo frames - FALLTHROUGH */
! 298: }
! 299: case em_82571:
! 300: case em_82572:
! 301: case em_80003es2lan: /* Limit Jumbo Frame size */
! 302: sc->hw.max_frame_size = 9234;
! 303: break;
! 304: case em_ich8lan:
! 305: /* ICH8 does not support jumbo frames */
! 306: sc->hw.max_frame_size = ETHER_MAX_LEN;
! 307: break;
! 308: default:
! 309: sc->hw.max_frame_size =
! 310: MAX_JUMBO_FRAME_SIZE;
! 311: }
! 312:
! 313: sc->hw.min_frame_size =
! 314: ETHER_MIN_LEN + ETHER_CRC_LEN;
! 315:
! 316: if (sc->hw.mac_type >= em_82544)
! 317: tsize = EM_ROUNDUP(sc->num_tx_desc * sizeof(struct em_tx_desc),
! 318: EM_MAX_TXD * sizeof(struct em_tx_desc));
! 319: else
! 320: tsize = EM_ROUNDUP(sc->num_tx_desc * sizeof(struct em_tx_desc),
! 321: EM_MAX_TXD_82543 * sizeof(struct em_tx_desc));
! 322: tsize = EM_ROUNDUP(tsize, PAGE_SIZE);
! 323:
! 324: /* Allocate Transmit Descriptor ring */
! 325: if (em_dma_malloc(sc, tsize, &sc->txdma, BUS_DMA_NOWAIT)) {
! 326: printf("%s: Unable to allocate tx_desc memory\n",
! 327: sc->sc_dv.dv_xname);
! 328: goto err_tx_desc;
! 329: }
! 330: sc->tx_desc_base = (struct em_tx_desc *)sc->txdma.dma_vaddr;
! 331:
! 332: rsize = EM_ROUNDUP(sc->num_rx_desc * sizeof(struct em_rx_desc),
! 333: EM_MAX_RXD * sizeof(struct em_rx_desc));
! 334: rsize = EM_ROUNDUP(rsize, PAGE_SIZE);
! 335:
! 336: /* Allocate Receive Descriptor ring */
! 337: if (em_dma_malloc(sc, rsize, &sc->rxdma, BUS_DMA_NOWAIT)) {
! 338: printf("%s: Unable to allocate rx_desc memory\n",
! 339: sc->sc_dv.dv_xname);
! 340: goto err_rx_desc;
! 341: }
! 342: sc->rx_desc_base = (struct em_rx_desc *) sc->rxdma.dma_vaddr;
! 343:
! 344: /* Initialize the hardware */
! 345: if (em_hardware_init(sc)) {
! 346: printf("%s: Unable to initialize the hardware\n",
! 347: sc->sc_dv.dv_xname);
! 348: goto err_hw_init;
! 349: }
! 350:
! 351: /* Copy the permanent MAC address out of the EEPROM */
! 352: if (em_read_mac_addr(&sc->hw) < 0) {
! 353: printf("%s: EEPROM read error while reading mac address\n",
! 354: sc->sc_dv.dv_xname);
! 355: goto err_mac_addr;
! 356: }
! 357:
! 358: if (!em_is_valid_ether_addr(sc->hw.mac_addr)) {
! 359: printf("%s: Invalid mac address\n", sc->sc_dv.dv_xname);
! 360: goto err_mac_addr;
! 361: }
! 362:
! 363: bcopy(sc->hw.mac_addr, sc->interface_data.ac_enaddr,
! 364: ETHER_ADDR_LEN);
! 365:
! 366: /* Setup OS specific network interface */
! 367: em_setup_interface(sc);
! 368:
! 369: /* Initialize statistics */
! 370: em_clear_hw_cntrs(&sc->hw);
! 371: em_update_stats_counters(sc);
! 372: sc->hw.get_link_status = 1;
! 373: em_update_link_status(sc);
! 374:
! 375: printf(", address %s\n", ether_sprintf(sc->interface_data.ac_enaddr));
! 376:
! 377: /* Indicate SOL/IDER usage */
! 378: if (em_check_phy_reset_block(&sc->hw))
! 379: printf("%s: PHY reset is blocked due to SOL/IDER session.\n",
! 380: sc->sc_dv.dv_xname);
! 381:
! 382: /* Identify 82544 on PCI-X */
! 383: em_get_bus_info(&sc->hw);
! 384: if (sc->hw.bus_type == em_bus_type_pcix &&
! 385: sc->hw.mac_type == em_82544)
! 386: sc->pcix_82544 = TRUE;
! 387: else
! 388: sc->pcix_82544 = FALSE;
! 389: INIT_DEBUGOUT("em_attach: end");
! 390: sc->sc_powerhook = powerhook_establish(em_power, sc);
! 391: sc->sc_shutdownhook = shutdownhook_establish(em_shutdown, sc);
! 392: return;
! 393:
! 394: err_mac_addr:
! 395: err_hw_init:
! 396: em_dma_free(sc, &sc->rxdma);
! 397: err_rx_desc:
! 398: em_dma_free(sc, &sc->txdma);
! 399: err_tx_desc:
! 400: err_pci:
! 401: em_free_pci_resources(sc);
! 402: }
! 403:
! 404: void
! 405: em_power(int why, void *arg)
! 406: {
! 407: struct em_softc *sc = (struct em_softc *)arg;
! 408: struct ifnet *ifp;
! 409:
! 410: if (why == PWR_RESUME) {
! 411: ifp = &sc->interface_data.ac_if;
! 412: if (ifp->if_flags & IFF_UP)
! 413: em_init(sc);
! 414: }
! 415: }
! 416:
! 417: /*********************************************************************
! 418: *
! 419: * Shutdown entry point
! 420: *
! 421: **********************************************************************/
! 422:
! 423: void
! 424: em_shutdown(void *arg)
! 425: {
! 426: struct em_softc *sc = arg;
! 427:
! 428: em_stop(sc);
! 429: }
! 430:
! 431: /*********************************************************************
! 432: * Transmit entry point
! 433: *
! 434: * em_start is called by the stack to initiate a transmit.
! 435: * The driver will remain in this routine as long as there are
! 436: * packets to transmit and transmit resources are available.
! 437: * In case resources are not available stack is notified and
! 438: * the packet is requeued.
! 439: **********************************************************************/
! 440:
! 441: void
! 442: em_start(struct ifnet *ifp)
! 443: {
! 444: struct mbuf *m_head;
! 445: struct em_softc *sc = ifp->if_softc;
! 446:
! 447: if ((ifp->if_flags & (IFF_OACTIVE | IFF_RUNNING)) != IFF_RUNNING)
! 448: return;
! 449:
! 450: if (!sc->link_active)
! 451: return;
! 452:
! 453: for (;;) {
! 454: IFQ_POLL(&ifp->if_snd, m_head);
! 455:
! 456: if (m_head == NULL)
! 457: break;
! 458:
! 459: if (em_encap(sc, m_head)) {
! 460: ifp->if_flags |= IFF_OACTIVE;
! 461: break;
! 462: }
! 463:
! 464: IFQ_DEQUEUE(&ifp->if_snd, m_head);
! 465:
! 466: #if NBPFILTER > 0
! 467: /* Send a copy of the frame to the BPF listener */
! 468: if (ifp->if_bpf)
! 469: bpf_mtap(ifp->if_bpf, m_head, BPF_DIRECTION_OUT);
! 470: #endif
! 471:
! 472: /* Set timeout in case hardware has problems transmitting */
! 473: ifp->if_timer = EM_TX_TIMEOUT;
! 474: }
! 475: }
! 476:
! 477: /*********************************************************************
! 478: * Ioctl entry point
! 479: *
! 480: * em_ioctl is called when the user wants to configure the
! 481: * interface.
! 482: *
! 483: * return 0 on success, positive on failure
! 484: **********************************************************************/
! 485:
! 486: int
! 487: em_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
! 488: {
! 489: int error = 0;
! 490: struct ifreq *ifr = (struct ifreq *) data;
! 491: struct ifaddr *ifa = (struct ifaddr *)data;
! 492: struct em_softc *sc = ifp->if_softc;
! 493: int s;
! 494:
! 495: s = splnet();
! 496:
! 497: if ((error = ether_ioctl(ifp, &sc->interface_data, command, data)) > 0) {
! 498: splx(s);
! 499: return (error);
! 500: }
! 501:
! 502: switch (command) {
! 503: case SIOCSIFADDR:
! 504: IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFADDR (Set Interface "
! 505: "Addr)");
! 506: if (!(ifp->if_flags & IFF_UP)) {
! 507: ifp->if_flags |= IFF_UP;
! 508: em_init(sc);
! 509: }
! 510: #ifdef INET
! 511: if (ifa->ifa_addr->sa_family == AF_INET)
! 512: arp_ifinit(&sc->interface_data, ifa);
! 513: #endif /* INET */
! 514: break;
! 515: case SIOCSIFMTU:
! 516: IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFMTU (Set Interface MTU)");
! 517: if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > ifp->if_hardmtu)
! 518: error = EINVAL;
! 519: else if (ifp->if_mtu != ifr->ifr_mtu)
! 520: ifp->if_mtu = ifr->ifr_mtu;
! 521: break;
! 522: case SIOCSIFFLAGS:
! 523: IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFFLAGS (Set Interface Flags)");
! 524: if (ifp->if_flags & IFF_UP) {
! 525: /*
! 526: * If only the PROMISC or ALLMULTI flag changes, then
! 527: * don't do a full re-init of the chip, just update
! 528: * the Rx filter.
! 529: */
! 530: if ((ifp->if_flags & IFF_RUNNING) &&
! 531: ((ifp->if_flags ^ sc->if_flags) &
! 532: (IFF_ALLMULTI | IFF_PROMISC)) != 0) {
! 533: em_set_promisc(sc);
! 534: } else {
! 535: if (!(ifp->if_flags & IFF_RUNNING))
! 536: em_init(sc);
! 537: }
! 538: } else {
! 539: if (ifp->if_flags & IFF_RUNNING)
! 540: em_stop(sc);
! 541: }
! 542: sc->if_flags = ifp->if_flags;
! 543: break;
! 544: case SIOCADDMULTI:
! 545: case SIOCDELMULTI:
! 546: IOCTL_DEBUGOUT("ioctl rcv'd: SIOC(ADD|DEL)MULTI");
! 547: error = (command == SIOCADDMULTI)
! 548: ? ether_addmulti(ifr, &sc->interface_data)
! 549: : ether_delmulti(ifr, &sc->interface_data);
! 550:
! 551: if (error == ENETRESET) {
! 552: if (ifp->if_flags & IFF_RUNNING) {
! 553: em_disable_intr(sc);
! 554: em_set_multi(sc);
! 555: if (sc->hw.mac_type == em_82542_rev2_0)
! 556: em_initialize_receive_unit(sc);
! 557: em_enable_intr(sc);
! 558: }
! 559: error = 0;
! 560: }
! 561: break;
! 562: case SIOCSIFMEDIA:
! 563: /* Check SOL/IDER usage */
! 564: if (em_check_phy_reset_block(&sc->hw)) {
! 565: printf("%s: Media change is blocked due to SOL/IDER session.\n",
! 566: sc->sc_dv.dv_xname);
! 567: break;
! 568: }
! 569: case SIOCGIFMEDIA:
! 570: IOCTL_DEBUGOUT("ioctl rcv'd: SIOCxIFMEDIA (Get/Set Interface Media)");
! 571: error = ifmedia_ioctl(ifp, ifr, &sc->media, command);
! 572: break;
! 573: default:
! 574: IOCTL_DEBUGOUT1("ioctl received: UNKNOWN (0x%x)", (int)command);
! 575: error = ENOTTY;
! 576: }
! 577:
! 578: splx(s);
! 579: return (error);
! 580: }
! 581:
! 582: /*********************************************************************
! 583: * Watchdog entry point
! 584: *
! 585: * This routine is called whenever hardware quits transmitting.
! 586: *
! 587: **********************************************************************/
! 588:
! 589: void
! 590: em_watchdog(struct ifnet *ifp)
! 591: {
! 592: struct em_softc *sc = ifp->if_softc;
! 593:
! 594: /* If we are in this routine because of pause frames, then
! 595: * don't reset the hardware.
! 596: */
! 597: if (E1000_READ_REG(&sc->hw, STATUS) & E1000_STATUS_TXOFF) {
! 598: ifp->if_timer = EM_TX_TIMEOUT;
! 599: return;
! 600: }
! 601:
! 602: printf("%s: watchdog timeout -- resetting\n", sc->sc_dv.dv_xname);
! 603:
! 604: em_init(sc);
! 605:
! 606: sc->watchdog_events++;
! 607: }
! 608:
! 609: /*********************************************************************
! 610: * Init entry point
! 611: *
! 612: * This routine is used in two ways. It is used by the stack as
! 613: * init entry point in network interface structure. It is also used
! 614: * by the driver as a hw/sw initialization routine to get to a
! 615: * consistent state.
! 616: *
! 617: **********************************************************************/
! 618:
! 619: void
! 620: em_init(void *arg)
! 621: {
! 622: struct em_softc *sc = arg;
! 623: struct ifnet *ifp = &sc->interface_data.ac_if;
! 624: uint32_t pba;
! 625: int s;
! 626:
! 627: s = splnet();
! 628:
! 629: INIT_DEBUGOUT("em_init: begin");
! 630:
! 631: em_stop(sc);
! 632:
! 633: if (ifp->if_flags & IFF_UP) {
! 634: if (sc->hw.mac_type >= em_82544)
! 635: sc->num_tx_desc = EM_MAX_TXD;
! 636: else
! 637: sc->num_tx_desc = EM_MAX_TXD_82543;
! 638: sc->num_rx_desc = EM_MAX_RXD;
! 639: } else {
! 640: sc->num_tx_desc = EM_MIN_TXD;
! 641: sc->num_rx_desc = EM_MIN_RXD;
! 642: }
! 643: IFQ_SET_MAXLEN(&ifp->if_snd, sc->num_tx_desc - 1);
! 644:
! 645: /*
! 646: * Packet Buffer Allocation (PBA)
! 647: * Writing PBA sets the receive portion of the buffer
! 648: * the remainder is used for the transmit buffer.
! 649: *
! 650: * Devices before the 82547 had a Packet Buffer of 64K.
! 651: * Default allocation: PBA=48K for Rx, leaving 16K for Tx.
! 652: * After the 82547 the buffer was reduced to 40K.
! 653: * Default allocation: PBA=30K for Rx, leaving 10K for Tx.
! 654: * Note: default does not leave enough room for Jumbo Frame >10k.
! 655: */
! 656: switch (sc->hw.mac_type) {
! 657: case em_82547:
! 658: case em_82547_rev_2: /* 82547: Total Packet Buffer is 40K */
! 659: if (sc->hw.max_frame_size > EM_RXBUFFER_8192)
! 660: pba = E1000_PBA_22K; /* 22K for Rx, 18K for Tx */
! 661: else
! 662: pba = E1000_PBA_30K; /* 30K for Rx, 10K for Tx */
! 663: sc->tx_fifo_head = 0;
! 664: sc->tx_head_addr = pba << EM_TX_HEAD_ADDR_SHIFT;
! 665: sc->tx_fifo_size = (E1000_PBA_40K - pba) << EM_PBA_BYTES_SHIFT;
! 666: break;
! 667: case em_82571:
! 668: case em_82572: /* Total Packet Buffer on these is 48k */
! 669: case em_80003es2lan:
! 670: pba = E1000_PBA_32K; /* 32K for Rx, 16K for Tx */
! 671: break;
! 672: case em_82573: /* 82573: Total Packet Buffer is 32K */
! 673: /* Jumbo frames not supported */
! 674: pba = E1000_PBA_12K; /* 12K for Rx, 20K for Tx */
! 675: break;
! 676: case em_ich8lan:
! 677: pba = E1000_PBA_8K;
! 678: break;
! 679: default:
! 680: /* Devices before 82547 had a Packet Buffer of 64K. */
! 681: if (sc->hw.max_frame_size > EM_RXBUFFER_8192)
! 682: pba = E1000_PBA_40K; /* 40K for Rx, 24K for Tx */
! 683: else
! 684: pba = E1000_PBA_48K; /* 48K for Rx, 16K for Tx */
! 685: }
! 686: INIT_DEBUGOUT1("em_init: pba=%dK",pba);
! 687: E1000_WRITE_REG(&sc->hw, PBA, pba);
! 688:
! 689: /* Get the latest mac address, User can use a LAA */
! 690: bcopy(sc->interface_data.ac_enaddr, sc->hw.mac_addr,
! 691: ETHER_ADDR_LEN);
! 692:
! 693: /* Initialize the hardware */
! 694: if (em_hardware_init(sc)) {
! 695: printf("%s: Unable to initialize the hardware\n",
! 696: sc->sc_dv.dv_xname);
! 697: splx(s);
! 698: return;
! 699: }
! 700: em_update_link_status(sc);
! 701:
! 702: /* Prepare transmit descriptors and buffers */
! 703: if (em_setup_transmit_structures(sc)) {
! 704: printf("%s: Could not setup transmit structures\n",
! 705: sc->sc_dv.dv_xname);
! 706: em_stop(sc);
! 707: splx(s);
! 708: return;
! 709: }
! 710: em_initialize_transmit_unit(sc);
! 711:
! 712: /* Setup Multicast table */
! 713: em_set_multi(sc);
! 714:
! 715: /* Prepare receive descriptors and buffers */
! 716: if (em_setup_receive_structures(sc)) {
! 717: printf("%s: Could not setup receive structures\n",
! 718: sc->sc_dv.dv_xname);
! 719: em_stop(sc);
! 720: splx(s);
! 721: return;
! 722: }
! 723: em_initialize_receive_unit(sc);
! 724:
! 725: /* Don't lose promiscuous settings */
! 726: em_set_promisc(sc);
! 727:
! 728: ifp->if_flags |= IFF_RUNNING;
! 729: ifp->if_flags &= ~IFF_OACTIVE;
! 730:
! 731: timeout_add(&sc->timer_handle, hz);
! 732: em_clear_hw_cntrs(&sc->hw);
! 733: em_enable_intr(sc);
! 734:
! 735: /* Don't reset the phy next time init gets called */
! 736: sc->hw.phy_reset_disable = TRUE;
! 737:
! 738: splx(s);
! 739: }
! 740:
! 741: /*********************************************************************
! 742: *
! 743: * Interrupt Service routine
! 744: *
! 745: **********************************************************************/
! 746: int
! 747: em_intr(void *arg)
! 748: {
! 749: struct em_softc *sc = arg;
! 750: struct ifnet *ifp;
! 751: u_int32_t reg_icr, test_icr;
! 752: int claimed = 0;
! 753:
! 754: ifp = &sc->interface_data.ac_if;
! 755:
! 756: for (;;) {
! 757: test_icr = reg_icr = E1000_READ_REG(&sc->hw, ICR);
! 758: if (sc->hw.mac_type >= em_82571)
! 759: test_icr = (reg_icr & E1000_ICR_INT_ASSERTED);
! 760: if (!test_icr)
! 761: break;
! 762:
! 763: claimed = 1;
! 764:
! 765: if (ifp->if_flags & IFF_RUNNING) {
! 766: em_rxeof(sc, -1);
! 767: em_txeof(sc);
! 768: }
! 769:
! 770: /* Link status change */
! 771: if (reg_icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) {
! 772: timeout_del(&sc->timer_handle);
! 773: sc->hw.get_link_status = 1;
! 774: em_check_for_link(&sc->hw);
! 775: em_update_link_status(sc);
! 776: timeout_add(&sc->timer_handle, hz);
! 777: }
! 778:
! 779: if (reg_icr & E1000_ICR_RXO)
! 780: sc->rx_overruns++;
! 781: }
! 782:
! 783: if (ifp->if_flags & IFF_RUNNING && !IFQ_IS_EMPTY(&ifp->if_snd))
! 784: em_start(ifp);
! 785:
! 786: return (claimed);
! 787: }
! 788:
! 789: /*********************************************************************
! 790: *
! 791: * Media Ioctl callback
! 792: *
! 793: * This routine is called whenever the user queries the status of
! 794: * the interface using ifconfig.
! 795: *
! 796: **********************************************************************/
! 797: void
! 798: em_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
! 799: {
! 800: struct em_softc *sc = ifp->if_softc;
! 801: u_char fiber_type = IFM_1000_SX;
! 802: u_int16_t ar, lpar, gsr;
! 803:
! 804: INIT_DEBUGOUT("em_media_status: begin");
! 805:
! 806: em_check_for_link(&sc->hw);
! 807: em_update_link_status(sc);
! 808:
! 809: ifmr->ifm_status = IFM_AVALID;
! 810: ifmr->ifm_active = IFM_ETHER;
! 811:
! 812: if (!sc->link_active) {
! 813: ifmr->ifm_active |= IFM_NONE;
! 814: return;
! 815: }
! 816:
! 817: ifmr->ifm_status |= IFM_ACTIVE;
! 818:
! 819: if (sc->hw.media_type == em_media_type_fiber ||
! 820: sc->hw.media_type == em_media_type_internal_serdes) {
! 821: if (sc->hw.mac_type == em_82545)
! 822: fiber_type = IFM_1000_LX;
! 823: ifmr->ifm_active |= fiber_type | IFM_FDX;
! 824: } else {
! 825: switch (sc->link_speed) {
! 826: case 10:
! 827: ifmr->ifm_active |= IFM_10_T;
! 828: break;
! 829: case 100:
! 830: ifmr->ifm_active |= IFM_100_TX;
! 831: break;
! 832: case 1000:
! 833: ifmr->ifm_active |= IFM_1000_T;
! 834: break;
! 835: }
! 836:
! 837: if (sc->link_duplex == FULL_DUPLEX)
! 838: ifmr->ifm_active |= IFM_FDX;
! 839: else
! 840: ifmr->ifm_active |= IFM_HDX;
! 841:
! 842: if (ifmr->ifm_active & IFM_FDX) {
! 843: em_read_phy_reg(&sc->hw, PHY_AUTONEG_ADV, &ar);
! 844: em_read_phy_reg(&sc->hw, PHY_LP_ABILITY, &lpar);
! 845:
! 846: if ((ar & NWAY_AR_PAUSE) && (lpar & NWAY_LPAR_PAUSE))
! 847: ifmr->ifm_active |= IFM_FLOW | IFM_ETH_TXPAUSE |
! 848: IFM_ETH_RXPAUSE;
! 849: else if (!(ar & NWAY_AR_PAUSE) && (ar & NWAY_AR_ASM_DIR) &&
! 850: (lpar & NWAY_LPAR_PAUSE) && (lpar & NWAY_LPAR_ASM_DIR))
! 851: ifmr->ifm_active |= IFM_FLOW | IFM_ETH_TXPAUSE;
! 852: else if ((ar & NWAY_AR_PAUSE) && (ar & NWAY_AR_ASM_DIR) &&
! 853: !(lpar & NWAY_LPAR_PAUSE) && (lpar & NWAY_LPAR_ASM_DIR))
! 854: ifmr->ifm_active |= IFM_FLOW | IFM_ETH_RXPAUSE;
! 855: }
! 856:
! 857: if (IFM_SUBTYPE(ifmr->ifm_active) == IFM_1000_T) {
! 858: em_read_phy_reg(&sc->hw, PHY_1000T_STATUS, &gsr);
! 859: if (gsr & SR_1000T_MS_CONFIG_RES)
! 860: ifmr->ifm_active |= IFM_ETH_MASTER;
! 861: }
! 862: }
! 863: }
! 864:
! 865: /*********************************************************************
! 866: *
! 867: * Media Ioctl callback
! 868: *
! 869: * This routine is called when the user changes speed/duplex using
! 870: * media/mediopt option with ifconfig.
! 871: *
! 872: **********************************************************************/
! 873: int
! 874: em_media_change(struct ifnet *ifp)
! 875: {
! 876: struct em_softc *sc = ifp->if_softc;
! 877: struct ifmedia *ifm = &sc->media;
! 878:
! 879: INIT_DEBUGOUT("em_media_change: begin");
! 880:
! 881: if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
! 882: return (EINVAL);
! 883:
! 884: switch (IFM_SUBTYPE(ifm->ifm_media)) {
! 885: case IFM_AUTO:
! 886: sc->hw.autoneg = DO_AUTO_NEG;
! 887: sc->hw.autoneg_advertised = AUTONEG_ADV_DEFAULT;
! 888: break;
! 889: case IFM_1000_LX:
! 890: case IFM_1000_SX:
! 891: case IFM_1000_T:
! 892: sc->hw.autoneg = DO_AUTO_NEG;
! 893: sc->hw.autoneg_advertised = ADVERTISE_1000_FULL;
! 894: break;
! 895: case IFM_100_TX:
! 896: sc->hw.autoneg = FALSE;
! 897: sc->hw.autoneg_advertised = 0;
! 898: if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX)
! 899: sc->hw.forced_speed_duplex = em_100_full;
! 900: else
! 901: sc->hw.forced_speed_duplex = em_100_half;
! 902: break;
! 903: case IFM_10_T:
! 904: sc->hw.autoneg = FALSE;
! 905: sc->hw.autoneg_advertised = 0;
! 906: if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX)
! 907: sc->hw.forced_speed_duplex = em_10_full;
! 908: else
! 909: sc->hw.forced_speed_duplex = em_10_half;
! 910: break;
! 911: default:
! 912: printf("%s: Unsupported media type\n", sc->sc_dv.dv_xname);
! 913: }
! 914:
! 915: /*
! 916: * As the speed/duplex settings may have changed we need to
! 917: * reset the PHY.
! 918: */
! 919: sc->hw.phy_reset_disable = FALSE;
! 920:
! 921: em_init(sc);
! 922:
! 923: return (0);
! 924: }
! 925:
! 926: /*********************************************************************
! 927: *
! 928: * This routine maps the mbufs to tx descriptors.
! 929: *
! 930: * return 0 on success, positive on failure
! 931: **********************************************************************/
! 932: int
! 933: em_encap(struct em_softc *sc, struct mbuf *m_head)
! 934: {
! 935: u_int32_t txd_upper;
! 936: u_int32_t txd_lower, txd_used = 0, txd_saved = 0;
! 937: int i, j, first, error = 0, last = 0;
! 938: bus_dmamap_t map;
! 939:
! 940: /* For 82544 Workaround */
! 941: DESC_ARRAY desc_array;
! 942: u_int32_t array_elements;
! 943: u_int32_t counter;
! 944:
! 945: struct em_buffer *tx_buffer, *tx_buffer_mapped;
! 946: struct em_tx_desc *current_tx_desc = NULL;
! 947:
! 948: /*
! 949: * Force a cleanup if number of TX descriptors
! 950: * available hits the threshold
! 951: */
! 952: if (sc->num_tx_desc_avail <= EM_TX_CLEANUP_THRESHOLD) {
! 953: em_txeof(sc);
! 954: /* Now do we at least have a minimal? */
! 955: if (sc->num_tx_desc_avail <= EM_TX_OP_THRESHOLD) {
! 956: sc->no_tx_desc_avail1++;
! 957: return (ENOBUFS);
! 958: }
! 959: }
! 960:
! 961: /*
! 962: * Map the packet for DMA.
! 963: *
! 964: * Capture the first descriptor index,
! 965: * this descriptor will have the index
! 966: * of the EOP which is the only one that
! 967: * no gets a DONE bit writeback.
! 968: */
! 969: first = sc->next_avail_tx_desc;
! 970: tx_buffer = &sc->tx_buffer_area[first];
! 971: tx_buffer_mapped = tx_buffer;
! 972: map = tx_buffer->map;
! 973:
! 974: error = bus_dmamap_load_mbuf(sc->txtag, map, m_head, BUS_DMA_NOWAIT);
! 975: if (error != 0) {
! 976: sc->no_tx_dma_setup++;
! 977: return (error);
! 978: }
! 979: EM_KASSERT(map->dm_nsegs!= 0, ("em_encap: empty packet"));
! 980:
! 981: if (map->dm_nsegs > sc->num_tx_desc_avail - 2)
! 982: goto fail;
! 983:
! 984: #ifdef EM_CSUM_OFFLOAD
! 985: if (sc->hw.mac_type >= em_82543)
! 986: em_transmit_checksum_setup(sc, m_head, &txd_upper, &txd_lower);
! 987: else
! 988: txd_upper = txd_lower = 0;
! 989: #else
! 990: txd_upper = txd_lower = 0;
! 991: #endif
! 992:
! 993: i = sc->next_avail_tx_desc;
! 994: if (sc->pcix_82544)
! 995: txd_saved = i;
! 996:
! 997: for (j = 0; j < map->dm_nsegs; j++) {
! 998: /* If sc is 82544 and on PCI-X bus */
! 999: if (sc->pcix_82544) {
! 1000: /*
! 1001: * Check the Address and Length combination and
! 1002: * split the data accordingly
! 1003: */
! 1004: array_elements = em_fill_descriptors(map->dm_segs[j].ds_addr,
! 1005: map->dm_segs[j].ds_len,
! 1006: &desc_array);
! 1007: for (counter = 0; counter < array_elements; counter++) {
! 1008: if (txd_used == sc->num_tx_desc_avail) {
! 1009: sc->next_avail_tx_desc = txd_saved;
! 1010: goto fail;
! 1011: }
! 1012: tx_buffer = &sc->tx_buffer_area[i];
! 1013: current_tx_desc = &sc->tx_desc_base[i];
! 1014: current_tx_desc->buffer_addr = htole64(
! 1015: desc_array.descriptor[counter].address);
! 1016: current_tx_desc->lower.data = htole32(
! 1017: (sc->txd_cmd | txd_lower |
! 1018: (u_int16_t)desc_array.descriptor[counter].length));
! 1019: current_tx_desc->upper.data = htole32((txd_upper));
! 1020: last = i;
! 1021: if (++i == sc->num_tx_desc)
! 1022: i = 0;
! 1023:
! 1024: tx_buffer->m_head = NULL;
! 1025: tx_buffer->next_eop = -1;
! 1026: txd_used++;
! 1027: }
! 1028: } else {
! 1029: tx_buffer = &sc->tx_buffer_area[i];
! 1030: current_tx_desc = &sc->tx_desc_base[i];
! 1031:
! 1032: current_tx_desc->buffer_addr = htole64(map->dm_segs[j].ds_addr);
! 1033: current_tx_desc->lower.data = htole32(
! 1034: sc->txd_cmd | txd_lower | map->dm_segs[j].ds_len);
! 1035: current_tx_desc->upper.data = htole32(txd_upper);
! 1036: last = i;
! 1037: if (++i == sc->num_tx_desc)
! 1038: i = 0;
! 1039:
! 1040: tx_buffer->m_head = NULL;
! 1041: tx_buffer->next_eop = -1;
! 1042: }
! 1043: }
! 1044:
! 1045: sc->next_avail_tx_desc = i;
! 1046: if (sc->pcix_82544)
! 1047: sc->num_tx_desc_avail -= txd_used;
! 1048: else
! 1049: sc->num_tx_desc_avail -= map->dm_nsegs;
! 1050:
! 1051: tx_buffer->m_head = m_head;
! 1052: tx_buffer_mapped->map = tx_buffer->map;
! 1053: tx_buffer->map = map;
! 1054: bus_dmamap_sync(sc->txtag, map, 0, map->dm_mapsize,
! 1055: BUS_DMASYNC_PREWRITE);
! 1056:
! 1057: /*
! 1058: * Last Descriptor of Packet
! 1059: * needs End Of Packet (EOP)
! 1060: * and Report Status (RS)
! 1061: */
! 1062: current_tx_desc->lower.data |=
! 1063: htole32(E1000_TXD_CMD_EOP | E1000_TXD_CMD_RS);
! 1064:
! 1065: /*
! 1066: * Keep track in the first buffer which
! 1067: * descriptor will be written back
! 1068: */
! 1069: tx_buffer = &sc->tx_buffer_area[first];
! 1070: tx_buffer->next_eop = last;
! 1071:
! 1072: /*
! 1073: * Advance the Transmit Descriptor Tail (Tdt),
! 1074: * this tells the E1000 that this frame is
! 1075: * available to transmit.
! 1076: */
! 1077: bus_dmamap_sync(sc->txdma.dma_tag, sc->txdma.dma_map, 0,
! 1078: sc->txdma.dma_map->dm_mapsize,
! 1079: BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
! 1080: if (sc->hw.mac_type == em_82547 &&
! 1081: sc->link_duplex == HALF_DUPLEX) {
! 1082: em_82547_move_tail_locked(sc);
! 1083: } else {
! 1084: E1000_WRITE_REG(&sc->hw, TDT, i);
! 1085: if (sc->hw.mac_type == em_82547)
! 1086: em_82547_update_fifo_head(sc, m_head->m_pkthdr.len);
! 1087: }
! 1088:
! 1089: return (0);
! 1090:
! 1091: fail:
! 1092: sc->no_tx_desc_avail2++;
! 1093: bus_dmamap_unload(sc->txtag, map);
! 1094: return (ENOBUFS);
! 1095: }
! 1096:
! 1097: /*********************************************************************
! 1098: *
! 1099: * 82547 workaround to avoid controller hang in half-duplex environment.
! 1100: * The workaround is to avoid queuing a large packet that would span
! 1101: * the internal Tx FIFO ring boundary. We need to reset the FIFO pointers
! 1102: * in this case. We do that only when FIFO is quiescent.
! 1103: *
! 1104: **********************************************************************/
! 1105: void
! 1106: em_82547_move_tail_locked(struct em_softc *sc)
! 1107: {
! 1108: uint16_t hw_tdt;
! 1109: uint16_t sw_tdt;
! 1110: struct em_tx_desc *tx_desc;
! 1111: uint16_t length = 0;
! 1112: boolean_t eop = 0;
! 1113:
! 1114: hw_tdt = E1000_READ_REG(&sc->hw, TDT);
! 1115: sw_tdt = sc->next_avail_tx_desc;
! 1116:
! 1117: while (hw_tdt != sw_tdt) {
! 1118: tx_desc = &sc->tx_desc_base[hw_tdt];
! 1119: length += tx_desc->lower.flags.length;
! 1120: eop = tx_desc->lower.data & E1000_TXD_CMD_EOP;
! 1121: if (++hw_tdt == sc->num_tx_desc)
! 1122: hw_tdt = 0;
! 1123:
! 1124: if (eop) {
! 1125: if (em_82547_fifo_workaround(sc, length)) {
! 1126: sc->tx_fifo_wrk_cnt++;
! 1127: timeout_add(&sc->tx_fifo_timer_handle, 1);
! 1128: break;
! 1129: }
! 1130: E1000_WRITE_REG(&sc->hw, TDT, hw_tdt);
! 1131: em_82547_update_fifo_head(sc, length);
! 1132: length = 0;
! 1133: }
! 1134: }
! 1135: }
! 1136:
! 1137: void
! 1138: em_82547_move_tail(void *arg)
! 1139: {
! 1140: struct em_softc *sc = arg;
! 1141: int s;
! 1142:
! 1143: s = splnet();
! 1144: em_82547_move_tail_locked(sc);
! 1145: splx(s);
! 1146: }
! 1147:
! 1148: int
! 1149: em_82547_fifo_workaround(struct em_softc *sc, int len)
! 1150: {
! 1151: int fifo_space, fifo_pkt_len;
! 1152:
! 1153: fifo_pkt_len = EM_ROUNDUP(len + EM_FIFO_HDR, EM_FIFO_HDR);
! 1154:
! 1155: if (sc->link_duplex == HALF_DUPLEX) {
! 1156: fifo_space = sc->tx_fifo_size - sc->tx_fifo_head;
! 1157:
! 1158: if (fifo_pkt_len >= (EM_82547_PKT_THRESH + fifo_space)) {
! 1159: if (em_82547_tx_fifo_reset(sc))
! 1160: return (0);
! 1161: else
! 1162: return (1);
! 1163: }
! 1164: }
! 1165:
! 1166: return (0);
! 1167: }
! 1168:
! 1169: void
! 1170: em_82547_update_fifo_head(struct em_softc *sc, int len)
! 1171: {
! 1172: int fifo_pkt_len = EM_ROUNDUP(len + EM_FIFO_HDR, EM_FIFO_HDR);
! 1173:
! 1174: /* tx_fifo_head is always 16 byte aligned */
! 1175: sc->tx_fifo_head += fifo_pkt_len;
! 1176: if (sc->tx_fifo_head >= sc->tx_fifo_size)
! 1177: sc->tx_fifo_head -= sc->tx_fifo_size;
! 1178: }
! 1179:
! 1180: int
! 1181: em_82547_tx_fifo_reset(struct em_softc *sc)
! 1182: {
! 1183: uint32_t tctl;
! 1184:
! 1185: if ((E1000_READ_REG(&sc->hw, TDT) ==
! 1186: E1000_READ_REG(&sc->hw, TDH)) &&
! 1187: (E1000_READ_REG(&sc->hw, TDFT) ==
! 1188: E1000_READ_REG(&sc->hw, TDFH)) &&
! 1189: (E1000_READ_REG(&sc->hw, TDFTS) ==
! 1190: E1000_READ_REG(&sc->hw, TDFHS)) &&
! 1191: (E1000_READ_REG(&sc->hw, TDFPC) == 0)) {
! 1192:
! 1193: /* Disable TX unit */
! 1194: tctl = E1000_READ_REG(&sc->hw, TCTL);
! 1195: E1000_WRITE_REG(&sc->hw, TCTL, tctl & ~E1000_TCTL_EN);
! 1196:
! 1197: /* Reset FIFO pointers */
! 1198: E1000_WRITE_REG(&sc->hw, TDFT, sc->tx_head_addr);
! 1199: E1000_WRITE_REG(&sc->hw, TDFH, sc->tx_head_addr);
! 1200: E1000_WRITE_REG(&sc->hw, TDFTS, sc->tx_head_addr);
! 1201: E1000_WRITE_REG(&sc->hw, TDFHS, sc->tx_head_addr);
! 1202:
! 1203: /* Re-enable TX unit */
! 1204: E1000_WRITE_REG(&sc->hw, TCTL, tctl);
! 1205: E1000_WRITE_FLUSH(&sc->hw);
! 1206:
! 1207: sc->tx_fifo_head = 0;
! 1208: sc->tx_fifo_reset_cnt++;
! 1209:
! 1210: return (TRUE);
! 1211: } else
! 1212: return (FALSE);
! 1213: }
! 1214:
! 1215: void
! 1216: em_set_promisc(struct em_softc *sc)
! 1217: {
! 1218: u_int32_t reg_rctl;
! 1219: struct ifnet *ifp = &sc->interface_data.ac_if;
! 1220:
! 1221: reg_rctl = E1000_READ_REG(&sc->hw, RCTL);
! 1222:
! 1223: if (ifp->if_flags & IFF_PROMISC) {
! 1224: reg_rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
! 1225: } else if (ifp->if_flags & IFF_ALLMULTI) {
! 1226: reg_rctl |= E1000_RCTL_MPE;
! 1227: reg_rctl &= ~E1000_RCTL_UPE;
! 1228: } else {
! 1229: reg_rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE);
! 1230: }
! 1231: E1000_WRITE_REG(&sc->hw, RCTL, reg_rctl);
! 1232: }
! 1233:
! 1234: /*********************************************************************
! 1235: * Multicast Update
! 1236: *
! 1237: * This routine is called whenever multicast address list is updated.
! 1238: *
! 1239: **********************************************************************/
! 1240:
! 1241: void
! 1242: em_set_multi(struct em_softc *sc)
! 1243: {
! 1244: u_int32_t reg_rctl = 0;
! 1245: u_int8_t mta[MAX_NUM_MULTICAST_ADDRESSES * ETH_LENGTH_OF_ADDRESS];
! 1246: int mcnt = 0;
! 1247: struct ifnet *ifp = &sc->interface_data.ac_if;
! 1248: struct arpcom *ac = &sc->interface_data;
! 1249: struct ether_multi *enm;
! 1250: struct ether_multistep step;
! 1251:
! 1252: IOCTL_DEBUGOUT("em_set_multi: begin");
! 1253:
! 1254: if (sc->hw.mac_type == em_82542_rev2_0) {
! 1255: reg_rctl = E1000_READ_REG(&sc->hw, RCTL);
! 1256: if (sc->hw.pci_cmd_word & CMD_MEM_WRT_INVALIDATE)
! 1257: em_pci_clear_mwi(&sc->hw);
! 1258: reg_rctl |= E1000_RCTL_RST;
! 1259: E1000_WRITE_REG(&sc->hw, RCTL, reg_rctl);
! 1260: msec_delay(5);
! 1261: }
! 1262: ETHER_FIRST_MULTI(step, ac, enm);
! 1263: while (enm != NULL) {
! 1264: if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
! 1265: ifp->if_flags |= IFF_ALLMULTI;
! 1266: mcnt = MAX_NUM_MULTICAST_ADDRESSES;
! 1267: }
! 1268: if (mcnt == MAX_NUM_MULTICAST_ADDRESSES)
! 1269: break;
! 1270: bcopy(enm->enm_addrlo, &mta[mcnt*ETH_LENGTH_OF_ADDRESS],
! 1271: ETH_LENGTH_OF_ADDRESS);
! 1272: mcnt++;
! 1273: ETHER_NEXT_MULTI(step, enm);
! 1274: }
! 1275:
! 1276: if (mcnt >= MAX_NUM_MULTICAST_ADDRESSES) {
! 1277: reg_rctl = E1000_READ_REG(&sc->hw, RCTL);
! 1278: reg_rctl |= E1000_RCTL_MPE;
! 1279: E1000_WRITE_REG(&sc->hw, RCTL, reg_rctl);
! 1280: } else
! 1281: em_mc_addr_list_update(&sc->hw, mta, mcnt, 0, 1);
! 1282:
! 1283: if (sc->hw.mac_type == em_82542_rev2_0) {
! 1284: reg_rctl = E1000_READ_REG(&sc->hw, RCTL);
! 1285: reg_rctl &= ~E1000_RCTL_RST;
! 1286: E1000_WRITE_REG(&sc->hw, RCTL, reg_rctl);
! 1287: msec_delay(5);
! 1288: if (sc->hw.pci_cmd_word & CMD_MEM_WRT_INVALIDATE)
! 1289: em_pci_set_mwi(&sc->hw);
! 1290: }
! 1291: }
! 1292:
! 1293: /*********************************************************************
! 1294: * Timer routine
! 1295: *
! 1296: * This routine checks for link status and updates statistics.
! 1297: *
! 1298: **********************************************************************/
! 1299:
! 1300: void
! 1301: em_local_timer(void *arg)
! 1302: {
! 1303: struct ifnet *ifp;
! 1304: struct em_softc *sc = arg;
! 1305: int s;
! 1306:
! 1307: ifp = &sc->interface_data.ac_if;
! 1308:
! 1309: s = splnet();
! 1310:
! 1311: em_check_for_link(&sc->hw);
! 1312: em_update_link_status(sc);
! 1313: em_update_stats_counters(sc);
! 1314: if (em_display_debug_stats && ifp->if_flags & IFF_RUNNING)
! 1315: em_print_hw_stats(sc);
! 1316: em_smartspeed(sc);
! 1317:
! 1318: timeout_add(&sc->timer_handle, hz);
! 1319:
! 1320: splx(s);
! 1321: }
! 1322:
! 1323: void
! 1324: em_update_link_status(struct em_softc *sc)
! 1325: {
! 1326: struct ifnet *ifp = &sc->interface_data.ac_if;
! 1327:
! 1328: if (E1000_READ_REG(&sc->hw, STATUS) & E1000_STATUS_LU) {
! 1329: if (sc->link_active == 0) {
! 1330: em_get_speed_and_duplex(&sc->hw,
! 1331: &sc->link_speed,
! 1332: &sc->link_duplex);
! 1333: /* Check if we may set SPEED_MODE bit on PCI-E */
! 1334: if ((sc->link_speed == SPEED_1000) &&
! 1335: ((sc->hw.mac_type == em_82571) ||
! 1336: (sc->hw.mac_type == em_82572))) {
! 1337: int tarc0;
! 1338:
! 1339: tarc0 = E1000_READ_REG(&sc->hw, TARC0);
! 1340: tarc0 |= SPEED_MODE_BIT;
! 1341: E1000_WRITE_REG(&sc->hw, TARC0, tarc0);
! 1342: }
! 1343: sc->link_active = 1;
! 1344: sc->smartspeed = 0;
! 1345: ifp->if_baudrate = sc->link_speed * 1000000;
! 1346: if (sc->link_duplex == FULL_DUPLEX)
! 1347: ifp->if_link_state = LINK_STATE_FULL_DUPLEX;
! 1348: else if (sc->link_duplex == HALF_DUPLEX)
! 1349: ifp->if_link_state = LINK_STATE_HALF_DUPLEX;
! 1350: else
! 1351: ifp->if_link_state = LINK_STATE_UP;
! 1352: if_link_state_change(ifp);
! 1353: }
! 1354: } else {
! 1355: if (sc->link_active == 1) {
! 1356: ifp->if_baudrate = sc->link_speed = 0;
! 1357: sc->link_duplex = 0;
! 1358: sc->link_active = 0;
! 1359: ifp->if_link_state = LINK_STATE_DOWN;
! 1360: if_link_state_change(ifp);
! 1361: }
! 1362: }
! 1363: }
! 1364:
! 1365: /*********************************************************************
! 1366: *
! 1367: * This routine disables all traffic on the adapter by issuing a
! 1368: * global reset on the MAC and deallocates TX/RX buffers.
! 1369: *
! 1370: **********************************************************************/
! 1371:
! 1372: void
! 1373: em_stop(void *arg)
! 1374: {
! 1375: struct ifnet *ifp;
! 1376: struct em_softc *sc = arg;
! 1377: ifp = &sc->interface_data.ac_if;
! 1378:
! 1379: INIT_DEBUGOUT("em_stop: begin");
! 1380: em_disable_intr(sc);
! 1381: em_reset_hw(&sc->hw);
! 1382: timeout_del(&sc->timer_handle);
! 1383: timeout_del(&sc->tx_fifo_timer_handle);
! 1384:
! 1385: /* Tell the stack that the interface is no longer active */
! 1386: ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
! 1387:
! 1388: em_free_transmit_structures(sc);
! 1389: em_free_receive_structures(sc);
! 1390: }
! 1391:
! 1392: /*********************************************************************
! 1393: *
! 1394: * Determine hardware revision.
! 1395: *
! 1396: **********************************************************************/
! 1397: void
! 1398: em_identify_hardware(struct em_softc *sc)
! 1399: {
! 1400: u_int32_t reg;
! 1401: struct pci_attach_args *pa = &sc->osdep.em_pa;
! 1402:
! 1403: /* Make sure our PCI config space has the necessary stuff set */
! 1404: sc->hw.pci_cmd_word = pci_conf_read(pa->pa_pc, pa->pa_tag,
! 1405: PCI_COMMAND_STATUS_REG);
! 1406:
! 1407: /* Save off the information about this board */
! 1408: sc->hw.vendor_id = PCI_VENDOR(pa->pa_id);
! 1409: sc->hw.device_id = PCI_PRODUCT(pa->pa_id);
! 1410:
! 1411: reg = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG);
! 1412: sc->hw.revision_id = PCI_REVISION(reg);
! 1413:
! 1414: reg = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
! 1415: sc->hw.subsystem_vendor_id = PCI_VENDOR(reg);
! 1416: sc->hw.subsystem_id = PCI_PRODUCT(reg);
! 1417:
! 1418: /* Identify the MAC */
! 1419: if (em_set_mac_type(&sc->hw))
! 1420: printf("%s: Unknown MAC Type\n", sc->sc_dv.dv_xname);
! 1421:
! 1422: if (sc->hw.mac_type == em_82541 ||
! 1423: sc->hw.mac_type == em_82541_rev_2 ||
! 1424: sc->hw.mac_type == em_82547 ||
! 1425: sc->hw.mac_type == em_82547_rev_2)
! 1426: sc->hw.phy_init_script = TRUE;
! 1427: }
! 1428:
! 1429: int
! 1430: em_allocate_pci_resources(struct em_softc *sc)
! 1431: {
! 1432: int val, rid;
! 1433: pci_intr_handle_t ih;
! 1434: const char *intrstr = NULL;
! 1435: struct pci_attach_args *pa = &sc->osdep.em_pa;
! 1436: pci_chipset_tag_t pc = pa->pa_pc;
! 1437:
! 1438: val = pci_conf_read(pa->pa_pc, pa->pa_tag, EM_MMBA);
! 1439: if (PCI_MAPREG_TYPE(val) != PCI_MAPREG_TYPE_MEM) {
! 1440: printf(": mmba is not mem space\n");
! 1441: return (ENXIO);
! 1442: }
! 1443: if (pci_mapreg_map(pa, EM_MMBA, PCI_MAPREG_MEM_TYPE(val), 0,
! 1444: &sc->osdep.mem_bus_space_tag, &sc->osdep.mem_bus_space_handle,
! 1445: &sc->osdep.em_membase, &sc->osdep.em_memsize, 0)) {
! 1446: printf(": cannot find mem space\n");
! 1447: return (ENXIO);
! 1448: }
! 1449:
! 1450: if (sc->hw.mac_type > em_82543) {
! 1451: /* Figure out where our I/O BAR is ? */
! 1452: for (rid = PCI_MAPREG_START; rid < PCI_MAPREG_END;) {
! 1453: val = pci_conf_read(pa->pa_pc, pa->pa_tag, rid);
! 1454: if (PCI_MAPREG_TYPE(val) == PCI_MAPREG_TYPE_IO) {
! 1455: sc->io_rid = rid;
! 1456: break;
! 1457: }
! 1458: rid += 4;
! 1459: if (PCI_MAPREG_MEM_TYPE(val) ==
! 1460: PCI_MAPREG_MEM_TYPE_64BIT)
! 1461: rid += 4; /* skip high bits, too */
! 1462: }
! 1463:
! 1464: if (pci_mapreg_map(pa, rid, PCI_MAPREG_TYPE_IO, 0,
! 1465: &sc->osdep.io_bus_space_tag, &sc->osdep.io_bus_space_handle,
! 1466: &sc->osdep.em_iobase, &sc->osdep.em_iosize, 0)) {
! 1467: printf(": cannot find i/o space\n");
! 1468: return (ENXIO);
! 1469: }
! 1470:
! 1471: sc->hw.io_base = 0;
! 1472: }
! 1473:
! 1474: /* for ICH8 we need to find the flash memory */
! 1475: if (sc->hw.mac_type == em_ich8lan) {
! 1476: val = pci_conf_read(pa->pa_pc, pa->pa_tag, EM_FLASH);
! 1477: if (PCI_MAPREG_TYPE(val) != PCI_MAPREG_TYPE_MEM) {
! 1478: printf(": flash is not mem space\n");
! 1479: return (ENXIO);
! 1480: }
! 1481:
! 1482: if (pci_mapreg_map(pa, EM_FLASH, PCI_MAPREG_MEM_TYPE(val), 0,
! 1483: &sc->osdep.flash_bus_space_tag, &sc->osdep.flash_bus_space_handle,
! 1484: &sc->osdep.em_flashbase, &sc->osdep.em_flashsize, 0)) {
! 1485: printf(": cannot find mem space\n");
! 1486: return (ENXIO);
! 1487: }
! 1488: }
! 1489:
! 1490: if (pci_intr_map(pa, &ih)) {
! 1491: printf(": couldn't map interrupt\n");
! 1492: return (ENXIO);
! 1493: }
! 1494:
! 1495: sc->hw.back = &sc->osdep;
! 1496:
! 1497: intrstr = pci_intr_string(pc, ih);
! 1498: sc->sc_intrhand = pci_intr_establish(pc, ih, IPL_NET, em_intr, sc,
! 1499: sc->sc_dv.dv_xname);
! 1500: if (sc->sc_intrhand == NULL) {
! 1501: printf(": couldn't establish interrupt");
! 1502: if (intrstr != NULL)
! 1503: printf(" at %s", intrstr);
! 1504: printf("\n");
! 1505: return (ENXIO);
! 1506: }
! 1507: printf(": %s", intrstr);
! 1508:
! 1509: return (0);
! 1510: }
! 1511:
! 1512: void
! 1513: em_free_pci_resources(struct em_softc *sc)
! 1514: {
! 1515: struct pci_attach_args *pa = &sc->osdep.em_pa;
! 1516: pci_chipset_tag_t pc = pa->pa_pc;
! 1517:
! 1518: if (sc->sc_intrhand)
! 1519: pci_intr_disestablish(pc, sc->sc_intrhand);
! 1520: sc->sc_intrhand = 0;
! 1521:
! 1522: if (sc->osdep.em_flashbase)
! 1523: bus_space_unmap(sc->osdep.flash_bus_space_tag, sc->osdep.flash_bus_space_handle,
! 1524: sc->osdep.em_flashsize);
! 1525: sc->osdep.em_flashbase = 0;
! 1526:
! 1527: if (sc->osdep.em_iobase)
! 1528: bus_space_unmap(sc->osdep.io_bus_space_tag, sc->osdep.io_bus_space_handle,
! 1529: sc->osdep.em_iosize);
! 1530: sc->osdep.em_iobase = 0;
! 1531:
! 1532: if (sc->osdep.em_membase)
! 1533: bus_space_unmap(sc->osdep.mem_bus_space_tag, sc->osdep.mem_bus_space_handle,
! 1534: sc->osdep.em_memsize);
! 1535: sc->osdep.em_membase = 0;
! 1536: }
! 1537:
! 1538: /*********************************************************************
! 1539: *
! 1540: * Initialize the hardware to a configuration as specified by the
! 1541: * em_softc structure. The controller is reset, the EEPROM is
! 1542: * verified, the MAC address is set, then the shared initialization
! 1543: * routines are called.
! 1544: *
! 1545: **********************************************************************/
! 1546: int
! 1547: em_hardware_init(struct em_softc *sc)
! 1548: {
! 1549: u_int16_t rx_buffer_size;
! 1550:
! 1551: INIT_DEBUGOUT("em_hardware_init: begin");
! 1552: /* Issue a global reset */
! 1553: em_reset_hw(&sc->hw);
! 1554:
! 1555: /* When hardware is reset, fifo_head is also reset */
! 1556: sc->tx_fifo_head = 0;
! 1557:
! 1558: /* Make sure we have a good EEPROM before we read from it */
! 1559: if (em_validate_eeprom_checksum(&sc->hw) < 0) {
! 1560: /*
! 1561: * Some PCIe parts fail the first check due to
! 1562: * the link being in sleep state, call it again,
! 1563: * if it fails a second time its a real issue.
! 1564: */
! 1565: if (em_validate_eeprom_checksum(&sc->hw) < 0) {
! 1566: printf("%s: The EEPROM Checksum Is Not Valid\n",
! 1567: sc->sc_dv.dv_xname);
! 1568: return (EIO);
! 1569: }
! 1570: }
! 1571:
! 1572: if (em_read_part_num(&sc->hw, &(sc->part_num)) < 0) {
! 1573: printf("%s: EEPROM read error while reading part number\n",
! 1574: sc->sc_dv.dv_xname);
! 1575: return (EIO);
! 1576: }
! 1577:
! 1578: /* Set up smart power down as default off on newer adapters */
! 1579: if (!em_smart_pwr_down &&
! 1580: (sc->hw.mac_type == em_82571 ||
! 1581: sc->hw.mac_type == em_82572)) {
! 1582: uint16_t phy_tmp = 0;
! 1583:
! 1584: /* Speed up time to link by disabling smart power down */
! 1585: em_read_phy_reg(&sc->hw, IGP02E1000_PHY_POWER_MGMT, &phy_tmp);
! 1586: phy_tmp &= ~IGP02E1000_PM_SPD;
! 1587: em_write_phy_reg(&sc->hw, IGP02E1000_PHY_POWER_MGMT, phy_tmp);
! 1588: }
! 1589:
! 1590: /*
! 1591: * These parameters control the automatic generation (Tx) and
! 1592: * response (Rx) to Ethernet PAUSE frames.
! 1593: * - High water mark should allow for at least two frames to be
! 1594: * received after sending an XOFF.
! 1595: * - Low water mark works best when it is very near the high water mark.
! 1596: * This allows the receiver to restart by sending XON when it has
! 1597: * drained a bit. Here we use an arbitary value of 1500 which will
! 1598: * restart after one full frame is pulled from the buffer. There
! 1599: * could be several smaller frames in the buffer and if so they will
! 1600: * not trigger the XON until their total number reduces the buffer
! 1601: * by 1500.
! 1602: * - The pause time is fairly large at 1000 x 512ns = 512 usec.
! 1603: */
! 1604: rx_buffer_size = ((E1000_READ_REG(&sc->hw, PBA) & 0xffff) << 10 );
! 1605:
! 1606: sc->hw.fc_high_water = rx_buffer_size -
! 1607: EM_ROUNDUP(sc->hw.max_frame_size, 1024);
! 1608: sc->hw.fc_low_water = sc->hw.fc_high_water - 1500;
! 1609: if (sc->hw.mac_type == em_80003es2lan)
! 1610: sc->hw.fc_pause_time = 0xFFFF;
! 1611: else
! 1612: sc->hw.fc_pause_time = 1000;
! 1613: sc->hw.fc_send_xon = TRUE;
! 1614: sc->hw.fc = E1000_FC_FULL;
! 1615:
! 1616: if (em_init_hw(&sc->hw) < 0) {
! 1617: printf("%s: Hardware Initialization Failed",
! 1618: sc->sc_dv.dv_xname);
! 1619: return (EIO);
! 1620: }
! 1621:
! 1622: em_check_for_link(&sc->hw);
! 1623:
! 1624: return (0);
! 1625: }
! 1626:
! 1627: /*********************************************************************
! 1628: *
! 1629: * Setup networking device structure and register an interface.
! 1630: *
! 1631: **********************************************************************/
! 1632: void
! 1633: em_setup_interface(struct em_softc *sc)
! 1634: {
! 1635: struct ifnet *ifp;
! 1636: u_char fiber_type = IFM_1000_SX;
! 1637:
! 1638: INIT_DEBUGOUT("em_setup_interface: begin");
! 1639:
! 1640: ifp = &sc->interface_data.ac_if;
! 1641: strlcpy(ifp->if_xname, sc->sc_dv.dv_xname, IFNAMSIZ);
! 1642: ifp->if_softc = sc;
! 1643: ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
! 1644: ifp->if_ioctl = em_ioctl;
! 1645: ifp->if_start = em_start;
! 1646: ifp->if_watchdog = em_watchdog;
! 1647: ifp->if_hardmtu =
! 1648: sc->hw.max_frame_size - ETHER_HDR_LEN - ETHER_CRC_LEN;
! 1649: IFQ_SET_MAXLEN(&ifp->if_snd, sc->num_tx_desc - 1);
! 1650: IFQ_SET_READY(&ifp->if_snd);
! 1651:
! 1652: ifp->if_capabilities = IFCAP_VLAN_MTU;
! 1653:
! 1654: #ifdef EM_CSUM_OFFLOAD
! 1655: if (sc->hw.mac_type >= em_82543)
! 1656: ifp->if_capabilities |= IFCAP_CSUM_TCPv4|IFCAP_CSUM_UDPv4;
! 1657: #endif
! 1658:
! 1659: /*
! 1660: * Specify the media types supported by this adapter and register
! 1661: * callbacks to update media and link information
! 1662: */
! 1663: ifmedia_init(&sc->media, IFM_IMASK, em_media_change,
! 1664: em_media_status);
! 1665: if (sc->hw.media_type == em_media_type_fiber ||
! 1666: sc->hw.media_type == em_media_type_internal_serdes) {
! 1667: if (sc->hw.mac_type == em_82545)
! 1668: fiber_type = IFM_1000_LX;
! 1669: ifmedia_add(&sc->media, IFM_ETHER | fiber_type | IFM_FDX,
! 1670: 0, NULL);
! 1671: ifmedia_add(&sc->media, IFM_ETHER | fiber_type,
! 1672: 0, NULL);
! 1673: } else {
! 1674: ifmedia_add(&sc->media, IFM_ETHER | IFM_10_T, 0, NULL);
! 1675: ifmedia_add(&sc->media, IFM_ETHER | IFM_10_T | IFM_FDX,
! 1676: 0, NULL);
! 1677: ifmedia_add(&sc->media, IFM_ETHER | IFM_100_TX,
! 1678: 0, NULL);
! 1679: ifmedia_add(&sc->media, IFM_ETHER | IFM_100_TX | IFM_FDX,
! 1680: 0, NULL);
! 1681: if (sc->hw.phy_type != em_phy_ife) {
! 1682: ifmedia_add(&sc->media, IFM_ETHER | IFM_1000_T | IFM_FDX,
! 1683: 0, NULL);
! 1684: ifmedia_add(&sc->media, IFM_ETHER | IFM_1000_T, 0, NULL);
! 1685: }
! 1686: }
! 1687: ifmedia_add(&sc->media, IFM_ETHER | IFM_AUTO, 0, NULL);
! 1688: ifmedia_set(&sc->media, IFM_ETHER | IFM_AUTO);
! 1689:
! 1690: if_attach(ifp);
! 1691: ether_ifattach(ifp);
! 1692: }
! 1693:
! 1694:
! 1695: /*********************************************************************
! 1696: *
! 1697: * Workaround for SmartSpeed on 82541 and 82547 controllers
! 1698: *
! 1699: **********************************************************************/
! 1700: void
! 1701: em_smartspeed(struct em_softc *sc)
! 1702: {
! 1703: uint16_t phy_tmp;
! 1704:
! 1705: if (sc->link_active || (sc->hw.phy_type != em_phy_igp) ||
! 1706: !sc->hw.autoneg || !(sc->hw.autoneg_advertised & ADVERTISE_1000_FULL))
! 1707: return;
! 1708:
! 1709: if (sc->smartspeed == 0) {
! 1710: /* If Master/Slave config fault is asserted twice,
! 1711: * we assume back-to-back */
! 1712: em_read_phy_reg(&sc->hw, PHY_1000T_STATUS, &phy_tmp);
! 1713: if (!(phy_tmp & SR_1000T_MS_CONFIG_FAULT))
! 1714: return;
! 1715: em_read_phy_reg(&sc->hw, PHY_1000T_STATUS, &phy_tmp);
! 1716: if (phy_tmp & SR_1000T_MS_CONFIG_FAULT) {
! 1717: em_read_phy_reg(&sc->hw, PHY_1000T_CTRL,
! 1718: &phy_tmp);
! 1719: if (phy_tmp & CR_1000T_MS_ENABLE) {
! 1720: phy_tmp &= ~CR_1000T_MS_ENABLE;
! 1721: em_write_phy_reg(&sc->hw,
! 1722: PHY_1000T_CTRL, phy_tmp);
! 1723: sc->smartspeed++;
! 1724: if (sc->hw.autoneg &&
! 1725: !em_phy_setup_autoneg(&sc->hw) &&
! 1726: !em_read_phy_reg(&sc->hw, PHY_CTRL,
! 1727: &phy_tmp)) {
! 1728: phy_tmp |= (MII_CR_AUTO_NEG_EN |
! 1729: MII_CR_RESTART_AUTO_NEG);
! 1730: em_write_phy_reg(&sc->hw,
! 1731: PHY_CTRL, phy_tmp);
! 1732: }
! 1733: }
! 1734: }
! 1735: return;
! 1736: } else if (sc->smartspeed == EM_SMARTSPEED_DOWNSHIFT) {
! 1737: /* If still no link, perhaps using 2/3 pair cable */
! 1738: em_read_phy_reg(&sc->hw, PHY_1000T_CTRL, &phy_tmp);
! 1739: phy_tmp |= CR_1000T_MS_ENABLE;
! 1740: em_write_phy_reg(&sc->hw, PHY_1000T_CTRL, phy_tmp);
! 1741: if (sc->hw.autoneg &&
! 1742: !em_phy_setup_autoneg(&sc->hw) &&
! 1743: !em_read_phy_reg(&sc->hw, PHY_CTRL, &phy_tmp)) {
! 1744: phy_tmp |= (MII_CR_AUTO_NEG_EN |
! 1745: MII_CR_RESTART_AUTO_NEG);
! 1746: em_write_phy_reg(&sc->hw, PHY_CTRL, phy_tmp);
! 1747: }
! 1748: }
! 1749: /* Restart process after EM_SMARTSPEED_MAX iterations */
! 1750: if (sc->smartspeed++ == EM_SMARTSPEED_MAX)
! 1751: sc->smartspeed = 0;
! 1752: }
! 1753:
! 1754: /*
! 1755: * Manage DMA'able memory.
! 1756: */
! 1757: int
! 1758: em_dma_malloc(struct em_softc *sc, bus_size_t size,
! 1759: struct em_dma_alloc *dma, int mapflags)
! 1760: {
! 1761: int r;
! 1762:
! 1763: dma->dma_tag = sc->osdep.em_pa.pa_dmat;
! 1764: r = bus_dmamap_create(dma->dma_tag, size, 1,
! 1765: size, 0, BUS_DMA_NOWAIT, &dma->dma_map);
! 1766: if (r != 0) {
! 1767: printf("%s: em_dma_malloc: bus_dmamap_create failed; "
! 1768: "error %u\n", sc->sc_dv.dv_xname, r);
! 1769: goto fail_0;
! 1770: }
! 1771:
! 1772: r = bus_dmamem_alloc(dma->dma_tag, size, PAGE_SIZE, 0, &dma->dma_seg,
! 1773: 1, &dma->dma_nseg, BUS_DMA_NOWAIT);
! 1774: if (r != 0) {
! 1775: printf("%s: em_dma_malloc: bus_dmammem_alloc failed; "
! 1776: "size %lu, error %d\n", sc->sc_dv.dv_xname,
! 1777: (unsigned long)size, r);
! 1778: goto fail_1;
! 1779: }
! 1780:
! 1781: r = bus_dmamem_map(dma->dma_tag, &dma->dma_seg, dma->dma_nseg, size,
! 1782: &dma->dma_vaddr, BUS_DMA_NOWAIT);
! 1783: if (r != 0) {
! 1784: printf("%s: em_dma_malloc: bus_dmammem_map failed; "
! 1785: "size %lu, error %d\n", sc->sc_dv.dv_xname,
! 1786: (unsigned long)size, r);
! 1787: goto fail_2;
! 1788: }
! 1789:
! 1790: r = bus_dmamap_load(sc->osdep.em_pa.pa_dmat, dma->dma_map,
! 1791: dma->dma_vaddr,
! 1792: size,
! 1793: NULL,
! 1794: mapflags | BUS_DMA_NOWAIT);
! 1795: if (r != 0) {
! 1796: printf("%s: em_dma_malloc: bus_dmamap_load failed; "
! 1797: "error %u\n", sc->sc_dv.dv_xname, r);
! 1798: goto fail_3;
! 1799: }
! 1800:
! 1801: dma->dma_size = size;
! 1802: return (0);
! 1803:
! 1804: fail_3:
! 1805: bus_dmamem_unmap(dma->dma_tag, dma->dma_vaddr, size);
! 1806: fail_2:
! 1807: bus_dmamem_free(dma->dma_tag, &dma->dma_seg, dma->dma_nseg);
! 1808: fail_1:
! 1809: bus_dmamap_destroy(dma->dma_tag, dma->dma_map);
! 1810: fail_0:
! 1811: dma->dma_map = NULL;
! 1812: dma->dma_tag = NULL;
! 1813:
! 1814: return (r);
! 1815: }
! 1816:
! 1817: void
! 1818: em_dma_free(struct em_softc *sc, struct em_dma_alloc *dma)
! 1819: {
! 1820: if (dma->dma_tag == NULL)
! 1821: return;
! 1822:
! 1823: if (dma->dma_map != NULL) {
! 1824: bus_dmamap_sync(dma->dma_tag, dma->dma_map, 0,
! 1825: dma->dma_map->dm_mapsize,
! 1826: BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
! 1827: bus_dmamap_unload(dma->dma_tag, dma->dma_map);
! 1828: bus_dmamem_unmap(dma->dma_tag, dma->dma_vaddr, dma->dma_size);
! 1829: bus_dmamem_free(dma->dma_tag, &dma->dma_seg, dma->dma_nseg);
! 1830: bus_dmamap_destroy(dma->dma_tag, dma->dma_map);
! 1831: }
! 1832: dma->dma_tag = NULL;
! 1833: }
! 1834:
! 1835: /*********************************************************************
! 1836: *
! 1837: * Allocate memory for tx_buffer structures. The tx_buffer stores all
! 1838: * the information needed to transmit a packet on the wire.
! 1839: *
! 1840: **********************************************************************/
! 1841: int
! 1842: em_allocate_transmit_structures(struct em_softc *sc)
! 1843: {
! 1844: if (!(sc->tx_buffer_area =
! 1845: (struct em_buffer *) malloc(sizeof(struct em_buffer) *
! 1846: sc->num_tx_desc, M_DEVBUF,
! 1847: M_NOWAIT))) {
! 1848: printf("%s: Unable to allocate tx_buffer memory\n",
! 1849: sc->sc_dv.dv_xname);
! 1850: return (ENOMEM);
! 1851: }
! 1852:
! 1853: bzero(sc->tx_buffer_area,
! 1854: sizeof(struct em_buffer) * sc->num_tx_desc);
! 1855:
! 1856: return (0);
! 1857: }
! 1858:
! 1859: /*********************************************************************
! 1860: *
! 1861: * Allocate and initialize transmit structures.
! 1862: *
! 1863: **********************************************************************/
! 1864: int
! 1865: em_setup_transmit_structures(struct em_softc *sc)
! 1866: {
! 1867: struct em_buffer *tx_buffer;
! 1868: int error, i;
! 1869:
! 1870: if ((error = em_allocate_transmit_structures(sc)) != 0)
! 1871: goto fail;
! 1872:
! 1873: bzero((void *) sc->tx_desc_base,
! 1874: (sizeof(struct em_tx_desc)) * sc->num_tx_desc);
! 1875:
! 1876: sc->txtag = sc->osdep.em_pa.pa_dmat;
! 1877:
! 1878: tx_buffer = sc->tx_buffer_area;
! 1879: for (i = 0; i < sc->num_tx_desc; i++) {
! 1880: error = bus_dmamap_create(sc->txtag, MAX_JUMBO_FRAME_SIZE,
! 1881: EM_MAX_SCATTER, MAX_JUMBO_FRAME_SIZE, 0,
! 1882: BUS_DMA_NOWAIT, &tx_buffer->map);
! 1883: if (error != 0) {
! 1884: printf("%s: Unable to create TX DMA map\n",
! 1885: sc->sc_dv.dv_xname);
! 1886: goto fail;
! 1887: }
! 1888: tx_buffer++;
! 1889: }
! 1890:
! 1891: sc->next_avail_tx_desc = 0;
! 1892: sc->next_tx_to_clean = 0;
! 1893:
! 1894: /* Set number of descriptors available */
! 1895: sc->num_tx_desc_avail = sc->num_tx_desc;
! 1896:
! 1897: /* Set checksum context */
! 1898: sc->active_checksum_context = OFFLOAD_NONE;
! 1899: bus_dmamap_sync(sc->txdma.dma_tag, sc->txdma.dma_map, 0,
! 1900: sc->txdma.dma_size, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
! 1901:
! 1902: return (0);
! 1903:
! 1904: fail:
! 1905: em_free_transmit_structures(sc);
! 1906: return (error);
! 1907: }
! 1908:
! 1909: /*********************************************************************
! 1910: *
! 1911: * Enable transmit unit.
! 1912: *
! 1913: **********************************************************************/
! 1914: void
! 1915: em_initialize_transmit_unit(struct em_softc *sc)
! 1916: {
! 1917: u_int32_t reg_tctl, reg_tipg = 0;
! 1918: u_int64_t bus_addr;
! 1919:
! 1920: INIT_DEBUGOUT("em_initialize_transmit_unit: begin");
! 1921:
! 1922: /* Setup the Base and Length of the Tx Descriptor Ring */
! 1923: bus_addr = sc->txdma.dma_map->dm_segs[0].ds_addr;
! 1924: E1000_WRITE_REG(&sc->hw, TDLEN,
! 1925: sc->num_tx_desc *
! 1926: sizeof(struct em_tx_desc));
! 1927: E1000_WRITE_REG(&sc->hw, TDBAH, (u_int32_t)(bus_addr >> 32));
! 1928: E1000_WRITE_REG(&sc->hw, TDBAL, (u_int32_t)bus_addr);
! 1929:
! 1930: /* Setup the HW Tx Head and Tail descriptor pointers */
! 1931: E1000_WRITE_REG(&sc->hw, TDT, 0);
! 1932: E1000_WRITE_REG(&sc->hw, TDH, 0);
! 1933:
! 1934: HW_DEBUGOUT2("Base = %x, Length = %x\n",
! 1935: E1000_READ_REG(&sc->hw, TDBAL),
! 1936: E1000_READ_REG(&sc->hw, TDLEN));
! 1937:
! 1938: /* Set the default values for the Tx Inter Packet Gap timer */
! 1939: switch (sc->hw.mac_type) {
! 1940: case em_82542_rev2_0:
! 1941: case em_82542_rev2_1:
! 1942: reg_tipg = DEFAULT_82542_TIPG_IPGT;
! 1943: reg_tipg |= DEFAULT_82542_TIPG_IPGR1 << E1000_TIPG_IPGR1_SHIFT;
! 1944: reg_tipg |= DEFAULT_82542_TIPG_IPGR2 << E1000_TIPG_IPGR2_SHIFT;
! 1945: break;
! 1946: case em_80003es2lan:
! 1947: reg_tipg = DEFAULT_82543_TIPG_IPGR1;
! 1948: reg_tipg |= DEFAULT_80003ES2LAN_TIPG_IPGR2 << E1000_TIPG_IPGR2_SHIFT;
! 1949: break;
! 1950: default:
! 1951: if (sc->hw.media_type == em_media_type_fiber ||
! 1952: sc->hw.media_type == em_media_type_internal_serdes)
! 1953: reg_tipg = DEFAULT_82543_TIPG_IPGT_FIBER;
! 1954: else
! 1955: reg_tipg = DEFAULT_82543_TIPG_IPGT_COPPER;
! 1956: reg_tipg |= DEFAULT_82543_TIPG_IPGR1 << E1000_TIPG_IPGR1_SHIFT;
! 1957: reg_tipg |= DEFAULT_82543_TIPG_IPGR2 << E1000_TIPG_IPGR2_SHIFT;
! 1958: }
! 1959:
! 1960: E1000_WRITE_REG(&sc->hw, TIPG, reg_tipg);
! 1961: E1000_WRITE_REG(&sc->hw, TIDV, sc->tx_int_delay);
! 1962: if (sc->hw.mac_type >= em_82540)
! 1963: E1000_WRITE_REG(&sc->hw, TADV, sc->tx_abs_int_delay);
! 1964:
! 1965: /* Program the Transmit Control Register */
! 1966: reg_tctl = E1000_TCTL_PSP | E1000_TCTL_EN |
! 1967: (E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT);
! 1968: if (sc->hw.mac_type >= em_82571)
! 1969: reg_tctl |= E1000_TCTL_MULR;
! 1970: if (sc->link_duplex == FULL_DUPLEX)
! 1971: reg_tctl |= E1000_FDX_COLLISION_DISTANCE << E1000_COLD_SHIFT;
! 1972: else
! 1973: reg_tctl |= E1000_HDX_COLLISION_DISTANCE << E1000_COLD_SHIFT;
! 1974: /* This write will effectively turn on the transmit unit */
! 1975: E1000_WRITE_REG(&sc->hw, TCTL, reg_tctl);
! 1976:
! 1977: /* Setup Transmit Descriptor Base Settings */
! 1978: sc->txd_cmd = E1000_TXD_CMD_IFCS;
! 1979:
! 1980: if (sc->tx_int_delay > 0)
! 1981: sc->txd_cmd |= E1000_TXD_CMD_IDE;
! 1982: }
! 1983:
! 1984: /*********************************************************************
! 1985: *
! 1986: * Free all transmit related data structures.
! 1987: *
! 1988: **********************************************************************/
! 1989: void
! 1990: em_free_transmit_structures(struct em_softc *sc)
! 1991: {
! 1992: struct em_buffer *tx_buffer;
! 1993: int i;
! 1994:
! 1995: INIT_DEBUGOUT("free_transmit_structures: begin");
! 1996:
! 1997: if (sc->tx_buffer_area != NULL) {
! 1998: tx_buffer = sc->tx_buffer_area;
! 1999: for (i = 0; i < sc->num_tx_desc; i++, tx_buffer++) {
! 2000: if (tx_buffer->map != NULL &&
! 2001: tx_buffer->map->dm_nsegs > 0) {
! 2002: bus_dmamap_sync(sc->txtag, tx_buffer->map,
! 2003: 0, tx_buffer->map->dm_mapsize,
! 2004: BUS_DMASYNC_POSTWRITE);
! 2005: bus_dmamap_unload(sc->txtag,
! 2006: tx_buffer->map);
! 2007: }
! 2008: if (tx_buffer->m_head != NULL) {
! 2009: m_freem(tx_buffer->m_head);
! 2010: tx_buffer->m_head = NULL;
! 2011: }
! 2012: if (tx_buffer->map != NULL) {
! 2013: bus_dmamap_destroy(sc->txtag,
! 2014: tx_buffer->map);
! 2015: tx_buffer->map = NULL;
! 2016: }
! 2017: }
! 2018: }
! 2019: if (sc->tx_buffer_area != NULL) {
! 2020: free(sc->tx_buffer_area, M_DEVBUF);
! 2021: sc->tx_buffer_area = NULL;
! 2022: }
! 2023: if (sc->txtag != NULL)
! 2024: sc->txtag = NULL;
! 2025: }
! 2026:
! 2027: #ifdef EM_CSUM_OFFLOAD
! 2028: /*********************************************************************
! 2029: *
! 2030: * The offload context needs to be set when we transfer the first
! 2031: * packet of a particular protocol (TCP/UDP). We change the
! 2032: * context only if the protocol type changes.
! 2033: *
! 2034: **********************************************************************/
! 2035: void
! 2036: em_transmit_checksum_setup(struct em_softc *sc, struct mbuf *mp,
! 2037: u_int32_t *txd_upper, u_int32_t *txd_lower)
! 2038: {
! 2039: struct em_context_desc *TXD;
! 2040: struct em_buffer *tx_buffer;
! 2041: int curr_txd;
! 2042:
! 2043: if (mp->m_pkthdr.csum_flags) {
! 2044: if (mp->m_pkthdr.csum_flags & M_TCPV4_CSUM_OUT) {
! 2045: *txd_upper = E1000_TXD_POPTS_TXSM << 8;
! 2046: *txd_lower = E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D;
! 2047: if (sc->active_checksum_context == OFFLOAD_TCP_IP)
! 2048: return;
! 2049: else
! 2050: sc->active_checksum_context = OFFLOAD_TCP_IP;
! 2051: } else if (mp->m_pkthdr.csum_flags & M_UDPV4_CSUM_OUT) {
! 2052: *txd_upper = E1000_TXD_POPTS_TXSM << 8;
! 2053: *txd_lower = E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D;
! 2054: if (sc->active_checksum_context == OFFLOAD_UDP_IP)
! 2055: return;
! 2056: else
! 2057: sc->active_checksum_context = OFFLOAD_UDP_IP;
! 2058: } else {
! 2059: *txd_upper = 0;
! 2060: *txd_lower = 0;
! 2061: return;
! 2062: }
! 2063: } else {
! 2064: *txd_upper = 0;
! 2065: *txd_lower = 0;
! 2066: return;
! 2067: }
! 2068:
! 2069: /* If we reach this point, the checksum offload context
! 2070: * needs to be reset.
! 2071: */
! 2072: curr_txd = sc->next_avail_tx_desc;
! 2073: tx_buffer = &sc->tx_buffer_area[curr_txd];
! 2074: TXD = (struct em_context_desc *) &sc->tx_desc_base[curr_txd];
! 2075:
! 2076: TXD->lower_setup.ip_fields.ipcss = ETHER_HDR_LEN;
! 2077: TXD->lower_setup.ip_fields.ipcso =
! 2078: ETHER_HDR_LEN + offsetof(struct ip, ip_sum);
! 2079: TXD->lower_setup.ip_fields.ipcse =
! 2080: htole16(ETHER_HDR_LEN + sizeof(struct ip) - 1);
! 2081:
! 2082: TXD->upper_setup.tcp_fields.tucss =
! 2083: ETHER_HDR_LEN + sizeof(struct ip);
! 2084: TXD->upper_setup.tcp_fields.tucse = htole16(0);
! 2085:
! 2086: if (sc->active_checksum_context == OFFLOAD_TCP_IP) {
! 2087: TXD->upper_setup.tcp_fields.tucso =
! 2088: ETHER_HDR_LEN + sizeof(struct ip) +
! 2089: offsetof(struct tcphdr, th_sum);
! 2090: } else if (sc->active_checksum_context == OFFLOAD_UDP_IP) {
! 2091: TXD->upper_setup.tcp_fields.tucso =
! 2092: ETHER_HDR_LEN + sizeof(struct ip) +
! 2093: offsetof(struct udphdr, uh_sum);
! 2094: }
! 2095:
! 2096: TXD->tcp_seg_setup.data = htole32(0);
! 2097: TXD->cmd_and_length = htole32(sc->txd_cmd | E1000_TXD_CMD_DEXT);
! 2098:
! 2099: tx_buffer->m_head = NULL;
! 2100: tx_buffer->next_eop = -1;
! 2101:
! 2102: if (++curr_txd == sc->num_tx_desc)
! 2103: curr_txd = 0;
! 2104:
! 2105: sc->num_tx_desc_avail--;
! 2106: sc->next_avail_tx_desc = curr_txd;
! 2107: }
! 2108: #endif /* EM_CSUM_OFFLOAD */
! 2109:
! 2110: /**********************************************************************
! 2111: *
! 2112: * Examine each tx_buffer in the used queue. If the hardware is done
! 2113: * processing the packet then free associated resources. The
! 2114: * tx_buffer is put back on the free queue.
! 2115: *
! 2116: **********************************************************************/
! 2117: void
! 2118: em_txeof(struct em_softc *sc)
! 2119: {
! 2120: int first, last, done, num_avail;
! 2121: struct em_buffer *tx_buffer;
! 2122: struct em_tx_desc *tx_desc, *eop_desc;
! 2123: struct ifnet *ifp = &sc->interface_data.ac_if;
! 2124:
! 2125: if (sc->num_tx_desc_avail == sc->num_tx_desc)
! 2126: return;
! 2127:
! 2128: num_avail = sc->num_tx_desc_avail;
! 2129: first = sc->next_tx_to_clean;
! 2130: tx_desc = &sc->tx_desc_base[first];
! 2131: tx_buffer = &sc->tx_buffer_area[first];
! 2132: last = tx_buffer->next_eop;
! 2133: eop_desc = &sc->tx_desc_base[last];
! 2134:
! 2135: /*
! 2136: * What this does is get the index of the
! 2137: * first descriptor AFTER the EOP of the
! 2138: * first packet, that way we can do the
! 2139: * simple comparison on the inner while loop.
! 2140: */
! 2141: if (++last == sc->num_tx_desc)
! 2142: last = 0;
! 2143: done = last;
! 2144:
! 2145: bus_dmamap_sync(sc->txdma.dma_tag, sc->txdma.dma_map, 0,
! 2146: sc->txdma.dma_map->dm_mapsize, BUS_DMASYNC_POSTREAD);
! 2147: while (eop_desc->upper.fields.status & E1000_TXD_STAT_DD) {
! 2148: /* We clean the range of the packet */
! 2149: while (first != done) {
! 2150: tx_desc->upper.data = 0;
! 2151: tx_desc->lower.data = 0;
! 2152: num_avail++;
! 2153:
! 2154: if (tx_buffer->m_head != NULL) {
! 2155: ifp->if_opackets++;
! 2156: if (tx_buffer->map->dm_nsegs > 0) {
! 2157: bus_dmamap_sync(sc->txtag,
! 2158: tx_buffer->map, 0,
! 2159: tx_buffer->map->dm_mapsize,
! 2160: BUS_DMASYNC_POSTWRITE);
! 2161: bus_dmamap_unload(sc->txtag,
! 2162: tx_buffer->map);
! 2163: }
! 2164: m_freem(tx_buffer->m_head);
! 2165: tx_buffer->m_head = NULL;
! 2166: }
! 2167: tx_buffer->next_eop = -1;
! 2168:
! 2169: if (++first == sc->num_tx_desc)
! 2170: first = 0;
! 2171:
! 2172: tx_buffer = &sc->tx_buffer_area[first];
! 2173: tx_desc = &sc->tx_desc_base[first];
! 2174: }
! 2175: /* See if we can continue to the next packet */
! 2176: last = tx_buffer->next_eop;
! 2177: if (last != -1) {
! 2178: eop_desc = &sc->tx_desc_base[last];
! 2179: /* Get new done point */
! 2180: if (++last == sc->num_tx_desc)
! 2181: last = 0;
! 2182: done = last;
! 2183: } else
! 2184: break;
! 2185: }
! 2186: bus_dmamap_sync(sc->txdma.dma_tag, sc->txdma.dma_map, 0,
! 2187: sc->txdma.dma_map->dm_mapsize,
! 2188: BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
! 2189:
! 2190: sc->next_tx_to_clean = first;
! 2191:
! 2192: /*
! 2193: * If we have enough room, clear IFF_OACTIVE to tell the stack
! 2194: * that it is OK to send packets.
! 2195: * If there are no pending descriptors, clear the timeout. Otherwise,
! 2196: * if some descriptors have been freed, restart the timeout.
! 2197: */
! 2198: if (num_avail > EM_TX_CLEANUP_THRESHOLD) {
! 2199: ifp->if_flags &= ~IFF_OACTIVE;
! 2200: /* All clean, turn off the timer */
! 2201: if (num_avail == sc->num_tx_desc)
! 2202: ifp->if_timer = 0;
! 2203: /* Some cleaned, reset the timer */
! 2204: else if (num_avail != sc->num_tx_desc_avail)
! 2205: ifp->if_timer = EM_TX_TIMEOUT;
! 2206: }
! 2207: sc->num_tx_desc_avail = num_avail;
! 2208: }
! 2209:
! 2210: /*********************************************************************
! 2211: *
! 2212: * Get a buffer from system mbuf buffer pool.
! 2213: *
! 2214: **********************************************************************/
! 2215: int
! 2216: em_get_buf(struct em_softc *sc, int i)
! 2217: {
! 2218: struct mbuf *m;
! 2219: bus_dmamap_t map;
! 2220: struct em_buffer *rx_buffer;
! 2221: int error;
! 2222:
! 2223: MGETHDR(m, M_DONTWAIT, MT_DATA);
! 2224: if (m == NULL) {
! 2225: sc->mbuf_alloc_failed++;
! 2226: return (ENOBUFS);
! 2227: }
! 2228: MCLGET(m, M_DONTWAIT);
! 2229: if ((m->m_flags & M_EXT) == 0) {
! 2230: m_freem(m);
! 2231: sc->mbuf_cluster_failed++;
! 2232: return (ENOBUFS);
! 2233: }
! 2234: m->m_len = m->m_pkthdr.len = MCLBYTES;
! 2235:
! 2236: if (sc->hw.max_frame_size <= (MCLBYTES - ETHER_ALIGN))
! 2237: m_adj(m, ETHER_ALIGN);
! 2238:
! 2239: /*
! 2240: * Using memory from the mbuf cluster pool, invoke the
! 2241: * bus_dma machinery to arrange the memory mapping.
! 2242: */
! 2243: error = bus_dmamap_load_mbuf(sc->rxtag, sc->rx_sparemap,
! 2244: m, BUS_DMA_NOWAIT);
! 2245: if (error) {
! 2246: m_free(m);
! 2247: return (error);
! 2248: }
! 2249:
! 2250: rx_buffer = &sc->rx_buffer_area[i];
! 2251: if (rx_buffer->m_head != NULL)
! 2252: bus_dmamap_unload(sc->rxtag, rx_buffer->map);
! 2253:
! 2254: map = rx_buffer->map;
! 2255: rx_buffer->map = sc->rx_sparemap;
! 2256: sc->rx_sparemap = map;
! 2257:
! 2258: bus_dmamap_sync(sc->rxtag, rx_buffer->map, 0,
! 2259: rx_buffer->map->dm_mapsize, BUS_DMASYNC_PREREAD);
! 2260:
! 2261: rx_buffer->m_head = m;
! 2262:
! 2263: sc->rx_desc_base[i].buffer_addr = htole64(rx_buffer->map->dm_segs[0].ds_addr);
! 2264:
! 2265: return (0);
! 2266: }
! 2267:
! 2268: /*********************************************************************
! 2269: *
! 2270: * Allocate memory for rx_buffer structures. Since we use one
! 2271: * rx_buffer per received packet, the maximum number of rx_buffer's
! 2272: * that we'll need is equal to the number of receive descriptors
! 2273: * that we've allocated.
! 2274: *
! 2275: **********************************************************************/
! 2276: int
! 2277: em_allocate_receive_structures(struct em_softc *sc)
! 2278: {
! 2279: int i, error;
! 2280: struct em_buffer *rx_buffer;
! 2281:
! 2282: if (!(sc->rx_buffer_area =
! 2283: (struct em_buffer *) malloc(sizeof(struct em_buffer) *
! 2284: sc->num_rx_desc, M_DEVBUF,
! 2285: M_NOWAIT))) {
! 2286: printf("%s: Unable to allocate rx_buffer memory\n",
! 2287: sc->sc_dv.dv_xname);
! 2288: return (ENOMEM);
! 2289: }
! 2290:
! 2291: bzero(sc->rx_buffer_area,
! 2292: sizeof(struct em_buffer) * sc->num_rx_desc);
! 2293:
! 2294: sc->rxtag = sc->osdep.em_pa.pa_dmat;
! 2295:
! 2296: error = bus_dmamap_create(sc->rxtag, MCLBYTES, 1, MCLBYTES,
! 2297: 0, BUS_DMA_NOWAIT, &sc->rx_sparemap);
! 2298: if (error != 0) {
! 2299: printf("%s: em_allocate_receive_structures: "
! 2300: "bus_dmamap_create failed; error %u\n",
! 2301: sc->sc_dv.dv_xname, error);
! 2302: goto fail;
! 2303: }
! 2304:
! 2305: rx_buffer = sc->rx_buffer_area;
! 2306: for (i = 0; i < sc->num_rx_desc; i++, rx_buffer++) {
! 2307: error = bus_dmamap_create(sc->rxtag, MCLBYTES, 1,
! 2308: MCLBYTES, 0, BUS_DMA_NOWAIT,
! 2309: &rx_buffer->map);
! 2310: if (error != 0) {
! 2311: printf("%s: em_allocate_receive_structures: "
! 2312: "bus_dmamap_create failed; error %u\n",
! 2313: sc->sc_dv.dv_xname, error);
! 2314: goto fail;
! 2315: }
! 2316: }
! 2317:
! 2318: for (i = 0; i < sc->num_rx_desc; i++) {
! 2319: error = em_get_buf(sc, i);
! 2320: if (error != 0)
! 2321: goto fail;
! 2322: }
! 2323: bus_dmamap_sync(sc->rxdma.dma_tag, sc->rxdma.dma_map, 0,
! 2324: sc->rxdma.dma_map->dm_mapsize,
! 2325: BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
! 2326:
! 2327: return (0);
! 2328:
! 2329: fail:
! 2330: em_free_receive_structures(sc);
! 2331: return (error);
! 2332: }
! 2333:
! 2334: /*********************************************************************
! 2335: *
! 2336: * Allocate and initialize receive structures.
! 2337: *
! 2338: **********************************************************************/
! 2339: int
! 2340: em_setup_receive_structures(struct em_softc *sc)
! 2341: {
! 2342: bzero((void *) sc->rx_desc_base,
! 2343: (sizeof(struct em_rx_desc)) * sc->num_rx_desc);
! 2344:
! 2345: if (em_allocate_receive_structures(sc))
! 2346: return (ENOMEM);
! 2347:
! 2348: /* Setup our descriptor pointers */
! 2349: sc->next_rx_desc_to_check = 0;
! 2350: return (0);
! 2351: }
! 2352:
! 2353: /*********************************************************************
! 2354: *
! 2355: * Enable receive unit.
! 2356: *
! 2357: **********************************************************************/
! 2358: void
! 2359: em_initialize_receive_unit(struct em_softc *sc)
! 2360: {
! 2361: u_int32_t reg_rctl;
! 2362: u_int32_t reg_rxcsum;
! 2363: struct ifnet *ifp;
! 2364: u_int64_t bus_addr;
! 2365:
! 2366: INIT_DEBUGOUT("em_initialize_receive_unit: begin");
! 2367: ifp = &sc->interface_data.ac_if;
! 2368:
! 2369: /* Make sure receives are disabled while setting up the descriptor ring */
! 2370: E1000_WRITE_REG(&sc->hw, RCTL, 0);
! 2371:
! 2372: /* Set the Receive Delay Timer Register */
! 2373: E1000_WRITE_REG(&sc->hw, RDTR,
! 2374: sc->rx_int_delay | E1000_RDT_FPDB);
! 2375:
! 2376: if (sc->hw.mac_type >= em_82540) {
! 2377: E1000_WRITE_REG(&sc->hw, RADV, sc->rx_abs_int_delay);
! 2378:
! 2379: /* Set the interrupt throttling rate. Value is calculated
! 2380: * as DEFAULT_ITR = 1/(MAX_INTS_PER_SEC * 256ns) */
! 2381: E1000_WRITE_REG(&sc->hw, ITR, DEFAULT_ITR);
! 2382: }
! 2383:
! 2384: /* Setup the Base and Length of the Rx Descriptor Ring */
! 2385: bus_addr = sc->rxdma.dma_map->dm_segs[0].ds_addr;
! 2386: E1000_WRITE_REG(&sc->hw, RDLEN, sc->num_rx_desc *
! 2387: sizeof(struct em_rx_desc));
! 2388: E1000_WRITE_REG(&sc->hw, RDBAH, (u_int32_t)(bus_addr >> 32));
! 2389: E1000_WRITE_REG(&sc->hw, RDBAL, (u_int32_t)bus_addr);
! 2390:
! 2391: /* Setup the Receive Control Register */
! 2392: reg_rctl = E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_LBM_NO |
! 2393: E1000_RCTL_RDMTS_HALF |
! 2394: (sc->hw.mc_filter_type << E1000_RCTL_MO_SHIFT);
! 2395:
! 2396: if (sc->hw.tbi_compatibility_on == TRUE)
! 2397: reg_rctl |= E1000_RCTL_SBP;
! 2398:
! 2399: switch (sc->rx_buffer_len) {
! 2400: default:
! 2401: case EM_RXBUFFER_2048:
! 2402: reg_rctl |= E1000_RCTL_SZ_2048;
! 2403: break;
! 2404: case EM_RXBUFFER_4096:
! 2405: reg_rctl |= E1000_RCTL_SZ_4096|E1000_RCTL_BSEX|E1000_RCTL_LPE;
! 2406: break;
! 2407: case EM_RXBUFFER_8192:
! 2408: reg_rctl |= E1000_RCTL_SZ_8192|E1000_RCTL_BSEX|E1000_RCTL_LPE;
! 2409: break;
! 2410: case EM_RXBUFFER_16384:
! 2411: reg_rctl |= E1000_RCTL_SZ_16384|E1000_RCTL_BSEX|E1000_RCTL_LPE;
! 2412: break;
! 2413: }
! 2414:
! 2415: if (sc->hw.max_frame_size != ETHER_MAX_LEN)
! 2416: reg_rctl |= E1000_RCTL_LPE;
! 2417:
! 2418: /* Enable 82543 Receive Checksum Offload for TCP and UDP */
! 2419: if (sc->hw.mac_type >= em_82543) {
! 2420: reg_rxcsum = E1000_READ_REG(&sc->hw, RXCSUM);
! 2421: reg_rxcsum |= (E1000_RXCSUM_IPOFL | E1000_RXCSUM_TUOFL);
! 2422: E1000_WRITE_REG(&sc->hw, RXCSUM, reg_rxcsum);
! 2423: }
! 2424:
! 2425: /* Enable Receives */
! 2426: E1000_WRITE_REG(&sc->hw, RCTL, reg_rctl);
! 2427:
! 2428: /* Setup the HW Rx Head and Tail Descriptor Pointers */
! 2429: E1000_WRITE_REG(&sc->hw, RDH, 0);
! 2430: E1000_WRITE_REG(&sc->hw, RDT, sc->num_rx_desc - 1);
! 2431: }
! 2432:
! 2433: /*********************************************************************
! 2434: *
! 2435: * Free receive related data structures.
! 2436: *
! 2437: **********************************************************************/
! 2438: void
! 2439: em_free_receive_structures(struct em_softc *sc)
! 2440: {
! 2441: struct em_buffer *rx_buffer;
! 2442: int i;
! 2443:
! 2444: INIT_DEBUGOUT("free_receive_structures: begin");
! 2445:
! 2446: if (sc->rx_sparemap) {
! 2447: bus_dmamap_destroy(sc->rxtag, sc->rx_sparemap);
! 2448: sc->rx_sparemap = NULL;
! 2449: }
! 2450: if (sc->rx_buffer_area != NULL) {
! 2451: rx_buffer = sc->rx_buffer_area;
! 2452: for (i = 0; i < sc->num_rx_desc; i++, rx_buffer++) {
! 2453: if (rx_buffer->map != NULL &&
! 2454: rx_buffer->map->dm_nsegs > 0) {
! 2455: bus_dmamap_sync(sc->rxtag, rx_buffer->map,
! 2456: 0, rx_buffer->map->dm_mapsize,
! 2457: BUS_DMASYNC_POSTREAD);
! 2458: bus_dmamap_unload(sc->rxtag,
! 2459: rx_buffer->map);
! 2460: }
! 2461: if (rx_buffer->m_head != NULL) {
! 2462: m_freem(rx_buffer->m_head);
! 2463: rx_buffer->m_head = NULL;
! 2464: }
! 2465: if (rx_buffer->map != NULL) {
! 2466: bus_dmamap_destroy(sc->rxtag,
! 2467: rx_buffer->map);
! 2468: rx_buffer->map = NULL;
! 2469: }
! 2470: }
! 2471: }
! 2472: if (sc->rx_buffer_area != NULL) {
! 2473: free(sc->rx_buffer_area, M_DEVBUF);
! 2474: sc->rx_buffer_area = NULL;
! 2475: }
! 2476: if (sc->rxtag != NULL)
! 2477: sc->rxtag = NULL;
! 2478: }
! 2479:
! 2480: /*********************************************************************
! 2481: *
! 2482: * This routine executes in interrupt context. It replenishes
! 2483: * the mbufs in the descriptor and sends data which has been
! 2484: * dma'ed into host memory to upper layer.
! 2485: *
! 2486: * We loop at most count times if count is > 0, or until done if
! 2487: * count < 0.
! 2488: *
! 2489: *********************************************************************/
! 2490: void
! 2491: em_rxeof(struct em_softc *sc, int count)
! 2492: {
! 2493: struct ifnet *ifp;
! 2494: struct mbuf *mp;
! 2495: u_int8_t accept_frame = 0;
! 2496: u_int8_t eop = 0;
! 2497: u_int16_t len, desc_len, prev_len_adj;
! 2498: int i;
! 2499:
! 2500: /* Pointer to the receive descriptor being examined. */
! 2501: struct em_rx_desc *current_desc;
! 2502: u_int8_t status;
! 2503:
! 2504: ifp = &sc->interface_data.ac_if;
! 2505: i = sc->next_rx_desc_to_check;
! 2506: current_desc = &sc->rx_desc_base[i];
! 2507: bus_dmamap_sync(sc->rxdma.dma_tag, sc->rxdma.dma_map, 0,
! 2508: sc->rxdma.dma_map->dm_mapsize, BUS_DMASYNC_POSTREAD);
! 2509:
! 2510: if (!((current_desc->status) & E1000_RXD_STAT_DD))
! 2511: return;
! 2512:
! 2513: while ((current_desc->status & E1000_RXD_STAT_DD) &&
! 2514: (count != 0) &&
! 2515: (ifp->if_flags & IFF_RUNNING)) {
! 2516: struct mbuf *m = NULL;
! 2517:
! 2518: mp = sc->rx_buffer_area[i].m_head;
! 2519: /*
! 2520: * Can't defer bus_dmamap_sync(9) because TBI_ACCEPT
! 2521: * needs to access the last received byte in the mbuf.
! 2522: */
! 2523: bus_dmamap_sync(sc->rxtag, sc->rx_buffer_area[i].map,
! 2524: 0, sc->rx_buffer_area[i].map->dm_mapsize,
! 2525: BUS_DMASYNC_POSTREAD);
! 2526:
! 2527: accept_frame = 1;
! 2528: prev_len_adj = 0;
! 2529: desc_len = letoh16(current_desc->length);
! 2530: status = current_desc->status;
! 2531: if (status & E1000_RXD_STAT_EOP) {
! 2532: count--;
! 2533: eop = 1;
! 2534: if (desc_len < ETHER_CRC_LEN) {
! 2535: len = 0;
! 2536: prev_len_adj = ETHER_CRC_LEN - desc_len;
! 2537: } else
! 2538: len = desc_len - ETHER_CRC_LEN;
! 2539: } else {
! 2540: eop = 0;
! 2541: len = desc_len;
! 2542: }
! 2543:
! 2544: if (current_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK) {
! 2545: u_int8_t last_byte;
! 2546: u_int32_t pkt_len = desc_len;
! 2547:
! 2548: if (sc->fmp != NULL)
! 2549: pkt_len += sc->fmp->m_pkthdr.len;
! 2550:
! 2551: last_byte = *(mtod(mp, caddr_t) + desc_len - 1);
! 2552: if (TBI_ACCEPT(&sc->hw, status, current_desc->errors,
! 2553: pkt_len, last_byte)) {
! 2554: em_tbi_adjust_stats(&sc->hw,
! 2555: &sc->stats,
! 2556: pkt_len,
! 2557: sc->hw.mac_addr);
! 2558: if (len > 0)
! 2559: len--;
! 2560: } else
! 2561: accept_frame = 0;
! 2562: }
! 2563:
! 2564: if (accept_frame) {
! 2565: if (em_get_buf(sc, i) != 0) {
! 2566: sc->dropped_pkts++;
! 2567: goto discard;
! 2568: }
! 2569:
! 2570: /* Assign correct length to the current fragment */
! 2571: mp->m_len = len;
! 2572:
! 2573: #ifdef __STRICT_ALIGNMENT
! 2574: /*
! 2575: * The Ethernet payload is not 32-bit aligned when
! 2576: * Jumbo packets are enabled, so on architectures with
! 2577: * strict alignment we need to shift the entire packet
! 2578: * ETHER_ALIGN bytes. Ugh.
! 2579: */
! 2580: if (sc->hw.max_frame_size > (MCLBYTES - ETHER_ALIGN)) {
! 2581: unsigned char tmp_align_buf[ETHER_ALIGN];
! 2582: int tmp_align_buf_len = 0;
! 2583:
! 2584: if (prev_len_adj > sc->align_buf_len)
! 2585: prev_len_adj -= sc->align_buf_len;
! 2586: else
! 2587: prev_len_adj = 0;
! 2588:
! 2589: if (mp->m_len > (MCLBYTES - ETHER_ALIGN)) {
! 2590: bcopy(mp->m_data +
! 2591: (MCLBYTES - ETHER_ALIGN),
! 2592: &tmp_align_buf,
! 2593: ETHER_ALIGN);
! 2594: tmp_align_buf_len = mp->m_len -
! 2595: (MCLBYTES - ETHER_ALIGN);
! 2596: mp->m_len -= ETHER_ALIGN;
! 2597: }
! 2598:
! 2599: if (mp->m_len) {
! 2600: bcopy(mp->m_data,
! 2601: mp->m_data + ETHER_ALIGN,
! 2602: mp->m_len);
! 2603: if (!sc->align_buf_len)
! 2604: mp->m_data += ETHER_ALIGN;
! 2605: }
! 2606:
! 2607: if (sc->align_buf_len) {
! 2608: mp->m_len += sc->align_buf_len;
! 2609: bcopy(&sc->align_buf,
! 2610: mp->m_data,
! 2611: sc->align_buf_len);
! 2612: }
! 2613:
! 2614: if (tmp_align_buf_len)
! 2615: bcopy(&tmp_align_buf,
! 2616: &sc->align_buf,
! 2617: tmp_align_buf_len);
! 2618: sc->align_buf_len = tmp_align_buf_len;
! 2619: }
! 2620: #endif /* __STRICT_ALIGNMENT */
! 2621:
! 2622: if (sc->fmp == NULL) {
! 2623: mp->m_pkthdr.len = mp->m_len;
! 2624: sc->fmp = mp; /* Store the first mbuf */
! 2625: sc->lmp = mp;
! 2626: } else {
! 2627: /* Chain mbuf's together */
! 2628: mp->m_flags &= ~M_PKTHDR;
! 2629: /*
! 2630: * Adjust length of previous mbuf in chain if we
! 2631: * received less than 4 bytes in the last descriptor.
! 2632: */
! 2633: if (prev_len_adj > 0) {
! 2634: sc->lmp->m_len -= prev_len_adj;
! 2635: sc->fmp->m_pkthdr.len -= prev_len_adj;
! 2636: }
! 2637: sc->lmp->m_next = mp;
! 2638: sc->lmp = sc->lmp->m_next;
! 2639: sc->fmp->m_pkthdr.len += mp->m_len;
! 2640: }
! 2641:
! 2642: if (eop) {
! 2643: sc->fmp->m_pkthdr.rcvif = ifp;
! 2644: ifp->if_ipackets++;
! 2645: em_receive_checksum(sc, current_desc,
! 2646: sc->fmp);
! 2647: m = sc->fmp;
! 2648: sc->fmp = NULL;
! 2649: sc->lmp = NULL;
! 2650: }
! 2651: } else {
! 2652: sc->dropped_pkts++;
! 2653: discard:
! 2654: /* Reuse loaded DMA map and just update mbuf chain */
! 2655: mp = sc->rx_buffer_area[i].m_head;
! 2656: mp->m_len = mp->m_pkthdr.len = MCLBYTES;
! 2657: mp->m_data = mp->m_ext.ext_buf;
! 2658: mp->m_next = NULL;
! 2659: if (sc->hw.max_frame_size <= (MCLBYTES - ETHER_ALIGN))
! 2660: m_adj(mp, ETHER_ALIGN);
! 2661: if (sc->fmp != NULL) {
! 2662: m_freem(sc->fmp);
! 2663: sc->fmp = NULL;
! 2664: sc->lmp = NULL;
! 2665: }
! 2666: m = NULL;
! 2667: }
! 2668:
! 2669: /* Zero out the receive descriptors status. */
! 2670: current_desc->status = 0;
! 2671: bus_dmamap_sync(sc->rxdma.dma_tag, sc->rxdma.dma_map, 0,
! 2672: sc->rxdma.dma_map->dm_mapsize,
! 2673: BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
! 2674:
! 2675: /* Advance our pointers to the next descriptor. */
! 2676: if (++i == sc->num_rx_desc)
! 2677: i = 0;
! 2678: if (m != NULL) {
! 2679: sc->next_rx_desc_to_check = i;
! 2680:
! 2681: #if NBPFILTER > 0
! 2682: /*
! 2683: * Handle BPF listeners. Let the BPF
! 2684: * user see the packet.
! 2685: */
! 2686: if (ifp->if_bpf)
! 2687: bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN);
! 2688: #endif
! 2689:
! 2690: ether_input_mbuf(ifp, m);
! 2691:
! 2692: i = sc->next_rx_desc_to_check;
! 2693: }
! 2694: current_desc = &sc->rx_desc_base[i];
! 2695: }
! 2696: sc->next_rx_desc_to_check = i;
! 2697:
! 2698: /* Advance the E1000's Receive Queue #0 "Tail Pointer". */
! 2699: if (--i < 0)
! 2700: i = sc->num_rx_desc - 1;
! 2701: E1000_WRITE_REG(&sc->hw, RDT, i);
! 2702: }
! 2703:
! 2704: /*********************************************************************
! 2705: *
! 2706: * Verify that the hardware indicated that the checksum is valid.
! 2707: * Inform the stack about the status of checksum so that stack
! 2708: * doesn't spend time verifying the checksum.
! 2709: *
! 2710: *********************************************************************/
! 2711: void
! 2712: em_receive_checksum(struct em_softc *sc, struct em_rx_desc *rx_desc,
! 2713: struct mbuf *mp)
! 2714: {
! 2715: /* 82543 or newer only */
! 2716: if ((sc->hw.mac_type < em_82543) ||
! 2717: /* Ignore Checksum bit is set */
! 2718: (rx_desc->status & E1000_RXD_STAT_IXSM)) {
! 2719: mp->m_pkthdr.csum_flags = 0;
! 2720: return;
! 2721: }
! 2722:
! 2723: if (rx_desc->status & E1000_RXD_STAT_IPCS) {
! 2724: /* Did it pass? */
! 2725: if (!(rx_desc->errors & E1000_RXD_ERR_IPE)) {
! 2726: /* IP Checksum Good */
! 2727: mp->m_pkthdr.csum_flags = M_IPV4_CSUM_IN_OK;
! 2728:
! 2729: } else
! 2730: mp->m_pkthdr.csum_flags = 0;
! 2731: }
! 2732:
! 2733: if (rx_desc->status & E1000_RXD_STAT_TCPCS) {
! 2734: /* Did it pass? */
! 2735: if (!(rx_desc->errors & E1000_RXD_ERR_TCPE))
! 2736: mp->m_pkthdr.csum_flags |=
! 2737: M_TCP_CSUM_IN_OK | M_UDP_CSUM_IN_OK;
! 2738: }
! 2739: }
! 2740:
! 2741: void
! 2742: em_enable_intr(struct em_softc *sc)
! 2743: {
! 2744: E1000_WRITE_REG(&sc->hw, IMS, (IMS_ENABLE_MASK));
! 2745: }
! 2746:
! 2747: void
! 2748: em_disable_intr(struct em_softc *sc)
! 2749: {
! 2750: /*
! 2751: * The first version of 82542 had an errata where when link
! 2752: * was forced it would stay up even if the cable was disconnected
! 2753: * Sequence errors were used to detect the disconnect and then
! 2754: * the driver would unforce the link. This code is in the ISR.
! 2755: * For this to work correctly the Sequence error interrupt had
! 2756: * to be enabled all the time.
! 2757: */
! 2758:
! 2759: if (sc->hw.mac_type == em_82542_rev2_0)
! 2760: E1000_WRITE_REG(&sc->hw, IMC, (0xffffffff & ~E1000_IMC_RXSEQ));
! 2761: else
! 2762: E1000_WRITE_REG(&sc->hw, IMC, 0xffffffff);
! 2763: }
! 2764:
! 2765: int
! 2766: em_is_valid_ether_addr(u_int8_t *addr)
! 2767: {
! 2768: const char zero_addr[6] = { 0, 0, 0, 0, 0, 0 };
! 2769:
! 2770: if ((addr[0] & 1) || (!bcmp(addr, zero_addr, ETHER_ADDR_LEN)))
! 2771: return (FALSE);
! 2772:
! 2773: return (TRUE);
! 2774: }
! 2775:
! 2776: void
! 2777: em_write_pci_cfg(struct em_hw *hw, uint32_t reg, uint16_t *value)
! 2778: {
! 2779: struct pci_attach_args *pa = &((struct em_osdep *)hw->back)->em_pa;
! 2780: pci_chipset_tag_t pc = pa->pa_pc;
! 2781: /* Should we do read/mask/write...? 16 vs 32 bit!!! */
! 2782: pci_conf_write(pc, pa->pa_tag, reg, *value);
! 2783: }
! 2784:
! 2785: void
! 2786: em_read_pci_cfg(struct em_hw *hw, uint32_t reg, uint16_t *value)
! 2787: {
! 2788: struct pci_attach_args *pa = &((struct em_osdep *)hw->back)->em_pa;
! 2789: pci_chipset_tag_t pc = pa->pa_pc;
! 2790: *value = pci_conf_read(pc, pa->pa_tag, reg);
! 2791: }
! 2792:
! 2793: void
! 2794: em_pci_set_mwi(struct em_hw *hw)
! 2795: {
! 2796: struct pci_attach_args *pa = &((struct em_osdep *)hw->back)->em_pa;
! 2797: pci_chipset_tag_t pc = pa->pa_pc;
! 2798: /* Should we do read/mask/write...? 16 vs 32 bit!!! */
! 2799: pci_conf_write(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG,
! 2800: (hw->pci_cmd_word | CMD_MEM_WRT_INVALIDATE));
! 2801: }
! 2802:
! 2803: void
! 2804: em_pci_clear_mwi(struct em_hw *hw)
! 2805: {
! 2806: struct pci_attach_args *pa = &((struct em_osdep *)hw->back)->em_pa;
! 2807: pci_chipset_tag_t pc = pa->pa_pc;
! 2808: /* Should we do read/mask/write...? 16 vs 32 bit!!! */
! 2809: pci_conf_write(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG,
! 2810: (hw->pci_cmd_word & ~CMD_MEM_WRT_INVALIDATE));
! 2811: }
! 2812:
! 2813: int32_t
! 2814: em_read_pcie_cap_reg(struct em_hw *hw, uint32_t reg, uint16_t *value)
! 2815: {
! 2816: struct pci_attach_args *pa = &((struct em_osdep *)hw->back)->em_pa;
! 2817: int32_t rc;
! 2818: u_int16_t pectl;
! 2819:
! 2820: /* find the PCIe link width and set max read request to 4KB */
! 2821: if (pci_get_capability(pa->pa_pc, pa->pa_tag, PCI_CAP_PCIEXPRESS,
! 2822: NULL, NULL) != 0) {
! 2823: em_read_pci_cfg(hw, reg + 0x12, value);
! 2824:
! 2825: em_read_pci_cfg(hw, reg + 0x8, &pectl);
! 2826: pectl = (pectl & ~0x7000) | (5 << 12);
! 2827: em_write_pci_cfg(hw, reg + 0x8, &pectl);
! 2828: rc = 0;
! 2829: } else
! 2830: rc = -1;
! 2831:
! 2832: return (rc);
! 2833: }
! 2834:
! 2835: /*********************************************************************
! 2836: * 82544 Coexistence issue workaround.
! 2837: * There are 2 issues.
! 2838: * 1. Transmit Hang issue.
! 2839: * To detect this issue, following equation can be used...
! 2840: * SIZE[3:0] + ADDR[2:0] = SUM[3:0].
! 2841: * If SUM[3:0] is in between 1 to 4, we will have this issue.
! 2842: *
! 2843: * 2. DAC issue.
! 2844: * To detect this issue, following equation can be used...
! 2845: * SIZE[3:0] + ADDR[2:0] = SUM[3:0].
! 2846: * If SUM[3:0] is in between 9 to c, we will have this issue.
! 2847: *
! 2848: *
! 2849: * WORKAROUND:
! 2850: * Make sure we do not have ending address as 1,2,3,4(Hang) or 9,a,b,c (DAC)
! 2851: *
! 2852: *** *********************************************************************/
! 2853: u_int32_t
! 2854: em_fill_descriptors(u_int64_t address, u_int32_t length,
! 2855: PDESC_ARRAY desc_array)
! 2856: {
! 2857: /* Since issue is sensitive to length and address.*/
! 2858: /* Let us first check the address...*/
! 2859: u_int32_t safe_terminator;
! 2860: if (length <= 4) {
! 2861: desc_array->descriptor[0].address = address;
! 2862: desc_array->descriptor[0].length = length;
! 2863: desc_array->elements = 1;
! 2864: return desc_array->elements;
! 2865: }
! 2866: safe_terminator = (u_int32_t)((((u_int32_t)address & 0x7) + (length & 0xF)) & 0xF);
! 2867: /* if it does not fall between 0x1 to 0x4 and 0x9 to 0xC then return */
! 2868: if (safe_terminator == 0 ||
! 2869: (safe_terminator > 4 &&
! 2870: safe_terminator < 9) ||
! 2871: (safe_terminator > 0xC &&
! 2872: safe_terminator <= 0xF)) {
! 2873: desc_array->descriptor[0].address = address;
! 2874: desc_array->descriptor[0].length = length;
! 2875: desc_array->elements = 1;
! 2876: return desc_array->elements;
! 2877: }
! 2878:
! 2879: desc_array->descriptor[0].address = address;
! 2880: desc_array->descriptor[0].length = length - 4;
! 2881: desc_array->descriptor[1].address = address + (length - 4);
! 2882: desc_array->descriptor[1].length = 4;
! 2883: desc_array->elements = 2;
! 2884: return desc_array->elements;
! 2885: }
! 2886:
! 2887: /**********************************************************************
! 2888: *
! 2889: * Update the board statistics counters.
! 2890: *
! 2891: **********************************************************************/
! 2892: void
! 2893: em_update_stats_counters(struct em_softc *sc)
! 2894: {
! 2895: struct ifnet *ifp;
! 2896:
! 2897: if (sc->hw.media_type == em_media_type_copper ||
! 2898: (E1000_READ_REG(&sc->hw, STATUS) & E1000_STATUS_LU)) {
! 2899: sc->stats.symerrs += E1000_READ_REG(&sc->hw, SYMERRS);
! 2900: sc->stats.sec += E1000_READ_REG(&sc->hw, SEC);
! 2901: }
! 2902: sc->stats.crcerrs += E1000_READ_REG(&sc->hw, CRCERRS);
! 2903: sc->stats.mpc += E1000_READ_REG(&sc->hw, MPC);
! 2904: sc->stats.scc += E1000_READ_REG(&sc->hw, SCC);
! 2905: sc->stats.ecol += E1000_READ_REG(&sc->hw, ECOL);
! 2906:
! 2907: sc->stats.mcc += E1000_READ_REG(&sc->hw, MCC);
! 2908: sc->stats.latecol += E1000_READ_REG(&sc->hw, LATECOL);
! 2909: sc->stats.colc += E1000_READ_REG(&sc->hw, COLC);
! 2910: sc->stats.dc += E1000_READ_REG(&sc->hw, DC);
! 2911: sc->stats.rlec += E1000_READ_REG(&sc->hw, RLEC);
! 2912: sc->stats.xonrxc += E1000_READ_REG(&sc->hw, XONRXC);
! 2913: sc->stats.xontxc += E1000_READ_REG(&sc->hw, XONTXC);
! 2914: sc->stats.xoffrxc += E1000_READ_REG(&sc->hw, XOFFRXC);
! 2915: sc->stats.xofftxc += E1000_READ_REG(&sc->hw, XOFFTXC);
! 2916: sc->stats.fcruc += E1000_READ_REG(&sc->hw, FCRUC);
! 2917: sc->stats.prc64 += E1000_READ_REG(&sc->hw, PRC64);
! 2918: sc->stats.prc127 += E1000_READ_REG(&sc->hw, PRC127);
! 2919: sc->stats.prc255 += E1000_READ_REG(&sc->hw, PRC255);
! 2920: sc->stats.prc511 += E1000_READ_REG(&sc->hw, PRC511);
! 2921: sc->stats.prc1023 += E1000_READ_REG(&sc->hw, PRC1023);
! 2922: sc->stats.prc1522 += E1000_READ_REG(&sc->hw, PRC1522);
! 2923: sc->stats.gprc += E1000_READ_REG(&sc->hw, GPRC);
! 2924: sc->stats.bprc += E1000_READ_REG(&sc->hw, BPRC);
! 2925: sc->stats.mprc += E1000_READ_REG(&sc->hw, MPRC);
! 2926: sc->stats.gptc += E1000_READ_REG(&sc->hw, GPTC);
! 2927:
! 2928: /* For the 64-bit byte counters the low dword must be read first. */
! 2929: /* Both registers clear on the read of the high dword */
! 2930:
! 2931: sc->stats.gorcl += E1000_READ_REG(&sc->hw, GORCL);
! 2932: sc->stats.gorch += E1000_READ_REG(&sc->hw, GORCH);
! 2933: sc->stats.gotcl += E1000_READ_REG(&sc->hw, GOTCL);
! 2934: sc->stats.gotch += E1000_READ_REG(&sc->hw, GOTCH);
! 2935:
! 2936: sc->stats.rnbc += E1000_READ_REG(&sc->hw, RNBC);
! 2937: sc->stats.ruc += E1000_READ_REG(&sc->hw, RUC);
! 2938: sc->stats.rfc += E1000_READ_REG(&sc->hw, RFC);
! 2939: sc->stats.roc += E1000_READ_REG(&sc->hw, ROC);
! 2940: sc->stats.rjc += E1000_READ_REG(&sc->hw, RJC);
! 2941:
! 2942: sc->stats.torl += E1000_READ_REG(&sc->hw, TORL);
! 2943: sc->stats.torh += E1000_READ_REG(&sc->hw, TORH);
! 2944: sc->stats.totl += E1000_READ_REG(&sc->hw, TOTL);
! 2945: sc->stats.toth += E1000_READ_REG(&sc->hw, TOTH);
! 2946:
! 2947: sc->stats.tpr += E1000_READ_REG(&sc->hw, TPR);
! 2948: sc->stats.tpt += E1000_READ_REG(&sc->hw, TPT);
! 2949: sc->stats.ptc64 += E1000_READ_REG(&sc->hw, PTC64);
! 2950: sc->stats.ptc127 += E1000_READ_REG(&sc->hw, PTC127);
! 2951: sc->stats.ptc255 += E1000_READ_REG(&sc->hw, PTC255);
! 2952: sc->stats.ptc511 += E1000_READ_REG(&sc->hw, PTC511);
! 2953: sc->stats.ptc1023 += E1000_READ_REG(&sc->hw, PTC1023);
! 2954: sc->stats.ptc1522 += E1000_READ_REG(&sc->hw, PTC1522);
! 2955: sc->stats.mptc += E1000_READ_REG(&sc->hw, MPTC);
! 2956: sc->stats.bptc += E1000_READ_REG(&sc->hw, BPTC);
! 2957:
! 2958: if (sc->hw.mac_type >= em_82543) {
! 2959: sc->stats.algnerrc +=
! 2960: E1000_READ_REG(&sc->hw, ALGNERRC);
! 2961: sc->stats.rxerrc +=
! 2962: E1000_READ_REG(&sc->hw, RXERRC);
! 2963: sc->stats.tncrs +=
! 2964: E1000_READ_REG(&sc->hw, TNCRS);
! 2965: sc->stats.cexterr +=
! 2966: E1000_READ_REG(&sc->hw, CEXTERR);
! 2967: sc->stats.tsctc +=
! 2968: E1000_READ_REG(&sc->hw, TSCTC);
! 2969: sc->stats.tsctfc +=
! 2970: E1000_READ_REG(&sc->hw, TSCTFC);
! 2971: }
! 2972: ifp = &sc->interface_data.ac_if;
! 2973:
! 2974: /* Fill out the OS statistics structure */
! 2975: ifp->if_collisions = sc->stats.colc;
! 2976:
! 2977: /* Rx Errors */
! 2978: ifp->if_ierrors =
! 2979: sc->dropped_pkts +
! 2980: sc->stats.rxerrc +
! 2981: sc->stats.crcerrs +
! 2982: sc->stats.algnerrc +
! 2983: sc->stats.ruc + sc->stats.roc +
! 2984: sc->stats.mpc + sc->stats.cexterr +
! 2985: sc->rx_overruns;
! 2986:
! 2987: /* Tx Errors */
! 2988: ifp->if_oerrors = sc->stats.ecol + sc->stats.latecol +
! 2989: sc->watchdog_events;
! 2990: }
! 2991:
! 2992: /**********************************************************************
! 2993: *
! 2994: * This routine is called only when em_display_debug_stats is enabled.
! 2995: * This routine provides a way to take a look at important statistics
! 2996: * maintained by the driver and hardware.
! 2997: *
! 2998: **********************************************************************/
! 2999: void
! 3000: em_print_hw_stats(struct em_softc *sc)
! 3001: {
! 3002: const char * const unit = sc->sc_dv.dv_xname;
! 3003:
! 3004: printf("%s: Excessive collisions = %lld\n", unit,
! 3005: (long long)sc->stats.ecol);
! 3006: printf("%s: Symbol errors = %lld\n", unit,
! 3007: (long long)sc->stats.symerrs);
! 3008: printf("%s: Sequence errors = %lld\n", unit,
! 3009: (long long)sc->stats.sec);
! 3010: printf("%s: Defer count = %lld\n", unit,
! 3011: (long long)sc->stats.dc);
! 3012:
! 3013: printf("%s: Missed Packets = %lld\n", unit,
! 3014: (long long)sc->stats.mpc);
! 3015: printf("%s: Receive No Buffers = %lld\n", unit,
! 3016: (long long)sc->stats.rnbc);
! 3017: /* RLEC is inaccurate on some hardware, calculate our own */
! 3018: printf("%s: Receive Length Errors = %lld\n", unit,
! 3019: ((long long)sc->stats.roc +
! 3020: (long long)sc->stats.ruc));
! 3021: printf("%s: Receive errors = %lld\n", unit,
! 3022: (long long)sc->stats.rxerrc);
! 3023: printf("%s: Crc errors = %lld\n", unit,
! 3024: (long long)sc->stats.crcerrs);
! 3025: printf("%s: Alignment errors = %lld\n", unit,
! 3026: (long long)sc->stats.algnerrc);
! 3027: printf("%s: Carrier extension errors = %lld\n", unit,
! 3028: (long long)sc->stats.cexterr);
! 3029:
! 3030: printf("%s: RX overruns = %ld\n", unit,
! 3031: sc->rx_overruns);
! 3032: printf("%s: watchdog timeouts = %ld\n", unit,
! 3033: sc->watchdog_events);
! 3034:
! 3035: printf("%s: XON Rcvd = %lld\n", unit,
! 3036: (long long)sc->stats.xonrxc);
! 3037: printf("%s: XON Xmtd = %lld\n", unit,
! 3038: (long long)sc->stats.xontxc);
! 3039: printf("%s: XOFF Rcvd = %lld\n", unit,
! 3040: (long long)sc->stats.xoffrxc);
! 3041: printf("%s: XOFF Xmtd = %lld\n", unit,
! 3042: (long long)sc->stats.xofftxc);
! 3043:
! 3044: printf("%s: Good Packets Rcvd = %lld\n", unit,
! 3045: (long long)sc->stats.gprc);
! 3046: printf("%s: Good Packets Xmtd = %lld\n", unit,
! 3047: (long long)sc->stats.gptc);
! 3048: }
CVSweb