11f7e3916SSepherosa Ziehau /* 21f7e3916SSepherosa Ziehau * Copyright (c) 2001-2011, 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 /* 381f7e3916SSepherosa Ziehau * IGB_TXD: Maximum number of Transmit Descriptors 391f7e3916SSepherosa Ziehau * 401f7e3916SSepherosa Ziehau * This value is the number of transmit descriptors allocated by the driver. 411f7e3916SSepherosa Ziehau * Increasing this value allows the driver to queue more transmits. Each 421f7e3916SSepherosa Ziehau * descriptor is 16 bytes. 431f7e3916SSepherosa Ziehau * Since TDLEN should be multiple of 128bytes, the number of transmit 441f7e3916SSepherosa Ziehau * desscriptors should meet the following condition. 451f7e3916SSepherosa Ziehau * (num_tx_desc * sizeof(struct e1000_tx_desc)) % 128 == 0 461f7e3916SSepherosa Ziehau */ 471f7e3916SSepherosa Ziehau #define IGB_MIN_TXD 256 481f7e3916SSepherosa Ziehau #define IGB_DEFAULT_TXD 1024 491f7e3916SSepherosa Ziehau #define IGB_MAX_TXD 4096 501f7e3916SSepherosa Ziehau 511f7e3916SSepherosa Ziehau /* 521f7e3916SSepherosa Ziehau * IGB_RXD: Maximum number of Transmit Descriptors 531f7e3916SSepherosa Ziehau * 541f7e3916SSepherosa Ziehau * This value is the number of receive descriptors allocated by the driver. 551f7e3916SSepherosa Ziehau * Increasing this value allows the driver to buffer more incoming packets. 561f7e3916SSepherosa Ziehau * Each descriptor is 16 bytes. A receive buffer is also allocated for each 571f7e3916SSepherosa Ziehau * descriptor. The maximum MTU size is 16110. 581f7e3916SSepherosa Ziehau * Since TDLEN should be multiple of 128bytes, the number of transmit 591f7e3916SSepherosa Ziehau * desscriptors should meet the following condition. 601f7e3916SSepherosa Ziehau * (num_tx_desc * sizeof(struct e1000_tx_desc)) % 128 == 0 611f7e3916SSepherosa Ziehau */ 621f7e3916SSepherosa Ziehau #define IGB_MIN_RXD 256 631f7e3916SSepherosa Ziehau #define IGB_DEFAULT_RXD 1024 641f7e3916SSepherosa Ziehau #define IGB_MAX_RXD 4096 651f7e3916SSepherosa Ziehau 661f7e3916SSepherosa Ziehau /* 671f7e3916SSepherosa Ziehau * This parameter controls when the driver calls the routine to reclaim 681f7e3916SSepherosa Ziehau * transmit descriptors. Cleaning earlier seems a win. 691f7e3916SSepherosa Ziehau */ 701f7e3916SSepherosa Ziehau #define IGB_TX_CLEANUP_THRESHOLD(sc) ((sc)->num_tx_desc / 2) 711f7e3916SSepherosa Ziehau 721f7e3916SSepherosa Ziehau /* 731f7e3916SSepherosa Ziehau * This parameter controls whether or not autonegotation is enabled. 741f7e3916SSepherosa Ziehau * 0 - Disable autonegotiation 751f7e3916SSepherosa Ziehau * 1 - Enable autonegotiation 761f7e3916SSepherosa Ziehau */ 771f7e3916SSepherosa Ziehau #define DO_AUTO_NEG 1 781f7e3916SSepherosa Ziehau 791f7e3916SSepherosa Ziehau /* 801f7e3916SSepherosa Ziehau * This parameter control whether or not the driver will wait for 811f7e3916SSepherosa Ziehau * autonegotiation to complete. 821f7e3916SSepherosa Ziehau * 1 - Wait for autonegotiation to complete 831f7e3916SSepherosa Ziehau * 0 - Don't wait for autonegotiation to complete 841f7e3916SSepherosa Ziehau */ 851f7e3916SSepherosa Ziehau #define WAIT_FOR_AUTO_NEG_DEFAULT 0 861f7e3916SSepherosa Ziehau 871f7e3916SSepherosa Ziehau /* Tunables -- End */ 881f7e3916SSepherosa Ziehau 891f7e3916SSepherosa Ziehau #define AUTONEG_ADV_DEFAULT (ADVERTISE_10_HALF | ADVERTISE_10_FULL | \ 901f7e3916SSepherosa Ziehau ADVERTISE_100_HALF | ADVERTISE_100_FULL | \ 911f7e3916SSepherosa Ziehau ADVERTISE_1000_FULL) 921f7e3916SSepherosa Ziehau 931f7e3916SSepherosa Ziehau #define AUTO_ALL_MODES 0 941f7e3916SSepherosa Ziehau 951f7e3916SSepherosa Ziehau /* PHY master/slave setting */ 961f7e3916SSepherosa Ziehau #define IGB_MASTER_SLAVE e1000_ms_hw_default 971f7e3916SSepherosa Ziehau 981f7e3916SSepherosa Ziehau /* 991f7e3916SSepherosa Ziehau * Micellaneous constants 1001f7e3916SSepherosa Ziehau */ 1011f7e3916SSepherosa Ziehau #define IGB_VENDOR_ID 0x8086 1021f7e3916SSepherosa Ziehau 1031f7e3916SSepherosa Ziehau #define IGB_JUMBO_PBA 0x00000028 1041f7e3916SSepherosa Ziehau #define IGB_DEFAULT_PBA 0x00000030 1051f7e3916SSepherosa Ziehau #define IGB_SMARTSPEED_DOWNSHIFT 3 1061f7e3916SSepherosa Ziehau #define IGB_SMARTSPEED_MAX 15 1071f7e3916SSepherosa Ziehau #define IGB_MAX_LOOP 10 1081f7e3916SSepherosa Ziehau 1091f7e3916SSepherosa Ziehau #define IGB_RX_PTHRESH (hw->mac.type <= e1000_82576 ? 16 : 8) 1101f7e3916SSepherosa Ziehau #define IGB_RX_HTHRESH 8 1111f7e3916SSepherosa Ziehau #define IGB_RX_WTHRESH 1 1121f7e3916SSepherosa Ziehau 1131f7e3916SSepherosa Ziehau #define IGB_TX_PTHRESH 8 1141f7e3916SSepherosa Ziehau #define IGB_TX_HTHRESH 1 1151f7e3916SSepherosa Ziehau #define IGB_TX_WTHRESH ((hw->mac.type != e1000_82575 && \ 1161f7e3916SSepherosa Ziehau sc->msix_mem) ? 1 : 16) 1171f7e3916SSepherosa Ziehau 1181f7e3916SSepherosa Ziehau #define MAX_NUM_MULTICAST_ADDRESSES 128 1191f7e3916SSepherosa Ziehau #define IGB_FC_PAUSE_TIME 0x0680 1201f7e3916SSepherosa Ziehau 1211f7e3916SSepherosa Ziehau #define IGB_INTR_RATE 10000 1221f7e3916SSepherosa Ziehau 1231f7e3916SSepherosa Ziehau /* 1241f7e3916SSepherosa Ziehau * TDBA/RDBA should be aligned on 16 byte boundary. But TDLEN/RDLEN should be 1251f7e3916SSepherosa Ziehau * multiple of 128 bytes. So we align TDBA/RDBA on 128 byte boundary. This will 1261f7e3916SSepherosa Ziehau * also optimize cache line size effect. H/W supports up to cache line size 128. 1271f7e3916SSepherosa Ziehau */ 1281f7e3916SSepherosa Ziehau #define IGB_DBA_ALIGN 128 1291f7e3916SSepherosa Ziehau 1301f7e3916SSepherosa Ziehau /* PCI Config defines */ 1311f7e3916SSepherosa Ziehau #define IGB_MSIX_BAR 3 1321f7e3916SSepherosa Ziehau 1331f7e3916SSepherosa Ziehau #define IGB_MAX_SCATTER 64 1341f7e3916SSepherosa Ziehau #define IGB_VFTA_SIZE 128 1351f7e3916SSepherosa Ziehau #define IGB_TSO_SIZE (65535 + \ 1361f7e3916SSepherosa Ziehau sizeof(struct ether_vlan_header)) 1371f7e3916SSepherosa Ziehau #define IGB_TSO_SEG_SIZE 4096 /* Max dma segment size */ 1381f7e3916SSepherosa Ziehau #define IGB_HDR_BUF 128 1391f7e3916SSepherosa Ziehau #define IGB_PKTTYPE_MASK 0x0000FFF0 1401f7e3916SSepherosa Ziehau 1411f7e3916SSepherosa Ziehau #define IGB_CSUM_FEATURES (CSUM_IP | CSUM_TCP | CSUM_UDP) 1421f7e3916SSepherosa Ziehau #define IGB_IPVHL_SIZE 1 /* sizeof(ip.ip_vhl) */ 1431f7e3916SSepherosa Ziehau #define IGB_TXCSUM_MINHL (ETHER_HDR_LEN + EVL_ENCAPLEN + \ 1441f7e3916SSepherosa Ziehau IGB_IPVHL_SIZE) 1451f7e3916SSepherosa Ziehau 146b6220144SSepherosa Ziehau /* One for TX csum offloading desc, the other 2 are reserved */ 147b6220144SSepherosa Ziehau #define IGB_TX_RESERVED 3 148b6220144SSepherosa Ziehau 149b6220144SSepherosa Ziehau /* Large enough for 64K TSO */ 150b6220144SSepherosa Ziehau #define IGB_TX_SPARE 32 151b6220144SSepherosa Ziehau 152b6220144SSepherosa Ziehau #define IGB_TX_OACTIVE_MAX 64 153b6220144SSepherosa Ziehau 1541f7e3916SSepherosa Ziehau struct igb_softc; 1551f7e3916SSepherosa Ziehau 1561f7e3916SSepherosa Ziehau /* 1571f7e3916SSepherosa Ziehau * Bus dma information structure 1581f7e3916SSepherosa Ziehau */ 1591f7e3916SSepherosa Ziehau struct igb_dma { 1601f7e3916SSepherosa Ziehau bus_addr_t dma_paddr; 1611f7e3916SSepherosa Ziehau void *dma_vaddr; 1621f7e3916SSepherosa Ziehau bus_dma_tag_t dma_tag; 1631f7e3916SSepherosa Ziehau bus_dmamap_t dma_map; 1641f7e3916SSepherosa Ziehau }; 1651f7e3916SSepherosa Ziehau 1661f7e3916SSepherosa Ziehau /* 1671f7e3916SSepherosa Ziehau * Transmit ring: one per queue 1681f7e3916SSepherosa Ziehau */ 1691f7e3916SSepherosa Ziehau struct igb_tx_ring { 1701f7e3916SSepherosa Ziehau struct igb_softc *sc; 1711f7e3916SSepherosa Ziehau uint32_t me; 1721f7e3916SSepherosa Ziehau struct igb_dma txdma; 173b6220144SSepherosa Ziehau bus_dma_tag_t tx_hdr_dtag; 174b6220144SSepherosa Ziehau bus_dmamap_t tx_hdr_dmap; 175b6220144SSepherosa Ziehau bus_addr_t tx_hdr_paddr; 1761f7e3916SSepherosa Ziehau struct e1000_tx_desc *tx_base; 1771f7e3916SSepherosa Ziehau uint32_t next_avail_desc; 1781f7e3916SSepherosa Ziehau uint32_t next_to_clean; 179b6220144SSepherosa Ziehau uint32_t *tx_hdr; 180b6220144SSepherosa Ziehau int tx_avail; 1811f7e3916SSepherosa Ziehau struct igb_tx_buf *tx_buf; 1821f7e3916SSepherosa Ziehau bus_dma_tag_t tx_tag; 183b6220144SSepherosa Ziehau int tx_nsegs; 184b6220144SSepherosa Ziehau int spare_desc; 185b6220144SSepherosa Ziehau int oact_lo_desc; 186b6220144SSepherosa Ziehau int oact_hi_desc; 187b6220144SSepherosa Ziehau int intr_nsegs; 188f6167a56SSepherosa Ziehau int tx_intr_bit; 189f6167a56SSepherosa Ziehau uint32_t tx_intr_mask; 1901f7e3916SSepherosa Ziehau 1911f7e3916SSepherosa Ziehau u_long no_desc_avail; 1921f7e3916SSepherosa Ziehau u_long tx_packets; 1931f7e3916SSepherosa Ziehau 1941f7e3916SSepherosa Ziehau u_long ctx_try_pullup; 1951f7e3916SSepherosa Ziehau u_long ctx_drop1; 1961f7e3916SSepherosa Ziehau u_long ctx_drop2; 1971f7e3916SSepherosa Ziehau u_long ctx_pullup1; 1981f7e3916SSepherosa Ziehau u_long ctx_pullup1_failed; 1991f7e3916SSepherosa Ziehau u_long ctx_pullup2; 2001f7e3916SSepherosa Ziehau u_long ctx_pullup2_failed; 2011f7e3916SSepherosa Ziehau }; 2021f7e3916SSepherosa Ziehau 2031f7e3916SSepherosa Ziehau /* 2041f7e3916SSepherosa Ziehau * Receive ring: one per queue 2051f7e3916SSepherosa Ziehau */ 2061f7e3916SSepherosa Ziehau struct igb_rx_ring { 2071f7e3916SSepherosa Ziehau struct igb_softc *sc; 2081f7e3916SSepherosa Ziehau uint32_t me; 2091f7e3916SSepherosa Ziehau struct igb_dma rxdma; 2101f7e3916SSepherosa Ziehau union e1000_adv_rx_desc *rx_base; 2111f7e3916SSepherosa Ziehau boolean_t discard; 2121f7e3916SSepherosa Ziehau uint32_t next_to_check; 2131f7e3916SSepherosa Ziehau struct igb_rx_buf *rx_buf; 2141f7e3916SSepherosa Ziehau bus_dma_tag_t rx_tag; 2151f7e3916SSepherosa Ziehau bus_dmamap_t rx_sparemap; 216f6167a56SSepherosa Ziehau int rx_intr_bit; 217f6167a56SSepherosa Ziehau uint32_t rx_intr_mask; 2181f7e3916SSepherosa Ziehau 2191f7e3916SSepherosa Ziehau /* 2201f7e3916SSepherosa Ziehau * First/last mbuf pointers, for 2211f7e3916SSepherosa Ziehau * collecting multisegment RX packets. 2221f7e3916SSepherosa Ziehau */ 2231f7e3916SSepherosa Ziehau struct mbuf *fmp; 2241f7e3916SSepherosa Ziehau struct mbuf *lmp; 2251f7e3916SSepherosa Ziehau 2261f7e3916SSepherosa Ziehau /* Soft stats */ 2271f7e3916SSepherosa Ziehau u_long rx_packets; 2281f7e3916SSepherosa Ziehau }; 2291f7e3916SSepherosa Ziehau 2301f7e3916SSepherosa Ziehau struct igb_softc { 2311f7e3916SSepherosa Ziehau struct arpcom arpcom; 2321f7e3916SSepherosa Ziehau struct e1000_hw hw; 2331f7e3916SSepherosa Ziehau 2341f7e3916SSepherosa Ziehau struct e1000_osdep osdep; 2351f7e3916SSepherosa Ziehau device_t dev; 236f6167a56SSepherosa Ziehau uint32_t flags; 237f6167a56SSepherosa Ziehau #define IGB_FLAG_SHARED_INTR 0x1 2381f7e3916SSepherosa Ziehau 2391f7e3916SSepherosa Ziehau bus_dma_tag_t parent_tag; 2401f7e3916SSepherosa Ziehau 2411f7e3916SSepherosa Ziehau int mem_rid; 2421f7e3916SSepherosa Ziehau struct resource *mem_res; 2431f7e3916SSepherosa Ziehau 2441f7e3916SSepherosa Ziehau struct resource *msix_mem; 2451f7e3916SSepherosa Ziehau void *tag; 2461f7e3916SSepherosa Ziehau uint32_t que_mask; 2471f7e3916SSepherosa Ziehau 2481f7e3916SSepherosa Ziehau int linkvec; 2491f7e3916SSepherosa Ziehau int link_mask; 2501f7e3916SSepherosa Ziehau int link_irq; 2511f7e3916SSepherosa Ziehau 2521f7e3916SSepherosa Ziehau struct ifmedia media; 2531f7e3916SSepherosa Ziehau struct callout timer; 2541f7e3916SSepherosa Ziehau 2551f7e3916SSepherosa Ziehau #if 0 2561f7e3916SSepherosa Ziehau int msix; /* total vectors allocated */ 2571f7e3916SSepherosa Ziehau #endif 2581f7e3916SSepherosa Ziehau int intr_type; 2591f7e3916SSepherosa Ziehau int intr_rid; 2601f7e3916SSepherosa Ziehau struct resource *intr_res; 2611f7e3916SSepherosa Ziehau void *intr_tag; 2621f7e3916SSepherosa Ziehau 2631f7e3916SSepherosa Ziehau int if_flags; 2641f7e3916SSepherosa Ziehau int max_frame_size; 2651f7e3916SSepherosa Ziehau int min_frame_size; 2661f7e3916SSepherosa Ziehau int pause_frames; 2671f7e3916SSepherosa Ziehau uint16_t vf_ifp; /* a VF interface */ 2681f7e3916SSepherosa Ziehau 2691f7e3916SSepherosa Ziehau /* Management and WOL features */ 2701f7e3916SSepherosa Ziehau int wol; 2711f7e3916SSepherosa Ziehau int has_manage; 2721f7e3916SSepherosa Ziehau 2731f7e3916SSepherosa Ziehau /* Info about the interface */ 2741f7e3916SSepherosa Ziehau uint8_t link_active; 2751f7e3916SSepherosa Ziehau uint16_t link_speed; 2761f7e3916SSepherosa Ziehau uint16_t link_duplex; 2771f7e3916SSepherosa Ziehau uint32_t smartspeed; 2781f7e3916SSepherosa Ziehau uint32_t dma_coalesce; 2791f7e3916SSepherosa Ziehau 2801f7e3916SSepherosa Ziehau int intr_rate; 281f6167a56SSepherosa Ziehau uint32_t intr_mask; 2821f7e3916SSepherosa Ziehau 2831f7e3916SSepherosa Ziehau /* 2841f7e3916SSepherosa Ziehau * Transmit rings 2851f7e3916SSepherosa Ziehau */ 286*27866bf1SSepherosa Ziehau int tx_ring_cnt; 2871f7e3916SSepherosa Ziehau struct igb_tx_ring *tx_rings; 2881f7e3916SSepherosa Ziehau int num_tx_desc; 2891f7e3916SSepherosa Ziehau 2901f7e3916SSepherosa Ziehau /* Multicast array pointer */ 2911f7e3916SSepherosa Ziehau uint8_t *mta; 2921f7e3916SSepherosa Ziehau 2931f7e3916SSepherosa Ziehau /* 2941f7e3916SSepherosa Ziehau * Receive rings 2951f7e3916SSepherosa Ziehau */ 296*27866bf1SSepherosa Ziehau int rx_ring_cnt; 2971f7e3916SSepherosa Ziehau struct igb_rx_ring *rx_rings; 2981f7e3916SSepherosa Ziehau int num_rx_desc; 2991f7e3916SSepherosa Ziehau uint32_t rx_mbuf_sz; 3001f7e3916SSepherosa Ziehau uint32_t rx_mask; 3011f7e3916SSepherosa Ziehau 3021f7e3916SSepherosa Ziehau /* Misc stats maintained by the driver */ 3031f7e3916SSepherosa Ziehau u_long dropped_pkts; 3041f7e3916SSepherosa Ziehau u_long mbuf_defrag_failed; 3051f7e3916SSepherosa Ziehau u_long no_tx_dma_setup; 3061f7e3916SSepherosa Ziehau u_long watchdog_events; 3071f7e3916SSepherosa Ziehau u_long rx_overruns; 3081f7e3916SSepherosa Ziehau u_long device_control; 3091f7e3916SSepherosa Ziehau u_long rx_control; 3101f7e3916SSepherosa Ziehau u_long int_mask; 3111f7e3916SSepherosa Ziehau u_long eint_mask; 3121f7e3916SSepherosa Ziehau u_long packet_buf_alloc_rx; 3131f7e3916SSepherosa Ziehau u_long packet_buf_alloc_tx; 3141f7e3916SSepherosa Ziehau 3151f7e3916SSepherosa Ziehau /* sysctl tree glue */ 3161f7e3916SSepherosa Ziehau struct sysctl_ctx_list sysctl_ctx; 3171f7e3916SSepherosa Ziehau struct sysctl_oid *sysctl_tree; 3181f7e3916SSepherosa Ziehau 3191f7e3916SSepherosa Ziehau void *stats; 3201f7e3916SSepherosa Ziehau }; 3211f7e3916SSepherosa Ziehau 3221f7e3916SSepherosa Ziehau struct igb_tx_buf { 3231f7e3916SSepherosa Ziehau struct mbuf *m_head; 3241f7e3916SSepherosa Ziehau bus_dmamap_t map; /* bus_dma map for packet */ 3251f7e3916SSepherosa Ziehau }; 3261f7e3916SSepherosa Ziehau 3271f7e3916SSepherosa Ziehau struct igb_rx_buf { 3281f7e3916SSepherosa Ziehau struct mbuf *m_head; 3291f7e3916SSepherosa Ziehau bus_dmamap_t map; /* bus_dma map for packet */ 3301f7e3916SSepherosa Ziehau bus_addr_t paddr; 3311f7e3916SSepherosa Ziehau }; 3321f7e3916SSepherosa Ziehau 3331f7e3916SSepherosa Ziehau #define UPDATE_VF_REG(reg, last, cur) \ 3341f7e3916SSepherosa Ziehau { \ 3351f7e3916SSepherosa Ziehau uint32_t new = E1000_READ_REG(hw, reg); \ 3361f7e3916SSepherosa Ziehau if (new < last) \ 3371f7e3916SSepherosa Ziehau cur += 0x100000000LL; \ 3381f7e3916SSepherosa Ziehau last = new; \ 3391f7e3916SSepherosa Ziehau cur &= 0xFFFFFFFF00000000LL; \ 3401f7e3916SSepherosa Ziehau cur |= new; \ 3411f7e3916SSepherosa Ziehau } 3421f7e3916SSepherosa Ziehau 343b6220144SSepherosa Ziehau #define IGB_IS_OACTIVE(txr) ((txr)->tx_avail < (txr)->oact_lo_desc) 344b6220144SSepherosa Ziehau #define IGB_IS_NOT_OACTIVE(txr) ((txr)->tx_avail >= (txr)->oact_hi_desc) 345b6220144SSepherosa Ziehau 3461f7e3916SSepherosa Ziehau #endif /* _IF_IGB_H_ */ 347