1d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck/*******************************************************************************
2d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
3d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck  Intel(R) 82576 Virtual Function Linux driver
42a06ed9297e927bb928897661940c47ea4f41707Mitch A Williams  Copyright(c) 2009 - 2012 Intel Corporation.
5d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
6d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck  This program is free software; you can redistribute it and/or modify it
7d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck  under the terms and conditions of the GNU General Public License,
8d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck  version 2, as published by the Free Software Foundation.
9d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
10d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck  This program is distributed in the hope it will be useful, but WITHOUT
11d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck  more details.
14d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
15d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck  You should have received a copy of the GNU General Public License along with
16d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck  this program; if not, write to the Free Software Foundation, Inc.,
17d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
18d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
19d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck  The full GNU General Public License is included in this distribution in
20d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck  the file called "COPYING".
21d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
22d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck  Contact Information:
23d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
24d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
25d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
26d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck*******************************************************************************/
27d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
28d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck/* Linux PRO/1000 Ethernet Driver main header file */
29d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
30d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#ifndef _IGBVF_H_
31d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define _IGBVF_H_
32d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
33d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#include <linux/types.h>
34d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#include <linux/timer.h>
35d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#include <linux/io.h>
36d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#include <linux/netdevice.h>
37a0f1d603ee4186081fda0ad48ccf6163c2009f10Jiri Pirko#include <linux/if_vlan.h>
38d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
39d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#include "vf.h"
40d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
41d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck/* Forward declarations */
42d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckstruct igbvf_info;
43d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckstruct igbvf_adapter;
44d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
45d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck/* Interrupt defines */
46ab50a2a430693b0961dc7b7d9fe2a4bd77d11ea6Mitch A Williams#define IGBVF_START_ITR                    488 /* ~8000 ints/sec */
47ab50a2a430693b0961dc7b7d9fe2a4bd77d11ea6Mitch A Williams#define IGBVF_4K_ITR                       980
48ab50a2a430693b0961dc7b7d9fe2a4bd77d11ea6Mitch A Williams#define IGBVF_20K_ITR                      196
49ab50a2a430693b0961dc7b7d9fe2a4bd77d11ea6Mitch A Williams#define IGBVF_70K_ITR                       56
50ab50a2a430693b0961dc7b7d9fe2a4bd77d11ea6Mitch A Williams
51ab50a2a430693b0961dc7b7d9fe2a4bd77d11ea6Mitch A Williamsenum latency_range {
52ab50a2a430693b0961dc7b7d9fe2a4bd77d11ea6Mitch A Williams	lowest_latency = 0,
53ab50a2a430693b0961dc7b7d9fe2a4bd77d11ea6Mitch A Williams	low_latency = 1,
54ab50a2a430693b0961dc7b7d9fe2a4bd77d11ea6Mitch A Williams	bulk_latency = 2,
55ab50a2a430693b0961dc7b7d9fe2a4bd77d11ea6Mitch A Williams	latency_invalid = 255
56ab50a2a430693b0961dc7b7d9fe2a4bd77d11ea6Mitch A Williams};
57ab50a2a430693b0961dc7b7d9fe2a4bd77d11ea6Mitch A Williams
58d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
5998a1708de1bfa5fe1c490febba850d6043d3c7faMartin Olsson/* Interrupt modes, as used by the IntMode parameter */
60d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_INT_MODE_LEGACY           0
61d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_INT_MODE_MSI              1
62d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_INT_MODE_MSIX             2
63d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
64d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck/* Tx/Rx descriptor defines */
65d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_DEFAULT_TXD               256
66d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_MAX_TXD                   4096
67d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_MIN_TXD                   80
68d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
69d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_DEFAULT_RXD               256
70d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_MAX_RXD                   4096
71d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_MIN_RXD                   80
72d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
73d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_MIN_ITR_USECS             10 /* 100000 irq/sec */
74d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_MAX_ITR_USECS             10000 /* 100    irq/sec */
75d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
76d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck/* RX descriptor control thresholds.
77d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck * PTHRESH - MAC will consider prefetch if it has fewer than this number of
78d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck *           descriptors available in its onboard memory.
79d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck *           Setting this to 0 disables RX descriptor prefetch.
80d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck * HTHRESH - MAC will only prefetch if there are at least this many descriptors
81d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck *           available in host memory.
82d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck *           If PTHRESH is 0, this should also be 0.
83d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck * WTHRESH - RX descriptor writeback threshold - MAC will delay writing back
84d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck *           descriptors until either it has this many to write back, or the
85d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck *           ITR timer expires.
86d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck */
87d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_RX_PTHRESH                16
88d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_RX_HTHRESH                8
89d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_RX_WTHRESH                1
90d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
91d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck/* this is the size past which hardware will drop packets when setting LPE=0 */
92d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define MAXIMUM_ETHERNET_VLAN_SIZE      1522
93d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
94d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_FC_PAUSE_TIME             0x0680 /* 858 usec */
95d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
96d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck/* How many Tx Descriptors do we need to call netif_wake_queue ? */
97d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_TX_QUEUE_WAKE             32
98d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck/* How many Rx Buffers do we bundle into one write to the hardware ? */
99d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_RX_BUFFER_WRITE           16 /* Must be power of 2 */
100d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
101d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define AUTO_ALL_MODES                  0
102d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_EEPROM_APME               0x0400
103d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
104d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_MNG_VLAN_NONE             (-1)
105d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
106d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck/* Number of packet split data buffers (not including the header buffer) */
107d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define PS_PAGE_BUFFERS                 (MAX_PS_BUFFERS - 1)
108d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
109d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckenum igbvf_boards {
110d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	board_vf,
111031d7952ee63e1aa679f7e87700e3281f4de4ba2Williams, Mitch A	board_i350_vf,
112d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck};
113d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
114d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckstruct igbvf_queue_stats {
115d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u64 packets;
116d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u64 bytes;
117d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck};
118d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
119d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck/*
120d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck * wrappers around a pointer to a socket buffer,
121d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck * so a DMA handle can be stored along with the buffer
122d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck */
123d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckstruct igbvf_buffer {
124d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	dma_addr_t dma;
125d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	struct sk_buff *skb;
126d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	union {
127d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck		/* Tx */
128d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck		struct {
129d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck			unsigned long time_stamp;
130d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck			u16 length;
131d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck			u16 next_to_watch;
132a7d5ca40ff56e2cd4e30bbe91f2d0deab6bfc006Alexander Duyck			u16 mapped_as_page;
133d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck		};
134d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck		/* Rx */
135d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck		struct {
136d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck			struct page *page;
137d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck			u64 page_dma;
138d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck			unsigned int page_offset;
139d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck		};
140d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	};
141d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck};
142d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
143d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckunion igbvf_desc {
144d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	union e1000_adv_rx_desc rx_desc;
145d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	union e1000_adv_tx_desc tx_desc;
146d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	struct e1000_adv_tx_context_desc tx_context_desc;
147d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck};
148d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
149d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckstruct igbvf_ring {
150d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	struct igbvf_adapter *adapter;  /* backlink */
151d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	union igbvf_desc *desc;         /* pointer to ring memory  */
152d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	dma_addr_t dma;                 /* phys address of ring    */
153d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	unsigned int size;              /* length of ring in bytes */
154d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	unsigned int count;             /* number of desc. in ring */
155d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
156d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u16 next_to_use;
157d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u16 next_to_clean;
158d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
159d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u16 head;
160d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u16 tail;
161d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
162d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	/* array of buffer information structs */
163d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	struct igbvf_buffer *buffer_info;
164d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	struct napi_struct napi;
165d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
166d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	char name[IFNAMSIZ + 5];
167d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 eims_value;
168d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 itr_val;
169ab50a2a430693b0961dc7b7d9fe2a4bd77d11ea6Mitch A Williams	enum latency_range itr_range;
170d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u16 itr_register;
171d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	int set_itr;
172d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
173d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	struct sk_buff *rx_skb_top;
174d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
175d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	struct igbvf_queue_stats stats;
176d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck};
177d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
178d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck/* board specific private data structure */
179d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckstruct igbvf_adapter {
180d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	struct timer_list watchdog_timer;
181d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	struct timer_list blink_timer;
182d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
183d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	struct work_struct reset_task;
184d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	struct work_struct watchdog_task;
185d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
186d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	const struct igbvf_info *ei;
187d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
188a0f1d603ee4186081fda0ad48ccf6163c2009f10Jiri Pirko	unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
189d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 bd_number;
190d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 rx_buffer_len;
191d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 polling_interval;
192d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u16 mng_vlan_id;
193d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u16 link_speed;
194d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u16 link_duplex;
195d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
196d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	spinlock_t tx_queue_lock; /* prevent concurrent tail updates */
197d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
198d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	/* track device up/down/testing state */
199d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	unsigned long state;
200d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
201d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	/* Interrupt Throttle Rate */
202ab50a2a430693b0961dc7b7d9fe2a4bd77d11ea6Mitch A Williams	u32 requested_itr; /* ints/sec or adaptive */
203ab50a2a430693b0961dc7b7d9fe2a4bd77d11ea6Mitch A Williams	u32 current_itr; /* Actual ITR register value, not ints/sec */
204d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
205d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	/*
206d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	 * Tx
207d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	 */
208d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	struct igbvf_ring *tx_ring /* One per active queue */
209d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	____cacheline_aligned_in_smp;
210d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
211d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	unsigned int restart_queue;
212d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 txd_cmd;
213d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
214d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 tx_int_delay;
215d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 tx_abs_int_delay;
216d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
217d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	unsigned int total_tx_bytes;
218d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	unsigned int total_tx_packets;
219d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	unsigned int total_rx_bytes;
220d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	unsigned int total_rx_packets;
221d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
222d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	/* Tx stats */
223d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 tx_timeout_count;
224d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 tx_fifo_head;
225d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 tx_head_addr;
226d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 tx_fifo_size;
227d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 tx_dma_failed;
228d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
229d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	/*
230d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	 * Rx
231d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	 */
232d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	struct igbvf_ring *rx_ring;
233d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
234d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 rx_int_delay;
235d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 rx_abs_int_delay;
236d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
237d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	/* Rx stats */
238d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u64 hw_csum_err;
239d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u64 hw_csum_good;
240d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u64 rx_hdr_split;
241d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 alloc_rx_buff_failed;
242d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 rx_dma_failed;
243d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
244d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	unsigned int rx_ps_hdr_size;
245d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 max_frame_size;
246d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 min_frame_size;
247d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
248d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	/* OS defined structs */
249d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	struct net_device *netdev;
250d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	struct pci_dev *pdev;
251d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	struct net_device_stats net_stats;
252d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	spinlock_t stats_lock;      /* prevent concurrent stats updates */
253d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
254d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	/* structs defined in e1000_hw.h */
255d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	struct e1000_hw hw;
256d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
257d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	/* The VF counters don't clear on read so we have to get a base
258d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	 * count on driver start up and always subtract that base on
259d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	 * on the first update, thus the flag..
260d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	 */
261d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	struct e1000_vf_stats stats;
262d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u64 zero_base;
263d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
264d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	struct igbvf_ring test_tx_ring;
265d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	struct igbvf_ring test_rx_ring;
266d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 test_icr;
267d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
268d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 msg_enable;
269d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	struct msix_entry *msix_entries;
270d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	int int_mode;
271d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 eims_enable_mask;
272d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 eims_other;
273d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 int_counter0;
274d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 int_counter1;
275d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
276d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 eeprom_wol;
277d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 wol;
278d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32 pba;
279d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
280d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	bool fc_autoneg;
281d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
282d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	unsigned long led_status;
283d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
284d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	unsigned int flags;
2857227909340477c1e5225bb2df76cdcc95b5e1da1Alexander Duyck	unsigned long last_reset;
286d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck};
287d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
288d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckstruct igbvf_info {
289d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	enum e1000_mac_type     mac;
290d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	unsigned int            flags;
291d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	u32                     pba;
292d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	void                    (*init_ops)(struct e1000_hw *);
293d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	s32                     (*get_variants)(struct igbvf_adapter *);
294d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck};
295d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
296d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck/* hardware capability, feature, and workaround flags */
2970364d6fd2c353d2d82da865a6f093f97c69b669cAlexander Duyck#define IGBVF_FLAG_RX_CSUM_DISABLED             (1 << 0)
298d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
299d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_RX_DESC_ADV(R, i)     \
300d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	(&((((R).desc))[i].rx_desc))
301d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_TX_DESC_ADV(R, i)     \
302d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	(&((((R).desc))[i].tx_desc))
303d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#define IGBVF_TX_CTXTDESC_ADV(R, i) \
304d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	(&((((R).desc))[i].tx_context_desc))
305d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
306d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckenum igbvf_state_t {
307d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	__IGBVF_TESTING,
308d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	__IGBVF_RESETTING,
309d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck	__IGBVF_DOWN
310d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck};
311d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
312d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckextern char igbvf_driver_name[];
313d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckextern const char igbvf_driver_version[];
314d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
315d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckextern void igbvf_check_options(struct igbvf_adapter *);
316d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckextern void igbvf_set_ethtool_ops(struct net_device *);
317d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
318d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckextern int igbvf_up(struct igbvf_adapter *);
319d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckextern void igbvf_down(struct igbvf_adapter *);
320d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckextern void igbvf_reinit_locked(struct igbvf_adapter *);
321d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckextern int igbvf_setup_rx_resources(struct igbvf_adapter *, struct igbvf_ring *);
322d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckextern int igbvf_setup_tx_resources(struct igbvf_adapter *, struct igbvf_ring *);
323d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckextern void igbvf_free_rx_resources(struct igbvf_ring *);
324d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckextern void igbvf_free_tx_resources(struct igbvf_ring *);
325d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckextern void igbvf_update_stats(struct igbvf_adapter *);
326d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
327d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyckextern unsigned int copybreak;
328d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck
329d4e0fe01a38a073568aee541a0247fe734095979Alexander Duyck#endif /* _IGBVF_H_ */
330