xref: /dflybsd-src/sys/dev/netif/igb/if_igb.h (revision 7b61c9f2d576da4a207790c3b01c9bcabc071632)
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 /*
388d6600daSSepherosa Ziehau  * Max ring count
398d6600daSSepherosa Ziehau  */
408d6600daSSepherosa Ziehau #define IGB_MAX_RING_82575	4
418d6600daSSepherosa Ziehau #define IGB_MAX_RING_I350	8
428d6600daSSepherosa Ziehau #define IGB_MAX_RING_82580	8
438d6600daSSepherosa Ziehau #define IGB_MAX_RING_82576	16
448d6600daSSepherosa Ziehau #define IGB_MIN_RING		1
45be922da6SSepherosa Ziehau #define IGB_MIN_RING_RSS	2
468d6600daSSepherosa Ziehau 
478d6600daSSepherosa Ziehau /*
488d6600daSSepherosa Ziehau  * Max TX/RX interrupt bits
498d6600daSSepherosa Ziehau  */
508d6600daSSepherosa Ziehau #define IGB_MAX_TXRXINT_82575	4	/* XXX not used */
518d6600daSSepherosa Ziehau #define IGB_MAX_TXRXINT_I350	8
528d6600daSSepherosa Ziehau #define IGB_MAX_TXRXINT_82580	8
538d6600daSSepherosa Ziehau #define IGB_MAX_TXRXINT_82576	16
548d6600daSSepherosa Ziehau #define IGB_MIN_TXRXINT		2	/* XXX VF? */
558d6600daSSepherosa Ziehau 
568d6600daSSepherosa Ziehau /*
579c0ecdccSSepherosa Ziehau  * Max IVAR count
589c0ecdccSSepherosa Ziehau  */
599c0ecdccSSepherosa Ziehau #define IGB_MAX_IVAR_I350	4
609c0ecdccSSepherosa Ziehau #define IGB_MAX_IVAR_82580	4
619c0ecdccSSepherosa Ziehau #define IGB_MAX_IVAR_82576	8
629c0ecdccSSepherosa Ziehau #define IGB_MAX_IVAR_VF		1
639c0ecdccSSepherosa Ziehau 
649c0ecdccSSepherosa Ziehau /*
651f7e3916SSepherosa Ziehau  * IGB_TXD: Maximum number of Transmit Descriptors
661f7e3916SSepherosa Ziehau  *
671f7e3916SSepherosa Ziehau  *   This value is the number of transmit descriptors allocated by the driver.
681f7e3916SSepherosa Ziehau  *   Increasing this value allows the driver to queue more transmits. Each
691f7e3916SSepherosa Ziehau  *   descriptor is 16 bytes.
701f7e3916SSepherosa Ziehau  *   Since TDLEN should be multiple of 128bytes, the number of transmit
711f7e3916SSepherosa Ziehau  *   desscriptors should meet the following condition.
721f7e3916SSepherosa Ziehau  *      (num_tx_desc * sizeof(struct e1000_tx_desc)) % 128 == 0
731f7e3916SSepherosa Ziehau  */
741f7e3916SSepherosa Ziehau #define IGB_MIN_TXD		256
751f7e3916SSepherosa Ziehau #define IGB_DEFAULT_TXD		1024
761f7e3916SSepherosa Ziehau #define IGB_MAX_TXD		4096
771f7e3916SSepherosa Ziehau 
781f7e3916SSepherosa Ziehau /*
791f7e3916SSepherosa Ziehau  * IGB_RXD: Maximum number of Transmit Descriptors
801f7e3916SSepherosa Ziehau  *
811f7e3916SSepherosa Ziehau  *   This value is the number of receive descriptors allocated by the driver.
821f7e3916SSepherosa Ziehau  *   Increasing this value allows the driver to buffer more incoming packets.
831f7e3916SSepherosa Ziehau  *   Each descriptor is 16 bytes.  A receive buffer is also allocated for each
841f7e3916SSepherosa Ziehau  *   descriptor. The maximum MTU size is 16110.
851f7e3916SSepherosa Ziehau  *   Since TDLEN should be multiple of 128bytes, the number of transmit
861f7e3916SSepherosa Ziehau  *   desscriptors should meet the following condition.
871f7e3916SSepherosa Ziehau  *      (num_tx_desc * sizeof(struct e1000_tx_desc)) % 128 == 0
881f7e3916SSepherosa Ziehau  */
891f7e3916SSepherosa Ziehau #define IGB_MIN_RXD		256
90e7c14703SSepherosa Ziehau #define IGB_DEFAULT_RXD		512
911f7e3916SSepherosa Ziehau #define IGB_MAX_RXD		4096
921f7e3916SSepherosa Ziehau 
931f7e3916SSepherosa Ziehau /*
941f7e3916SSepherosa Ziehau  * This parameter controls when the driver calls the routine to reclaim
951f7e3916SSepherosa Ziehau  * transmit descriptors. Cleaning earlier seems a win.
961f7e3916SSepherosa Ziehau  */
971f7e3916SSepherosa Ziehau #define IGB_TX_CLEANUP_THRESHOLD(sc)	((sc)->num_tx_desc / 2)
981f7e3916SSepherosa Ziehau 
991f7e3916SSepherosa Ziehau /*
1001f7e3916SSepherosa Ziehau  * This parameter controls whether or not autonegotation is enabled.
1011f7e3916SSepherosa Ziehau  *              0 - Disable autonegotiation
1021f7e3916SSepherosa Ziehau  *              1 - Enable  autonegotiation
1031f7e3916SSepherosa Ziehau  */
1041f7e3916SSepherosa Ziehau #define DO_AUTO_NEG		1
1051f7e3916SSepherosa Ziehau 
1061f7e3916SSepherosa Ziehau /*
1071f7e3916SSepherosa Ziehau  * This parameter control whether or not the driver will wait for
1081f7e3916SSepherosa Ziehau  * autonegotiation to complete.
1091f7e3916SSepherosa Ziehau  *              1 - Wait for autonegotiation to complete
1101f7e3916SSepherosa Ziehau  *              0 - Don't wait for autonegotiation to complete
1111f7e3916SSepherosa Ziehau  */
1121f7e3916SSepherosa Ziehau #define WAIT_FOR_AUTO_NEG_DEFAULT	0
1131f7e3916SSepherosa Ziehau 
1141f7e3916SSepherosa Ziehau /* Tunables -- End */
1151f7e3916SSepherosa Ziehau 
1161f7e3916SSepherosa Ziehau #define AUTONEG_ADV_DEFAULT	(ADVERTISE_10_HALF | ADVERTISE_10_FULL | \
1171f7e3916SSepherosa Ziehau 				 ADVERTISE_100_HALF | ADVERTISE_100_FULL | \
1181f7e3916SSepherosa Ziehau 				 ADVERTISE_1000_FULL)
1191f7e3916SSepherosa Ziehau 
1201f7e3916SSepherosa Ziehau #define AUTO_ALL_MODES			0
1211f7e3916SSepherosa Ziehau 
1221f7e3916SSepherosa Ziehau /* PHY master/slave setting */
1231f7e3916SSepherosa Ziehau #define IGB_MASTER_SLAVE		e1000_ms_hw_default
1241f7e3916SSepherosa Ziehau 
1251f7e3916SSepherosa Ziehau /*
1261f7e3916SSepherosa Ziehau  * Micellaneous constants
1271f7e3916SSepherosa Ziehau  */
1281f7e3916SSepherosa Ziehau #define IGB_VENDOR_ID			0x8086
1291f7e3916SSepherosa Ziehau 
1301f7e3916SSepherosa Ziehau #define IGB_JUMBO_PBA			0x00000028
1311f7e3916SSepherosa Ziehau #define IGB_DEFAULT_PBA			0x00000030
1321f7e3916SSepherosa Ziehau #define IGB_SMARTSPEED_DOWNSHIFT	3
1331f7e3916SSepherosa Ziehau #define IGB_SMARTSPEED_MAX		15
1341f7e3916SSepherosa Ziehau #define IGB_MAX_LOOP			10
1351f7e3916SSepherosa Ziehau 
1361f7e3916SSepherosa Ziehau #define IGB_RX_PTHRESH			(hw->mac.type <= e1000_82576 ? 16 : 8)
1371f7e3916SSepherosa Ziehau #define IGB_RX_HTHRESH			8
1381f7e3916SSepherosa Ziehau #define IGB_RX_WTHRESH			1
1391f7e3916SSepherosa Ziehau 
1401f7e3916SSepherosa Ziehau #define IGB_TX_PTHRESH			8
1411f7e3916SSepherosa Ziehau #define IGB_TX_HTHRESH			1
142396b7048SSepherosa Ziehau #define IGB_TX_WTHRESH			16
1431f7e3916SSepherosa Ziehau 
1441f7e3916SSepherosa Ziehau #define MAX_NUM_MULTICAST_ADDRESSES	128
1451f7e3916SSepherosa Ziehau #define IGB_FC_PAUSE_TIME		0x0680
1461f7e3916SSepherosa Ziehau 
147c2d84054SSepherosa Ziehau #define IGB_INTR_RATE			6000
1489c0ecdccSSepherosa Ziehau #define IGB_MSIX_RX_RATE		6000
1499c0ecdccSSepherosa Ziehau #define IGB_MSIX_TX_RATE		4000
1501f7e3916SSepherosa Ziehau 
1511f7e3916SSepherosa Ziehau /*
1521f7e3916SSepherosa Ziehau  * TDBA/RDBA should be aligned on 16 byte boundary. But TDLEN/RDLEN should be
1531f7e3916SSepherosa Ziehau  * multiple of 128 bytes. So we align TDBA/RDBA on 128 byte boundary. This will
1541f7e3916SSepherosa Ziehau  * also optimize cache line size effect. H/W supports up to cache line size 128.
1551f7e3916SSepherosa Ziehau  */
1561f7e3916SSepherosa Ziehau #define IGB_DBA_ALIGN			128
1571f7e3916SSepherosa Ziehau 
1581f7e3916SSepherosa Ziehau /* PCI Config defines */
1591f7e3916SSepherosa Ziehau #define IGB_MSIX_BAR			3
1601f7e3916SSepherosa Ziehau 
1611f7e3916SSepherosa Ziehau #define IGB_MAX_SCATTER			64
1621f7e3916SSepherosa Ziehau #define IGB_VFTA_SIZE			128
16323f6ffe4SSepherosa Ziehau #define IGB_TSO_SIZE			(IP_MAXPACKET + \
1641f7e3916SSepherosa Ziehau 					 sizeof(struct ether_vlan_header))
1651f7e3916SSepherosa Ziehau #define IGB_HDR_BUF			128
1661f7e3916SSepherosa Ziehau #define IGB_PKTTYPE_MASK		0x0000FFF0
1671f7e3916SSepherosa Ziehau 
1681f7e3916SSepherosa Ziehau #define IGB_CSUM_FEATURES		(CSUM_IP | CSUM_TCP | CSUM_UDP)
1691f7e3916SSepherosa Ziehau #define IGB_IPVHL_SIZE			1 /* sizeof(ip.ip_vhl) */
1701f7e3916SSepherosa Ziehau #define IGB_TXCSUM_MINHL		(ETHER_HDR_LEN + EVL_ENCAPLEN + \
1711f7e3916SSepherosa Ziehau 					 IGB_IPVHL_SIZE)
1721f7e3916SSepherosa Ziehau 
173b6220144SSepherosa Ziehau /* One for TX csum offloading desc, the other 2 are reserved */
174b6220144SSepherosa Ziehau #define IGB_TX_RESERVED			3
175b6220144SSepherosa Ziehau 
176b6220144SSepherosa Ziehau /* Large enough for 64K TSO */
17723f6ffe4SSepherosa Ziehau #define IGB_TX_SPARE			33
178b6220144SSepherosa Ziehau 
179b6220144SSepherosa Ziehau #define IGB_TX_OACTIVE_MAX		64
180b6220144SSepherosa Ziehau 
1817d235eb5SSepherosa Ziehau /* main + 16x RX + 16x TX */
1827d235eb5SSepherosa Ziehau #define IGB_NSERIALIZE			33
1837d235eb5SSepherosa Ziehau 
1848d6600daSSepherosa Ziehau #define IGB_NRSSRK			10
1858d6600daSSepherosa Ziehau #define IGB_RSSRK_SIZE			4
1868d6600daSSepherosa Ziehau #define IGB_RSSRK_VAL(key, i)		(key[(i) * IGB_RSSRK_SIZE] | \
1878d6600daSSepherosa Ziehau 					 key[(i) * IGB_RSSRK_SIZE + 1] << 8 | \
1888d6600daSSepherosa Ziehau 					 key[(i) * IGB_RSSRK_SIZE + 2] << 16 | \
1898d6600daSSepherosa Ziehau 					 key[(i) * IGB_RSSRK_SIZE + 3] << 24)
1908d6600daSSepherosa Ziehau 
1918d6600daSSepherosa Ziehau #define IGB_NRETA			32
1928d6600daSSepherosa Ziehau #define IGB_RETA_SIZE			4
1938d6600daSSepherosa Ziehau #define IGB_RETA_SHIFT			0
1948d6600daSSepherosa Ziehau #define IGB_RETA_SHIFT_82575		6
1958d6600daSSepherosa Ziehau 
196d4beffa9SSepherosa Ziehau #define IGB_EITR_INTVL_MASK		0x7ffc
197d4beffa9SSepherosa Ziehau #define IGB_EITR_INTVL_SHIFT		2
198d4beffa9SSepherosa Ziehau 
1991f7e3916SSepherosa Ziehau struct igb_softc;
2001f7e3916SSepherosa Ziehau 
2011f7e3916SSepherosa Ziehau /*
2021f7e3916SSepherosa Ziehau  * Bus dma information structure
2031f7e3916SSepherosa Ziehau  */
2041f7e3916SSepherosa Ziehau struct igb_dma {
2051f7e3916SSepherosa Ziehau 	bus_addr_t		dma_paddr;
2061f7e3916SSepherosa Ziehau 	void			*dma_vaddr;
2071f7e3916SSepherosa Ziehau 	bus_dma_tag_t		dma_tag;
2081f7e3916SSepherosa Ziehau 	bus_dmamap_t		dma_map;
2091f7e3916SSepherosa Ziehau };
2101f7e3916SSepherosa Ziehau 
2111f7e3916SSepherosa Ziehau /*
2121f7e3916SSepherosa Ziehau  * Transmit ring: one per queue
2131f7e3916SSepherosa Ziehau  */
2141f7e3916SSepherosa Ziehau struct igb_tx_ring {
2157d235eb5SSepherosa Ziehau 	struct lwkt_serialize	tx_serialize;
2161f7e3916SSepherosa Ziehau 	struct igb_softc	*sc;
2171f7e3916SSepherosa Ziehau 	uint32_t		me;
2181f7e3916SSepherosa Ziehau 	struct e1000_tx_desc	*tx_base;
21991b8700aSSepherosa Ziehau 	int			num_tx_desc;
2201f7e3916SSepherosa Ziehau 	uint32_t		next_avail_desc;
2211f7e3916SSepherosa Ziehau 	uint32_t		next_to_clean;
222b6220144SSepherosa Ziehau 	uint32_t		*tx_hdr;
223b6220144SSepherosa Ziehau 	int			tx_avail;
2241f7e3916SSepherosa Ziehau 	struct igb_tx_buf	*tx_buf;
2251f7e3916SSepherosa Ziehau 	bus_dma_tag_t		tx_tag;
226b6220144SSepherosa Ziehau 	int			tx_nsegs;
227b6220144SSepherosa Ziehau 	int			spare_desc;
228b6220144SSepherosa Ziehau 	int			oact_lo_desc;
229b6220144SSepherosa Ziehau 	int			oact_hi_desc;
230b6220144SSepherosa Ziehau 	int			intr_nsegs;
231f6167a56SSepherosa Ziehau 	int			tx_intr_bit;
232f6167a56SSepherosa Ziehau 	uint32_t		tx_intr_mask;
2331f7e3916SSepherosa Ziehau 
234791a0338SSepherosa Ziehau 	/* Soft stats */
2351f7e3916SSepherosa Ziehau 	u_long			no_desc_avail;
2361f7e3916SSepherosa Ziehau 	u_long			tx_packets;
237791a0338SSepherosa Ziehau 
238791a0338SSepherosa Ziehau 	struct igb_dma		txdma;
239791a0338SSepherosa Ziehau 	bus_dma_tag_t		tx_hdr_dtag;
240791a0338SSepherosa Ziehau 	bus_dmamap_t		tx_hdr_dmap;
241791a0338SSepherosa Ziehau 	bus_addr_t		tx_hdr_paddr;
242ff230ec8SSepherosa Ziehau } __cachealign;
2431f7e3916SSepherosa Ziehau 
2441f7e3916SSepherosa Ziehau /*
2451f7e3916SSepherosa Ziehau  * Receive ring: one per queue
2461f7e3916SSepherosa Ziehau  */
2471f7e3916SSepherosa Ziehau struct igb_rx_ring {
2487d235eb5SSepherosa Ziehau 	struct lwkt_serialize	rx_serialize;
2491f7e3916SSepherosa Ziehau 	struct igb_softc	*sc;
2501f7e3916SSepherosa Ziehau 	uint32_t		me;
2511f7e3916SSepherosa Ziehau 	union e1000_adv_rx_desc	*rx_base;
2521f7e3916SSepherosa Ziehau 	boolean_t		discard;
25391b8700aSSepherosa Ziehau 	int			num_rx_desc;
2541f7e3916SSepherosa Ziehau 	uint32_t		next_to_check;
2551f7e3916SSepherosa Ziehau 	struct igb_rx_buf	*rx_buf;
2561f7e3916SSepherosa Ziehau 	bus_dma_tag_t		rx_tag;
2571f7e3916SSepherosa Ziehau 	bus_dmamap_t		rx_sparemap;
258f6167a56SSepherosa Ziehau 	int			rx_intr_bit;
259f6167a56SSepherosa Ziehau 	uint32_t		rx_intr_mask;
2601f7e3916SSepherosa Ziehau 
2611f7e3916SSepherosa Ziehau 	/*
2621f7e3916SSepherosa Ziehau 	 * First/last mbuf pointers, for
2631f7e3916SSepherosa Ziehau 	 * collecting multisegment RX packets.
2641f7e3916SSepherosa Ziehau 	 */
2651f7e3916SSepherosa Ziehau 	struct mbuf		*fmp;
2661f7e3916SSepherosa Ziehau 	struct mbuf		*lmp;
2671f7e3916SSepherosa Ziehau 
2681f7e3916SSepherosa Ziehau 	/* Soft stats */
2691f7e3916SSepherosa Ziehau 	u_long			rx_packets;
270791a0338SSepherosa Ziehau 
271791a0338SSepherosa Ziehau 	struct igb_dma		rxdma;
272ff230ec8SSepherosa Ziehau } __cachealign;
2731f7e3916SSepherosa Ziehau 
2749c0ecdccSSepherosa Ziehau struct igb_msix_data {
2759c0ecdccSSepherosa Ziehau 	struct lwkt_serialize	*msix_serialize;
2769c0ecdccSSepherosa Ziehau 	struct lwkt_serialize	msix_serialize0;
2779c0ecdccSSepherosa Ziehau 	struct igb_softc	*msix_sc;
2789c0ecdccSSepherosa Ziehau 	uint32_t		msix_mask;
2799c0ecdccSSepherosa Ziehau 	struct igb_rx_ring	*msix_rx;
2809c0ecdccSSepherosa Ziehau 	struct igb_tx_ring	*msix_tx;
2819c0ecdccSSepherosa Ziehau 
2829c0ecdccSSepherosa Ziehau 	driver_intr_t		*msix_func;
2839c0ecdccSSepherosa Ziehau 	void			*msix_arg;
2849c0ecdccSSepherosa Ziehau 
2859c0ecdccSSepherosa Ziehau 	int			msix_cpuid;
2869c0ecdccSSepherosa Ziehau 	char			msix_desc[32];
2879c0ecdccSSepherosa Ziehau 	int			msix_rid;
2889c0ecdccSSepherosa Ziehau 	struct resource		*msix_res;
2899c0ecdccSSepherosa Ziehau 	void			*msix_handle;
2909c0ecdccSSepherosa Ziehau 	u_int			msix_vector;
2919c0ecdccSSepherosa Ziehau 	int			msix_rate;
2929c0ecdccSSepherosa Ziehau 	char			msix_rate_desc[32];
293ff230ec8SSepherosa Ziehau } __cachealign;
2949c0ecdccSSepherosa Ziehau 
2951f7e3916SSepherosa Ziehau struct igb_softc {
2961f7e3916SSepherosa Ziehau 	struct arpcom		arpcom;
2971f7e3916SSepherosa Ziehau 	struct e1000_hw		hw;
2981f7e3916SSepherosa Ziehau 
2991f7e3916SSepherosa Ziehau 	struct e1000_osdep	osdep;
3001f7e3916SSepherosa Ziehau 	device_t		dev;
301f6167a56SSepherosa Ziehau 	uint32_t		flags;
302f6167a56SSepherosa Ziehau #define IGB_FLAG_SHARED_INTR	0x1
303396b7048SSepherosa Ziehau #define IGB_FLAG_HAS_MGMT	0x2
30423f6ffe4SSepherosa Ziehau #define IGB_FLAG_TSO_IPLEN0	0x4
3051f7e3916SSepherosa Ziehau 
3061f7e3916SSepherosa Ziehau 	bus_dma_tag_t		parent_tag;
3071f7e3916SSepherosa Ziehau 
3081f7e3916SSepherosa Ziehau 	int			mem_rid;
3091f7e3916SSepherosa Ziehau 	struct resource 	*mem_res;
3101f7e3916SSepherosa Ziehau 
3111f7e3916SSepherosa Ziehau 	struct ifmedia		media;
3121f7e3916SSepherosa Ziehau 	struct callout		timer;
313*7b61c9f2SSepherosa Ziehau 	int			timer_cpuid;
3141f7e3916SSepherosa Ziehau 
3151f7e3916SSepherosa Ziehau 	int			intr_type;
3161f7e3916SSepherosa Ziehau 	int			intr_rid;
3171f7e3916SSepherosa Ziehau 	struct resource		*intr_res;
3181f7e3916SSepherosa Ziehau 	void			*intr_tag;
3191f7e3916SSepherosa Ziehau 
3201f7e3916SSepherosa Ziehau 	int			if_flags;
3211f7e3916SSepherosa Ziehau 	int			max_frame_size;
3221f7e3916SSepherosa Ziehau 	int			pause_frames;
3231f7e3916SSepherosa Ziehau 	uint16_t		vf_ifp;	/* a VF interface */
3241f7e3916SSepherosa Ziehau 
3251f7e3916SSepherosa Ziehau 	/* Management and WOL features */
3261f7e3916SSepherosa Ziehau 	int			wol;
3271f7e3916SSepherosa Ziehau 
3281f7e3916SSepherosa Ziehau 	/* Info about the interface */
3291f7e3916SSepherosa Ziehau 	uint8_t			link_active;
3301f7e3916SSepherosa Ziehau 	uint16_t		link_speed;
3311f7e3916SSepherosa Ziehau 	uint16_t		link_duplex;
3321f7e3916SSepherosa Ziehau 	uint32_t		smartspeed;
3331f7e3916SSepherosa Ziehau 	uint32_t		dma_coalesce;
3341f7e3916SSepherosa Ziehau 
335396b7048SSepherosa Ziehau 	/* Multicast array pointer */
336396b7048SSepherosa Ziehau 	uint8_t			*mta;
337396b7048SSepherosa Ziehau 
338d0f59cadSSepherosa Ziehau 	int			rx_npoll_off;
339d0f59cadSSepherosa Ziehau 	int			tx_npoll_off;
3407d235eb5SSepherosa Ziehau 	int			serialize_cnt;
3417d235eb5SSepherosa Ziehau 	int			tx_serialize;
3427d235eb5SSepherosa Ziehau 	int			rx_serialize;
3437d235eb5SSepherosa Ziehau 	struct lwkt_serialize	*serializes[IGB_NSERIALIZE];
3447d235eb5SSepherosa Ziehau 	struct lwkt_serialize	main_serialize;
3457d235eb5SSepherosa Ziehau 
3461f7e3916SSepherosa Ziehau 	int			intr_rate;
347f6167a56SSepherosa Ziehau 	uint32_t		intr_mask;
3489c0ecdccSSepherosa Ziehau 	int			sts_intr_bit;
3499c0ecdccSSepherosa Ziehau 	uint32_t		sts_intr_mask;
3501f7e3916SSepherosa Ziehau 
3511f7e3916SSepherosa Ziehau 	/*
3521f7e3916SSepherosa Ziehau 	 * Transmit rings
3531f7e3916SSepherosa Ziehau 	 */
35427866bf1SSepherosa Ziehau 	int			tx_ring_cnt;
3551f7e3916SSepherosa Ziehau 	struct igb_tx_ring	*tx_rings;
3561f7e3916SSepherosa Ziehau 
3571f7e3916SSepherosa Ziehau 	/*
3581f7e3916SSepherosa Ziehau 	 * Receive rings
3591f7e3916SSepherosa Ziehau 	 */
3608d6600daSSepherosa Ziehau 	int			rss_debug;
36127866bf1SSepherosa Ziehau 	int			rx_ring_cnt;
3629c0ecdccSSepherosa Ziehau 	int			rx_ring_msix;
363be922da6SSepherosa Ziehau 	int			rx_ring_inuse;
3641f7e3916SSepherosa Ziehau 	struct igb_rx_ring	*rx_rings;
3651f7e3916SSepherosa Ziehau 
3661f7e3916SSepherosa Ziehau 	/* Misc stats maintained by the driver */
3671f7e3916SSepherosa Ziehau 	u_long			dropped_pkts;
3681f7e3916SSepherosa Ziehau 	u_long			mbuf_defrag_failed;
3691f7e3916SSepherosa Ziehau 	u_long			no_tx_dma_setup;
3701f7e3916SSepherosa Ziehau 	u_long			watchdog_events;
3711f7e3916SSepherosa Ziehau 	u_long			rx_overruns;
3721f7e3916SSepherosa Ziehau 	u_long			device_control;
3731f7e3916SSepherosa Ziehau 	u_long			rx_control;
3741f7e3916SSepherosa Ziehau 	u_long			int_mask;
3751f7e3916SSepherosa Ziehau 	u_long			eint_mask;
3761f7e3916SSepherosa Ziehau 	u_long			packet_buf_alloc_rx;
3771f7e3916SSepherosa Ziehau 	u_long			packet_buf_alloc_tx;
3781f7e3916SSepherosa Ziehau 
3791f7e3916SSepherosa Ziehau 	/* sysctl tree glue */
3801f7e3916SSepherosa Ziehau 	struct sysctl_ctx_list	sysctl_ctx;
3811f7e3916SSepherosa Ziehau 	struct sysctl_oid	*sysctl_tree;
3821f7e3916SSepherosa Ziehau 
3831f7e3916SSepherosa Ziehau 	void 			*stats;
3849c0ecdccSSepherosa Ziehau 
3859c0ecdccSSepherosa Ziehau 	int			msix_tx_cpuid;
3869c0ecdccSSepherosa Ziehau 	int			msix_mem_rid;
3879c0ecdccSSepherosa Ziehau 	struct resource 	*msix_mem_res;
3889c0ecdccSSepherosa Ziehau 	int			msix_cnt;
3899c0ecdccSSepherosa Ziehau 	struct igb_msix_data	*msix_data;
3901f7e3916SSepherosa Ziehau };
3911f7e3916SSepherosa Ziehau 
3928d6600daSSepherosa Ziehau #define IGB_ENABLE_HWRSS(sc)	((sc)->rx_ring_cnt > 1)
3938d6600daSSepherosa Ziehau 
3941f7e3916SSepherosa Ziehau struct igb_tx_buf {
3951f7e3916SSepherosa Ziehau 	struct mbuf	*m_head;
3961f7e3916SSepherosa Ziehau 	bus_dmamap_t	map;		/* bus_dma map for packet */
3971f7e3916SSepherosa Ziehau };
3981f7e3916SSepherosa Ziehau 
3991f7e3916SSepherosa Ziehau struct igb_rx_buf {
4001f7e3916SSepherosa Ziehau 	struct mbuf	*m_head;
4011f7e3916SSepherosa Ziehau 	bus_dmamap_t	map;	/* bus_dma map for packet */
4021f7e3916SSepherosa Ziehau 	bus_addr_t	paddr;
4031f7e3916SSepherosa Ziehau };
4041f7e3916SSepherosa Ziehau 
4051f7e3916SSepherosa Ziehau #define UPDATE_VF_REG(reg, last, cur)		\
4061f7e3916SSepherosa Ziehau {						\
4071f7e3916SSepherosa Ziehau 	uint32_t new = E1000_READ_REG(hw, reg);	\
4081f7e3916SSepherosa Ziehau 	if (new < last)				\
4091f7e3916SSepherosa Ziehau 		cur += 0x100000000LL;		\
4101f7e3916SSepherosa Ziehau 	last = new;				\
4111f7e3916SSepherosa Ziehau 	cur &= 0xFFFFFFFF00000000LL;		\
4121f7e3916SSepherosa Ziehau 	cur |= new;				\
4131f7e3916SSepherosa Ziehau }
4141f7e3916SSepherosa Ziehau 
415b6220144SSepherosa Ziehau #define IGB_IS_OACTIVE(txr)	((txr)->tx_avail < (txr)->oact_lo_desc)
416b6220144SSepherosa Ziehau #define IGB_IS_NOT_OACTIVE(txr)	((txr)->tx_avail >= (txr)->oact_hi_desc)
417b6220144SSepherosa Ziehau 
4181f7e3916SSepherosa Ziehau #endif /* _IF_IGB_H_ */
419