| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | /*******************************************************************************
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Intel 82599 Virtual Function driver | 
					
						
							| 
									
										
										
										
											2014-03-04 03:02:13 +00:00
										 |  |  |   Copyright(c) 1999 - 2014 Intel Corporation. | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   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. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   You should have received a copy of the GNU General Public License along with | 
					
						
							|  |  |  |   this program; if not, write to the Free Software Foundation, Inc., | 
					
						
							|  |  |  |   51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   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 _IXGBEVF_H_
 | 
					
						
							|  |  |  | #define _IXGBEVF_H_
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/types.h>
 | 
					
						
							| 
									
										
										
										
											2011-07-21 03:25:09 +00:00
										 |  |  | #include <linux/bitops.h>
 | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | #include <linux/timer.h>
 | 
					
						
							|  |  |  | #include <linux/io.h>
 | 
					
						
							|  |  |  | #include <linux/netdevice.h>
 | 
					
						
							| 
									
										
										
										
											2011-07-21 03:25:09 +00:00
										 |  |  | #include <linux/if_vlan.h>
 | 
					
						
							| 
									
										
										
										
											2011-06-22 05:01:35 +00:00
										 |  |  | #include <linux/u64_stats_sync.h>
 | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "vf.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-21 06:24:20 +00:00
										 |  |  | #ifdef CONFIG_NET_RX_BUSY_POLL
 | 
					
						
							|  |  |  | #include <net/busy_poll.h>
 | 
					
						
							| 
									
										
										
										
											2013-09-21 06:24:25 +00:00
										 |  |  | #define BP_EXTENDED_STATS
 | 
					
						
							| 
									
										
										
										
											2013-09-21 06:24:20 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | /* wrapper around a pointer to a socket buffer,
 | 
					
						
							|  |  |  |  * so a DMA handle can be stored along with the buffer */ | 
					
						
							|  |  |  | struct ixgbevf_tx_buffer { | 
					
						
							| 
									
										
										
										
											2014-01-17 18:30:03 -08:00
										 |  |  | 	union ixgbe_adv_tx_desc *next_to_watch; | 
					
						
							|  |  |  | 	unsigned long time_stamp; | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | 	struct sk_buff *skb; | 
					
						
							| 
									
										
										
										
											2014-01-17 18:30:03 -08:00
										 |  |  | 	unsigned int bytecount; | 
					
						
							|  |  |  | 	unsigned short gso_segs; | 
					
						
							|  |  |  | 	__be16 protocol; | 
					
						
							| 
									
										
										
										
											2014-01-17 18:30:04 -08:00
										 |  |  | 	DEFINE_DMA_UNMAP_ADDR(dma); | 
					
						
							|  |  |  | 	DEFINE_DMA_UNMAP_LEN(len); | 
					
						
							| 
									
										
										
										
											2014-01-17 18:30:03 -08:00
										 |  |  | 	u32 tx_flags; | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct ixgbevf_rx_buffer { | 
					
						
							|  |  |  | 	struct sk_buff *skb; | 
					
						
							|  |  |  | 	dma_addr_t dma; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-17 18:30:00 -08:00
										 |  |  | struct ixgbevf_stats { | 
					
						
							|  |  |  | 	u64 packets; | 
					
						
							|  |  |  | 	u64 bytes; | 
					
						
							|  |  |  | #ifdef BP_EXTENDED_STATS
 | 
					
						
							|  |  |  | 	u64 yields; | 
					
						
							|  |  |  | 	u64 misses; | 
					
						
							|  |  |  | 	u64 cleaned; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct ixgbevf_tx_queue_stats { | 
					
						
							|  |  |  | 	u64 restart_queue; | 
					
						
							|  |  |  | 	u64 tx_busy; | 
					
						
							|  |  |  | 	u64 tx_done_old; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct ixgbevf_rx_queue_stats { | 
					
						
							|  |  |  | 	u64 non_eop_descs; | 
					
						
							|  |  |  | 	u64 alloc_rx_page_failed; | 
					
						
							|  |  |  | 	u64 alloc_rx_buff_failed; | 
					
						
							|  |  |  | 	u64 csum_err; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | struct ixgbevf_ring { | 
					
						
							| 
									
										
										
										
											2012-05-11 08:32:45 +00:00
										 |  |  | 	struct ixgbevf_ring *next; | 
					
						
							| 
									
										
										
										
											2012-05-11 08:33:16 +00:00
										 |  |  | 	struct net_device *netdev; | 
					
						
							|  |  |  | 	struct device *dev; | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | 	void *desc;			/* descriptor ring memory */ | 
					
						
							|  |  |  | 	dma_addr_t dma;			/* phys. address of descriptor ring */ | 
					
						
							|  |  |  | 	unsigned int size;		/* length in bytes */ | 
					
						
							|  |  |  | 	unsigned int count;		/* amount of descriptors */ | 
					
						
							|  |  |  | 	unsigned int next_to_use; | 
					
						
							|  |  |  | 	unsigned int next_to_clean; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	union { | 
					
						
							|  |  |  | 		struct ixgbevf_tx_buffer *tx_buffer_info; | 
					
						
							|  |  |  | 		struct ixgbevf_rx_buffer *rx_buffer_info; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-17 18:30:00 -08:00
										 |  |  | 	struct ixgbevf_stats stats; | 
					
						
							|  |  |  | 	struct u64_stats_sync syncp; | 
					
						
							|  |  |  | 	union { | 
					
						
							|  |  |  | 		struct ixgbevf_tx_queue_stats tx_stats; | 
					
						
							|  |  |  | 		struct ixgbevf_rx_queue_stats rx_stats; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-06 05:53:32 +00:00
										 |  |  | 	u64 hw_csum_rx_error; | 
					
						
							| 
									
										
										
										
											2013-10-30 07:45:39 +00:00
										 |  |  | 	u8 __iomem *tail; | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	u16 reg_idx; /* holds the special value that gets the hardware register
 | 
					
						
							|  |  |  | 		      * offset associated with this ring, which is different | 
					
						
							|  |  |  | 		      * for DCB and RSS modes */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	u16 rx_buf_len; | 
					
						
							| 
									
										
										
										
											2014-01-17 18:30:00 -08:00
										 |  |  | 	int queue_index; /* needed for multiqueue queue management */ | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* How many Rx Buffers do we bundle into one write to the hardware ? */ | 
					
						
							|  |  |  | #define IXGBEVF_RX_BUFFER_WRITE	16	/* Must be power of 2 */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-20 08:10:03 +00:00
										 |  |  | #define MAX_RX_QUEUES IXGBE_VF_MAX_RX_QUEUES
 | 
					
						
							|  |  |  | #define MAX_TX_QUEUES IXGBE_VF_MAX_TX_QUEUES
 | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define IXGBEVF_DEFAULT_TXD   1024
 | 
					
						
							|  |  |  | #define IXGBEVF_DEFAULT_RXD   512
 | 
					
						
							|  |  |  | #define IXGBEVF_MAX_TXD       4096
 | 
					
						
							|  |  |  | #define IXGBEVF_MIN_TXD       64
 | 
					
						
							|  |  |  | #define IXGBEVF_MAX_RXD       4096
 | 
					
						
							|  |  |  | #define IXGBEVF_MIN_RXD       64
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Supported Rx Buffer Sizes */ | 
					
						
							|  |  |  | #define IXGBEVF_RXBUFFER_256   256    /* Used for packet split */
 | 
					
						
							| 
									
										
										
										
											2012-11-13 04:03:19 +00:00
										 |  |  | #define IXGBEVF_RXBUFFER_2K    2048
 | 
					
						
							|  |  |  | #define IXGBEVF_RXBUFFER_4K    4096
 | 
					
						
							|  |  |  | #define IXGBEVF_RXBUFFER_8K    8192
 | 
					
						
							|  |  |  | #define IXGBEVF_RXBUFFER_10K   10240
 | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define IXGBEVF_RX_HDR_SIZE IXGBEVF_RXBUFFER_256
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define MAXIMUM_ETHERNET_VLAN_SIZE (VLAN_ETH_FRAME_LEN + ETH_FCS_LEN)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define IXGBE_TX_FLAGS_CSUM		(u32)(1)
 | 
					
						
							|  |  |  | #define IXGBE_TX_FLAGS_VLAN		(u32)(1 << 1)
 | 
					
						
							|  |  |  | #define IXGBE_TX_FLAGS_TSO		(u32)(1 << 2)
 | 
					
						
							|  |  |  | #define IXGBE_TX_FLAGS_IPV4		(u32)(1 << 3)
 | 
					
						
							|  |  |  | #define IXGBE_TX_FLAGS_VLAN_MASK	0xffff0000
 | 
					
						
							|  |  |  | #define IXGBE_TX_FLAGS_VLAN_PRIO_MASK	0x0000e000
 | 
					
						
							|  |  |  | #define IXGBE_TX_FLAGS_VLAN_SHIFT	16
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-11 08:32:45 +00:00
										 |  |  | struct ixgbevf_ring_container { | 
					
						
							|  |  |  | 	struct ixgbevf_ring *ring;	/* pointer to linked list of rings */ | 
					
						
							| 
									
										
										
										
											2012-05-11 08:32:55 +00:00
										 |  |  | 	unsigned int total_bytes;	/* total bytes processed this int */ | 
					
						
							|  |  |  | 	unsigned int total_packets;	/* total packets processed this int */ | 
					
						
							| 
									
										
										
										
											2012-05-11 08:32:45 +00:00
										 |  |  | 	u8 count;			/* total number of rings in vector */ | 
					
						
							|  |  |  | 	u8 itr;				/* current ITR setting for ring */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* iterator for handling rings in ring container */ | 
					
						
							|  |  |  | #define ixgbevf_for_each_ring(pos, head) \
 | 
					
						
							|  |  |  | 	for (pos = (head).ring; pos != NULL; pos = pos->next) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | /* MAX_MSIX_Q_VECTORS of these are allocated,
 | 
					
						
							|  |  |  |  * but we only use one per queue-specific vector. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | struct ixgbevf_q_vector { | 
					
						
							|  |  |  | 	struct ixgbevf_adapter *adapter; | 
					
						
							| 
									
										
										
										
											2012-05-11 08:32:55 +00:00
										 |  |  | 	u16 v_idx;		/* index of q_vector within array, also used for
 | 
					
						
							|  |  |  | 				 * finding the bit in EICR and friends that | 
					
						
							|  |  |  | 				 * represents the vector for this ring */ | 
					
						
							|  |  |  | 	u16 itr;		/* Interrupt throttle rate written to EITR */ | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | 	struct napi_struct napi; | 
					
						
							| 
									
										
										
										
											2012-05-11 08:32:45 +00:00
										 |  |  | 	struct ixgbevf_ring_container rx, tx; | 
					
						
							| 
									
										
										
										
											2012-05-11 08:32:50 +00:00
										 |  |  | 	char name[IFNAMSIZ + 9]; | 
					
						
							| 
									
										
										
										
											2013-09-21 06:24:20 +00:00
										 |  |  | #ifdef CONFIG_NET_RX_BUSY_POLL
 | 
					
						
							|  |  |  | 	unsigned int state; | 
					
						
							|  |  |  | #define IXGBEVF_QV_STATE_IDLE		0
 | 
					
						
							|  |  |  | #define IXGBEVF_QV_STATE_NAPI		1    /* NAPI owns this QV */
 | 
					
						
							|  |  |  | #define IXGBEVF_QV_STATE_POLL		2    /* poll owns this QV */
 | 
					
						
							|  |  |  | #define IXGBEVF_QV_STATE_DISABLED	4    /* QV is disabled */
 | 
					
						
							|  |  |  | #define IXGBEVF_QV_OWNED (IXGBEVF_QV_STATE_NAPI | IXGBEVF_QV_STATE_POLL)
 | 
					
						
							|  |  |  | #define IXGBEVF_QV_LOCKED (IXGBEVF_QV_OWNED | IXGBEVF_QV_STATE_DISABLED)
 | 
					
						
							|  |  |  | #define IXGBEVF_QV_STATE_NAPI_YIELD	8    /* NAPI yielded this QV */
 | 
					
						
							|  |  |  | #define IXGBEVF_QV_STATE_POLL_YIELD	16   /* poll yielded this QV */
 | 
					
						
							|  |  |  | #define IXGBEVF_QV_YIELD (IXGBEVF_QV_STATE_NAPI_YIELD | IXGBEVF_QV_STATE_POLL_YIELD)
 | 
					
						
							|  |  |  | #define IXGBEVF_QV_USER_PEND (IXGBEVF_QV_STATE_POLL | IXGBEVF_QV_STATE_POLL_YIELD)
 | 
					
						
							|  |  |  | 	spinlock_t lock; | 
					
						
							|  |  |  | #endif /* CONFIG_NET_RX_BUSY_POLL */
 | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2013-09-21 06:24:20 +00:00
										 |  |  | #ifdef CONFIG_NET_RX_BUSY_POLL
 | 
					
						
							|  |  |  | static inline void ixgbevf_qv_init_lock(struct ixgbevf_q_vector *q_vector) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	spin_lock_init(&q_vector->lock); | 
					
						
							|  |  |  | 	q_vector->state = IXGBEVF_QV_STATE_IDLE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* called from the device poll routine to get ownership of a q_vector */ | 
					
						
							|  |  |  | static inline bool ixgbevf_qv_lock_napi(struct ixgbevf_q_vector *q_vector) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int rc = true; | 
					
						
							|  |  |  | 	spin_lock_bh(&q_vector->lock); | 
					
						
							|  |  |  | 	if (q_vector->state & IXGBEVF_QV_LOCKED) { | 
					
						
							|  |  |  | 		WARN_ON(q_vector->state & IXGBEVF_QV_STATE_NAPI); | 
					
						
							|  |  |  | 		q_vector->state |= IXGBEVF_QV_STATE_NAPI_YIELD; | 
					
						
							|  |  |  | 		rc = false; | 
					
						
							| 
									
										
										
										
											2013-09-21 06:24:25 +00:00
										 |  |  | #ifdef BP_EXTENDED_STATS
 | 
					
						
							| 
									
										
										
										
											2014-01-17 18:30:00 -08:00
										 |  |  | 		q_vector->tx.ring->stats.yields++; | 
					
						
							| 
									
										
										
										
											2013-09-21 06:24:25 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2013-09-21 06:24:20 +00:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		/* we don't care if someone yielded */ | 
					
						
							|  |  |  | 		q_vector->state = IXGBEVF_QV_STATE_NAPI; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	spin_unlock_bh(&q_vector->lock); | 
					
						
							|  |  |  | 	return rc; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* returns true is someone tried to get the qv while napi had it */ | 
					
						
							|  |  |  | static inline bool ixgbevf_qv_unlock_napi(struct ixgbevf_q_vector *q_vector) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int rc = false; | 
					
						
							|  |  |  | 	spin_lock_bh(&q_vector->lock); | 
					
						
							|  |  |  | 	WARN_ON(q_vector->state & (IXGBEVF_QV_STATE_POLL | | 
					
						
							|  |  |  | 				   IXGBEVF_QV_STATE_NAPI_YIELD)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (q_vector->state & IXGBEVF_QV_STATE_POLL_YIELD) | 
					
						
							|  |  |  | 		rc = true; | 
					
						
							|  |  |  | 	/* reset state to idle, unless QV is disabled */ | 
					
						
							|  |  |  | 	q_vector->state &= IXGBEVF_QV_STATE_DISABLED; | 
					
						
							|  |  |  | 	spin_unlock_bh(&q_vector->lock); | 
					
						
							|  |  |  | 	return rc; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* called from ixgbevf_low_latency_poll() */ | 
					
						
							|  |  |  | static inline bool ixgbevf_qv_lock_poll(struct ixgbevf_q_vector *q_vector) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int rc = true; | 
					
						
							|  |  |  | 	spin_lock_bh(&q_vector->lock); | 
					
						
							|  |  |  | 	if ((q_vector->state & IXGBEVF_QV_LOCKED)) { | 
					
						
							|  |  |  | 		q_vector->state |= IXGBEVF_QV_STATE_POLL_YIELD; | 
					
						
							|  |  |  | 		rc = false; | 
					
						
							| 
									
										
										
										
											2013-09-21 06:24:25 +00:00
										 |  |  | #ifdef BP_EXTENDED_STATS
 | 
					
						
							| 
									
										
										
										
											2014-01-17 18:30:00 -08:00
										 |  |  | 		q_vector->rx.ring->stats.yields++; | 
					
						
							| 
									
										
										
										
											2013-09-21 06:24:25 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2013-09-21 06:24:20 +00:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		/* preserve yield marks */ | 
					
						
							|  |  |  | 		q_vector->state |= IXGBEVF_QV_STATE_POLL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	spin_unlock_bh(&q_vector->lock); | 
					
						
							|  |  |  | 	return rc; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* returns true if someone tried to get the qv while it was locked */ | 
					
						
							|  |  |  | static inline bool ixgbevf_qv_unlock_poll(struct ixgbevf_q_vector *q_vector) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int rc = false; | 
					
						
							|  |  |  | 	spin_lock_bh(&q_vector->lock); | 
					
						
							|  |  |  | 	WARN_ON(q_vector->state & (IXGBEVF_QV_STATE_NAPI)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (q_vector->state & IXGBEVF_QV_STATE_POLL_YIELD) | 
					
						
							|  |  |  | 		rc = true; | 
					
						
							|  |  |  | 	/* reset state to idle, unless QV is disabled */ | 
					
						
							|  |  |  | 	q_vector->state &= IXGBEVF_QV_STATE_DISABLED; | 
					
						
							|  |  |  | 	spin_unlock_bh(&q_vector->lock); | 
					
						
							|  |  |  | 	return rc; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* true if a socket is polling, even if it did not get the lock */ | 
					
						
							|  |  |  | static inline bool ixgbevf_qv_busy_polling(struct ixgbevf_q_vector *q_vector) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	WARN_ON(!(q_vector->state & IXGBEVF_QV_OWNED)); | 
					
						
							|  |  |  | 	return q_vector->state & IXGBEVF_QV_USER_PEND; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* false if QV is currently owned */ | 
					
						
							|  |  |  | static inline bool ixgbevf_qv_disable(struct ixgbevf_q_vector *q_vector) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int rc = true; | 
					
						
							|  |  |  | 	spin_lock_bh(&q_vector->lock); | 
					
						
							|  |  |  | 	if (q_vector->state & IXGBEVF_QV_OWNED) | 
					
						
							|  |  |  | 		rc = false; | 
					
						
							| 
									
										
										
										
											2014-01-16 02:30:06 -08:00
										 |  |  | 	q_vector->state |= IXGBEVF_QV_STATE_DISABLED; | 
					
						
							| 
									
										
										
										
											2013-09-21 06:24:20 +00:00
										 |  |  | 	spin_unlock_bh(&q_vector->lock); | 
					
						
							|  |  |  | 	return rc; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* CONFIG_NET_RX_BUSY_POLL */
 | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-11 08:32:55 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * microsecond values for various ITR rates shifted by 2 to fit itr register | 
					
						
							|  |  |  |  * with the first 3 bits reserved 0 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #define IXGBE_MIN_RSC_ITR	24
 | 
					
						
							|  |  |  | #define IXGBE_100K_ITR		40
 | 
					
						
							|  |  |  | #define IXGBE_20K_ITR		200
 | 
					
						
							|  |  |  | #define IXGBE_10K_ITR		400
 | 
					
						
							|  |  |  | #define IXGBE_8K_ITR		500
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | /* 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 ixgbe 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
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-23 02:17:52 +00:00
										 |  |  | static inline u16 ixgbevf_desc_unused(struct ixgbevf_ring *ring) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	u16 ntc = ring->next_to_clean; | 
					
						
							|  |  |  | 	u16 ntu = ring->next_to_use; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ((ntc > ntu) ? 0 : ring->count) + ntc - ntu - 1; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-04 03:02:23 +00:00
										 |  |  | static inline void ixgbevf_write_tail(struct ixgbevf_ring *ring, u32 value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	writel(value, ring->tail); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-11 08:33:00 +00:00
										 |  |  | #define IXGBEVF_RX_DESC(R, i)	    \
 | 
					
						
							|  |  |  | 	(&(((union ixgbe_adv_rx_desc *)((R)->desc))[i])) | 
					
						
							|  |  |  | #define IXGBEVF_TX_DESC(R, i)	    \
 | 
					
						
							|  |  |  | 	(&(((union ixgbe_adv_tx_desc *)((R)->desc))[i])) | 
					
						
							|  |  |  | #define IXGBEVF_TX_CTXTDESC(R, i)	    \
 | 
					
						
							|  |  |  | 	(&(((struct ixgbe_adv_tx_context_desc *)((R)->desc))[i])) | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-22 02:04:37 +00:00
										 |  |  | #define IXGBE_MAX_JUMBO_FRAME_SIZE	9728 /* Maximum Supported Size 9.5KB */
 | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define OTHER_VECTOR 1
 | 
					
						
							|  |  |  | #define NON_Q_VECTORS (OTHER_VECTOR)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define MAX_MSIX_Q_VECTORS 2
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-11 08:32:50 +00:00
										 |  |  | #define MIN_MSIX_Q_VECTORS 1
 | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | #define MIN_MSIX_COUNT (MIN_MSIX_Q_VECTORS + NON_Q_VECTORS)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* board specific private data structure */ | 
					
						
							|  |  |  | struct ixgbevf_adapter { | 
					
						
							|  |  |  | 	struct timer_list watchdog_timer; | 
					
						
							| 
									
										
										
										
											2011-07-21 03:25:09 +00:00
										 |  |  | 	unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | 	struct work_struct reset_task; | 
					
						
							|  |  |  | 	struct ixgbevf_q_vector *q_vector[MAX_MSIX_Q_VECTORS]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Interrupt Throttle Rate */ | 
					
						
							| 
									
										
										
										
											2012-05-11 08:32:55 +00:00
										 |  |  | 	u16 rx_itr_setting; | 
					
						
							|  |  |  | 	u16 tx_itr_setting; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* interrupt masks */ | 
					
						
							|  |  |  | 	u32 eims_enable_mask; | 
					
						
							|  |  |  | 	u32 eims_other; | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* TX */ | 
					
						
							|  |  |  | 	int num_tx_queues; | 
					
						
							| 
									
										
										
										
											2014-01-17 18:30:01 -08:00
										 |  |  | 	struct ixgbevf_ring *tx_ring[MAX_TX_QUEUES]; /* One per active queue */ | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | 	u64 restart_queue; | 
					
						
							|  |  |  | 	u32 tx_timeout_count; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* RX */ | 
					
						
							|  |  |  | 	int num_rx_queues; | 
					
						
							| 
									
										
										
										
											2014-01-17 18:30:01 -08:00
										 |  |  | 	struct ixgbevf_ring *rx_ring[MAX_TX_QUEUES]; /* One per active queue */ | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | 	u64 hw_csum_rx_error; | 
					
						
							|  |  |  | 	u64 hw_rx_no_dma_resources; | 
					
						
							|  |  |  | 	u64 non_eop_descs; | 
					
						
							|  |  |  | 	int num_msix_vectors; | 
					
						
							|  |  |  | 	u32 alloc_rx_page_failed; | 
					
						
							|  |  |  | 	u32 alloc_rx_buff_failed; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Some features need tri-state capability,
 | 
					
						
							|  |  |  | 	 * thus the additional *_CAPABLE flags. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	u32 flags; | 
					
						
							| 
									
										
										
										
											2012-05-11 08:32:29 +00:00
										 |  |  | #define IXGBE_FLAG_IN_WATCHDOG_TASK             (u32)(1)
 | 
					
						
							| 
									
										
										
										
											2012-11-13 04:03:18 +00:00
										 |  |  | #define IXGBE_FLAG_IN_NETPOLL                   (u32)(1 << 1)
 | 
					
						
							| 
									
										
										
										
											2013-09-21 01:40:49 +00:00
										 |  |  | #define IXGBEVF_FLAG_QUEUE_RESET_REQUESTED	(u32)(1 << 2)
 | 
					
						
							| 
									
										
										
										
											2012-05-11 08:32:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-17 18:30:01 -08:00
										 |  |  | 	struct msix_entry *msix_entries; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | 	/* OS defined structs */ | 
					
						
							|  |  |  | 	struct net_device *netdev; | 
					
						
							|  |  |  | 	struct pci_dev *pdev; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* structs defined in ixgbe_vf.h */ | 
					
						
							|  |  |  | 	struct ixgbe_hw hw; | 
					
						
							|  |  |  | 	u16 msg_enable; | 
					
						
							|  |  |  | 	/* Interrupt Throttle Rate */ | 
					
						
							|  |  |  | 	u32 eitr_param; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-17 18:30:01 -08:00
										 |  |  | 	struct ixgbevf_hw_stats stats; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | 	unsigned long state; | 
					
						
							|  |  |  | 	u64 tx_busy; | 
					
						
							|  |  |  | 	unsigned int tx_ring_count; | 
					
						
							|  |  |  | 	unsigned int rx_ring_count; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-21 06:24:25 +00:00
										 |  |  | #ifdef BP_EXTENDED_STATS
 | 
					
						
							|  |  |  | 	u64 bp_rx_yields; | 
					
						
							|  |  |  | 	u64 bp_rx_cleaned; | 
					
						
							|  |  |  | 	u64 bp_rx_missed; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	u64 bp_tx_yields; | 
					
						
							|  |  |  | 	u64 bp_tx_cleaned; | 
					
						
							|  |  |  | 	u64 bp_tx_missed; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-04 03:02:34 +00:00
										 |  |  | 	u8 __iomem *io_addr; /* Mainly for iounmap use */ | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | 	u32 link_speed; | 
					
						
							|  |  |  | 	bool link_up; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-11 08:33:06 +00:00
										 |  |  | 	spinlock_t mbx_lock; | 
					
						
							| 
									
										
										
										
											2014-01-17 18:30:01 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	struct work_struct watchdog_task; | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | enum ixbgevf_state_t { | 
					
						
							|  |  |  | 	__IXGBEVF_TESTING, | 
					
						
							|  |  |  | 	__IXGBEVF_RESETTING, | 
					
						
							| 
									
										
										
										
											2014-03-04 03:02:13 +00:00
										 |  |  | 	__IXGBEVF_DOWN, | 
					
						
							| 
									
										
										
										
											2014-03-12 00:38:45 +00:00
										 |  |  | 	__IXGBEVF_DISABLED, | 
					
						
							| 
									
										
										
										
											2014-03-04 03:02:13 +00:00
										 |  |  | 	__IXGBEVF_REMOVING, | 
					
						
							| 
									
										
										
										
											2014-03-12 00:38:51 +00:00
										 |  |  | 	__IXGBEVF_WORK_INIT, | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-01 05:12:38 +00:00
										 |  |  | struct ixgbevf_cb { | 
					
						
							|  |  |  | 	struct sk_buff *prev; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | #define IXGBE_CB(skb) ((struct ixgbevf_cb *)(skb)->cb)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | enum ixgbevf_boards { | 
					
						
							|  |  |  | 	board_82599_vf, | 
					
						
							| 
									
										
										
										
											2010-12-02 07:12:26 +00:00
										 |  |  | 	board_X540_vf, | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-18 22:13:34 +00:00
										 |  |  | extern const struct ixgbevf_info ixgbevf_82599_vf_info; | 
					
						
							|  |  |  | extern const struct ixgbevf_info ixgbevf_X540_vf_info; | 
					
						
							| 
									
										
										
										
											2012-01-18 22:13:33 +00:00
										 |  |  | extern const struct ixgbe_mbx_operations ixgbevf_mbx_ops; | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* needed by ethtool.c */ | 
					
						
							| 
									
										
										
										
											2012-01-18 22:13:34 +00:00
										 |  |  | extern const char ixgbevf_driver_name[]; | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | extern const char ixgbevf_driver_version[]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-23 11:37:59 -07:00
										 |  |  | void ixgbevf_up(struct ixgbevf_adapter *adapter); | 
					
						
							|  |  |  | void ixgbevf_down(struct ixgbevf_adapter *adapter); | 
					
						
							|  |  |  | void ixgbevf_reinit_locked(struct ixgbevf_adapter *adapter); | 
					
						
							|  |  |  | void ixgbevf_reset(struct ixgbevf_adapter *adapter); | 
					
						
							|  |  |  | void ixgbevf_set_ethtool_ops(struct net_device *netdev); | 
					
						
							| 
									
										
										
										
											2014-01-17 18:29:59 -08:00
										 |  |  | int ixgbevf_setup_rx_resources(struct ixgbevf_ring *); | 
					
						
							|  |  |  | int ixgbevf_setup_tx_resources(struct ixgbevf_ring *); | 
					
						
							|  |  |  | void ixgbevf_free_rx_resources(struct ixgbevf_ring *); | 
					
						
							|  |  |  | void ixgbevf_free_tx_resources(struct ixgbevf_ring *); | 
					
						
							| 
									
										
										
										
											2013-09-23 11:37:59 -07:00
										 |  |  | void ixgbevf_update_stats(struct ixgbevf_adapter *adapter); | 
					
						
							|  |  |  | int ethtool_ioctl(struct ifreq *ifr); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-22 06:19:18 +00:00
										 |  |  | extern void ixgbevf_write_eitr(struct ixgbevf_q_vector *q_vector); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-23 11:37:59 -07:00
										 |  |  | void ixgbe_napi_add_all(struct ixgbevf_adapter *adapter); | 
					
						
							|  |  |  | void ixgbe_napi_del_all(struct ixgbevf_adapter *adapter); | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef DEBUG
 | 
					
						
							| 
									
										
										
										
											2013-09-23 11:37:59 -07:00
										 |  |  | char *ixgbevf_get_hw_dev_name(struct ixgbe_hw *hw); | 
					
						
							| 
									
										
										
										
											2010-01-09 02:24:10 +00:00
										 |  |  | #define hw_dbg(hw, format, arg...) \
 | 
					
						
							|  |  |  | 	printk(KERN_DEBUG "%s: " format, ixgbevf_get_hw_dev_name(hw), ##arg) | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #define hw_dbg(hw, format, arg...) do {} while (0)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* _IXGBEVF_H_ */
 |