i40evf.h 11.6 KB
Newer Older
G
Greg Rose 已提交
1 2 3
/*******************************************************************************
 *
 * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver
M
Mitch Williams 已提交
4
 * Copyright(c) 2013 - 2014 Intel Corporation.
G
Greg Rose 已提交
5 6 7 8 9 10 11 12 13 14
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
15 16 17
 * You should have received a copy of the GNU General Public License along
 * with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
G
Greg Rose 已提交
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
 * The full GNU General Public License is included in this distribution in
 * the file called "COPYING".
 *
 * Contact Information:
 * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
 *
 ******************************************************************************/

#ifndef _I40EVF_H_
#define _I40EVF_H_

#include <linux/module.h>
#include <linux/pci.h>
#include <linux/aer.h>
#include <linux/netdevice.h>
#include <linux/vmalloc.h>
#include <linux/interrupt.h>
#include <linux/ethtool.h>
#include <linux/if_vlan.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/sctp.h>
#include <linux/ipv6.h>
#include <net/ip6_checksum.h>
#include <net/udp.h>

#include "i40e_type.h"
#include "i40e_virtchnl.h"
#include "i40e_txrx.h"

#define DEFAULT_DEBUG_LEVEL_SHIFT 3
#define PFX "i40evf: "

/* dummy struct to make common code less painful */
struct i40e_vsi {
	struct i40evf_adapter *back;
	struct net_device *netdev;
	unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
	u16 seid;
	u16 id;
	unsigned long state;
	int base_vector;
	u16 work_limit;
	/* high bit set means dynamic, use accessor routines to read/write.
	 * hardware only supports 2us resolution for the ITR registers.
	 * these values always store the USER setting, and must be converted
	 * before programming to a register.
	 */
	u16 rx_itr_setting;
	u16 tx_itr_setting;
69
	u16 qs_handle;
70 71
	u8 *rss_hkey_user; /* User configured hash keys */
	u8 *rss_lut_user;  /* User configured lookup table entries */
G
Greg Rose 已提交
72 73 74 75 76 77 78 79 80 81
};

/* How many Rx Buffers do we bundle into one write to the hardware ? */
#define I40EVF_RX_BUFFER_WRITE	16	/* Must be power of 2 */
#define I40EVF_DEFAULT_TXD   512
#define I40EVF_DEFAULT_RXD   512
#define I40EVF_MAX_TXD       4096
#define I40EVF_MIN_TXD       64
#define I40EVF_MAX_RXD       4096
#define I40EVF_MIN_RXD       64
82
#define I40EVF_REQ_DESCRIPTOR_MULTIPLE  32
G
Greg Rose 已提交
83 84 85 86 87 88 89 90 91

/* Supported Rx Buffer Sizes */
#define I40EVF_RXBUFFER_64    64     /* Used for packet split */
#define I40EVF_RXBUFFER_128   128    /* Used for packet split */
#define I40EVF_RXBUFFER_256   256    /* Used for packet split */
#define I40EVF_RXBUFFER_2048  2048
#define I40EVF_MAX_RXBUFFER   16384  /* largest size for single descriptor */
#define I40EVF_MAX_AQ_BUF_SIZE    4096
#define I40EVF_AQ_LEN             32
92
#define I40EVF_AQ_MAX_ERR         20 /* times to try before resetting AQ */
G
Greg Rose 已提交
93 94 95 96 97 98 99 100 101 102

#define MAXIMUM_ETHERNET_VLAN_SIZE (VLAN_ETH_FRAME_LEN + ETH_FCS_LEN)

#define I40E_RX_DESC(R, i) (&(((union i40e_32byte_rx_desc *)((R)->desc))[i]))
#define I40E_TX_DESC(R, i) (&(((struct i40e_tx_desc *)((R)->desc))[i]))
#define I40E_TX_CTXTDESC(R, i) \
	(&(((struct i40e_tx_context_desc *)((R)->desc))[i]))
#define MAX_RX_QUEUES 8
#define MAX_TX_QUEUES MAX_RX_QUEUES

103
#define I40EVF_HKEY_ARRAY_SIZE ((I40E_VFQF_HKEY_MAX_INDEX + 1) * 4)
104
#define I40EVF_HLUT_ARRAY_SIZE ((I40E_VFQF_HLUT_MAX_INDEX + 1) * 4)
105

