xref: /dflybsd-src/sys/dev/netif/igb/if_igb.h (revision 620b9679515f9db3801f83d855667df59c49a669)
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