11f7e3916SSepherosa Ziehau /* 2ba0123e0SSepherosa Ziehau * Copyright (c) 2001-2013, Intel Corporation 31f7e3916SSepherosa Ziehau * All rights reserved. 41f7e3916SSepherosa Ziehau * 51f7e3916SSepherosa Ziehau * Redistribution and use in source and binary forms, with or without 61f7e3916SSepherosa Ziehau * modification, are permitted provided that the following conditions are met: 71f7e3916SSepherosa Ziehau * 81f7e3916SSepherosa Ziehau * 1. Redistributions of source code must retain the above copyright notice, 91f7e3916SSepherosa Ziehau * this list of conditions and the following disclaimer. 101f7e3916SSepherosa Ziehau * 111f7e3916SSepherosa Ziehau * 2. Redistributions in binary form must reproduce the above copyright 121f7e3916SSepherosa Ziehau * notice, this list of conditions and the following disclaimer in the 131f7e3916SSepherosa Ziehau * documentation and/or other materials provided with the distribution. 141f7e3916SSepherosa Ziehau * 151f7e3916SSepherosa Ziehau * 3. Neither the name of the Intel Corporation nor the names of its 161f7e3916SSepherosa Ziehau * contributors may be used to endorse or promote products derived from 171f7e3916SSepherosa Ziehau * this software without specific prior written permission. 181f7e3916SSepherosa Ziehau * 191f7e3916SSepherosa Ziehau * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 201f7e3916SSepherosa Ziehau * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 211f7e3916SSepherosa Ziehau * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 221f7e3916SSepherosa Ziehau * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 231f7e3916SSepherosa Ziehau * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 241f7e3916SSepherosa Ziehau * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 251f7e3916SSepherosa Ziehau * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 261f7e3916SSepherosa Ziehau * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 271f7e3916SSepherosa Ziehau * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 281f7e3916SSepherosa Ziehau * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 291f7e3916SSepherosa Ziehau * POSSIBILITY OF SUCH DAMAGE. 301f7e3916SSepherosa Ziehau */ 311f7e3916SSepherosa Ziehau 321f7e3916SSepherosa Ziehau #ifndef _IF_IGB_H_ 331f7e3916SSepherosa Ziehau #define _IF_IGB_H_ 341f7e3916SSepherosa Ziehau 351f7e3916SSepherosa Ziehau /* Tunables */ 361f7e3916SSepherosa Ziehau 371f7e3916SSepherosa Ziehau /* 388d6600daSSepherosa Ziehau * Max ring count 398d6600daSSepherosa Ziehau */ 40d734c6e7SSepherosa Ziehau #define IGB_MAX_RING_I210 4 41d734c6e7SSepherosa Ziehau #define IGB_MAX_RING_I211 2 428d6600daSSepherosa Ziehau #define IGB_MAX_RING_I350 8 438b7c6465SSepherosa Ziehau #define IGB_MAX_RING_I354 8 448d6600daSSepherosa Ziehau #define IGB_MAX_RING_82580 8 458d6600daSSepherosa Ziehau #define IGB_MAX_RING_82576 16 46d734c6e7SSepherosa Ziehau #define IGB_MAX_RING_82575 4 478d6600daSSepherosa Ziehau #define IGB_MIN_RING 1 48be922da6SSepherosa Ziehau #define IGB_MIN_RING_RSS 2 498d6600daSSepherosa Ziehau 508d6600daSSepherosa Ziehau /* 518d6600daSSepherosa Ziehau * Max TX/RX interrupt bits 528d6600daSSepherosa Ziehau */ 53d734c6e7SSepherosa Ziehau #define IGB_MAX_TXRXINT_I210 4 54d734c6e7SSepherosa Ziehau #define IGB_MAX_TXRXINT_I211 4 558d6600daSSepherosa Ziehau #define IGB_MAX_TXRXINT_I350 8 568b7c6465SSepherosa Ziehau #define IGB_MAX_TXRXINT_I354 8 578d6600daSSepherosa Ziehau #define IGB_MAX_TXRXINT_82580 8 588d6600daSSepherosa Ziehau #define IGB_MAX_TXRXINT_82576 16 59d734c6e7SSepherosa Ziehau #define IGB_MAX_TXRXINT_82575 4 /* XXX not used */ 608d6600daSSepherosa Ziehau #define IGB_MIN_TXRXINT 2 /* XXX VF? */ 618d6600daSSepherosa Ziehau 628d6600daSSepherosa Ziehau /* 639c0ecdccSSepherosa Ziehau * Max IVAR count 649c0ecdccSSepherosa Ziehau */ 65d734c6e7SSepherosa Ziehau #define IGB_MAX_IVAR_I210 4 66d734c6e7SSepherosa Ziehau #define IGB_MAX_IVAR_I211 4 679c0ecdccSSepherosa Ziehau #define IGB_MAX_IVAR_I350 4 688b7c6465SSepherosa Ziehau #define IGB_MAX_IVAR_I354 4 699c0ecdccSSepherosa Ziehau #define IGB_MAX_IVAR_82580 4 709c0ecdccSSepherosa Ziehau #define IGB_MAX_IVAR_82576 8 719c0ecdccSSepherosa Ziehau #define IGB_MAX_IVAR_VF 1 729c0ecdccSSepherosa Ziehau 739c0ecdccSSepherosa Ziehau /* 745a612d02SSepherosa Ziehau * Default number of segments received before writing to RX related registers 755a612d02SSepherosa Ziehau */ 765a612d02SSepherosa Ziehau #define IGB_DEF_RXWREG_NSEGS 32 775a612d02SSepherosa Ziehau 785a612d02SSepherosa Ziehau /* 799832ceaaSSepherosa Ziehau * Default number of segments sent before writing to TX related registers 805a612d02SSepherosa Ziehau */ 815a612d02SSepherosa Ziehau #define IGB_DEF_TXWREG_NSEGS 8 825a612d02SSepherosa Ziehau 835a612d02SSepherosa Ziehau /* 841f7e3916SSepherosa Ziehau * IGB_TXD: Maximum number of Transmit Descriptors 851f7e3916SSepherosa Ziehau * 861f7e3916SSepherosa Ziehau * This value is the number of transmit descriptors allocated by the driver. 871f7e3916SSepherosa Ziehau * Increasing this value allows the driver to queue more transmits. Each 881f7e3916SSepherosa Ziehau * descriptor is 16 bytes. 891f7e3916SSepherosa Ziehau * Since TDLEN should be multiple of 128bytes, the number of transmit 901f7e3916SSepherosa Ziehau * desscriptors should meet the following condition. 911f7e3916SSepherosa Ziehau * (num_tx_desc * sizeof(struct e1000_tx_desc)) % 128 == 0 921f7e3916SSepherosa Ziehau */ 931f7e3916SSepherosa Ziehau #define IGB_MIN_TXD 256 941f7e3916SSepherosa Ziehau #define IGB_DEFAULT_TXD 1024 951f7e3916SSepherosa Ziehau #define IGB_MAX_TXD 4096 961f7e3916SSepherosa Ziehau 971f7e3916SSepherosa Ziehau /* 981f7e3916SSepherosa Ziehau * IGB_RXD: Maximum number of Transmit Descriptors 991f7e3916SSepherosa Ziehau * 1001f7e3916SSepherosa Ziehau * This value is the number of receive descriptors allocated by the driver. 1011f7e3916SSepherosa Ziehau * Increasing this value allows the driver to buffer more incoming packets. 1021f7e3916SSepherosa Ziehau * Each descriptor is 16 bytes. A receive buffer is also allocated for each 1031f7e3916SSepherosa Ziehau * descriptor. The maximum MTU size is 16110. 1041f7e3916SSepherosa Ziehau * Since TDLEN should be multiple of 128bytes, the number of transmit 1051f7e3916SSepherosa Ziehau * desscriptors should meet the following condition. 1061f7e3916SSepherosa Ziehau * (num_tx_desc * sizeof(struct e1000_tx_desc)) % 128 == 0 1071f7e3916SSepherosa Ziehau */ 1081f7e3916SSepherosa Ziehau #define IGB_MIN_RXD 256 109e7c14703SSepherosa Ziehau #define IGB_DEFAULT_RXD 512 1101f7e3916SSepherosa Ziehau #define IGB_MAX_RXD 4096 1111f7e3916SSepherosa Ziehau 1121f7e3916SSepherosa Ziehau /* 1131f7e3916SSepherosa Ziehau * This parameter controls when the driver calls the routine to reclaim 1141f7e3916SSepherosa Ziehau * transmit descriptors. Cleaning earlier seems a win. 1151f7e3916SSepherosa Ziehau */ 1161f7e3916SSepherosa Ziehau #define IGB_TX_CLEANUP_THRESHOLD(sc) ((sc)->num_tx_desc / 2) 1171f7e3916SSepherosa Ziehau 1181f7e3916SSepherosa Ziehau /* 1191f7e3916SSepherosa Ziehau * This parameter controls whether or not autonegotation is enabled. 1201f7e3916SSepherosa Ziehau * 0 - Disable autonegotiation 1211f7e3916SSepherosa Ziehau * 1 - Enable autonegotiation 1221f7e3916SSepherosa Ziehau */ 1231f7e3916SSepherosa Ziehau #define DO_AUTO_NEG 1 1241f7e3916SSepherosa Ziehau 1251f7e3916SSepherosa Ziehau /* 1261f7e3916SSepherosa Ziehau * This parameter control whether or not the driver will wait for 1271f7e3916SSepherosa Ziehau * autonegotiation to complete. 1281f7e3916SSepherosa Ziehau * 1 - Wait for autonegotiation to complete 1291f7e3916SSepherosa Ziehau * 0 - Don't wait for autonegotiation to complete 1301f7e3916SSepherosa Ziehau */ 1311f7e3916SSepherosa Ziehau #define WAIT_FOR_AUTO_NEG_DEFAULT 0 1321f7e3916SSepherosa Ziehau 1331f7e3916SSepherosa Ziehau /* Tunables -- End */ 1341f7e3916SSepherosa Ziehau 1351f7e3916SSepherosa Ziehau #define AUTONEG_ADV_DEFAULT (ADVERTISE_10_HALF | ADVERTISE_10_FULL | \ 1361f7e3916SSepherosa Ziehau ADVERTISE_100_HALF | ADVERTISE_100_FULL | \ 1371f7e3916SSepherosa Ziehau ADVERTISE_1000_FULL) 1381f7e3916SSepherosa Ziehau 1391f7e3916SSepherosa Ziehau #define AUTO_ALL_MODES 0 1401f7e3916SSepherosa Ziehau 1411f7e3916SSepherosa Ziehau /* PHY master/slave setting */ 1421f7e3916SSepherosa Ziehau #define IGB_MASTER_SLAVE e1000_ms_hw_default 1431f7e3916SSepherosa Ziehau 1441f7e3916SSepherosa Ziehau /* 1451f7e3916SSepherosa Ziehau * Micellaneous constants 1461f7e3916SSepherosa Ziehau */ 1471f7e3916SSepherosa Ziehau #define IGB_VENDOR_ID 0x8086 1481f7e3916SSepherosa Ziehau 1491f7e3916SSepherosa Ziehau #define IGB_JUMBO_PBA 0x00000028 1501f7e3916SSepherosa Ziehau #define IGB_DEFAULT_PBA 0x00000030 1511f7e3916SSepherosa Ziehau #define IGB_SMARTSPEED_DOWNSHIFT 3 1521f7e3916SSepherosa Ziehau #define IGB_SMARTSPEED_MAX 15 1531f7e3916SSepherosa Ziehau #define IGB_MAX_LOOP 10 1541f7e3916SSepherosa Ziehau 155ba0123e0SSepherosa Ziehau #define IGB_RX_PTHRESH ((hw->mac.type == e1000_i354) ? 12 : \ 156ba0123e0SSepherosa Ziehau ((hw->mac.type <= e1000_82576) ? 16 : 8)) 1571f7e3916SSepherosa Ziehau #define IGB_RX_HTHRESH 8 158ba0123e0SSepherosa Ziehau #define IGB_RX_WTHRESH ((hw->mac.type == e1000_82576 && \ 159ba0123e0SSepherosa Ziehau sc->msix_mem_res) ? 1 : 4) 1601f7e3916SSepherosa Ziehau 161ba0123e0SSepherosa Ziehau #define IGB_TX_PTHRESH ((hw->mac.type == e1000_i354) ? 20 : 8) 1621f7e3916SSepherosa Ziehau #define IGB_TX_HTHRESH 1 163396b7048SSepherosa Ziehau #define IGB_TX_WTHRESH 16 1641f7e3916SSepherosa Ziehau 1651f7e3916SSepherosa Ziehau #define MAX_NUM_MULTICAST_ADDRESSES 128 1661f7e3916SSepherosa Ziehau #define IGB_FC_PAUSE_TIME 0x0680 1671f7e3916SSepherosa Ziehau 168c2d84054SSepherosa Ziehau #define IGB_INTR_RATE 6000 1699c0ecdccSSepherosa Ziehau #define IGB_MSIX_RX_RATE 6000 1709c0ecdccSSepherosa Ziehau #define IGB_MSIX_TX_RATE 4000 1711f7e3916SSepherosa Ziehau 1721f7e3916SSepherosa Ziehau /* 1731f7e3916SSepherosa Ziehau * TDBA/RDBA should be aligned on 16 byte boundary. But TDLEN/RDLEN should be 1741f7e3916SSepherosa Ziehau * multiple of 128 bytes. So we align TDBA/RDBA on 128 byte boundary. This will 1751f7e3916SSepherosa Ziehau * also optimize cache line size effect. H/W supports up to cache line size 128. 1761f7e3916SSepherosa Ziehau */ 1771f7e3916SSepherosa Ziehau #define IGB_DBA_ALIGN 128 1781f7e3916SSepherosa Ziehau 1791f7e3916SSepherosa Ziehau /* PCI Config defines */ 1801f7e3916SSepherosa Ziehau #define IGB_MSIX_BAR 3 181d46e097fSSepherosa Ziehau #define IGB_MSIX_BAR_ALT 4 1821f7e3916SSepherosa Ziehau 1831f7e3916SSepherosa Ziehau #define IGB_VFTA_SIZE 128 18423f6ffe4SSepherosa Ziehau #define IGB_TSO_SIZE (IP_MAXPACKET + \ 1851f7e3916SSepherosa Ziehau sizeof(struct ether_vlan_header)) 1861f7e3916SSepherosa Ziehau #define IGB_HDR_BUF 128 187ba0123e0SSepherosa Ziehau #define IGB_TXPBSIZE 20408 1881f7e3916SSepherosa Ziehau #define IGB_PKTTYPE_MASK 0x0000FFF0 1891f7e3916SSepherosa Ziehau 1901f7e3916SSepherosa Ziehau #define IGB_CSUM_FEATURES (CSUM_IP | CSUM_TCP | CSUM_UDP) 1911f7e3916SSepherosa Ziehau 192b6220144SSepherosa Ziehau /* One for TX csum offloading desc, the other 2 are reserved */ 193b6220144SSepherosa Ziehau #define IGB_TX_RESERVED 3 194b6220144SSepherosa Ziehau 195b6220144SSepherosa Ziehau /* Large enough for 64K TSO */ 196aee05168SSepherosa Ziehau #define IGB_MAX_SCATTER 33 197b6220144SSepherosa Ziehau 1988d6600daSSepherosa Ziehau #define IGB_NRSSRK 10 1998d6600daSSepherosa Ziehau #define IGB_RSSRK_SIZE 4 2008d6600daSSepherosa Ziehau #define IGB_RSSRK_VAL(key, i) (key[(i) * IGB_RSSRK_SIZE] | \ 2018d6600daSSepherosa Ziehau key[(i) * IGB_RSSRK_SIZE + 1] << 8 | \ 2028d6600daSSepherosa Ziehau key[(i) * IGB_RSSRK_SIZE + 2] << 16 | \ 2038d6600daSSepherosa Ziehau key[(i) * IGB_RSSRK_SIZE + 3] << 24) 2048d6600daSSepherosa Ziehau 2058d6600daSSepherosa Ziehau #define IGB_NRETA 32 2068d6600daSSepherosa Ziehau #define IGB_RETA_SIZE 4 2078d6600daSSepherosa Ziehau #define IGB_RETA_SHIFT 0 2088d6600daSSepherosa Ziehau #define IGB_RETA_SHIFT_82575 6 2098d6600daSSepherosa Ziehau 2101bbd565eSSepherosa Ziehau #define IGB_RDRTABLE_SIZE (IGB_NRETA * IGB_RETA_SIZE) 2111bbd565eSSepherosa Ziehau 212d4beffa9SSepherosa Ziehau #define IGB_EITR_INTVL_MASK 0x7ffc 213d4beffa9SSepherosa Ziehau #define IGB_EITR_INTVL_SHIFT 2 214d4beffa9SSepherosa Ziehau 215ba0123e0SSepherosa Ziehau /* Disable DMA Coalesce Flush */ 216ba0123e0SSepherosa Ziehau #define IGB_DMCTLX_DCFLUSH_DIS 0x80000000 217ba0123e0SSepherosa Ziehau 2181f7e3916SSepherosa Ziehau struct igb_softc; 2191f7e3916SSepherosa Ziehau 2201f7e3916SSepherosa Ziehau /* 2211f7e3916SSepherosa Ziehau * Bus dma information structure 2221f7e3916SSepherosa Ziehau */ 2231f7e3916SSepherosa Ziehau struct igb_dma { 2241f7e3916SSepherosa Ziehau bus_addr_t dma_paddr; 2251f7e3916SSepherosa Ziehau void *dma_vaddr; 2261f7e3916SSepherosa Ziehau bus_dma_tag_t dma_tag; 2271f7e3916SSepherosa Ziehau bus_dmamap_t dma_map; 2281f7e3916SSepherosa Ziehau }; 2291f7e3916SSepherosa Ziehau 2301f7e3916SSepherosa Ziehau /* 2311f7e3916SSepherosa Ziehau * Transmit ring: one per queue 2321f7e3916SSepherosa Ziehau */ 2331f7e3916SSepherosa Ziehau struct igb_tx_ring { 2347d235eb5SSepherosa Ziehau struct lwkt_serialize tx_serialize; 2351f7e3916SSepherosa Ziehau struct igb_softc *sc; 236f0a26983SSepherosa Ziehau struct ifaltq_subque *ifsq; 2371f7e3916SSepherosa Ziehau uint32_t me; 238*620b9679SSepherosa Ziehau int16_t tx_running; 239*620b9679SSepherosa Ziehau #define IGB_TX_RUNNING 100 240*620b9679SSepherosa Ziehau #define IGB_TX_RUNNING_DEC 25 241*620b9679SSepherosa Ziehau uint16_t tx_flags; 24281b8cfc6SSepherosa Ziehau #define IGB_TXFLAG_TSO_IPLEN0 0x1 243ddaf4d42SSepherosa Ziehau #define IGB_TXFLAG_ENABLED 0x2 2441f7e3916SSepherosa Ziehau struct e1000_tx_desc *tx_base; 24591b8700aSSepherosa Ziehau int num_tx_desc; 2461f7e3916SSepherosa Ziehau uint32_t next_avail_desc; 2471f7e3916SSepherosa Ziehau uint32_t next_to_clean; 248b6220144SSepherosa Ziehau int tx_avail; 249*620b9679SSepherosa Ziehau int tx_nmbuf; 250*620b9679SSepherosa Ziehau uint32_t *tx_hdr; 2511f7e3916SSepherosa Ziehau struct igb_tx_buf *tx_buf; 2521f7e3916SSepherosa Ziehau bus_dma_tag_t tx_tag; 253b6220144SSepherosa Ziehau int tx_nsegs; 254b6220144SSepherosa Ziehau int intr_nsegs; 255871c0e2bSSepherosa Ziehau int wreg_nsegs; 256fa2e32fbSSepherosa Ziehau int tx_intr_vec; 257f6167a56SSepherosa Ziehau uint32_t tx_intr_mask; 25816109efcSSepherosa Ziehau struct ifsubq_watchdog tx_watchdog; 259*620b9679SSepherosa Ziehau struct callout tx_gc_timer; 2601f7e3916SSepherosa Ziehau 261791a0338SSepherosa Ziehau /* Soft stats */ 2621f7e3916SSepherosa Ziehau u_long tx_packets; 263*620b9679SSepherosa Ziehau u_long tx_gc; 264791a0338SSepherosa Ziehau 265791a0338SSepherosa Ziehau struct igb_dma txdma; 266791a0338SSepherosa Ziehau bus_dma_tag_t tx_hdr_dtag; 267791a0338SSepherosa Ziehau bus_dmamap_t tx_hdr_dmap; 268791a0338SSepherosa Ziehau bus_addr_t tx_hdr_paddr; 2690e23628aSSepherosa Ziehau int tx_intr_cpuid; 270ff230ec8SSepherosa Ziehau } __cachealign; 2711f7e3916SSepherosa Ziehau 2721f7e3916SSepherosa Ziehau /* 2731f7e3916SSepherosa Ziehau * Receive ring: one per queue 2741f7e3916SSepherosa Ziehau */ 2751f7e3916SSepherosa Ziehau struct igb_rx_ring { 2767d235eb5SSepherosa Ziehau struct lwkt_serialize rx_serialize; 2771f7e3916SSepherosa Ziehau struct igb_softc *sc; 2781f7e3916SSepherosa Ziehau uint32_t me; 2791f7e3916SSepherosa Ziehau union e1000_adv_rx_desc *rx_base; 2801f7e3916SSepherosa Ziehau boolean_t discard; 28191b8700aSSepherosa Ziehau int num_rx_desc; 2821f7e3916SSepherosa Ziehau uint32_t next_to_check; 2831f7e3916SSepherosa Ziehau struct igb_rx_buf *rx_buf; 2841f7e3916SSepherosa Ziehau bus_dma_tag_t rx_tag; 2851f7e3916SSepherosa Ziehau bus_dmamap_t rx_sparemap; 286fa2e32fbSSepherosa Ziehau int rx_intr_vec; 287f6167a56SSepherosa Ziehau uint32_t rx_intr_mask; 2881f7e3916SSepherosa Ziehau 2891f7e3916SSepherosa Ziehau /* 2901f7e3916SSepherosa Ziehau * First/last mbuf pointers, for 2911f7e3916SSepherosa Ziehau * collecting multisegment RX packets. 2921f7e3916SSepherosa Ziehau */ 2931f7e3916SSepherosa Ziehau struct mbuf *fmp; 2941f7e3916SSepherosa Ziehau struct mbuf *lmp; 2959d8e892aSSepherosa Ziehau int wreg_nsegs; 2961f7e3916SSepherosa Ziehau 297fa2e32fbSSepherosa Ziehau struct igb_tx_ring *rx_txr; /* piggybacked TX ring */ 298fa2e32fbSSepherosa Ziehau 2991f7e3916SSepherosa Ziehau /* Soft stats */ 3001f7e3916SSepherosa Ziehau u_long rx_packets; 301791a0338SSepherosa Ziehau 302791a0338SSepherosa Ziehau struct igb_dma rxdma; 303ff230ec8SSepherosa Ziehau } __cachealign; 3041f7e3916SSepherosa Ziehau 305fa2e32fbSSepherosa Ziehau struct igb_intr_data { 306fa2e32fbSSepherosa Ziehau struct lwkt_serialize *intr_serialize; 307fa2e32fbSSepherosa Ziehau driver_intr_t *intr_func; 308fa2e32fbSSepherosa Ziehau void *intr_hand; 309fa2e32fbSSepherosa Ziehau struct resource *intr_res; 310fa2e32fbSSepherosa Ziehau void *intr_funcarg; 311fa2e32fbSSepherosa Ziehau int intr_rid; 312fa2e32fbSSepherosa Ziehau int intr_cpuid; 313fa2e32fbSSepherosa Ziehau int intr_rate; 314fa2e32fbSSepherosa Ziehau int intr_use; 315fa2e32fbSSepherosa Ziehau #define IGB_INTR_USE_RXTX 0 316fa2e32fbSSepherosa Ziehau #define IGB_INTR_USE_STATUS 1 317fa2e32fbSSepherosa Ziehau #define IGB_INTR_USE_RX 2 318fa2e32fbSSepherosa Ziehau #define IGB_INTR_USE_TX 3 319fa2e32fbSSepherosa Ziehau const char *intr_desc; 320fa2e32fbSSepherosa Ziehau char intr_desc0[64]; 321fa2e32fbSSepherosa Ziehau }; 3229c0ecdccSSepherosa Ziehau 3231f7e3916SSepherosa Ziehau struct igb_softc { 3241f7e3916SSepherosa Ziehau struct arpcom arpcom; 3251f7e3916SSepherosa Ziehau struct e1000_hw hw; 3261f7e3916SSepherosa Ziehau 3271f7e3916SSepherosa Ziehau struct e1000_osdep osdep; 3281f7e3916SSepherosa Ziehau device_t dev; 329f6167a56SSepherosa Ziehau uint32_t flags; 330f6167a56SSepherosa Ziehau #define IGB_FLAG_SHARED_INTR 0x1 331396b7048SSepherosa Ziehau #define IGB_FLAG_HAS_MGMT 0x2 3321f7e3916SSepherosa Ziehau 3331f7e3916SSepherosa Ziehau bus_dma_tag_t parent_tag; 3341f7e3916SSepherosa Ziehau 3351f7e3916SSepherosa Ziehau int mem_rid; 3361f7e3916SSepherosa Ziehau struct resource *mem_res; 3371f7e3916SSepherosa Ziehau 3381f7e3916SSepherosa Ziehau struct ifmedia media; 3391f7e3916SSepherosa Ziehau struct callout timer; 3407b61c9f2SSepherosa Ziehau int timer_cpuid; 3411f7e3916SSepherosa Ziehau 3421f7e3916SSepherosa Ziehau int if_flags; 3431f7e3916SSepherosa Ziehau int max_frame_size; 3441f7e3916SSepherosa Ziehau int pause_frames; 3451f7e3916SSepherosa Ziehau uint16_t vf_ifp; /* a VF interface */ 3461f7e3916SSepherosa Ziehau 3471f7e3916SSepherosa Ziehau /* Management and WOL features */ 3481f7e3916SSepherosa Ziehau int wol; 3491f7e3916SSepherosa Ziehau 3501f7e3916SSepherosa Ziehau /* Info about the interface */ 3511f7e3916SSepherosa Ziehau uint8_t link_active; 3521f7e3916SSepherosa Ziehau uint16_t link_speed; 3531f7e3916SSepherosa Ziehau uint16_t link_duplex; 3541f7e3916SSepherosa Ziehau uint32_t smartspeed; 3551f7e3916SSepherosa Ziehau uint32_t dma_coalesce; 3561f7e3916SSepherosa Ziehau 357396b7048SSepherosa Ziehau /* Multicast array pointer */ 358396b7048SSepherosa Ziehau uint8_t *mta; 359396b7048SSepherosa Ziehau 3607d235eb5SSepherosa Ziehau int serialize_cnt; 36177671e5eSSepherosa Ziehau struct lwkt_serialize **serializes; 3627d235eb5SSepherosa Ziehau struct lwkt_serialize main_serialize; 3637d235eb5SSepherosa Ziehau 364fa2e32fbSSepherosa Ziehau int intr_type; 365f6167a56SSepherosa Ziehau uint32_t intr_mask; 366fa2e32fbSSepherosa Ziehau int sts_msix_vec; 3679c0ecdccSSepherosa Ziehau uint32_t sts_intr_mask; 3681f7e3916SSepherosa Ziehau 3691f7e3916SSepherosa Ziehau /* 3701f7e3916SSepherosa Ziehau * Transmit rings 3711f7e3916SSepherosa Ziehau */ 37227866bf1SSepherosa Ziehau int tx_ring_cnt; 373d802cc67SSepherosa Ziehau int tx_ring_msix; 374d802cc67SSepherosa Ziehau int tx_ring_inuse; 3751f7e3916SSepherosa Ziehau struct igb_tx_ring *tx_rings; 3761f7e3916SSepherosa Ziehau 3771f7e3916SSepherosa Ziehau /* 3781f7e3916SSepherosa Ziehau * Receive rings 3791f7e3916SSepherosa Ziehau */ 3808d6600daSSepherosa Ziehau int rss_debug; 38127866bf1SSepherosa Ziehau int rx_ring_cnt; 3829c0ecdccSSepherosa Ziehau int rx_ring_msix; 383be922da6SSepherosa Ziehau int rx_ring_inuse; 3841f7e3916SSepherosa Ziehau struct igb_rx_ring *rx_rings; 3851f7e3916SSepherosa Ziehau 386d2f385fbSSepherosa Ziehau int ifm_flowctrl; 387ad4bef87SSepherosa Ziehau 3881f7e3916SSepherosa Ziehau /* Misc stats maintained by the driver */ 3891f7e3916SSepherosa Ziehau u_long dropped_pkts; 3901f7e3916SSepherosa Ziehau u_long mbuf_defrag_failed; 3911f7e3916SSepherosa Ziehau u_long no_tx_dma_setup; 3921f7e3916SSepherosa Ziehau u_long watchdog_events; 3931f7e3916SSepherosa Ziehau u_long rx_overruns; 3941f7e3916SSepherosa Ziehau u_long device_control; 3951f7e3916SSepherosa Ziehau u_long rx_control; 3961f7e3916SSepherosa Ziehau u_long int_mask; 3971f7e3916SSepherosa Ziehau u_long eint_mask; 3981f7e3916SSepherosa Ziehau u_long packet_buf_alloc_rx; 3991f7e3916SSepherosa Ziehau u_long packet_buf_alloc_tx; 4001f7e3916SSepherosa Ziehau 4011f7e3916SSepherosa Ziehau void *stats; 4029c0ecdccSSepherosa Ziehau 4039c0ecdccSSepherosa Ziehau int msix_mem_rid; 4049c0ecdccSSepherosa Ziehau struct resource *msix_mem_res; 405fa2e32fbSSepherosa Ziehau 406fa2e32fbSSepherosa Ziehau int intr_cnt; 407fa2e32fbSSepherosa Ziehau struct igb_intr_data *intr_data; 4081bbd565eSSepherosa Ziehau 4091bbd565eSSepherosa Ziehau struct if_ringmap *rx_rmap; 4101bbd565eSSepherosa Ziehau struct if_ringmap *rx_rmap_intr; 4111bbd565eSSepherosa Ziehau struct if_ringmap *tx_rmap; 4121bbd565eSSepherosa Ziehau struct if_ringmap *tx_rmap_intr; 4131bbd565eSSepherosa Ziehau 4141bbd565eSSepherosa Ziehau int rdr_table[IGB_RDRTABLE_SIZE]; 4151f7e3916SSepherosa Ziehau }; 4161f7e3916SSepherosa Ziehau 4178d6600daSSepherosa Ziehau #define IGB_ENABLE_HWRSS(sc) ((sc)->rx_ring_cnt > 1) 418d802cc67SSepherosa Ziehau #define IGB_ENABLE_HWTSS(sc) ((sc)->tx_ring_cnt > 1) 4198d6600daSSepherosa Ziehau 4201f7e3916SSepherosa Ziehau struct igb_tx_buf { 4211f7e3916SSepherosa Ziehau struct mbuf *m_head; 4221f7e3916SSepherosa Ziehau bus_dmamap_t map; /* bus_dma map for packet */ 4231f7e3916SSepherosa Ziehau }; 4241f7e3916SSepherosa Ziehau 4251f7e3916SSepherosa Ziehau struct igb_rx_buf { 4261f7e3916SSepherosa Ziehau struct mbuf *m_head; 4271f7e3916SSepherosa Ziehau bus_dmamap_t map; /* bus_dma map for packet */ 4281f7e3916SSepherosa Ziehau bus_addr_t paddr; 4291f7e3916SSepherosa Ziehau }; 4301f7e3916SSepherosa Ziehau 4311f7e3916SSepherosa Ziehau #define UPDATE_VF_REG(reg, last, cur) \ 4321f7e3916SSepherosa Ziehau { \ 4331f7e3916SSepherosa Ziehau uint32_t new = E1000_READ_REG(hw, reg); \ 4341f7e3916SSepherosa Ziehau if (new < last) \ 4351f7e3916SSepherosa Ziehau cur += 0x100000000LL; \ 4361f7e3916SSepherosa Ziehau last = new; \ 4371f7e3916SSepherosa Ziehau cur &= 0xFFFFFFFF00000000LL; \ 4381f7e3916SSepherosa Ziehau cur |= new; \ 4391f7e3916SSepherosa Ziehau } 4401f7e3916SSepherosa Ziehau 4418b7c6465SSepherosa Ziehau #define IGB_I210_LINK_DELAY 1000 /* unit: ms */ 4428b7c6465SSepherosa Ziehau 4431f7e3916SSepherosa Ziehau #endif /* _IF_IGB_H_ */ 444