G
Greg Rose 已提交
106 107 108 109 110 111 112 113 114 115 116 117
/* MAX_MSIX_Q_VECTORS of these are allocated,
 * but we only use one per queue-specific vector.
 */
struct i40e_q_vector {
	struct i40evf_adapter *adapter;
	struct i40e_vsi *vsi;
	struct napi_struct napi;
	unsigned long reg_idx;
	struct i40e_ring_container rx;
	struct i40e_ring_container tx;
	u32 ring_mask;
	u8 num_ringpairs;	/* total number of ring pairs in vector */
118 119
#define ITR_COUNTDOWN_START 100
	u8 itr_countdown;	/* when 0 or 1 update ITR */
G
Greg Rose 已提交
120 121
	int v_idx;	  /* vector index in list */
	char name[IFNAMSIZ + 9];
122
	bool arm_wb_state;
G
Greg Rose 已提交
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
	cpumask_var_t affinity_mask;
};

/* Helper macros to switch between ints/sec and what the register uses.
 * And yes, it's the same math going both ways.  The lowest value
 * supported by all of the i40e hardware is 8.
 */
#define EITR_INTS_PER_SEC_TO_REG(_eitr) \
	((_eitr) ? (1000000000 / ((_eitr) * 256)) : 8)
#define EITR_REG_TO_INTS_PER_SEC EITR_INTS_PER_SEC_TO_REG

#define I40EVF_DESC_UNUSED(R) \
	((((R)->next_to_clean > (R)->next_to_use) ? 0 : (R)->count) + \
	(R)->next_to_clean - (R)->next_to_use - 1)

#define I40EVF_RX_DESC_ADV(R, i)	    \
	(&(((union i40e_adv_rx_desc *)((R).desc))[i]))
#define I40EVF_TX_DESC_ADV(R, i)	    \
	(&(((union i40e_adv_tx_desc *)((R).desc))[i]))
#define I40EVF_TX_CTXTDESC_ADV(R, i)	    \
	(&(((struct i40e_adv_tx_context_desc *)((R).desc))[i]))

#define OTHER_VECTOR 1
#define NONQ_VECS (OTHER_VECTOR)

#define MIN_MSIX_Q_VECTORS 1
#define MIN_MSIX_COUNT (MIN_MSIX_Q_VECTORS + NONQ_VECS)

#define I40EVF_QUEUE_END_OF_LIST 0x7FF
#define I40EVF_FREE_VECTOR 0x7FFF
struct i40evf_mac_filter {
	struct list_head list;
	u8 macaddr[ETH_ALEN];
	bool remove;		/* filter needs to be removed */
	bool add;		/* filter needs to be added */
};

struct i40evf_vlan_filter {
	struct list_head list;
	u16 vlan;
	bool remove;		/* filter needs to be removed */
	bool add;		/* filter needs to be added */
};

/* Driver state. The order of these is important! */
enum i40evf_state_t {
	__I40EVF_STARTUP,		/* driver loaded, probe complete */
	__I40EVF_REMOVE,		/* driver is being unloaded */
	__I40EVF_INIT_VERSION_CHECK,	/* aq msg sent, awaiting reply */
	__I40EVF_INIT_GET_RESOURCES,	/* aq msg sent, awaiting reply */
	__I40EVF_INIT_SW,		/* got resources, setting up structs */
M
Mitch Williams 已提交
174
	__I40EVF_RESETTING,		/* in reset */
G
Greg Rose 已提交
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
	/* Below here, watchdog is running */
	__I40EVF_DOWN,			/* ready, can be opened */
	__I40EVF_TESTING,		/* in ethtool self-test */
	__I40EVF_RUNNING,		/* opened, working */
};

enum i40evf_critical_section_t {
	__I40EVF_IN_CRITICAL_TASK,	/* cannot be interrupted */
};
/* make common code happy */
#define __I40E_DOWN __I40EVF_DOWN

/* board specific private data structure */
struct i40evf_adapter {
	struct timer_list watchdog_timer;
	struct work_struct reset_task;
	struct work_struct adminq_task;
	struct delayed_work init_task;
193
	struct i40e_q_vector *q_vectors;
G
Greg Rose 已提交
194
	struct list_head vlan_filter_list;
195
	char misc_vector_name[IFNAMSIZ + 9];
196
	int num_active_queues;
G
Greg Rose 已提交
197 198 199 200 201

