1/******************************************************************************* 2 * 3 * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver 4 * Copyright(c) 2013 - 2014 Intel Corporation. 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms and conditions of the GNU General Public License, 8 * version 2, as published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 * more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program. If not, see <http://www.gnu.org/licenses/>. 17 * 18 * The full GNU General Public License is included in this distribution in 19 * the file called "COPYING". 20 * 21 * Contact Information: 22 * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> 23 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 24 * 25 ******************************************************************************/ 26 27#ifndef _I40EVF_H_ 28#define _I40EVF_H_ 29 30#include <linux/module.h> 31#include <linux/pci.h> 32#include <linux/aer.h> 33#include <linux/netdevice.h> 34#include <linux/vmalloc.h> 35#include <linux/interrupt.h> 36#include <linux/ethtool.h> 37#include <linux/if_vlan.h> 38#include <linux/ip.h> 39#include <linux/tcp.h> 40#include <linux/sctp.h> 41#include <linux/ipv6.h> 42#include <net/ip6_checksum.h> 43#include <net/udp.h> 44 45#include "i40e_type.h" 46#include "i40e_virtchnl.h" 47#include "i40e_txrx.h" 48 49#define DEFAULT_DEBUG_LEVEL_SHIFT 3 50#define PFX "i40evf: " 51#define DPRINTK(nlevel, klevel, fmt, args...) \ 52 ((void)((NETIF_MSG_##nlevel & adapter->msg_enable) && \ 53 printk(KERN_##klevel PFX "%s: %s: " fmt, adapter->netdev->name, \ 54 __func__ , ## args))) 55 56/* dummy struct to make common code less painful */ 57struct i40e_vsi { 58 struct i40evf_adapter *back; 59 struct net_device *netdev; 60 unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; 61 u16 seid; 62 u16 id; 63 unsigned long state; 64 int base_vector; 65 u16 work_limit; 66 /* high bit set means dynamic, use accessor routines to read/write. 67 * hardware only supports 2us resolution for the ITR registers. 68 * these values always store the USER setting, and must be converted 69 * before programming to a register. 70 */ 71 u16 rx_itr_setting; 72 u16 tx_itr_setting; 73}; 74 75/* How many Rx Buffers do we bundle into one write to the hardware ? */ 76#define I40EVF_RX_BUFFER_WRITE 16 /* Must be power of 2 */ 77#define I40EVF_DEFAULT_TXD 512 78#define I40EVF_DEFAULT_RXD 512 79#define I40EVF_MAX_TXD 4096 80#define I40EVF_MIN_TXD 64 81#define I40EVF_MAX_RXD 4096 82#define I40EVF_MIN_RXD 64 83#define I40EVF_REQ_DESCRIPTOR_MULTIPLE 32 84 85/* Supported Rx Buffer Sizes */ 86#define I40EVF_RXBUFFER_64 64 /* Used for packet split */ 87#define I40EVF_RXBUFFER_128 128 /* Used for packet split */ 88#define I40EVF_RXBUFFER_256 256 /* Used for packet split */ 89#define I40EVF_RXBUFFER_2048 2048 90#define I40EVF_MAX_RXBUFFER 16384 /* largest size for single descriptor */ 91#define I40EVF_MAX_AQ_BUF_SIZE 4096 92#define I40EVF_AQ_LEN 32 93#define I40EVF_AQ_MAX_ERR 10 /* times to try before resetting AQ */ 94 95#define MAXIMUM_ETHERNET_VLAN_SIZE (VLAN_ETH_FRAME_LEN + ETH_FCS_LEN) 96 97#define I40E_RX_DESC(R, i) (&(((union i40e_32byte_rx_desc *)((R)->desc))[i])) 98#define I40E_TX_DESC(R, i) (&(((struct i40e_tx_desc *)((R)->desc))[i])) 99#define I40E_TX_CTXTDESC(R, i) \ 100 (&(((struct i40e_tx_context_desc *)((R)->desc))[i])) 101#define MAX_RX_QUEUES 8 102#define MAX_TX_QUEUES MAX_RX_QUEUES 103 104/* MAX_MSIX_Q_VECTORS of these are allocated, 105 * but we only use one per queue-specific vector. 106 */ 107struct i40e_q_vector { 108 struct i40evf_adapter *adapter; 109 struct i40e_vsi *vsi; 110 struct napi_struct napi; 111 unsigned long reg_idx; 112 struct i40e_ring_container rx; 113 struct i40e_ring_container tx; 114 u32 ring_mask; 115 u8 num_ringpairs; /* total number of ring pairs in vector */ 116 int v_idx; /* vector index in list */ 117 char name[IFNAMSIZ + 9]; 118 cpumask_var_t affinity_mask; 119}; 120 121/* Helper macros to switch between ints/sec and what the register uses. 122 * And yes, it's the same math going both ways. The lowest value 123 * supported by all of the i40e hardware is 8. 124 */ 125#define EITR_INTS_PER_SEC_TO_REG(_eitr) \ 126 ((_eitr) ? (1000000000 / ((_eitr) * 256)) : 8) 127#define EITR_REG_TO_INTS_PER_SEC EITR_INTS_PER_SEC_TO_REG 128 129#define I40EVF_DESC_UNUSED(R) \ 130 ((((R)->next_to_clean > (R)->next_to_use) ? 0 : (R)->count) + \ 131 (R)->next_to_clean - (R)->next_to_use - 1) 132 133#define I40EVF_RX_DESC_ADV(R, i) \ 134 (&(((union i40e_adv_rx_desc *)((R).desc))[i])) 135#define I40EVF_TX_DESC_ADV(R, i) \ 136 (&(((union i40e_adv_tx_desc *)((R).desc))[i])) 137#define I40EVF_TX_CTXTDESC_ADV(R, i) \ 138 (&(((struct i40e_adv_tx_context_desc *)((R).desc))[i])) 139 140#define OTHER_VECTOR 1 141#define NONQ_VECS (OTHER_VECTOR) 142 143#define MAX_MSIX_Q_VECTORS 4 144#define MAX_MSIX_COUNT 5 145 146#define MIN_MSIX_Q_VECTORS 1 147#define MIN_MSIX_COUNT (MIN_MSIX_Q_VECTORS + NONQ_VECS) 148 149#define I40EVF_QUEUE_END_OF_LIST 0x7FF 150#define I40EVF_FREE_VECTOR 0x7FFF 151struct i40evf_mac_filter { 152 struct list_head list; 153 u8 macaddr[ETH_ALEN]; 154 bool remove; /* filter needs to be removed */ 155 bool add; /* filter needs to be added */ 156}; 157 158struct i40evf_vlan_filter { 159 struct list_head list; 160 u16 vlan; 161 bool remove; /* filter needs to be removed */ 162 bool add; /* filter needs to be added */ 163}; 164 165/* Driver state. The order of these is important! */ 166enum i40evf_state_t { 167 __I40EVF_STARTUP, /* driver loaded, probe complete */ 168 __I40EVF_REMOVE, /* driver is being unloaded */ 169 __I40EVF_INIT_VERSION_CHECK, /* aq msg sent, awaiting reply */ 170 __I40EVF_INIT_GET_RESOURCES, /* aq msg sent, awaiting reply */ 171 __I40EVF_INIT_SW, /* got resources, setting up structs */ 172 __I40EVF_RESETTING, /* in reset */ 173 /* Below here, watchdog is running */ 174 __I40EVF_DOWN, /* ready, can be opened */ 175 __I40EVF_TESTING, /* in ethtool self-test */ 176 __I40EVF_RUNNING, /* opened, working */ 177}; 178 179enum i40evf_critical_section_t { 180 __I40EVF_IN_CRITICAL_TASK, /* cannot be interrupted */ 181}; 182/* make common code happy */ 183#define __I40E_DOWN __I40EVF_DOWN 184 185/* board specific private data structure */ 186struct i40evf_adapter { 187 struct timer_list watchdog_timer; 188 struct work_struct reset_task; 189 struct work_struct adminq_task; 190 struct delayed_work init_task; 191 struct i40e_q_vector *q_vector[MAX_MSIX_Q_VECTORS]; 192 struct list_head vlan_filter_list; 193 char misc_vector_name[IFNAMSIZ + 9]; 194 int num_active_queues; 195 196 /* TX */ 197 struct i40e_ring *tx_rings[I40E_MAX_VSI_QP]; 198 u32 tx_timeout_count; 199 struct list_head mac_filter_list; 200 u32 tx_desc_count; 201 202 /* RX */ 203 struct i40e_ring *rx_rings[I40E_MAX_VSI_QP]; 204 u64 hw_csum_rx_error; 205 u32 rx_desc_count; 206 int num_msix_vectors; 207 struct msix_entry *msix_entries; 208 209 u32 flags; 210#define I40EVF_FLAG_RX_CSUM_ENABLED (u32)(1) 211#define I40EVF_FLAG_RX_1BUF_CAPABLE (u32)(1 << 1) 212#define I40EVF_FLAG_RX_PS_CAPABLE (u32)(1 << 2) 213#define I40EVF_FLAG_RX_PS_ENABLED (u32)(1 << 3) 214#define I40EVF_FLAG_IN_NETPOLL (u32)(1 << 4) 215#define I40EVF_FLAG_IMIR_ENABLED (u32)(1 << 5) 216#define I40EVF_FLAG_MQ_CAPABLE (u32)(1 << 6) 217#define I40EVF_FLAG_NEED_LINK_UPDATE (u32)(1 << 7) 218#define I40EVF_FLAG_PF_COMMS_FAILED (u32)(1 << 8) 219#define I40EVF_FLAG_RESET_PENDING (u32)(1 << 9) 220#define I40EVF_FLAG_RESET_NEEDED (u32)(1 << 10) 221/* duplcates for common code */ 222#define I40E_FLAG_FDIR_ATR_ENABLED 0 223#define I40E_FLAG_DCB_ENABLED 0 224#define I40E_FLAG_IN_NETPOLL I40EVF_FLAG_IN_NETPOLL 225#define I40E_FLAG_RX_CSUM_ENABLED I40EVF_FLAG_RX_CSUM_ENABLED 226 /* flags for admin queue service task */ 227 u32 aq_required; 228#define I40EVF_FLAG_AQ_ENABLE_QUEUES (u32)(1) 229#define I40EVF_FLAG_AQ_DISABLE_QUEUES (u32)(1 << 1) 230#define I40EVF_FLAG_AQ_ADD_MAC_FILTER (u32)(1 << 2) 231#define I40EVF_FLAG_AQ_ADD_VLAN_FILTER (u32)(1 << 3) 232#define I40EVF_FLAG_AQ_DEL_MAC_FILTER (u32)(1 << 4) 233#define I40EVF_FLAG_AQ_DEL_VLAN_FILTER (u32)(1 << 5) 234#define I40EVF_FLAG_AQ_CONFIGURE_QUEUES (u32)(1 << 6) 235#define I40EVF_FLAG_AQ_MAP_VECTORS (u32)(1 << 7) 236#define I40EVF_FLAG_AQ_HANDLE_RESET (u32)(1 << 8) 237 238 /* OS defined structs */ 239 struct net_device *netdev; 240 struct pci_dev *pdev; 241 struct net_device_stats net_stats; 242 243 struct i40e_hw hw; /* defined in i40e_type.h */ 244 245 enum i40evf_state_t state; 246 unsigned long crit_section; 247 248 struct work_struct watchdog_task; 249 bool netdev_registered; 250 bool link_up; 251 enum i40e_virtchnl_ops current_op; 252 struct i40e_virtchnl_vf_resource *vf_res; /* incl. all VSIs */ 253 struct i40e_virtchnl_vsi_resource *vsi_res; /* our LAN VSI */ 254 u16 msg_enable; 255 struct i40e_eth_stats current_stats; 256 struct i40e_vsi vsi; 257 u32 aq_wait_count; 258}; 259 260 261/* needed by i40evf_ethtool.c */ 262extern char i40evf_driver_name[]; 263extern const char i40evf_driver_version[]; 264 265int i40evf_up(struct i40evf_adapter *adapter); 266void i40evf_down(struct i40evf_adapter *adapter); 267void i40evf_reinit_locked(struct i40evf_adapter *adapter); 268void i40evf_reset(struct i40evf_adapter *adapter); 269void i40evf_set_ethtool_ops(struct net_device *netdev); 270void i40evf_update_stats(struct i40evf_adapter *adapter); 271void i40evf_reset_interrupt_capability(struct i40evf_adapter *adapter); 272int i40evf_init_interrupt_scheme(struct i40evf_adapter *adapter); 273void i40evf_irq_enable_queues(struct i40evf_adapter *adapter, u32 mask); 274void i40evf_free_all_tx_resources(struct i40evf_adapter *adapter); 275void i40evf_free_all_rx_resources(struct i40evf_adapter *adapter); 276 277void i40e_napi_add_all(struct i40evf_adapter *adapter); 278void i40e_napi_del_all(struct i40evf_adapter *adapter); 279 280int i40evf_send_api_ver(struct i40evf_adapter *adapter); 281int i40evf_verify_api_ver(struct i40evf_adapter *adapter); 282int i40evf_send_vf_config_msg(struct i40evf_adapter *adapter); 283int i40evf_get_vf_config(struct i40evf_adapter *adapter); 284void i40evf_irq_enable(struct i40evf_adapter *adapter, bool flush); 285void i40evf_configure_queues(struct i40evf_adapter *adapter); 286void i40evf_deconfigure_queues(struct i40evf_adapter *adapter); 287void i40evf_enable_queues(struct i40evf_adapter *adapter); 288void i40evf_disable_queues(struct i40evf_adapter *adapter); 289void i40evf_map_queues(struct i40evf_adapter *adapter); 290void i40evf_add_ether_addrs(struct i40evf_adapter *adapter); 291void i40evf_del_ether_addrs(struct i40evf_adapter *adapter); 292void i40evf_add_vlans(struct i40evf_adapter *adapter); 293void i40evf_del_vlans(struct i40evf_adapter *adapter); 294void i40evf_set_promiscuous(struct i40evf_adapter *adapter, int flags); 295void i40evf_request_stats(struct i40evf_adapter *adapter); 296void i40evf_request_reset(struct i40evf_adapter *adapter); 297void i40evf_virtchnl_completion(struct i40evf_adapter *adapter, 298 enum i40e_virtchnl_ops v_opcode, 299 i40e_status v_retval, u8 *msg, u16 msglen); 300#endif /* _I40EVF_H_ */ 301