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