	/* TX */
	struct i40e_ring *tx_rings[I40E_MAX_VSI_QP];
	u32 tx_timeout_count;
	struct list_head mac_filter_list;
202
	u32 tx_desc_count;
G
Greg Rose 已提交
203 204 205 206

	/* RX */
	struct i40e_ring *rx_rings[I40E_MAX_VSI_QP];
	u64 hw_csum_rx_error;
207
	u32 rx_desc_count;
G
Greg Rose 已提交
208 209 210
	int num_msix_vectors;
	struct msix_entry *msix_entries;

211
	u32 flags;
212 213 214 215 216 217 218 219 220 221
#define I40EVF_FLAG_RX_CSUM_ENABLED              BIT(0)
#define I40EVF_FLAG_RX_1BUF_CAPABLE              BIT(1)
#define I40EVF_FLAG_RX_PS_CAPABLE                BIT(2)
#define I40EVF_FLAG_RX_PS_ENABLED                BIT(3)
#define I40EVF_FLAG_IMIR_ENABLED                 BIT(5)
#define I40EVF_FLAG_MQ_CAPABLE                   BIT(6)
#define I40EVF_FLAG_NEED_LINK_UPDATE             BIT(7)
#define I40EVF_FLAG_PF_COMMS_FAILED              BIT(8)
#define I40EVF_FLAG_RESET_PENDING                BIT(9)
#define I40EVF_FLAG_RESET_NEEDED                 BIT(10)
222 223
#define I40EVF_FLAG_WB_ON_ITR_CAPABLE		BIT(11)
#define I40EVF_FLAG_OUTER_UDP_CSUM_CAPABLE	BIT(12)
224
#define I40EVF_FLAG_ADDR_SET_BY_PF		BIT(13)
225
/* duplicates for common code */
G
Greg Rose 已提交
226 227 228
#define I40E_FLAG_FDIR_ATR_ENABLED		 0
#define I40E_FLAG_DCB_ENABLED			 0
#define I40E_FLAG_RX_CSUM_ENABLED                I40EVF_FLAG_RX_CSUM_ENABLED
229 230
#define I40E_FLAG_WB_ON_ITR_CAPABLE		I40EVF_FLAG_WB_ON_ITR_CAPABLE
#define I40E_FLAG_OUTER_UDP_CSUM_CAPABLE	I40EVF_FLAG_OUTER_UDP_CSUM_CAPABLE
G
Greg Rose 已提交
231 232
	/* flags for admin queue service task */
	u32 aq_required;
233 234 235 236 237 238 239 240 241
#define I40EVF_FLAG_AQ_ENABLE_QUEUES		BIT(0)
#define I40EVF_FLAG_AQ_DISABLE_QUEUES		BIT(1)
#define I40EVF_FLAG_AQ_ADD_MAC_FILTER		BIT(2)
#define I40EVF_FLAG_AQ_ADD_VLAN_FILTER		BIT(3)
#define I40EVF_FLAG_AQ_DEL_MAC_FILTER		BIT(4)
#define I40EVF_FLAG_AQ_DEL_VLAN_FILTER		BIT(5)
#define I40EVF_FLAG_AQ_CONFIGURE_QUEUES		BIT(6)
#define I40EVF_FLAG_AQ_MAP_VECTORS		BIT(7)
#define I40EVF_FLAG_AQ_HANDLE_RESET		BIT(8)
242
#define I40EVF_FLAG_AQ_CONFIGURE_RSS		BIT(9)
243
#define I40EVF_FLAG_AQ_GET_CONFIG		BIT(10)
M
Mitch Williams 已提交
244

G
Greg Rose 已提交
245 246 247 248 249
	/* OS defined structs */
	struct net_device *netdev;
	struct pci_dev *pdev;
	struct net_device_stats net_stats;

M
Mitch Williams 已提交
250
	struct i40e_hw hw; /* defined in i40e_type.h */
G
Greg Rose 已提交
251 252

	enum i40evf_state_t state;
M
Mitch Williams 已提交
253
	unsigned long crit_section;
G
Greg Rose 已提交
254 255 256 257 258

	struct work_struct watchdog_task;
	bool netdev_registered;
	bool link_up;
	enum i40e_virtchnl_ops current_op;
259 260 261 262 263 264
#define CLIENT_ENABLED(_a) ((_a)->vf_res->vf_offload_flags & \
			    I40E_VIRTCHNL_VF_OFFLOAD_IWARP)
