xref: /freebsd/sys/dev/ixgbe/ixgbe.h (revision 47dd71a877cf95431e80a4e84e8f36571890df70)
19ca4041bSJack F Vogel /******************************************************************************
213705f88SJack F Vogel 
385d0a26eSJack F Vogel   Copyright (c) 2001-2012, Intel Corporation
413705f88SJack F Vogel   All rights reserved.
513705f88SJack F Vogel 
613705f88SJack F Vogel   Redistribution and use in source and binary forms, with or without
713705f88SJack F Vogel   modification, are permitted provided that the following conditions are met:
813705f88SJack F Vogel 
913705f88SJack F Vogel    1. Redistributions of source code must retain the above copyright notice,
1013705f88SJack F Vogel       this list of conditions and the following disclaimer.
1113705f88SJack F Vogel 
1213705f88SJack F Vogel    2. Redistributions in binary form must reproduce the above copyright
1313705f88SJack F Vogel       notice, this list of conditions and the following disclaimer in the
1413705f88SJack F Vogel       documentation and/or other materials provided with the distribution.
1513705f88SJack F Vogel 
1613705f88SJack F Vogel    3. Neither the name of the Intel Corporation nor the names of its
1713705f88SJack F Vogel       contributors may be used to endorse or promote products derived from
1813705f88SJack F Vogel       this software without specific prior written permission.
1913705f88SJack F Vogel 
2013705f88SJack F Vogel   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2113705f88SJack F Vogel   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2213705f88SJack F Vogel   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2313705f88SJack F Vogel   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2413705f88SJack F Vogel   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2513705f88SJack F Vogel   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2613705f88SJack F Vogel   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2713705f88SJack F Vogel   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2813705f88SJack F Vogel   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2913705f88SJack F Vogel   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3013705f88SJack F Vogel   POSSIBILITY OF SUCH DAMAGE.
3113705f88SJack F Vogel 
329ca4041bSJack F Vogel ******************************************************************************/
3313705f88SJack F Vogel /*$FreeBSD$*/
3413705f88SJack F Vogel 
351b6e0dbaSJack F Vogel 
3613705f88SJack F Vogel #ifndef _IXGBE_H_
3713705f88SJack F Vogel #define _IXGBE_H_
3813705f88SJack F Vogel 
3913705f88SJack F Vogel 
4013705f88SJack F Vogel #include <sys/param.h>
4113705f88SJack F Vogel #include <sys/systm.h>
4201816c87SJack F Vogel #ifndef IXGBE_LEGACY_TX
43d8602bb9SJack F Vogel #include <sys/buf_ring.h>
44d8602bb9SJack F Vogel #endif
4513705f88SJack F Vogel #include <sys/mbuf.h>
4613705f88SJack F Vogel #include <sys/protosw.h>
4713705f88SJack F Vogel #include <sys/socket.h>
4813705f88SJack F Vogel #include <sys/malloc.h>
4913705f88SJack F Vogel #include <sys/kernel.h>
5013705f88SJack F Vogel #include <sys/module.h>
5113705f88SJack F Vogel #include <sys/sockio.h>
5213705f88SJack F Vogel 
5313705f88SJack F Vogel #include <net/if.h>
5413705f88SJack F Vogel #include <net/if_arp.h>
5513705f88SJack F Vogel #include <net/bpf.h>
5613705f88SJack F Vogel #include <net/ethernet.h>
5713705f88SJack F Vogel #include <net/if_dl.h>
5813705f88SJack F Vogel #include <net/if_media.h>
5913705f88SJack F Vogel 
6013705f88SJack F Vogel #include <net/bpf.h>
6113705f88SJack F Vogel #include <net/if_types.h>
6213705f88SJack F Vogel #include <net/if_vlan_var.h>
6313705f88SJack F Vogel 
6413705f88SJack F Vogel #include <netinet/in_systm.h>
6513705f88SJack F Vogel #include <netinet/in.h>
6613705f88SJack F Vogel #include <netinet/if_ether.h>
6713705f88SJack F Vogel #include <netinet/ip.h>
6813705f88SJack F Vogel #include <netinet/ip6.h>
6913705f88SJack F Vogel #include <netinet/tcp.h>
700ac6dfecSJack F Vogel #include <netinet/tcp_lro.h>
7113705f88SJack F Vogel #include <netinet/udp.h>
7213705f88SJack F Vogel 
7313705f88SJack F Vogel #include <machine/in_cksum.h>
7413705f88SJack F Vogel 
7513705f88SJack F Vogel #include <sys/bus.h>
7613705f88SJack F Vogel #include <machine/bus.h>
7713705f88SJack F Vogel #include <sys/rman.h>
7813705f88SJack F Vogel #include <machine/resource.h>
7913705f88SJack F Vogel #include <vm/vm.h>
8013705f88SJack F Vogel #include <vm/pmap.h>
8113705f88SJack F Vogel #include <machine/clock.h>
8213705f88SJack F Vogel #include <dev/pci/pcivar.h>
8313705f88SJack F Vogel #include <dev/pci/pcireg.h>
8413705f88SJack F Vogel #include <sys/proc.h>
8513705f88SJack F Vogel #include <sys/sysctl.h>
8613705f88SJack F Vogel #include <sys/endian.h>
8713705f88SJack F Vogel #include <sys/taskqueue.h>
889ca4041bSJack F Vogel #include <sys/pcpu.h>
89d8602bb9SJack F Vogel #include <sys/smp.h>
90d8602bb9SJack F Vogel #include <machine/smp.h>
9113705f88SJack F Vogel 
9213705f88SJack F Vogel #include "ixgbe_api.h"
9313705f88SJack F Vogel 
9413705f88SJack F Vogel /* Tunables */
9513705f88SJack F Vogel 
9613705f88SJack F Vogel /*
973ec35e52SJack F Vogel  * TxDescriptors Valid Range: 64-4096 Default Value: 256 This value is the
9813705f88SJack F Vogel  * number of transmit descriptors allocated by the driver. Increasing this
9913705f88SJack F Vogel  * value allows the driver to queue more transmits. Each descriptor is 16
1003ec35e52SJack F Vogel  * bytes. Performance tests have show the 2K value to be optimal for top
1013ec35e52SJack F Vogel  * performance.
10213705f88SJack F Vogel  */
1030ac6dfecSJack F Vogel #define DEFAULT_TXD	1024
1043ec35e52SJack F Vogel #define PERFORM_TXD	2048
10513705f88SJack F Vogel #define MAX_TXD		4096
10613705f88SJack F Vogel #define MIN_TXD		64
10713705f88SJack F Vogel 
10813705f88SJack F Vogel /*
1093ec35e52SJack F Vogel  * RxDescriptors Valid Range: 64-4096 Default Value: 256 This value is the
1103ec35e52SJack F Vogel  * number of receive descriptors allocated for each RX queue. Increasing this
11113705f88SJack F Vogel  * value allows the driver to buffer more incoming packets. Each descriptor
1123ec35e52SJack F Vogel  * is 16 bytes.  A receive buffer is also allocated for each descriptor.
11313705f88SJack F Vogel  *
1143ec35e52SJack F Vogel  * Note: with 8 rings and a dual port card, it is possible to bump up
1153ec35e52SJack F Vogel  *	against the system mbuf pool limit, you can tune nmbclusters
1163ec35e52SJack F Vogel  *	to adjust for this.
11713705f88SJack F Vogel  */
1180ac6dfecSJack F Vogel #define DEFAULT_RXD	1024
1193ec35e52SJack F Vogel #define PERFORM_RXD	2048
12013705f88SJack F Vogel #define MAX_RXD		4096
12113705f88SJack F Vogel #define MIN_RXD		64
12213705f88SJack F Vogel 
1233ec35e52SJack F Vogel /* Alignment for rings */
1243ec35e52SJack F Vogel #define DBA_ALIGN	128
1253ec35e52SJack F Vogel 
12613705f88SJack F Vogel /*
12713705f88SJack F Vogel  * This parameter controls the maximum no of times the driver will loop in
12813705f88SJack F Vogel  * the isr. Minimum Value = 1
12913705f88SJack F Vogel  */
1301b6e0dbaSJack F Vogel #define MAX_LOOP	10
13113705f88SJack F Vogel 
13213705f88SJack F Vogel /*
1332969bf0eSJack F Vogel  * This is the max watchdog interval, ie. the time that can
1342969bf0eSJack F Vogel  * pass between any two TX clean operations, such only happening
1352969bf0eSJack F Vogel  * when the TX hardware is functioning.
13613705f88SJack F Vogel  */
1372969bf0eSJack F Vogel #define IXGBE_WATCHDOG                   (10 * hz)
13813705f88SJack F Vogel 
13913705f88SJack F Vogel /*
14013705f88SJack F Vogel  * This parameters control when the driver calls the routine to reclaim
14113705f88SJack F Vogel  * transmit descriptors.
14213705f88SJack F Vogel  */
14313705f88SJack F Vogel #define IXGBE_TX_CLEANUP_THRESHOLD	(adapter->num_tx_desc / 8)
14413705f88SJack F Vogel #define IXGBE_TX_OP_THRESHOLD		(adapter->num_tx_desc / 32)
14513705f88SJack F Vogel 
14613705f88SJack F Vogel #define IXGBE_MAX_FRAME_SIZE	0x3F00
14713705f88SJack F Vogel 
1483ec35e52SJack F Vogel /* Flow control constants */
1492969bf0eSJack F Vogel #define IXGBE_FC_PAUSE		0xFFFF
1503ec35e52SJack F Vogel #define IXGBE_FC_HI		0x20000
1513ec35e52SJack F Vogel #define IXGBE_FC_LO		0x10000
15213705f88SJack F Vogel 
153cfc0969aSScott Long /*
154cfc0969aSScott Long  * Used for optimizing small rx mbufs.  Effort is made to keep the copy
155cfc0969aSScott Long  * small and aligned for the CPU L1 cache.
156cfc0969aSScott Long  *
157cfc0969aSScott Long  * MHLEN is typically 168 bytes, giving us 8-byte alignment.  Getting
158cfc0969aSScott Long  * 32 byte alignment needed for the fast bcopy results in 8 bytes being
159cfc0969aSScott Long  * wasted.  Getting 64 byte alignment, which _should_ be ideal for
160cfc0969aSScott Long  * modern Intel CPUs, results in 40 bytes wasted and a significant drop
161cfc0969aSScott Long  * in observed efficiency of the optimization, 97.9% -> 81.8%.
162cfc0969aSScott Long  */
163cfc0969aSScott Long #define IXGBE_RX_COPY_LEN	160
164cfc0969aSScott Long #define IXGBE_RX_COPY_ALIGN	(MHLEN - IXGBE_RX_COPY_LEN)
165cfc0969aSScott Long 
1660e6fa41fSJack F Vogel /* Keep older OS drivers building... */
1670e6fa41fSJack F Vogel #if !defined(SYSCTL_ADD_UQUAD)
1680e6fa41fSJack F Vogel #define SYSCTL_ADD_UQUAD SYSCTL_ADD_QUAD
1690e6fa41fSJack F Vogel #endif
1700e6fa41fSJack F Vogel 
17113705f88SJack F Vogel /* Defines for printing debug information */
17213705f88SJack F Vogel #define DEBUG_INIT  0
17313705f88SJack F Vogel #define DEBUG_IOCTL 0
17413705f88SJack F Vogel #define DEBUG_HW    0
17513705f88SJack F Vogel 
17613705f88SJack F Vogel #define INIT_DEBUGOUT(S)            if (DEBUG_INIT)  printf(S "\n")
17713705f88SJack F Vogel #define INIT_DEBUGOUT1(S, A)        if (DEBUG_INIT)  printf(S "\n", A)
17813705f88SJack F Vogel #define INIT_DEBUGOUT2(S, A, B)     if (DEBUG_INIT)  printf(S "\n", A, B)
17913705f88SJack F Vogel #define IOCTL_DEBUGOUT(S)           if (DEBUG_IOCTL) printf(S "\n")
18013705f88SJack F Vogel #define IOCTL_DEBUGOUT1(S, A)       if (DEBUG_IOCTL) printf(S "\n", A)
18113705f88SJack F Vogel #define IOCTL_DEBUGOUT2(S, A, B)    if (DEBUG_IOCTL) printf(S "\n", A, B)
18213705f88SJack F Vogel #define HW_DEBUGOUT(S)              if (DEBUG_HW) printf(S "\n")
18313705f88SJack F Vogel #define HW_DEBUGOUT1(S, A)          if (DEBUG_HW) printf(S "\n", A)
18413705f88SJack F Vogel #define HW_DEBUGOUT2(S, A, B)       if (DEBUG_HW) printf(S "\n", A, B)
18513705f88SJack F Vogel 
18613705f88SJack F Vogel #define MAX_NUM_MULTICAST_ADDRESSES     128
1870ac6dfecSJack F Vogel #define IXGBE_82598_SCATTER		100
1880ac6dfecSJack F Vogel #define IXGBE_82599_SCATTER		32
1891b6e0dbaSJack F Vogel #define MSIX_82598_BAR			3
1901b6e0dbaSJack F Vogel #define MSIX_82599_BAR			4
19139fc714aSBjoern A. Zeeb #define IXGBE_TSO_SIZE			262140
19213705f88SJack F Vogel #define IXGBE_TX_BUFFER_SIZE		((u32) 1514)
193c0014855SJack F Vogel #define IXGBE_RX_HDR			128
194d8602bb9SJack F Vogel #define IXGBE_VFTA_SIZE			128
195d8602bb9SJack F Vogel #define IXGBE_BR_SIZE			4096
19685d0a26eSJack F Vogel #define IXGBE_QUEUE_MIN_FREE		32
1979de5aff5SJack F Vogel 
1986a59dfbbSJack F Vogel /* IOCTL define to gather SFP+ Diagnostic data */
1996a59dfbbSJack F Vogel #define SIOCGI2C	SIOCGIFGENERIC
2006a59dfbbSJack F Vogel 
2019de5aff5SJack F Vogel /* Offload bits in mbuf flag */
2029de5aff5SJack F Vogel #if __FreeBSD_version >= 800000
2039de5aff5SJack F Vogel #define CSUM_OFFLOAD		(CSUM_IP|CSUM_TCP|CSUM_UDP|CSUM_SCTP)
2049de5aff5SJack F Vogel #else
2059de5aff5SJack F Vogel #define CSUM_OFFLOAD		(CSUM_IP|CSUM_TCP|CSUM_UDP)
2069de5aff5SJack F Vogel #endif
20713705f88SJack F Vogel 
20813705f88SJack F Vogel /*
20913705f88SJack F Vogel  * Interrupt Moderation parameters
21013705f88SJack F Vogel  */
2111b6e0dbaSJack F Vogel #define IXGBE_LOW_LATENCY	128
2121b6e0dbaSJack F Vogel #define IXGBE_AVE_LATENCY	400
2131b6e0dbaSJack F Vogel #define IXGBE_BULK_LATENCY	1200
2141b6e0dbaSJack F Vogel #define IXGBE_LINK_ITR		2000
2151b6e0dbaSJack F Vogel 
21613705f88SJack F Vogel /*
2171b6e0dbaSJack F Vogel  *****************************************************************************
21813705f88SJack F Vogel  * vendor_info_array
21913705f88SJack F Vogel  *
22013705f88SJack F Vogel  * This array contains the list of Subvendor/Subdevice IDs on which the driver
22113705f88SJack F Vogel  * should load.
22213705f88SJack F Vogel  *
22313705f88SJack F Vogel  *****************************************************************************
22413705f88SJack F Vogel  */
22513705f88SJack F Vogel typedef struct _ixgbe_vendor_info_t {
22613705f88SJack F Vogel 	unsigned int    vendor_id;
22713705f88SJack F Vogel 	unsigned int    device_id;
22813705f88SJack F Vogel 	unsigned int    subvendor_id;
22913705f88SJack F Vogel 	unsigned int    subdevice_id;
23013705f88SJack F Vogel 	unsigned int    index;
23113705f88SJack F Vogel } ixgbe_vendor_info_t;
23213705f88SJack F Vogel 
2336a59dfbbSJack F Vogel /* This is used to get SFP+ module data */
2346a59dfbbSJack F Vogel struct ixgbe_i2c_req {
2356a59dfbbSJack F Vogel         u8 dev_addr;
2366a59dfbbSJack F Vogel         u8 offset;
2376a59dfbbSJack F Vogel         u8 len;
2386a59dfbbSJack F Vogel         u8 data[8];
2396a59dfbbSJack F Vogel };
24013705f88SJack F Vogel 
24113705f88SJack F Vogel struct ixgbe_tx_buf {
2420ac6dfecSJack F Vogel 	u32		eop_index;
24313705f88SJack F Vogel 	struct mbuf	*m_head;
24413705f88SJack F Vogel 	bus_dmamap_t	map;
24513705f88SJack F Vogel };
24613705f88SJack F Vogel 
24713705f88SJack F Vogel struct ixgbe_rx_buf {
2487d1157eeSJack F Vogel 	struct mbuf	*buf;
249c0014855SJack F Vogel 	struct mbuf	*fmp;
2507d1157eeSJack F Vogel 	bus_dmamap_t	map;
251cfc0969aSScott Long 	u_int		flags;
252cfc0969aSScott Long #define IXGBE_RX_COPY	0x01
2537d1157eeSJack F Vogel 	uint64_t	addr;
25413705f88SJack F Vogel };
25513705f88SJack F Vogel 
25613705f88SJack F Vogel /*
25713705f88SJack F Vogel  * Bus dma allocation structure used by ixgbe_dma_malloc and ixgbe_dma_free.
25813705f88SJack F Vogel  */
25913705f88SJack F Vogel struct ixgbe_dma_alloc {
26013705f88SJack F Vogel 	bus_addr_t		dma_paddr;
26113705f88SJack F Vogel 	caddr_t			dma_vaddr;
26213705f88SJack F Vogel 	bus_dma_tag_t		dma_tag;
26313705f88SJack F Vogel 	bus_dmamap_t		dma_map;
26413705f88SJack F Vogel 	bus_dma_segment_t	dma_seg;
26513705f88SJack F Vogel 	bus_size_t		dma_size;
26613705f88SJack F Vogel 	int			dma_nseg;
26713705f88SJack F Vogel };
26813705f88SJack F Vogel 
26913705f88SJack F Vogel /*
270c0014855SJack F Vogel ** Driver queue struct: this is the interrupt container
271c0014855SJack F Vogel **  for the associated tx and rx ring.
272c0014855SJack F Vogel */
273c0014855SJack F Vogel struct ix_queue {
274c0014855SJack F Vogel 	struct adapter		*adapter;
275c0014855SJack F Vogel 	u32			msix;           /* This queue's MSIX vector */
276c0014855SJack F Vogel 	u32			eims;           /* This queue's EIMS bit */
277c0014855SJack F Vogel 	u32			eitr_setting;
278c0014855SJack F Vogel 	struct resource		*res;
279c0014855SJack F Vogel 	void			*tag;
280c0014855SJack F Vogel 	struct tx_ring		*txr;
281c0014855SJack F Vogel 	struct rx_ring		*rxr;
282c0014855SJack F Vogel 	struct task		que_task;
283c0014855SJack F Vogel 	struct taskqueue	*tq;
284c0014855SJack F Vogel 	u64			irqs;
285c0014855SJack F Vogel };
286c0014855SJack F Vogel 
287c0014855SJack F Vogel /*
288c0014855SJack F Vogel  * The transmit ring, one per queue
28913705f88SJack F Vogel  */
29013705f88SJack F Vogel struct tx_ring {
29113705f88SJack F Vogel         struct adapter		*adapter;
2929ca4041bSJack F Vogel 	struct mtx		tx_mtx;
29313705f88SJack F Vogel 	u32			me;
294*47dd71a8SJack F Vogel 	int			watchdog_time;
295*47dd71a8SJack F Vogel 	union ixgbe_adv_tx_desc	*tx_base;
296*47dd71a8SJack F Vogel 	struct ixgbe_tx_buf	*tx_buffers;
297*47dd71a8SJack F Vogel 	struct ixgbe_dma_alloc	txdma;
298*47dd71a8SJack F Vogel 	volatile u16		tx_avail;
299*47dd71a8SJack F Vogel 	u16			next_avail_desc;
300*47dd71a8SJack F Vogel 	u16			next_to_clean;
301*47dd71a8SJack F Vogel 	u16			process_limit;
302*47dd71a8SJack F Vogel 	u16			num_desc;
30335bbbdaaSJack F Vogel 	enum {
30435bbbdaaSJack F Vogel 	    IXGBE_QUEUE_IDLE,
30535bbbdaaSJack F Vogel 	    IXGBE_QUEUE_WORKING,
30635bbbdaaSJack F Vogel 	    IXGBE_QUEUE_HUNG,
30735bbbdaaSJack F Vogel 	}			queue_status;
3089ca4041bSJack F Vogel 	u32			txd_cmd;
30913705f88SJack F Vogel 	bus_dma_tag_t		txtag;
3101b6e0dbaSJack F Vogel 	char			mtx_name[16];
31101816c87SJack F Vogel #ifndef IXGBE_LEGACY_TX
312d8602bb9SJack F Vogel 	struct buf_ring		*br;
313aceb0403SJohn Baldwin 	struct task		txq_task;
314d8602bb9SJack F Vogel #endif
3152969bf0eSJack F Vogel #ifdef IXGBE_FDIR
3162969bf0eSJack F Vogel 	u16			atr_sample;
3172969bf0eSJack F Vogel 	u16			atr_count;
3182969bf0eSJack F Vogel #endif
319c0014855SJack F Vogel 	u32			bytes;  /* used for AIM */
320c0014855SJack F Vogel 	u32			packets;
3219ca4041bSJack F Vogel 	/* Soft Stats */
322*47dd71a8SJack F Vogel 	unsigned long   	tso_tx;
323*47dd71a8SJack F Vogel 	unsigned long   	no_tx_map_avail;
324*47dd71a8SJack F Vogel 	unsigned long   	no_tx_dma_setup;
325c0014855SJack F Vogel 	u64			no_desc_avail;
3261b6e0dbaSJack F Vogel 	u64			total_packets;
32713705f88SJack F Vogel };
32813705f88SJack F Vogel 
32913705f88SJack F Vogel 
33013705f88SJack F Vogel /*
33113705f88SJack F Vogel  * The Receive ring, one per rx queue
33213705f88SJack F Vogel  */
33313705f88SJack F Vogel struct rx_ring {
33413705f88SJack F Vogel         struct adapter		*adapter;
3359ca4041bSJack F Vogel 	struct mtx		rx_mtx;
33613705f88SJack F Vogel 	u32			me;
33713705f88SJack F Vogel 	union ixgbe_adv_rx_desc	*rx_base;
33813705f88SJack F Vogel 	struct ixgbe_dma_alloc	rxdma;
3399ca4041bSJack F Vogel 	struct lro_ctrl		lro;
340d8602bb9SJack F Vogel 	bool			lro_enabled;
3412969bf0eSJack F Vogel 	bool			hw_rsc;
342c0014855SJack F Vogel 	bool			discard;
34385d0a26eSJack F Vogel 	bool			vtag_strip;
344*47dd71a8SJack F Vogel         u16			next_to_refresh;
345*47dd71a8SJack F Vogel         u16 			next_to_check;
346*47dd71a8SJack F Vogel 	u16			num_desc;
347*47dd71a8SJack F Vogel 	u16			mbuf_sz;
348*47dd71a8SJack F Vogel 	u16			process_limit;
349c0014855SJack F Vogel 	char			mtx_name[16];
35013705f88SJack F Vogel 	struct ixgbe_rx_buf	*rx_buffers;
3517d1157eeSJack F Vogel 	bus_dma_tag_t		tag;
3521b6e0dbaSJack F Vogel 
3531b6e0dbaSJack F Vogel 	u32			bytes; /* Used for AIM calc */
354c0014855SJack F Vogel 	u32			packets;
355d8602bb9SJack F Vogel 
35613705f88SJack F Vogel 	/* Soft stats */
3579ca4041bSJack F Vogel 	u64			rx_irq;
358cfc0969aSScott Long 	u64			rx_copies;
3591b6e0dbaSJack F Vogel 	u64			rx_packets;
3601b6e0dbaSJack F Vogel 	u64 			rx_bytes;
361c0014855SJack F Vogel 	u64 			rx_discarded;
3622969bf0eSJack F Vogel 	u64 			rsc_num;
3632969bf0eSJack F Vogel #ifdef IXGBE_FDIR
3642969bf0eSJack F Vogel 	u64			flm;
3652969bf0eSJack F Vogel #endif
36613705f88SJack F Vogel };
36713705f88SJack F Vogel 
36813705f88SJack F Vogel /* Our adapter structure */
36913705f88SJack F Vogel struct adapter {
37013705f88SJack F Vogel 	struct ifnet		*ifp;
37113705f88SJack F Vogel 	struct ixgbe_hw		hw;
37213705f88SJack F Vogel 
37313705f88SJack F Vogel 	struct ixgbe_osdep	osdep;
37413705f88SJack F Vogel 	struct device		*dev;
3759ca4041bSJack F Vogel 
3769ca4041bSJack F Vogel 	struct resource		*pci_mem;
3779ca4041bSJack F Vogel 	struct resource		*msix_mem;
37813705f88SJack F Vogel 
37913705f88SJack F Vogel 	/*
380d8602bb9SJack F Vogel 	 * Interrupt resources: this set is
381d8602bb9SJack F Vogel 	 * either used for legacy, or for Link
382d8602bb9SJack F Vogel 	 * when doing MSIX
38313705f88SJack F Vogel 	 */
384d8602bb9SJack F Vogel 	void			*tag;
385d8602bb9SJack F Vogel 	struct resource 	*res;
38613705f88SJack F Vogel 
38713705f88SJack F Vogel 	struct ifmedia		media;
38813705f88SJack F Vogel 	struct callout		timer;
38913705f88SJack F Vogel 	int			msix;
39013705f88SJack F Vogel 	int			if_flags;
3919ca4041bSJack F Vogel 
3923ec35e52SJack F Vogel 	struct mtx		core_mtx;
3939ca4041bSJack F Vogel 
394d8602bb9SJack F Vogel 	eventhandler_tag 	vlan_attach;
395d8602bb9SJack F Vogel 	eventhandler_tag 	vlan_detach;
396d8602bb9SJack F Vogel 
3972969bf0eSJack F Vogel 	u16			num_vlans;
398d8602bb9SJack F Vogel 	u16			num_queues;
399d8602bb9SJack F Vogel 
4001a4e3449SJack F Vogel 	/*
4011a4e3449SJack F Vogel 	** Shadow VFTA table, this is needed because
4021a4e3449SJack F Vogel 	** the real vlan filter table gets cleared during
4031a4e3449SJack F Vogel 	** a soft reset and the driver needs to be able
4041a4e3449SJack F Vogel 	** to repopulate it.
4051a4e3449SJack F Vogel 	*/
4061a4e3449SJack F Vogel 	u32			shadow_vfta[IXGBE_VFTA_SIZE];
4071a4e3449SJack F Vogel 
4081a4e3449SJack F Vogel 	/* Info about the interface */
4091b6e0dbaSJack F Vogel 	u32			optics;
41085d0a26eSJack F Vogel 	u32			fc; /* local flow ctrl setting */
41117d2646bSJack F Vogel 	int			advertise;  /* link speeds */
4129ca4041bSJack F Vogel 	bool			link_active;
4139ca4041bSJack F Vogel 	u16			max_frame_size;
414182b3808SJack F Vogel 	u16			num_segs;
4159ca4041bSJack F Vogel 	u32			link_speed;
4160ac6dfecSJack F Vogel 	bool			link_up;
4171b6e0dbaSJack F Vogel 	u32 			linkvec;
41813705f88SJack F Vogel 
4191b6e0dbaSJack F Vogel 	/* Mbuf cluster size */
4201b6e0dbaSJack F Vogel 	u32			rx_mbuf_sz;
4211b6e0dbaSJack F Vogel 
4220ac6dfecSJack F Vogel 	/* Support for pluggable optics */
4231b6e0dbaSJack F Vogel 	bool			sfp_probe;
4240ac6dfecSJack F Vogel 	struct task     	link_task;  /* Link tasklet */
4250ac6dfecSJack F Vogel 	struct task     	mod_task;   /* SFP tasklet */
426c0014855SJack F Vogel 	struct task     	msf_task;   /* Multispeed Fiber */
4272969bf0eSJack F Vogel #ifdef IXGBE_FDIR
4282969bf0eSJack F Vogel 	int			fdir_reinit;
4292969bf0eSJack F Vogel 	struct task     	fdir_task;
4302969bf0eSJack F Vogel #endif
4310ac6dfecSJack F Vogel 	struct taskqueue	*tq;
43213705f88SJack F Vogel 
43313705f88SJack F Vogel 	/*
434c0014855SJack F Vogel 	** Queues:
435c0014855SJack F Vogel 	**   This is the irq holder, it has
436c0014855SJack F Vogel 	**   and RX/TX pair or rings associated
437c0014855SJack F Vogel 	**   with it.
438c0014855SJack F Vogel 	*/
439c0014855SJack F Vogel 	struct ix_queue		*queues;
440c0014855SJack F Vogel 
441c0014855SJack F Vogel 	/*
44213705f88SJack F Vogel 	 * Transmit rings:
44313705f88SJack F Vogel 	 *	Allocated at run time, an array of rings.
44413705f88SJack F Vogel 	 */
44513705f88SJack F Vogel 	struct tx_ring		*tx_rings;
446*47dd71a8SJack F Vogel 	u32			num_tx_desc;
44713705f88SJack F Vogel 
44813705f88SJack F Vogel 	/*
44913705f88SJack F Vogel 	 * Receive rings:
45013705f88SJack F Vogel 	 *	Allocated at run time, an array of rings.
45113705f88SJack F Vogel 	 */
45213705f88SJack F Vogel 	struct rx_ring		*rx_rings;
453c0014855SJack F Vogel 	u64			que_mask;
454*47dd71a8SJack F Vogel 	u32			num_rx_desc;
45513705f88SJack F Vogel 
45638104eccSJack F Vogel 	/* Multicast array memory */
45738104eccSJack F Vogel 	u8			*mta;
45838104eccSJack F Vogel 
45913705f88SJack F Vogel 	/* Misc stats maintained by the driver */
46013705f88SJack F Vogel 	unsigned long   	dropped_pkts;
4611b6e0dbaSJack F Vogel 	unsigned long   	mbuf_defrag_failed;
4621b6e0dbaSJack F Vogel 	unsigned long   	mbuf_header_failed;
4631b6e0dbaSJack F Vogel 	unsigned long   	mbuf_packet_failed;
46413705f88SJack F Vogel 	unsigned long   	watchdog_events;
4659ca4041bSJack F Vogel 	unsigned long		link_irq;
46613705f88SJack F Vogel 
46713705f88SJack F Vogel 	struct ixgbe_hw_stats 	stats;
46813705f88SJack F Vogel };
46913705f88SJack F Vogel 
4700ac6dfecSJack F Vogel /* Precision Time Sync (IEEE 1588) defines */
4710ac6dfecSJack F Vogel #define ETHERTYPE_IEEE1588      0x88F7
4720ac6dfecSJack F Vogel #define PICOSECS_PER_TICK       20833
4730ac6dfecSJack F Vogel #define TSYNC_UDP_PORT          319 /* UDP port for the protocol */
4740ac6dfecSJack F Vogel #define IXGBE_ADVTXD_TSTAMP	0x00080000
4750ac6dfecSJack F Vogel 
4760ac6dfecSJack F Vogel 
4779ca4041bSJack F Vogel #define IXGBE_CORE_LOCK_INIT(_sc, _name) \
4789ca4041bSJack F Vogel         mtx_init(&(_sc)->core_mtx, _name, "IXGBE Core Lock", MTX_DEF)
4799ca4041bSJack F Vogel #define IXGBE_CORE_LOCK_DESTROY(_sc)      mtx_destroy(&(_sc)->core_mtx)
4809ca4041bSJack F Vogel #define IXGBE_TX_LOCK_DESTROY(_sc)        mtx_destroy(&(_sc)->tx_mtx)
4819ca4041bSJack F Vogel #define IXGBE_RX_LOCK_DESTROY(_sc)        mtx_destroy(&(_sc)->rx_mtx)
4829ca4041bSJack F Vogel #define IXGBE_CORE_LOCK(_sc)              mtx_lock(&(_sc)->core_mtx)
4839ca4041bSJack F Vogel #define IXGBE_TX_LOCK(_sc)                mtx_lock(&(_sc)->tx_mtx)
4840ac6dfecSJack F Vogel #define IXGBE_TX_TRYLOCK(_sc)             mtx_trylock(&(_sc)->tx_mtx)
4859ca4041bSJack F Vogel #define IXGBE_RX_LOCK(_sc)                mtx_lock(&(_sc)->rx_mtx)
4869ca4041bSJack F Vogel #define IXGBE_CORE_UNLOCK(_sc)            mtx_unlock(&(_sc)->core_mtx)
4879ca4041bSJack F Vogel #define IXGBE_TX_UNLOCK(_sc)              mtx_unlock(&(_sc)->tx_mtx)
4889ca4041bSJack F Vogel #define IXGBE_RX_UNLOCK(_sc)              mtx_unlock(&(_sc)->rx_mtx)
4899ca4041bSJack F Vogel #define IXGBE_CORE_LOCK_ASSERT(_sc)       mtx_assert(&(_sc)->core_mtx, MA_OWNED)
4909ca4041bSJack F Vogel #define IXGBE_TX_LOCK_ASSERT(_sc)         mtx_assert(&(_sc)->tx_mtx, MA_OWNED)
4919ca4041bSJack F Vogel 
4929ca4041bSJack F Vogel 
4930ac6dfecSJack F Vogel static inline bool
4940ac6dfecSJack F Vogel ixgbe_is_sfp(struct ixgbe_hw *hw)
4950ac6dfecSJack F Vogel {
4960ac6dfecSJack F Vogel 	switch (hw->phy.type) {
4970ac6dfecSJack F Vogel 	case ixgbe_phy_sfp_avago:
4980ac6dfecSJack F Vogel 	case ixgbe_phy_sfp_ftl:
4990ac6dfecSJack F Vogel 	case ixgbe_phy_sfp_intel:
5000ac6dfecSJack F Vogel 	case ixgbe_phy_sfp_unknown:
501c0014855SJack F Vogel 	case ixgbe_phy_sfp_passive_tyco:
502c0014855SJack F Vogel 	case ixgbe_phy_sfp_passive_unknown:
5030ac6dfecSJack F Vogel 		return TRUE;
5040ac6dfecSJack F Vogel 	default:
5050ac6dfecSJack F Vogel 		return FALSE;
5060ac6dfecSJack F Vogel 	}
5070ac6dfecSJack F Vogel }
5080ac6dfecSJack F Vogel 
5092d8f84cbSJack F Vogel /* Workaround to make 8.0 buildable */
5104655a392SJack F Vogel #if __FreeBSD_version >= 800000 && __FreeBSD_version < 800504
5112d8f84cbSJack F Vogel static __inline int
5122d8f84cbSJack F Vogel drbr_needs_enqueue(struct ifnet *ifp, struct buf_ring *br)
5132d8f84cbSJack F Vogel {
5142d8f84cbSJack F Vogel #ifdef ALTQ
5152d8f84cbSJack F Vogel         if (ALTQ_IS_ENABLED(&ifp->if_snd))
5162d8f84cbSJack F Vogel                 return (1);
5172d8f84cbSJack F Vogel #endif
5182d8f84cbSJack F Vogel         return (!buf_ring_empty(br));
5192d8f84cbSJack F Vogel }
5202d8f84cbSJack F Vogel #endif
5212d8f84cbSJack F Vogel 
522e2314c6cSJack F Vogel /*
523e2314c6cSJack F Vogel ** Find the number of unrefreshed RX descriptors
524e2314c6cSJack F Vogel */
525e2314c6cSJack F Vogel static inline u16
526e2314c6cSJack F Vogel ixgbe_rx_unrefreshed(struct rx_ring *rxr)
527e2314c6cSJack F Vogel {
528e2314c6cSJack F Vogel 	if (rxr->next_to_check > rxr->next_to_refresh)
529e2314c6cSJack F Vogel 		return (rxr->next_to_check - rxr->next_to_refresh - 1);
530e2314c6cSJack F Vogel 	else
531*47dd71a8SJack F Vogel 		return ((rxr->num_desc + rxr->next_to_check) -
532e2314c6cSJack F Vogel 		    rxr->next_to_refresh - 1);
533e2314c6cSJack F Vogel }
534e2314c6cSJack F Vogel 
53513705f88SJack F Vogel #endif /* _IXGBE_H_ */
536