#define RSS_AQ(_a) ((_a)->vf_res->vf_offload_flags & \
		    I40E_VIRTCHNL_VF_OFFLOAD_RSS_AQ)
#define VLAN_ALLOWED(_a) ((_a)->vf_res->vf_offload_flags & \
			  I40E_VIRTCHNL_VF_OFFLOAD_VLAN)
G
Greg Rose 已提交
265 266
	struct i40e_virtchnl_vf_resource *vf_res; /* incl. all VSIs */
	struct i40e_virtchnl_vsi_resource *vsi_res; /* our LAN VSI */
267 268 269
	struct i40e_virtchnl_version_info pf_version;
#define PF_IS_V11(_a) (((_a)->pf_version.major == 1) && \
		       ((_a)->pf_version.minor == 1))
G
Greg Rose 已提交
270 271 272 273 274 275 276 277 278 279 280 281 282
	u16 msg_enable;
	struct i40e_eth_stats current_stats;
	struct i40e_vsi vsi;
	u32 aq_wait_count;
};


/* needed by i40evf_ethtool.c */
extern char i40evf_driver_name[];
extern const char i40evf_driver_version[];

int i40evf_up(struct i40evf_adapter *adapter);
void i40evf_down(struct i40evf_adapter *adapter);
M
Mitch Williams 已提交
283
int i40evf_process_config(struct i40evf_adapter *adapter);
G
Greg Rose 已提交
284 285 286 287 288 289
void i40evf_reset(struct i40evf_adapter *adapter);
void i40evf_set_ethtool_ops(struct net_device *netdev);
void i40evf_update_stats(struct i40evf_adapter *adapter);
void i40evf_reset_interrupt_capability(struct i40evf_adapter *adapter);
int i40evf_init_interrupt_scheme(struct i40evf_adapter *adapter);
void i40evf_irq_enable_queues(struct i40evf_adapter *adapter, u32 mask);
M
Mitch Williams 已提交
290 291
void i40evf_free_all_tx_resources(struct i40evf_adapter *adapter);
void i40evf_free_all_rx_resources(struct i40evf_adapter *adapter);
G
Greg Rose 已提交
292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311

void i40e_napi_add_all(struct i40evf_adapter *adapter);
void i40e_napi_del_all(struct i40evf_adapter *adapter);

int i40evf_send_api_ver(struct i40evf_adapter *adapter);
int i40evf_verify_api_ver(struct i40evf_adapter *adapter);
int i40evf_send_vf_config_msg(struct i40evf_adapter *adapter);
int i40evf_get_vf_config(struct i40evf_adapter *adapter);
void i40evf_irq_enable(struct i40evf_adapter *adapter, bool flush);
void i40evf_configure_queues(struct i40evf_adapter *adapter);
void i40evf_deconfigure_queues(struct i40evf_adapter *adapter);
void i40evf_enable_queues(struct i40evf_adapter *adapter);
void i40evf_disable_queues(struct i40evf_adapter *adapter);
void i40evf_map_queues(struct i40evf_adapter *adapter);
void i40evf_add_ether_addrs(struct i40evf_adapter *adapter);
void i40evf_del_ether_addrs(struct i40evf_adapter *adapter);
void i40evf_add_vlans(struct i40evf_adapter *adapter);
void i40evf_del_vlans(struct i40evf_adapter *adapter);
void i40evf_set_promiscuous(struct i40evf_adapter *adapter, int flags);
void i40evf_request_stats(struct i40evf_adapter *adapter);
312
void i40evf_request_reset(struct i40evf_adapter *adapter);
G
Greg Rose 已提交
313 314 315
void i40evf_virtchnl_completion(struct i40evf_adapter *adapter,
				enum i40e_virtchnl_ops v_opcode,
				i40e_status v_retval, u8 *msg, u16 msglen);
316 317
int i40evf_config_rss(struct i40e_vsi *vsi, const u8 *seed, u8 *lut,
		      u16 lut_size);
318 319
int i40evf_get_rss(struct i40e_vsi *vsi, const u8 *seed, u8 *lut,
		   u16 lut_size);
G
Greg Rose 已提交
320
#endif /* _I40EVF_H_ */