192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/*******************************************************************************
292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose  Intel 82599 Virtual Function driver
45c47a2b6211316ee9cd8740db453af7c5c01d0d6Greg Rose  Copyright(c) 1999 - 2012 Intel Corporation.
592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose  This program is free software; you can redistribute it and/or modify it
792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose  under the terms and conditions of the GNU General Public License,
892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose  version 2, as published by the Free Software Foundation.
992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
1092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose  This program is distributed in the hope it will be useful, but WITHOUT
1192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
1392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose  more details.
1492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
1592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose  You should have received a copy of the GNU General Public License along with
1692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose  this program; if not, write to the Free Software Foundation, Inc.,
1792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
1892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
1992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose  The full GNU General Public License is included in this distribution in
2092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose  the file called "COPYING".
2192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
2292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose  Contact Information:
2392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
2492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
2592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
2692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose*******************************************************************************/
2792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
2892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
2992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/******************************************************************************
3092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose Copyright (c)2006 - 2007 Myricom, Inc. for some LRO specific code
3192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose******************************************************************************/
32dbd9636e281895cd3a15682f0966fb545ddff9e8Jeff Kirsher
33dbd9636e281895cd3a15682f0966fb545ddff9e8Jeff Kirsher#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
34dbd9636e281895cd3a15682f0966fb545ddff9e8Jeff Kirsher
3592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#include <linux/types.h>
36dadcd65f52921456112183fde543fc214bb0a227Jiri Pirko#include <linux/bitops.h>
3792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#include <linux/module.h>
3892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#include <linux/pci.h>
3992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#include <linux/netdevice.h>
4092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#include <linux/vmalloc.h>
4192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#include <linux/string.h>
4292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#include <linux/in.h>
4392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#include <linux/ip.h>
4492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#include <linux/tcp.h>
4592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#include <linux/ipv6.h>
465a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h>
4792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#include <net/checksum.h>
4892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#include <net/ip6_checksum.h>
4992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#include <linux/ethtool.h>
5001789349ee52e4a3faf376f1485303d9723c4f1fJiri Pirko#include <linux/if.h>
5192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#include <linux/if_vlan.h>
5270c71606190e9115e5f8363bfcd164c582eb314aPaul Gortmaker#include <linux/prefetch.h>
5392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
5492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#include "ixgbevf.h"
5592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
563d8fe98f8d5cb303d907d8f94ea6dc1f9a1d8b7aStephen Hemmingerconst char ixgbevf_driver_name[] = "ixgbevf";
5792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic const char ixgbevf_driver_string[] =
58422e05d12af9c1063d57210074b4e6db36a0cf39Greg Rose	"Intel(R) 10 Gigabit PCI Express Virtual Function Network Driver";
5992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
60c1a7e1ebc17a9243d99ba0432d1138d74114dea7Greg Rose#define DRV_VERSION "2.2.0-k"
6192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseconst char ixgbevf_driver_version[] = DRV_VERSION;
6266c87bd50ddae681ebedfda0d75e6e73ecd29ce7Greg Rosestatic char ixgbevf_copyright[] =
635c47a2b6211316ee9cd8740db453af7c5c01d0d6Greg Rose	"Copyright (c) 2009 - 2012 Intel Corporation.";
6492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
6592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic const struct ixgbevf_info *ixgbevf_info_tbl[] = {
662316aa2aee254c126e688b53a3a105b82bc3f368Greg Rose	[board_82599_vf] = &ixgbevf_82599_vf_info,
672316aa2aee254c126e688b53a3a105b82bc3f368Greg Rose	[board_X540_vf]  = &ixgbevf_X540_vf_info,
6892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose};
6992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
7092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/* ixgbevf_pci_tbl - PCI Device ID Table
7192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
7292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * Wildcard entries (PCI_ANY_ID) should come last
7392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * Last entry must be all 0s
7492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
7592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * { Vendor ID, Device ID, SubVendor ID, SubDevice ID,
7692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *   Class, Class Mask, private data (not used) }
7792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose */
7892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic struct pci_device_id ixgbevf_pci_tbl[] = {
7992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_VF),
8092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	board_82599_vf},
812316aa2aee254c126e688b53a3a105b82bc3f368Greg Rose	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_X540_VF),
822316aa2aee254c126e688b53a3a105b82bc3f368Greg Rose	board_X540_vf},
8392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
8492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* required last entry */
8592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	{0, }
8692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose};
8792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg RoseMODULE_DEVICE_TABLE(pci, ixgbevf_pci_tbl);
8892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
8992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg RoseMODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>");
9092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg RoseMODULE_DESCRIPTION("Intel(R) 82599 Virtual Function Driver");
9192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg RoseMODULE_LICENSE("GPL");
9292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg RoseMODULE_VERSION(DRV_VERSION);
9392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
94b3f4d5990bfc8b060e5010c1464789fca1f4c5b4stephen hemminger#define DEFAULT_MSG_ENABLE (NETIF_MSG_DRV|NETIF_MSG_PROBE|NETIF_MSG_LINK)
95b3f4d5990bfc8b060e5010c1464789fca1f4c5b4stephen hemmingerstatic int debug = -1;
96b3f4d5990bfc8b060e5010c1464789fca1f4c5b4stephen hemmingermodule_param(debug, int, 0);
97b3f4d5990bfc8b060e5010c1464789fca1f4c5b4stephen hemmingerMODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
9892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
9992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/* forward decls */
10092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_set_itr_msix(struct ixgbevf_q_vector *q_vector);
10192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_write_eitr(struct ixgbevf_adapter *adapter, int v_idx,
10292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			       u32 itr_reg);
10392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
10492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic inline void ixgbevf_release_rx_desc(struct ixgbe_hw *hw,
10592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					   struct ixgbevf_ring *rx_ring,
10692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					   u32 val)
10792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
10892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/*
10992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * Force memory writes to complete before letting h/w
11092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * know there are new descriptors to fetch.  (Only
11192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * applicable for weak-ordered memory model archs,
11292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * such as IA-64).
11392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 */
11492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	wmb();
11592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	IXGBE_WRITE_REG(hw, IXGBE_VFRDT(rx_ring->reg_idx), val);
11692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
11792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
11892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/*
11965d676c8c13c39301ebf813c7af00a13f05b2035Greg Rose * ixgbevf_set_ivar - set IVAR registers - maps interrupt causes to vectors
12092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: pointer to adapter struct
12192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @direction: 0 for Rx, 1 for Tx, -1 for other causes
12292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @queue: queue to map the corresponding interrupt to
12392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @msix_vector: the vector to map to the corresponding queue
12492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
12592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose */
12692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_set_ivar(struct ixgbevf_adapter *adapter, s8 direction,
12792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			     u8 queue, u8 msix_vector)
12892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
12992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u32 ivar, index;
13092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
13192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (direction == -1) {
13292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* other causes */
13392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		msix_vector |= IXGBE_IVAR_ALLOC_VAL;
13492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ivar = IXGBE_READ_REG(hw, IXGBE_VTIVAR_MISC);
13592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ivar &= ~0xFF;
13692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ivar |= msix_vector;
13792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		IXGBE_WRITE_REG(hw, IXGBE_VTIVAR_MISC, ivar);
13892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	} else {
13992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* tx or rx causes */
14092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		msix_vector |= IXGBE_IVAR_ALLOC_VAL;
14192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		index = ((16 * (queue & 1)) + (8 * direction));
14292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ivar = IXGBE_READ_REG(hw, IXGBE_VTIVAR(queue >> 1));
14392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ivar &= ~(0xFF << index);
14492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ivar |= (msix_vector << index);
14592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		IXGBE_WRITE_REG(hw, IXGBE_VTIVAR(queue >> 1), ivar);
14692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
14792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
14892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
14992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_unmap_and_free_tx_resource(struct ixgbevf_adapter *adapter,
15092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					       struct ixgbevf_tx_buffer
15192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					       *tx_buffer_info)
15292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
15392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (tx_buffer_info->dma) {
15492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (tx_buffer_info->mapped_as_page)
1552a1f8794161d9d5d46881160279df62767197526Nick Nunley			dma_unmap_page(&adapter->pdev->dev,
15692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				       tx_buffer_info->dma,
15792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				       tx_buffer_info->length,
1582a1f8794161d9d5d46881160279df62767197526Nick Nunley				       DMA_TO_DEVICE);
15992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		else
1602a1f8794161d9d5d46881160279df62767197526Nick Nunley			dma_unmap_single(&adapter->pdev->dev,
16192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					 tx_buffer_info->dma,
16292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					 tx_buffer_info->length,
1632a1f8794161d9d5d46881160279df62767197526Nick Nunley					 DMA_TO_DEVICE);
16492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_buffer_info->dma = 0;
16592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
16692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (tx_buffer_info->skb) {
16792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		dev_kfree_skb_any(tx_buffer_info->skb);
16892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_buffer_info->skb = NULL;
16992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
17092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_buffer_info->time_stamp = 0;
17192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* tx_buffer_info must be completely set up in the transmit path */
17292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
17392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
17492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#define IXGBE_MAX_TXD_PWR	14
17592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#define IXGBE_MAX_DATA_PER_TXD	(1 << IXGBE_MAX_TXD_PWR)
17692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
17792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/* Tx Descriptors needed, worst case */
17892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#define TXD_USE_COUNT(S) (((S) >> IXGBE_MAX_TXD_PWR) + \
17992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			 (((S) & (IXGBE_MAX_DATA_PER_TXD - 1)) ? 1 : 0))
18092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#ifdef MAX_SKB_FRAGS
18192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#define DESC_NEEDED (TXD_USE_COUNT(IXGBE_MAX_DATA_PER_TXD) /* skb->data */ + \
18292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	MAX_SKB_FRAGS * TXD_USE_COUNT(PAGE_SIZE) + 1)      /* for context */
18392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#else
18492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#define DESC_NEEDED TXD_USE_COUNT(IXGBE_MAX_DATA_PER_TXD)
18592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#endif
18692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
18792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_tx_timeout(struct net_device *netdev);
18892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
18992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
19092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_clean_tx_irq - Reclaim resources after transmit completes
19192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
19292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @tx_ring: tx ring to clean
19392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
19492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic bool ixgbevf_clean_tx_irq(struct ixgbevf_adapter *adapter,
19592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				 struct ixgbevf_ring *tx_ring)
19692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
19792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct net_device *netdev = adapter->netdev;
19892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
19992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	union ixgbe_adv_tx_desc *tx_desc, *eop_desc;
20092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_tx_buffer *tx_buffer_info;
20192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	unsigned int i, eop, count = 0;
20292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	unsigned int total_bytes = 0, total_packets = 0;
20392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
20492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	i = tx_ring->next_to_clean;
20592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	eop = tx_ring->tx_buffer_info[i].next_to_watch;
20692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	eop_desc = IXGBE_TX_DESC_ADV(*tx_ring, eop);
20792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
20892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	while ((eop_desc->wb.status & cpu_to_le32(IXGBE_TXD_STAT_DD)) &&
20992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	       (count < tx_ring->work_limit)) {
21092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		bool cleaned = false;
2112d0bb1c1f4524befe9f0fcf0d0cd3081a451223fJeff Kirsher		rmb(); /* read buffer_info after eop_desc */
21298b9e48fca11c8aa54b25c02d3329392b52db8abGreg Rose		/* eop could change between read and DD-check */
21398b9e48fca11c8aa54b25c02d3329392b52db8abGreg Rose		if (unlikely(eop != tx_ring->tx_buffer_info[i].next_to_watch))
21498b9e48fca11c8aa54b25c02d3329392b52db8abGreg Rose			goto cont_loop;
21592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		for ( ; !cleaned; count++) {
21692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			struct sk_buff *skb;
21792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			tx_desc = IXGBE_TX_DESC_ADV(*tx_ring, i);
21892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			tx_buffer_info = &tx_ring->tx_buffer_info[i];
21992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			cleaned = (i == eop);
22092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			skb = tx_buffer_info->skb;
22192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
22292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			if (cleaned && skb) {
22392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				unsigned int segs, bytecount;
22492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
22592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				/* gso_segs is currently only valid for tcp */
22692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				segs = skb_shinfo(skb)->gso_segs ?: 1;
22792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				/* multiply data chunks by size of headers */
22892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				bytecount = ((segs - 1) * skb_headlen(skb)) +
22992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					    skb->len;
23092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				total_packets += segs;
23192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				total_bytes += bytecount;
23292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			}
23392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
23492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			ixgbevf_unmap_and_free_tx_resource(adapter,
23592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose							   tx_buffer_info);
23692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
23792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			tx_desc->wb.status = 0;
23892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
23992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			i++;
24092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			if (i == tx_ring->count)
24192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				i = 0;
24292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
24392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
24498b9e48fca11c8aa54b25c02d3329392b52db8abGreg Rosecont_loop:
24592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		eop = tx_ring->tx_buffer_info[i].next_to_watch;
24692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		eop_desc = IXGBE_TX_DESC_ADV(*tx_ring, eop);
24792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
24892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
24992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_ring->next_to_clean = i;
25092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
25192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#define TX_WAKE_THRESHOLD (DESC_NEEDED * 2)
25292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (unlikely(count && netif_carrier_ok(netdev) &&
25392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		     (IXGBE_DESC_UNUSED(tx_ring) >= TX_WAKE_THRESHOLD))) {
25492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* Make sure that anybody stopping the queue after this
25592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		 * sees the new next_to_clean.
25692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		 */
25792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		smp_mb();
25892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#ifdef HAVE_TX_MQ
25992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (__netif_subqueue_stopped(netdev, tx_ring->queue_index) &&
26092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		    !test_bit(__IXGBEVF_DOWN, &adapter->state)) {
26192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			netif_wake_subqueue(netdev, tx_ring->queue_index);
26292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			++adapter->restart_queue;
26392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
26492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#else
26592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (netif_queue_stopped(netdev) &&
26692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		    !test_bit(__IXGBEVF_DOWN, &adapter->state)) {
26792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			netif_wake_queue(netdev);
26892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			++adapter->restart_queue;
26992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
27092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#endif
27192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
27292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
27392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* re-arm the interrupt */
27492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if ((count >= tx_ring->work_limit) &&
27592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	    (!test_bit(__IXGBEVF_DOWN, &adapter->state))) {
27692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		IXGBE_WRITE_REG(hw, IXGBE_VTEICS, tx_ring->v_idx);
27792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
27892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
2794197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet	u64_stats_update_begin(&tx_ring->syncp);
28092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_ring->total_bytes += total_bytes;
28192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_ring->total_packets += total_packets;
2824197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet	u64_stats_update_end(&tx_ring->syncp);
28392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
284807540baae406c84dcb9c1c8ef07a56d2d2ae84aEric Dumazet	return count < tx_ring->work_limit;
28592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
28692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
28792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
28892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_receive_skb - Send a completed packet up the stack
28992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @q_vector: structure containing interrupt and ring information
29092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @skb: packet to send up
29192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @status: hardware indication of status of receive
29292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @rx_ring: rx descriptor ring (for a specific queue) to setup
29392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @rx_desc: rx descriptor
29492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
29592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_receive_skb(struct ixgbevf_q_vector *q_vector,
29692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				struct sk_buff *skb, u8 status,
29792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				struct ixgbevf_ring *ring,
29892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				union ixgbe_adv_rx_desc *rx_desc)
29992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
30092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = q_vector->adapter;
30192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	bool is_vlan = (status & IXGBE_RXD_STAT_VP);
302dd1ed3b7bfed15f6162f63840941e9cf4f3611a1Greg Rose	u16 tag = le16_to_cpu(rx_desc->wb.upper.vlan);
30392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
304dd1ed3b7bfed15f6162f63840941e9cf4f3611a1Greg Rose	if (is_vlan && test_bit(tag, adapter->active_vlans))
305dadcd65f52921456112183fde543fc214bb0a227Jiri Pirko		__vlan_hwaccel_put_tag(skb, tag);
306dadcd65f52921456112183fde543fc214bb0a227Jiri Pirko
307dadcd65f52921456112183fde543fc214bb0a227Jiri Pirko	if (!(adapter->flags & IXGBE_FLAG_IN_NETPOLL))
30892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			napi_gro_receive(&q_vector->napi, skb);
309dadcd65f52921456112183fde543fc214bb0a227Jiri Pirko	else
310c82a538e4ff101faae030273243d3b0a0a9e335dGreg Rose			netif_rx(skb);
31192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
31292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
31392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
31492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_rx_checksum - indicate in skb if hw indicated a good cksum
31592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: address of board private structure
31692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @status_err: hardware indication of status of receive
31792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @skb: skb currently being received and modified
31892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
31992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic inline void ixgbevf_rx_checksum(struct ixgbevf_adapter *adapter,
32092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				       u32 status_err, struct sk_buff *skb)
32192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
322bc8acf2c8c3e43fcc192762a9f964b3e9a17748bEric Dumazet	skb_checksum_none_assert(skb);
32392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
32492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* Rx csum disabled */
32592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (!(adapter->flags & IXGBE_FLAG_RX_CSUM_ENABLED))
32692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		return;
32792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
32892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* if IP and error */
32992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if ((status_err & IXGBE_RXD_STAT_IPCS) &&
33092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	    (status_err & IXGBE_RXDADV_ERR_IPE)) {
33192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->hw_csum_rx_error++;
33292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		return;
33392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
33492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
33592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (!(status_err & IXGBE_RXD_STAT_L4CS))
33692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		return;
33792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
33892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (status_err & IXGBE_RXDADV_ERR_TCPE) {
33992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->hw_csum_rx_error++;
34092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		return;
34192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
34292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
34392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* It must be a TCP or UDP packet with a valid checksum */
34492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	skb->ip_summed = CHECKSUM_UNNECESSARY;
34592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->hw_csum_rx_good++;
34692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
34792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
34892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
34992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_alloc_rx_buffers - Replace used receive buffers; packet split
35092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: address of board private structure
35192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
35292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_alloc_rx_buffers(struct ixgbevf_adapter *adapter,
35392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				     struct ixgbevf_ring *rx_ring,
35492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				     int cleaned_count)
35592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
35692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct pci_dev *pdev = adapter->pdev;
35792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	union ixgbe_adv_rx_desc *rx_desc;
35892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_rx_buffer *bi;
35992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct sk_buff *skb;
36092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	unsigned int i;
36192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	unsigned int bufsz = rx_ring->rx_buf_len + NET_IP_ALIGN;
36292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
36392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	i = rx_ring->next_to_use;
36492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	bi = &rx_ring->rx_buffer_info[i];
36592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
36692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	while (cleaned_count--) {
36792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		rx_desc = IXGBE_RX_DESC_ADV(*rx_ring, i);
36892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
36992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (!bi->page_dma &&
37092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		    (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED)) {
37192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			if (!bi->page) {
3721f2149c1df50c8c712950872675f46e6e44629f0Eric Dumazet				bi->page = alloc_page(GFP_ATOMIC | __GFP_COLD);
37392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				if (!bi->page) {
37492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					adapter->alloc_rx_page_failed++;
37592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					goto no_buffers;
37692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				}
37792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				bi->page_offset = 0;
37892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			} else {
37992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				/* use a half page if we're re-using */
38092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				bi->page_offset ^= (PAGE_SIZE / 2);
38192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			}
38292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
3832a1f8794161d9d5d46881160279df62767197526Nick Nunley			bi->page_dma = dma_map_page(&pdev->dev, bi->page,
38492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose						    bi->page_offset,
38592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose						    (PAGE_SIZE / 2),
3862a1f8794161d9d5d46881160279df62767197526Nick Nunley						    DMA_FROM_DEVICE);
38792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
38892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
38992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		skb = bi->skb;
39092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (!skb) {
39192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			skb = netdev_alloc_skb(adapter->netdev,
39292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose							       bufsz);
39392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
39492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			if (!skb) {
39592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				adapter->alloc_rx_buff_failed++;
39692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				goto no_buffers;
39792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			}
39892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
39992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			/*
40092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			 * Make buffer alignment 2 beyond a 16 byte boundary
40192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			 * this will result in a 16 byte aligned IP header after
40292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			 * the 14 byte MAC header is removed
40392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			 */
40492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			skb_reserve(skb, NET_IP_ALIGN);
40592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
40692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			bi->skb = skb;
40792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
40892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (!bi->dma) {
4092a1f8794161d9d5d46881160279df62767197526Nick Nunley			bi->dma = dma_map_single(&pdev->dev, skb->data,
41092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose						 rx_ring->rx_buf_len,
4112a1f8794161d9d5d46881160279df62767197526Nick Nunley						 DMA_FROM_DEVICE);
41292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
41392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* Refresh the desc even if buffer_addrs didn't change because
41492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		 * each write-back erases this info. */
41592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) {
41692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			rx_desc->read.pkt_addr = cpu_to_le64(bi->page_dma);
41792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			rx_desc->read.hdr_addr = cpu_to_le64(bi->dma);
41892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		} else {
41992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			rx_desc->read.pkt_addr = cpu_to_le64(bi->dma);
42092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
42192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
42292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		i++;
42392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (i == rx_ring->count)
42492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			i = 0;
42592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		bi = &rx_ring->rx_buffer_info[i];
42692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
42792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
42892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseno_buffers:
42992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (rx_ring->next_to_use != i) {
43092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		rx_ring->next_to_use = i;
43192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (i-- == 0)
43292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			i = (rx_ring->count - 1);
43392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
43492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_release_rx_desc(&adapter->hw, rx_ring, i);
43592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
43692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
43792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
43892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic inline void ixgbevf_irq_enable_queues(struct ixgbevf_adapter *adapter,
43992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					     u64 qmask)
44092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
44192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u32 mask;
44292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
44392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
44492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	mask = (qmask & 0xFFFFFFFF);
44592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, mask);
44692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
44792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
44892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic inline u16 ixgbevf_get_hdr_info(union ixgbe_adv_rx_desc *rx_desc)
44992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
45092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return rx_desc->wb.lower.lo_dword.hs_rss.hdr_info;
45192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
45292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
45392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic inline u16 ixgbevf_get_pkt_info(union ixgbe_adv_rx_desc *rx_desc)
45492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
45592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return rx_desc->wb.lower.lo_dword.hs_rss.pkt_info;
45692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
45792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
45892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic bool ixgbevf_clean_rx_irq(struct ixgbevf_q_vector *q_vector,
45992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				 struct ixgbevf_ring *rx_ring,
46092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				 int *work_done, int work_to_do)
46192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
46292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = q_vector->adapter;
46392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct pci_dev *pdev = adapter->pdev;
46492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	union ixgbe_adv_rx_desc *rx_desc, *next_rxd;
46592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_rx_buffer *rx_buffer_info, *next_buffer;
46692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct sk_buff *skb;
46792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	unsigned int i;
46892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u32 len, staterr;
46992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u16 hdr_info;
47092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	bool cleaned = false;
47192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int cleaned_count = 0;
47292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	unsigned int total_rx_bytes = 0, total_rx_packets = 0;
47392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
47492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	i = rx_ring->next_to_clean;
47592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	rx_desc = IXGBE_RX_DESC_ADV(*rx_ring, i);
47692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	staterr = le32_to_cpu(rx_desc->wb.upper.status_error);
47792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	rx_buffer_info = &rx_ring->rx_buffer_info[i];
47892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
47992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	while (staterr & IXGBE_RXD_STAT_DD) {
48092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		u32 upper_len = 0;
48192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (*work_done >= work_to_do)
48292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			break;
48392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		(*work_done)++;
48492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
4852d0bb1c1f4524befe9f0fcf0d0cd3081a451223fJeff Kirsher		rmb(); /* read descriptor and rx_buffer_info after status DD */
48692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) {
48792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			hdr_info = le16_to_cpu(ixgbevf_get_hdr_info(rx_desc));
48892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			len = (hdr_info & IXGBE_RXDADV_HDRBUFLEN_MASK) >>
48992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			       IXGBE_RXDADV_HDRBUFLEN_SHIFT;
49092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			if (hdr_info & IXGBE_RXDADV_SPH)
49192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				adapter->rx_hdr_split++;
49292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			if (len > IXGBEVF_RX_HDR_SIZE)
49392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				len = IXGBEVF_RX_HDR_SIZE;
49492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			upper_len = le16_to_cpu(rx_desc->wb.upper.length);
49592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		} else {
49692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			len = le16_to_cpu(rx_desc->wb.upper.length);
49792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
49892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		cleaned = true;
49992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		skb = rx_buffer_info->skb;
50092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		prefetch(skb->data - NET_IP_ALIGN);
50192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		rx_buffer_info->skb = NULL;
50292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
50392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (rx_buffer_info->dma) {
5042a1f8794161d9d5d46881160279df62767197526Nick Nunley			dma_unmap_single(&pdev->dev, rx_buffer_info->dma,
50592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					 rx_ring->rx_buf_len,
5062a1f8794161d9d5d46881160279df62767197526Nick Nunley					 DMA_FROM_DEVICE);
50792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			rx_buffer_info->dma = 0;
50892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			skb_put(skb, len);
50992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
51092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
51192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (upper_len) {
5122a1f8794161d9d5d46881160279df62767197526Nick Nunley			dma_unmap_page(&pdev->dev, rx_buffer_info->page_dma,
5132a1f8794161d9d5d46881160279df62767197526Nick Nunley				       PAGE_SIZE / 2, DMA_FROM_DEVICE);
51492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			rx_buffer_info->page_dma = 0;
51592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags,
51692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					   rx_buffer_info->page,
51792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					   rx_buffer_info->page_offset,
51892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					   upper_len);
51992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
52092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			if ((rx_ring->rx_buf_len > (PAGE_SIZE / 2)) ||
52192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			    (page_count(rx_buffer_info->page) != 1))
52292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				rx_buffer_info->page = NULL;
52392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			else
52492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				get_page(rx_buffer_info->page);
52592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
52692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			skb->len += upper_len;
52792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			skb->data_len += upper_len;
52892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			skb->truesize += upper_len;
52992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
53092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
53192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		i++;
53292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (i == rx_ring->count)
53392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			i = 0;
53492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
53592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		next_rxd = IXGBE_RX_DESC_ADV(*rx_ring, i);
53692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		prefetch(next_rxd);
53792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		cleaned_count++;
53892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
53992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		next_buffer = &rx_ring->rx_buffer_info[i];
54092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
54192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (!(staterr & IXGBE_RXD_STAT_EOP)) {
54292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) {
54392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				rx_buffer_info->skb = next_buffer->skb;
54492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				rx_buffer_info->dma = next_buffer->dma;
54592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				next_buffer->skb = skb;
54692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				next_buffer->dma = 0;
54792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			} else {
54892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				skb->next = next_buffer->skb;
54992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				skb->next->prev = skb;
55092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			}
55192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			adapter->non_eop_descs++;
55292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			goto next_desc;
55392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
55492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
55592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* ERR_MASK will only have valid bits if EOP set */
55692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (unlikely(staterr & IXGBE_RXDADV_ERR_FRAME_ERR_MASK)) {
55792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			dev_kfree_skb_irq(skb);
55892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			goto next_desc;
55992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
56092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
56192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_rx_checksum(adapter, staterr, skb);
56292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
56392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* probably a little skewed due to removing CRC */
56492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		total_rx_bytes += skb->len;
56592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		total_rx_packets++;
56692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
56792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/*
56892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		 * Work around issue of some types of VM to VM loop back
56992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		 * packets not getting split correctly
57092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		 */
57192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (staterr & IXGBE_RXD_STAT_LB) {
572e743d31312d00932391b123dfac3324d2b9e8c81Eric Dumazet			u32 header_fixup_len = skb_headlen(skb);
57392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			if (header_fixup_len < 14)
57492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				skb_push(skb, header_fixup_len);
57592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
57692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		skb->protocol = eth_type_trans(skb, adapter->netdev);
57792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
57892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_receive_skb(q_vector, skb, staterr, rx_ring, rx_desc);
57992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
58092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosenext_desc:
58192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		rx_desc->wb.upper.status_error = 0;
58292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
58392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* return some buffers to hardware, one at a time is too slow */
58492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (cleaned_count >= IXGBEVF_RX_BUFFER_WRITE) {
58592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			ixgbevf_alloc_rx_buffers(adapter, rx_ring,
58692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose						 cleaned_count);
58792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			cleaned_count = 0;
58892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
58992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
59092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* use prefetched values */
59192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		rx_desc = next_rxd;
59292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		rx_buffer_info = &rx_ring->rx_buffer_info[i];
59392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
59492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		staterr = le32_to_cpu(rx_desc->wb.upper.status_error);
59592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
59692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
59792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	rx_ring->next_to_clean = i;
59892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	cleaned_count = IXGBE_DESC_UNUSED(rx_ring);
59992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
60092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (cleaned_count)
60192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_alloc_rx_buffers(adapter, rx_ring, cleaned_count);
60292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
6034197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet	u64_stats_update_begin(&rx_ring->syncp);
60492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	rx_ring->total_packets += total_rx_packets;
60592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	rx_ring->total_bytes += total_rx_bytes;
6064197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet	u64_stats_update_end(&rx_ring->syncp);
60792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
60892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return cleaned;
60992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
61092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
61192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
61292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_clean_rxonly - msix (aka one shot) rx clean routine
61392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @napi: napi struct with our devices info in it
61492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @budget: amount of work driver is allowed to do this pass, in packets
61592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
61692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * This function is optimized for cleaning one queue only on a single
61792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * q_vector!!!
61892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
61992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int ixgbevf_clean_rxonly(struct napi_struct *napi, int budget)
62092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
62192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_q_vector *q_vector =
62292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		container_of(napi, struct ixgbevf_q_vector, napi);
62392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = q_vector->adapter;
62492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_ring *rx_ring = NULL;
62592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int work_done = 0;
62692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	long r_idx;
62792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
62892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	r_idx = find_first_bit(q_vector->rxr_idx, adapter->num_rx_queues);
62992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	rx_ring = &(adapter->rx_ring[r_idx]);
63092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
63192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_clean_rx_irq(q_vector, rx_ring, &work_done, budget);
63292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
63392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* If all Rx work done, exit the polling mode */
63492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (work_done < budget) {
63592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		napi_complete(napi);
63692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (adapter->itr_setting & 1)
63792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			ixgbevf_set_itr_msix(q_vector);
63892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (!test_bit(__IXGBEVF_DOWN, &adapter->state))
63992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			ixgbevf_irq_enable_queues(adapter, rx_ring->v_idx);
64092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
64192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
64292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return work_done;
64392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
64492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
64592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
64692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_clean_rxonly_many - msix (aka one shot) rx clean routine
64792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @napi: napi struct with our devices info in it
64892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @budget: amount of work driver is allowed to do this pass, in packets
64992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
65092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * This function will clean more than one rx queue associated with a
65192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * q_vector.
65292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
65392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int ixgbevf_clean_rxonly_many(struct napi_struct *napi, int budget)
65492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
65592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_q_vector *q_vector =
65692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		container_of(napi, struct ixgbevf_q_vector, napi);
65792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = q_vector->adapter;
65892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_ring *rx_ring = NULL;
65992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int work_done = 0, i;
66092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	long r_idx;
66192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u64 enable_mask = 0;
66292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
66392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* attempt to distribute budget to each queue fairly, but don't allow
66492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * the budget to go below 1 because we'll exit polling */
66592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	budget /= (q_vector->rxr_count ?: 1);
66692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	budget = max(budget, 1);
66792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	r_idx = find_first_bit(q_vector->rxr_idx, adapter->num_rx_queues);
66892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < q_vector->rxr_count; i++) {
66992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		rx_ring = &(adapter->rx_ring[r_idx]);
67092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_clean_rx_irq(q_vector, rx_ring, &work_done, budget);
67192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		enable_mask |= rx_ring->v_idx;
67292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		r_idx = find_next_bit(q_vector->rxr_idx, adapter->num_rx_queues,
67392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				      r_idx + 1);
67492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
67592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
67692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#ifndef HAVE_NETDEV_NAPI_LIST
67792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (!netif_running(adapter->netdev))
67892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		work_done = 0;
67992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
68092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#endif
68192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	r_idx = find_first_bit(q_vector->rxr_idx, adapter->num_rx_queues);
68292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	rx_ring = &(adapter->rx_ring[r_idx]);
68392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
68492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* If all Rx work done, exit the polling mode */
68592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (work_done < budget) {
68692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		napi_complete(napi);
68792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (adapter->itr_setting & 1)
68892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			ixgbevf_set_itr_msix(q_vector);
68992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (!test_bit(__IXGBEVF_DOWN, &adapter->state))
69092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			ixgbevf_irq_enable_queues(adapter, enable_mask);
69192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
69292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
69392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return work_done;
69492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
69592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
69692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
69792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
69892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_configure_msix - Configure MSI-X hardware
69992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
70092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
70192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_configure_msix sets up the hardware to properly generate MSI-X
70292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * interrupts.
70392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
70492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_configure_msix(struct ixgbevf_adapter *adapter)
70592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
70692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_q_vector *q_vector;
70792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
70892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int i, j, q_vectors, v_idx, r_idx;
70992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u32 mask;
71092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
71192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
71292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
71392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/*
71492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * Populate the IVAR table and set the ITR values to the
71592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * corresponding register.
71692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 */
71792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (v_idx = 0; v_idx < q_vectors; v_idx++) {
71892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		q_vector = adapter->q_vector[v_idx];
719984b3f5746ed2cde3d184651dabf26980f2b66e5Akinobu Mita		/* XXX for_each_set_bit(...) */
72092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		r_idx = find_first_bit(q_vector->rxr_idx,
72192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				       adapter->num_rx_queues);
72292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
72392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		for (i = 0; i < q_vector->rxr_count; i++) {
72492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			j = adapter->rx_ring[r_idx].reg_idx;
72592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			ixgbevf_set_ivar(adapter, 0, j, v_idx);
72692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			r_idx = find_next_bit(q_vector->rxr_idx,
72792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					      adapter->num_rx_queues,
72892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					      r_idx + 1);
72992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
73092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		r_idx = find_first_bit(q_vector->txr_idx,
73192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				       adapter->num_tx_queues);
73292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
73392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		for (i = 0; i < q_vector->txr_count; i++) {
73492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			j = adapter->tx_ring[r_idx].reg_idx;
73592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			ixgbevf_set_ivar(adapter, 1, j, v_idx);
73692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			r_idx = find_next_bit(q_vector->txr_idx,
73792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					      adapter->num_tx_queues,
73892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					      r_idx + 1);
73992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
74092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
74192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* if this is a tx only vector halve the interrupt rate */
74292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (q_vector->txr_count && !q_vector->rxr_count)
74392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			q_vector->eitr = (adapter->eitr_param >> 1);
74492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		else if (q_vector->rxr_count)
74592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			/* rx only */
74692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			q_vector->eitr = adapter->eitr_param;
74792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
74892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_write_eitr(adapter, v_idx, q_vector->eitr);
74992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
75092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
75192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_set_ivar(adapter, -1, 1, v_idx);
75292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
75392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* set up to autoclear timer, and the vectors */
75492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	mask = IXGBE_EIMS_ENABLE_MASK;
75592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	mask &= ~IXGBE_EIMS_OTHER;
75692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	IXGBE_WRITE_REG(hw, IXGBE_VTEIAC, mask);
75792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
75892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
75992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseenum latency_range {
76092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	lowest_latency = 0,
76192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	low_latency = 1,
76292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	bulk_latency = 2,
76392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	latency_invalid = 255
76492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose};
76592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
76692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
76792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_update_itr - update the dynamic ITR value based on statistics
76892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: pointer to adapter
76992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @eitr: eitr setting (ints per sec) to give last timeslice
77092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @itr_setting: current throttle rate in ints/second
77192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @packets: the number of packets during this measurement interval
77292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @bytes: the number of bytes during this measurement interval
77392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
77492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *      Stores a new ITR value based on packets and byte
77592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *      counts during the last interrupt.  The advantage of per interrupt
77692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *      computation is faster updates and more accurate ITR for the current
77792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *      traffic pattern.  Constants in this function were computed
77892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *      based on theoretical maximum wire speed and thresholds were set based
77992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *      on testing data as well as attempting to minimize response time
78092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *      while increasing bulk throughput.
78192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
78292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic u8 ixgbevf_update_itr(struct ixgbevf_adapter *adapter,
78392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			     u32 eitr, u8 itr_setting,
78492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			     int packets, int bytes)
78592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
78692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	unsigned int retval = itr_setting;
78792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u32 timepassed_us;
78892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u64 bytes_perint;
78992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
79092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (packets == 0)
79192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto update_itr_done;
79292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
79392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
79492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* simple throttlerate management
79592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 *    0-20MB/s lowest (100000 ints/s)
79692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 *   20-100MB/s low   (20000 ints/s)
79792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 *  100-1249MB/s bulk (8000 ints/s)
79892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 */
79992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* what was last interrupt timeslice? */
80092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	timepassed_us = 1000000/eitr;
80192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	bytes_perint = bytes / timepassed_us; /* bytes/usec */
80292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
80392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	switch (itr_setting) {
80492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	case lowest_latency:
80592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (bytes_perint > adapter->eitr_low)
80692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			retval = low_latency;
80792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		break;
80892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	case low_latency:
80992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (bytes_perint > adapter->eitr_high)
81092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			retval = bulk_latency;
81192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		else if (bytes_perint <= adapter->eitr_low)
81292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			retval = lowest_latency;
81392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		break;
81492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	case bulk_latency:
81592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (bytes_perint <= adapter->eitr_high)
81692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			retval = low_latency;
81792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		break;
81892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
81992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
82092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseupdate_itr_done:
82192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return retval;
82292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
82392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
82492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
82592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_write_eitr - write VTEITR register in hardware specific way
82692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: pointer to adapter struct
82792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @v_idx: vector index into q_vector array
82892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @itr_reg: new value to be written in *register* format, not ints/s
82992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
83092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * This function is made to be called by ethtool and by the driver
83192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * when it needs to update VTEITR registers at runtime.  Hardware
83292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * specific quirks/differences are taken care of here.
83392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose */
83492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_write_eitr(struct ixgbevf_adapter *adapter, int v_idx,
83592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			       u32 itr_reg)
83692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
83792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
83892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
83992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	itr_reg = EITR_INTS_PER_SEC_TO_REG(itr_reg);
84092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
84192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/*
84292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * set the WDIS bit to not clear the timer bits and cause an
84392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * immediate assertion of the interrupt
84492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 */
84592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	itr_reg |= IXGBE_EITR_CNT_WDIS;
84692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
84792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	IXGBE_WRITE_REG(hw, IXGBE_VTEITR(v_idx), itr_reg);
84892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
84992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
85092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_set_itr_msix(struct ixgbevf_q_vector *q_vector)
85192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
85292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = q_vector->adapter;
85392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u32 new_itr;
85492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u8 current_itr, ret_itr;
85592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int i, r_idx, v_idx = q_vector->v_idx;
85692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_ring *rx_ring, *tx_ring;
85792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
85892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	r_idx = find_first_bit(q_vector->txr_idx, adapter->num_tx_queues);
85992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < q_vector->txr_count; i++) {
86092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_ring = &(adapter->tx_ring[r_idx]);
86192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ret_itr = ixgbevf_update_itr(adapter, q_vector->eitr,
86292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					     q_vector->tx_itr,
86392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					     tx_ring->total_packets,
86492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					     tx_ring->total_bytes);
86592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* if the result for this queue would decrease interrupt
86692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		 * rate for this vector then use that result */
86792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		q_vector->tx_itr = ((q_vector->tx_itr > ret_itr) ?
86892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				    q_vector->tx_itr - 1 : ret_itr);
86992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		r_idx = find_next_bit(q_vector->txr_idx, adapter->num_tx_queues,
87092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				      r_idx + 1);
87192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
87292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
87392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	r_idx = find_first_bit(q_vector->rxr_idx, adapter->num_rx_queues);
87492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < q_vector->rxr_count; i++) {
87592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		rx_ring = &(adapter->rx_ring[r_idx]);
87692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ret_itr = ixgbevf_update_itr(adapter, q_vector->eitr,
87792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					     q_vector->rx_itr,
87892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					     rx_ring->total_packets,
87992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					     rx_ring->total_bytes);
88092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* if the result for this queue would decrease interrupt
88192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		 * rate for this vector then use that result */
88292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		q_vector->rx_itr = ((q_vector->rx_itr > ret_itr) ?
88392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				    q_vector->rx_itr - 1 : ret_itr);
88492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		r_idx = find_next_bit(q_vector->rxr_idx, adapter->num_rx_queues,
88592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				      r_idx + 1);
88692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
88792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
88892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	current_itr = max(q_vector->rx_itr, q_vector->tx_itr);
88992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
89092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	switch (current_itr) {
89192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* counts and packets in update_itr are dependent on these numbers */
89292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	case lowest_latency:
89392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		new_itr = 100000;
89492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		break;
89592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	case low_latency:
89692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		new_itr = 20000; /* aka hwitr = ~200 */
89792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		break;
89892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	case bulk_latency:
89992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	default:
90092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		new_itr = 8000;
90192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		break;
90292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
90392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
90492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (new_itr != q_vector->eitr) {
90592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		u32 itr_reg;
90692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
90792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* save the algorithm value here, not the smoothed one */
90892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		q_vector->eitr = new_itr;
90992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* do an exponential smoothing */
91092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		new_itr = ((q_vector->eitr * 90)/100) + ((new_itr * 10)/100);
91192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		itr_reg = EITR_INTS_PER_SEC_TO_REG(new_itr);
91292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_write_eitr(adapter, v_idx, itr_reg);
91392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
91492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
91592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
91692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic irqreturn_t ixgbevf_msix_mbx(int irq, void *data)
91792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
91892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct net_device *netdev = data;
91992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
92092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
92192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u32 eicr;
922a9ee25a2b87c8077042ce23d3231f67f026719b0Greg Rose	u32 msg;
923375b27cf5db963e2bc2a34dc5643d0d7ceca1ee2Greg Rose	bool got_ack = false;
92492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
92592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	eicr = IXGBE_READ_REG(hw, IXGBE_VTEICS);
92692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	IXGBE_WRITE_REG(hw, IXGBE_VTEICR, eicr);
92792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
928375b27cf5db963e2bc2a34dc5643d0d7ceca1ee2Greg Rose	if (!hw->mbx.ops.check_for_ack(hw))
929375b27cf5db963e2bc2a34dc5643d0d7ceca1ee2Greg Rose		got_ack = true;
93008259594e047170923ef11d1482648642bfe606fGreg Rose
931375b27cf5db963e2bc2a34dc5643d0d7ceca1ee2Greg Rose	if (!hw->mbx.ops.check_for_msg(hw)) {
932375b27cf5db963e2bc2a34dc5643d0d7ceca1ee2Greg Rose		hw->mbx.ops.read(hw, &msg, 1);
933a9ee25a2b87c8077042ce23d3231f67f026719b0Greg Rose
934375b27cf5db963e2bc2a34dc5643d0d7ceca1ee2Greg Rose		if ((msg & IXGBE_MBVFICR_VFREQ_MASK) == IXGBE_PF_CONTROL_MSG)
935375b27cf5db963e2bc2a34dc5643d0d7ceca1ee2Greg Rose			mod_timer(&adapter->watchdog_timer,
936375b27cf5db963e2bc2a34dc5643d0d7ceca1ee2Greg Rose				  round_jiffies(jiffies + 1));
937a9ee25a2b87c8077042ce23d3231f67f026719b0Greg Rose
938375b27cf5db963e2bc2a34dc5643d0d7ceca1ee2Greg Rose		if (msg & IXGBE_VT_MSGTYPE_NACK)
939375b27cf5db963e2bc2a34dc5643d0d7ceca1ee2Greg Rose			pr_warn("Last Request of type %2.2x to PF Nacked\n",
940375b27cf5db963e2bc2a34dc5643d0d7ceca1ee2Greg Rose				msg & 0xFF);
9413a2c40336b5ee112f6a2bc784e79aa6124d7acf6Greg Rose		/*
9423a2c40336b5ee112f6a2bc784e79aa6124d7acf6Greg Rose		 * Restore the PFSTS bit in case someone is polling for a
9433a2c40336b5ee112f6a2bc784e79aa6124d7acf6Greg Rose		 * return message from the PF
9443a2c40336b5ee112f6a2bc784e79aa6124d7acf6Greg Rose		 */
9453a2c40336b5ee112f6a2bc784e79aa6124d7acf6Greg Rose		hw->mbx.v2p_mailbox |= IXGBE_VFMAILBOX_PFSTS;
946375b27cf5db963e2bc2a34dc5643d0d7ceca1ee2Greg Rose	}
947375b27cf5db963e2bc2a34dc5643d0d7ceca1ee2Greg Rose
948375b27cf5db963e2bc2a34dc5643d0d7ceca1ee2Greg Rose	/*
949375b27cf5db963e2bc2a34dc5643d0d7ceca1ee2Greg Rose	 * checking for the ack clears the PFACK bit.  Place
950375b27cf5db963e2bc2a34dc5643d0d7ceca1ee2Greg Rose	 * it back in the v2p_mailbox cache so that anyone
951375b27cf5db963e2bc2a34dc5643d0d7ceca1ee2Greg Rose	 * polling for an ack will not miss it
952375b27cf5db963e2bc2a34dc5643d0d7ceca1ee2Greg Rose	 */
953375b27cf5db963e2bc2a34dc5643d0d7ceca1ee2Greg Rose	if (got_ack)
954375b27cf5db963e2bc2a34dc5643d0d7ceca1ee2Greg Rose		hw->mbx.v2p_mailbox |= IXGBE_VFMAILBOX_PFACK;
9553a2c40336b5ee112f6a2bc784e79aa6124d7acf6Greg Rose
95692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return IRQ_HANDLED;
95792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
95892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
95992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic irqreturn_t ixgbevf_msix_clean_tx(int irq, void *data)
96092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
96192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_q_vector *q_vector = data;
96292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter  *adapter = q_vector->adapter;
96392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_ring     *tx_ring;
96492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int i, r_idx;
96592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
96692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (!q_vector->txr_count)
96792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		return IRQ_HANDLED;
96892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
96992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	r_idx = find_first_bit(q_vector->txr_idx, adapter->num_tx_queues);
97092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < q_vector->txr_count; i++) {
97192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_ring = &(adapter->tx_ring[r_idx]);
97292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_ring->total_bytes = 0;
97392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_ring->total_packets = 0;
97492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_clean_tx_irq(adapter, tx_ring);
97592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		r_idx = find_next_bit(q_vector->txr_idx, adapter->num_tx_queues,
97692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				      r_idx + 1);
97792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
97892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
97992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (adapter->itr_setting & 1)
98092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_set_itr_msix(q_vector);
98192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
98292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return IRQ_HANDLED;
98392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
98492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
98592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
98665d676c8c13c39301ebf813c7af00a13f05b2035Greg Rose * ixgbevf_msix_clean_rx - single unshared vector rx clean (all queues)
98792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @irq: unused
98892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @data: pointer to our q_vector struct for this interrupt vector
98992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
99092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic irqreturn_t ixgbevf_msix_clean_rx(int irq, void *data)
99192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
99292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_q_vector *q_vector = data;
99392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter  *adapter = q_vector->adapter;
99492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
99592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_ring  *rx_ring;
99692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int r_idx;
99792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int i;
99892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
99992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	r_idx = find_first_bit(q_vector->rxr_idx, adapter->num_rx_queues);
100092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < q_vector->rxr_count; i++) {
100192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		rx_ring = &(adapter->rx_ring[r_idx]);
100292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		rx_ring->total_bytes = 0;
100392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		rx_ring->total_packets = 0;
100492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		r_idx = find_next_bit(q_vector->rxr_idx, adapter->num_rx_queues,
100592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				      r_idx + 1);
100692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
100792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
100892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (!q_vector->rxr_count)
100992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		return IRQ_HANDLED;
101092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
101192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	r_idx = find_first_bit(q_vector->rxr_idx, adapter->num_rx_queues);
101292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	rx_ring = &(adapter->rx_ring[r_idx]);
101392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* disable interrupts on this vector only */
101492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	IXGBE_WRITE_REG(hw, IXGBE_VTEIMC, rx_ring->v_idx);
101592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	napi_schedule(&q_vector->napi);
101692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
101792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
101892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return IRQ_HANDLED;
101992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
102092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
102192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic irqreturn_t ixgbevf_msix_clean_many(int irq, void *data)
102292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
102392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_msix_clean_rx(irq, data);
102492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_msix_clean_tx(irq, data);
102592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
102692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return IRQ_HANDLED;
102792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
102892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
102992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic inline void map_vector_to_rxq(struct ixgbevf_adapter *a, int v_idx,
103092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				     int r_idx)
103192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
103292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_q_vector *q_vector = a->q_vector[v_idx];
103392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
103492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	set_bit(r_idx, q_vector->rxr_idx);
103592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	q_vector->rxr_count++;
103692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	a->rx_ring[r_idx].v_idx = 1 << v_idx;
103792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
103892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
103992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic inline void map_vector_to_txq(struct ixgbevf_adapter *a, int v_idx,
104092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				     int t_idx)
104192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
104292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_q_vector *q_vector = a->q_vector[v_idx];
104392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
104492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	set_bit(t_idx, q_vector->txr_idx);
104592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	q_vector->txr_count++;
104692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	a->tx_ring[t_idx].v_idx = 1 << v_idx;
104792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
104892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
104992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
105092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_map_rings_to_vectors - Maps descriptor rings to vectors
105192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure to initialize
105292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
105392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * This function maps descriptor rings to the queue-specific vectors
105492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * we were allotted through the MSI-X enabling code.  Ideally, we'd have
105592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * one vector per ring/queue, but on a constrained vector budget, we
105692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * group the rings as "efficiently" as possible.  You would add new
105792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * mapping configurations in here.
105892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
105992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int ixgbevf_map_rings_to_vectors(struct ixgbevf_adapter *adapter)
106092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
106192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int q_vectors;
106292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int v_start = 0;
106392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int rxr_idx = 0, txr_idx = 0;
106492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int rxr_remaining = adapter->num_rx_queues;
106592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int txr_remaining = adapter->num_tx_queues;
106692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int i, j;
106792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int rqpv, tqpv;
106892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int err = 0;
106992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
107092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
107192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
107292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/*
107392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * The ideal configuration...
107492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * We have enough vectors to map one per queue.
107592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 */
107692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (q_vectors == adapter->num_rx_queues + adapter->num_tx_queues) {
107792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		for (; rxr_idx < rxr_remaining; v_start++, rxr_idx++)
107892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			map_vector_to_rxq(adapter, v_start, rxr_idx);
107992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
108092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		for (; txr_idx < txr_remaining; v_start++, txr_idx++)
108192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			map_vector_to_txq(adapter, v_start, txr_idx);
108292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto out;
108392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
108492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
108592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/*
108692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * If we don't have enough vectors for a 1-to-1
108792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * mapping, we'll have to group them so there are
108892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * multiple queues per vector.
108992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 */
109092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* Re-adjusting *qpv takes care of the remainder. */
109192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = v_start; i < q_vectors; i++) {
109292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		rqpv = DIV_ROUND_UP(rxr_remaining, q_vectors - i);
109392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		for (j = 0; j < rqpv; j++) {
109492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			map_vector_to_rxq(adapter, i, rxr_idx);
109592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			rxr_idx++;
109692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			rxr_remaining--;
109792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
109892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
109992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = v_start; i < q_vectors; i++) {
110092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tqpv = DIV_ROUND_UP(txr_remaining, q_vectors - i);
110192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		for (j = 0; j < tqpv; j++) {
110292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			map_vector_to_txq(adapter, i, txr_idx);
110392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			txr_idx++;
110492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			txr_remaining--;
110592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
110692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
110792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
110892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseout:
110992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return err;
111092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
111192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
111292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
111392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_request_msix_irqs - Initialize MSI-X interrupts
111492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
111592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
111692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_request_msix_irqs allocates MSI-X vectors and requests
111792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * interrupts from the kernel.
111892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
111992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int ixgbevf_request_msix_irqs(struct ixgbevf_adapter *adapter)
112092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
112192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct net_device *netdev = adapter->netdev;
112292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	irqreturn_t (*handler)(int, void *);
112392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int i, vector, q_vectors, err;
112492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int ri = 0, ti = 0;
112592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
112692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* Decrement for Other and TCP Timer vectors */
112792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
112892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
112992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#define SET_HANDLER(_v) (((_v)->rxr_count && (_v)->txr_count)          \
113092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					  ? &ixgbevf_msix_clean_many : \
113192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			  (_v)->rxr_count ? &ixgbevf_msix_clean_rx   : \
113292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			  (_v)->txr_count ? &ixgbevf_msix_clean_tx   : \
113392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			  NULL)
113492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (vector = 0; vector < q_vectors; vector++) {
113592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		handler = SET_HANDLER(adapter->q_vector[vector]);
113692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
113792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (handler == &ixgbevf_msix_clean_rx) {
113892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			sprintf(adapter->name[vector], "%s-%s-%d",
113992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				netdev->name, "rx", ri++);
114092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		} else if (handler == &ixgbevf_msix_clean_tx) {
114192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			sprintf(adapter->name[vector], "%s-%s-%d",
114292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				netdev->name, "tx", ti++);
114392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		} else if (handler == &ixgbevf_msix_clean_many) {
114492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			sprintf(adapter->name[vector], "%s-%s-%d",
114592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				netdev->name, "TxRx", vector);
114692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		} else {
114792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			/* skip this unused q_vector */
114892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			continue;
114992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
115092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		err = request_irq(adapter->msix_entries[vector].vector,
115192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				  handler, 0, adapter->name[vector],
115292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				  adapter->q_vector[vector]);
115392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (err) {
115492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			hw_dbg(&adapter->hw,
115592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			       "request_irq failed for MSIX interrupt "
115692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			       "Error: %d\n", err);
115792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			goto free_queue_irqs;
115892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
115992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
116092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
116192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	sprintf(adapter->name[vector], "%s:mbx", netdev->name);
116292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	err = request_irq(adapter->msix_entries[vector].vector,
116392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			  &ixgbevf_msix_mbx, 0, adapter->name[vector], netdev);
116492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (err) {
116592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		hw_dbg(&adapter->hw,
116692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		       "request_irq for msix_mbx failed: %d\n", err);
116792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto free_queue_irqs;
116892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
116992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
117092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return 0;
117192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
117292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosefree_queue_irqs:
117392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = vector - 1; i >= 0; i--)
117492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		free_irq(adapter->msix_entries[--vector].vector,
117592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			 &(adapter->q_vector[i]));
117692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	pci_disable_msix(adapter->pdev);
117792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	kfree(adapter->msix_entries);
117892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->msix_entries = NULL;
117992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return err;
118092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
118192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
118292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic inline void ixgbevf_reset_q_vectors(struct ixgbevf_adapter *adapter)
118392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
118492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int i, q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
118592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
118692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < q_vectors; i++) {
118792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		struct ixgbevf_q_vector *q_vector = adapter->q_vector[i];
118892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		bitmap_zero(q_vector->rxr_idx, MAX_RX_QUEUES);
118992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		bitmap_zero(q_vector->txr_idx, MAX_TX_QUEUES);
119092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		q_vector->rxr_count = 0;
119192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		q_vector->txr_count = 0;
119292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		q_vector->eitr = adapter->eitr_param;
119392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
119492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
119592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
119692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
119792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_request_irq - initialize interrupts
119892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
119992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
120092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * Attempts to configure interrupts using the best available
120192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * capabilities of the hardware and kernel.
120292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
120392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int ixgbevf_request_irq(struct ixgbevf_adapter *adapter)
120492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
120592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int err = 0;
120692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
120792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	err = ixgbevf_request_msix_irqs(adapter);
120892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
120992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (err)
121092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		hw_dbg(&adapter->hw,
121192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		       "request_irq failed, Error %d\n", err);
121292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
121392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return err;
121492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
121592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
121692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_free_irq(struct ixgbevf_adapter *adapter)
121792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
121892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct net_device *netdev = adapter->netdev;
121992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int i, q_vectors;
122092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
122192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	q_vectors = adapter->num_msix_vectors;
122292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
122392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	i = q_vectors - 1;
122492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
122592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	free_irq(adapter->msix_entries[i].vector, netdev);
122692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	i--;
122792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
122892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (; i >= 0; i--) {
122992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		free_irq(adapter->msix_entries[i].vector,
123092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			 adapter->q_vector[i]);
123192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
123292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
123392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_reset_q_vectors(adapter);
123492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
123592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
123692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
123792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_irq_disable - Mask off interrupt generation on the NIC
123892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
123992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
124092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic inline void ixgbevf_irq_disable(struct ixgbevf_adapter *adapter)
124192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
124292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int i;
124392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
124492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
124592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	IXGBE_WRITE_REG(hw, IXGBE_VTEIMC, ~0);
124692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
124792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	IXGBE_WRITE_FLUSH(hw);
124892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
124992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < adapter->num_msix_vectors; i++)
125092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		synchronize_irq(adapter->msix_entries[i].vector);
125192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
125292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
125392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
125492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_irq_enable - Enable default interrupt generation settings
125592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
125692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
125792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic inline void ixgbevf_irq_enable(struct ixgbevf_adapter *adapter,
125892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				      bool queues, bool flush)
125992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
126092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
126192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u32 mask;
126292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u64 qmask;
126392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
126492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	mask = (IXGBE_EIMS_ENABLE_MASK & ~IXGBE_EIMS_RTX_QUEUE);
126592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	qmask = ~0;
126692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
126792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, mask);
126892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
126992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (queues)
127092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_irq_enable_queues(adapter, qmask);
127192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
127292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (flush)
127392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		IXGBE_WRITE_FLUSH(hw);
127492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
127592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
127692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
127792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_configure_tx - Configure 82599 VF Transmit Unit after Reset
127892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
127992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
128092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * Configure the Tx unit of the MAC after a reset.
128192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
128292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_configure_tx(struct ixgbevf_adapter *adapter)
128392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
128492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u64 tdba;
128592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
128692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u32 i, j, tdlen, txctrl;
128792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
128892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* Setup the HW Tx Head and Tail descriptor pointers */
128992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < adapter->num_tx_queues; i++) {
129092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		struct ixgbevf_ring *ring = &adapter->tx_ring[i];
129192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		j = ring->reg_idx;
129292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tdba = ring->dma;
129392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tdlen = ring->count * sizeof(union ixgbe_adv_tx_desc);
129492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		IXGBE_WRITE_REG(hw, IXGBE_VFTDBAL(j),
129592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				(tdba & DMA_BIT_MASK(32)));
129692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		IXGBE_WRITE_REG(hw, IXGBE_VFTDBAH(j), (tdba >> 32));
129792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		IXGBE_WRITE_REG(hw, IXGBE_VFTDLEN(j), tdlen);
129892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		IXGBE_WRITE_REG(hw, IXGBE_VFTDH(j), 0);
129992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		IXGBE_WRITE_REG(hw, IXGBE_VFTDT(j), 0);
130092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->tx_ring[i].head = IXGBE_VFTDH(j);
130192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->tx_ring[i].tail = IXGBE_VFTDT(j);
130292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* Disable Tx Head Writeback RO bit, since this hoses
130392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		 * bookkeeping if things aren't delivered in order.
130492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		 */
130592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		txctrl = IXGBE_READ_REG(hw, IXGBE_VFDCA_TXCTRL(j));
130692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		txctrl &= ~IXGBE_DCA_TXCTRL_TX_WB_RO_EN;
130792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		IXGBE_WRITE_REG(hw, IXGBE_VFDCA_TXCTRL(j), txctrl);
130892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
130992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
131092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
131192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#define IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT	2
131292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
131392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_configure_srrctl(struct ixgbevf_adapter *adapter, int index)
131492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
131592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_ring *rx_ring;
131692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
131792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u32 srrctl;
131892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
131992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	rx_ring = &adapter->rx_ring[index];
132092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
132192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	srrctl = IXGBE_SRRCTL_DROP_EN;
132292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
132392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) {
132492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		u16 bufsz = IXGBEVF_RXBUFFER_2048;
132592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* grow the amount we can receive on large page machines */
132692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (bufsz < (PAGE_SIZE / 2))
132792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			bufsz = (PAGE_SIZE / 2);
132892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* cap the bufsz at our largest descriptor size */
132992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		bufsz = min((u16)IXGBEVF_MAX_RXBUFFER, bufsz);
133092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
133192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		srrctl |= bufsz >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
133292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		srrctl |= IXGBE_SRRCTL_DESCTYPE_HDR_SPLIT_ALWAYS;
133392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		srrctl |= ((IXGBEVF_RX_HDR_SIZE <<
133492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			   IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT) &
133592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			   IXGBE_SRRCTL_BSIZEHDR_MASK);
133692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	} else {
133792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		srrctl |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
133892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
133992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (rx_ring->rx_buf_len == MAXIMUM_ETHERNET_VLAN_SIZE)
134092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			srrctl |= IXGBEVF_RXBUFFER_2048 >>
134192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				IXGBE_SRRCTL_BSIZEPKT_SHIFT;
134292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		else
134392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			srrctl |= rx_ring->rx_buf_len >>
134492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				IXGBE_SRRCTL_BSIZEPKT_SHIFT;
134592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
134692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	IXGBE_WRITE_REG(hw, IXGBE_VFSRRCTL(index), srrctl);
134792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
134892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
134992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
135092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_configure_rx - Configure 82599 VF Receive Unit after Reset
135192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
135292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
135392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * Configure the Rx unit of the MAC after a reset.
135492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
135592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_configure_rx(struct ixgbevf_adapter *adapter)
135692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
135792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u64 rdba;
135892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
135992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct net_device *netdev = adapter->netdev;
136092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int max_frame = netdev->mtu + ETH_HLEN + ETH_FCS_LEN;
136192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int i, j;
136292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u32 rdlen;
136392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int rx_buf_len;
136492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
136592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* Decide whether to use packet split mode or not */
136692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (netdev->mtu > ETH_DATA_LEN) {
136792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (adapter->flags & IXGBE_FLAG_RX_PS_CAPABLE)
136892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			adapter->flags |= IXGBE_FLAG_RX_PS_ENABLED;
136992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		else
137092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			adapter->flags &= ~IXGBE_FLAG_RX_PS_ENABLED;
137192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	} else {
137292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (adapter->flags & IXGBE_FLAG_RX_1BUF_CAPABLE)
137392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			adapter->flags &= ~IXGBE_FLAG_RX_PS_ENABLED;
137492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		else
137592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			adapter->flags |= IXGBE_FLAG_RX_PS_ENABLED;
137692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
137792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
137892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* Set the RX buffer length according to the mode */
137992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) {
138092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* PSRTYPE must be initialized in 82599 */
138192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		u32 psrtype = IXGBE_PSRTYPE_TCPHDR |
138292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			IXGBE_PSRTYPE_UDPHDR |
138392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			IXGBE_PSRTYPE_IPV4HDR |
138492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			IXGBE_PSRTYPE_IPV6HDR |
138592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			IXGBE_PSRTYPE_L2HDR;
138692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		IXGBE_WRITE_REG(hw, IXGBE_VFPSRTYPE, psrtype);
138792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		rx_buf_len = IXGBEVF_RX_HDR_SIZE;
138892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	} else {
138992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		IXGBE_WRITE_REG(hw, IXGBE_VFPSRTYPE, 0);
139092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (netdev->mtu <= ETH_DATA_LEN)
139192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			rx_buf_len = MAXIMUM_ETHERNET_VLAN_SIZE;
139292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		else
139392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			rx_buf_len = ALIGN(max_frame, 1024);
139492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
139592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
139692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	rdlen = adapter->rx_ring[0].count * sizeof(union ixgbe_adv_rx_desc);
139792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* Setup the HW Rx Head and Tail Descriptor Pointers and
139892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * the Base and Length of the Rx Descriptor Ring */
139992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < adapter->num_rx_queues; i++) {
140092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		rdba = adapter->rx_ring[i].dma;
140192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		j = adapter->rx_ring[i].reg_idx;
140292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		IXGBE_WRITE_REG(hw, IXGBE_VFRDBAL(j),
140392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				(rdba & DMA_BIT_MASK(32)));
140492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		IXGBE_WRITE_REG(hw, IXGBE_VFRDBAH(j), (rdba >> 32));
140592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		IXGBE_WRITE_REG(hw, IXGBE_VFRDLEN(j), rdlen);
140692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		IXGBE_WRITE_REG(hw, IXGBE_VFRDH(j), 0);
140792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		IXGBE_WRITE_REG(hw, IXGBE_VFRDT(j), 0);
140892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->rx_ring[i].head = IXGBE_VFRDH(j);
140992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->rx_ring[i].tail = IXGBE_VFRDT(j);
141092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->rx_ring[i].rx_buf_len = rx_buf_len;
141192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
141292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_configure_srrctl(adapter, j);
141392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
141492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
141592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
14168e586137e6b63af1e881b328466ab5ffbe562510Jiri Pirkostatic int ixgbevf_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
141792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
141892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
141992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
142092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
142192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* add VID to filter table */
142292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (hw->mac.ops.set_vfta)
142392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		hw->mac.ops.set_vfta(hw, vid, 0, true);
1424dadcd65f52921456112183fde543fc214bb0a227Jiri Pirko	set_bit(vid, adapter->active_vlans);
14258e586137e6b63af1e881b328466ab5ffbe562510Jiri Pirko
14268e586137e6b63af1e881b328466ab5ffbe562510Jiri Pirko	return 0;
142792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
142892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
14298e586137e6b63af1e881b328466ab5ffbe562510Jiri Pirkostatic int ixgbevf_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
143092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
143192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
143292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
143392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
143492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* remove VID from filter table */
143592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (hw->mac.ops.set_vfta)
143692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		hw->mac.ops.set_vfta(hw, vid, 0, false);
1437dadcd65f52921456112183fde543fc214bb0a227Jiri Pirko	clear_bit(vid, adapter->active_vlans);
14388e586137e6b63af1e881b328466ab5ffbe562510Jiri Pirko
14398e586137e6b63af1e881b328466ab5ffbe562510Jiri Pirko	return 0;
144092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
144192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
144292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_restore_vlan(struct ixgbevf_adapter *adapter)
144392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
1444dadcd65f52921456112183fde543fc214bb0a227Jiri Pirko	u16 vid;
144592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
1446dadcd65f52921456112183fde543fc214bb0a227Jiri Pirko	for_each_set_bit(vid, adapter->active_vlans, VLAN_N_VID)
1447dadcd65f52921456112183fde543fc214bb0a227Jiri Pirko		ixgbevf_vlan_rx_add_vid(adapter->netdev, vid);
144892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
144992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
145046ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rosestatic int ixgbevf_write_uc_addr_list(struct net_device *netdev)
145146ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose{
145246ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
145346ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose	struct ixgbe_hw *hw = &adapter->hw;
145446ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose	int count = 0;
145546ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose
145646ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose	if ((netdev_uc_count(netdev)) > 10) {
1457dbd9636e281895cd3a15682f0966fb545ddff9e8Jeff Kirsher		pr_err("Too many unicast filters - No Space\n");
145846ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose		return -ENOSPC;
145946ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose	}
146046ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose
146146ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose	if (!netdev_uc_empty(netdev)) {
146246ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose		struct netdev_hw_addr *ha;
146346ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose		netdev_for_each_uc_addr(ha, netdev) {
146446ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose			hw->mac.ops.set_uc_addr(hw, ++count, ha->addr);
146546ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose			udelay(200);
146646ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose		}
146746ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose	} else {
146846ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose		/*
146946ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose		 * If the list is empty then send message to PF driver to
147046ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose		 * clear all macvlans on this VF.
147146ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose		 */
147246ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose		hw->mac.ops.set_uc_addr(hw, 0, NULL);
147346ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose	}
147446ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose
147546ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose	return count;
147646ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose}
147746ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose
147892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
147992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_set_rx_mode - Multicast set
148092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @netdev: network interface device structure
148192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
148292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * The set_rx_method entry point is called whenever the multicast address
148392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * list or the network interface flags are updated.  This routine is
148492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * responsible for configuring the hardware for proper multicast mode.
148592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
148692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_set_rx_mode(struct net_device *netdev)
148792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
148892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
148992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
149092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
149192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* reprogram multicast list */
149292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (hw->mac.ops.update_mc_addr_list)
14935c58c47a4f3758c81594402451d8fe0d8accb4e8Jiri Pirko		hw->mac.ops.update_mc_addr_list(hw, netdev);
149446ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose
149546ec20ff7d6f9f011e06d58e4e87153ed8c893edGreg Rose	ixgbevf_write_uc_addr_list(netdev);
149692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
149792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
149892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_napi_enable_all(struct ixgbevf_adapter *adapter)
149992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
150092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int q_idx;
150192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_q_vector *q_vector;
150292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
150392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
150492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (q_idx = 0; q_idx < q_vectors; q_idx++) {
150592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		struct napi_struct *napi;
150692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		q_vector = adapter->q_vector[q_idx];
150792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (!q_vector->rxr_count)
150892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			continue;
150992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		napi = &q_vector->napi;
151092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (q_vector->rxr_count > 1)
151192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			napi->poll = &ixgbevf_clean_rxonly_many;
151292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
151392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		napi_enable(napi);
151492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
151592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
151692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
151792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_napi_disable_all(struct ixgbevf_adapter *adapter)
151892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
151992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int q_idx;
152092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_q_vector *q_vector;
152192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
152292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
152392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (q_idx = 0; q_idx < q_vectors; q_idx++) {
152492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		q_vector = adapter->q_vector[q_idx];
152592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (!q_vector->rxr_count)
152692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			continue;
152792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		napi_disable(&q_vector->napi);
152892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
152992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
153092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
153192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_configure(struct ixgbevf_adapter *adapter)
153292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
153392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct net_device *netdev = adapter->netdev;
153492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int i;
153592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
153692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_set_rx_mode(netdev);
153792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
153892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_restore_vlan(adapter);
153992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
154092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_configure_tx(adapter);
154192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_configure_rx(adapter);
154292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < adapter->num_rx_queues; i++) {
154392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		struct ixgbevf_ring *ring = &adapter->rx_ring[i];
154492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_alloc_rx_buffers(adapter, ring, ring->count);
154592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ring->next_to_use = ring->count - 1;
154692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		writel(ring->next_to_use, adapter->hw.hw_addr + ring->tail);
154792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
154892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
154992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
155092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#define IXGBE_MAX_RX_DESC_POLL 10
155192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic inline void ixgbevf_rx_desc_queue_enable(struct ixgbevf_adapter *adapter,
155292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose						int rxr)
155392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
155492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
155592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int j = adapter->rx_ring[rxr].reg_idx;
155692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int k;
155792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
155892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (k = 0; k < IXGBE_MAX_RX_DESC_POLL; k++) {
155992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(j)) & IXGBE_RXDCTL_ENABLE)
156092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			break;
156192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		else
156292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			msleep(1);
156392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
156492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (k >= IXGBE_MAX_RX_DESC_POLL) {
156592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		hw_dbg(hw, "RXDCTL.ENABLE on Rx queue %d "
156692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		       "not set within the polling period\n", rxr);
156792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
156892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
156992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_release_rx_desc(&adapter->hw, &adapter->rx_ring[rxr],
157092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				(adapter->rx_ring[rxr].count - 1));
157192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
157292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
157333bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rosestatic void ixgbevf_save_reset_stats(struct ixgbevf_adapter *adapter)
157433bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose{
157533bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose	/* Only save pre-reset stats if there are some */
157633bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose	if (adapter->stats.vfgprc || adapter->stats.vfgptc) {
157733bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose		adapter->stats.saved_reset_vfgprc += adapter->stats.vfgprc -
157833bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose			adapter->stats.base_vfgprc;
157933bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose		adapter->stats.saved_reset_vfgptc += adapter->stats.vfgptc -
158033bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose			adapter->stats.base_vfgptc;
158133bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose		adapter->stats.saved_reset_vfgorc += adapter->stats.vfgorc -
158233bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose			adapter->stats.base_vfgorc;
158333bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose		adapter->stats.saved_reset_vfgotc += adapter->stats.vfgotc -
158433bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose			adapter->stats.base_vfgotc;
158533bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose		adapter->stats.saved_reset_vfmprc += adapter->stats.vfmprc -
158633bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose			adapter->stats.base_vfmprc;
158733bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose	}
158833bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose}
158933bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose
159033bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rosestatic void ixgbevf_init_last_counter_stats(struct ixgbevf_adapter *adapter)
159133bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose{
159233bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
159333bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose
159433bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose	adapter->stats.last_vfgprc = IXGBE_READ_REG(hw, IXGBE_VFGPRC);
159533bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose	adapter->stats.last_vfgorc = IXGBE_READ_REG(hw, IXGBE_VFGORC_LSB);
159633bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose	adapter->stats.last_vfgorc |=
159733bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose		(((u64)(IXGBE_READ_REG(hw, IXGBE_VFGORC_MSB))) << 32);
159833bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose	adapter->stats.last_vfgptc = IXGBE_READ_REG(hw, IXGBE_VFGPTC);
159933bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose	adapter->stats.last_vfgotc = IXGBE_READ_REG(hw, IXGBE_VFGOTC_LSB);
160033bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose	adapter->stats.last_vfgotc |=
160133bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose		(((u64)(IXGBE_READ_REG(hw, IXGBE_VFGOTC_MSB))) << 32);
160233bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose	adapter->stats.last_vfmprc = IXGBE_READ_REG(hw, IXGBE_VFMPRC);
160333bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose
160433bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose	adapter->stats.base_vfgprc = adapter->stats.last_vfgprc;
160533bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose	adapter->stats.base_vfgorc = adapter->stats.last_vfgorc;
160633bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose	adapter->stats.base_vfgptc = adapter->stats.last_vfgptc;
160733bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose	adapter->stats.base_vfgotc = adapter->stats.last_vfgotc;
160833bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose	adapter->stats.base_vfmprc = adapter->stats.last_vfmprc;
160933bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose}
161033bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose
161192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int ixgbevf_up_complete(struct ixgbevf_adapter *adapter)
161292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
161392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct net_device *netdev = adapter->netdev;
161492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
161592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int i, j = 0;
161692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int num_rx_rings = adapter->num_rx_queues;
161792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u32 txdctl, rxdctl;
161892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
161992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < adapter->num_tx_queues; i++) {
162092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		j = adapter->tx_ring[i].reg_idx;
162192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(j));
162292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* enable WTHRESH=8 descriptors, to encourage burst writeback */
162392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		txdctl |= (8 << 16);
162492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(j), txdctl);
162592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
162692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
162792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < adapter->num_tx_queues; i++) {
162892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		j = adapter->tx_ring[i].reg_idx;
162992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(j));
163092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		txdctl |= IXGBE_TXDCTL_ENABLE;
163192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(j), txdctl);
163292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
163392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
163492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < num_rx_rings; i++) {
163592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		j = adapter->rx_ring[i].reg_idx;
163692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		rxdctl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(j));
1637dadcd65f52921456112183fde543fc214bb0a227Jiri Pirko		rxdctl |= IXGBE_RXDCTL_ENABLE | IXGBE_RXDCTL_VME;
163869bfbec47d1c120f66f2f24d5f2cb13a72fc88dfGreg Rose		if (hw->mac.type == ixgbe_mac_X540_vf) {
163969bfbec47d1c120f66f2f24d5f2cb13a72fc88dfGreg Rose			rxdctl &= ~IXGBE_RXDCTL_RLPMLMASK;
164069bfbec47d1c120f66f2f24d5f2cb13a72fc88dfGreg Rose			rxdctl |= ((netdev->mtu + ETH_HLEN + ETH_FCS_LEN) |
164169bfbec47d1c120f66f2f24d5f2cb13a72fc88dfGreg Rose				   IXGBE_RXDCTL_RLPML_EN);
164269bfbec47d1c120f66f2f24d5f2cb13a72fc88dfGreg Rose		}
164392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(j), rxdctl);
164492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_rx_desc_queue_enable(adapter, i);
164592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
164692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
164792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_configure_msix(adapter);
164892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
164992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (hw->mac.ops.set_rar) {
165092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (is_valid_ether_addr(hw->mac.addr))
165192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0);
165292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		else
165392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			hw->mac.ops.set_rar(hw, 0, hw->mac.perm_addr, 0);
165492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
165592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
165692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	clear_bit(__IXGBEVF_DOWN, &adapter->state);
165792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_napi_enable_all(adapter);
165892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
165992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* enable transmits */
166092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	netif_tx_start_all_queues(netdev);
166192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
166233bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose	ixgbevf_save_reset_stats(adapter);
166333bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose	ixgbevf_init_last_counter_stats(adapter);
166433bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose
166592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* bring the link up in the watchdog, this could race with our first
166692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * link up interrupt but shouldn't be a problem */
166792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->flags |= IXGBE_FLAG_NEED_LINK_UPDATE;
166892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->link_check_timeout = jiffies;
166992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	mod_timer(&adapter->watchdog_timer, jiffies);
167092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return 0;
167192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
167292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
167392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseint ixgbevf_up(struct ixgbevf_adapter *adapter)
167492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
167592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int err;
167692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
167792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
167892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_configure(adapter);
167992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
168092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	err = ixgbevf_up_complete(adapter);
168192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
168292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* clear any pending interrupts, may auto mask */
168392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	IXGBE_READ_REG(hw, IXGBE_VTEICR);
168492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
168592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_irq_enable(adapter, true, true);
168692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
168792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return err;
168892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
168992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
169092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
169192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_clean_rx_ring - Free Rx Buffers per Queue
169292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
169392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @rx_ring: ring to free buffers from
169492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
169592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_clean_rx_ring(struct ixgbevf_adapter *adapter,
169692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				  struct ixgbevf_ring *rx_ring)
169792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
169892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct pci_dev *pdev = adapter->pdev;
169992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	unsigned long size;
170092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	unsigned int i;
170192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
1702c0456c231a8b2981128cc29e211b7bad1bd997dfGreg Rose	if (!rx_ring->rx_buffer_info)
1703c0456c231a8b2981128cc29e211b7bad1bd997dfGreg Rose		return;
170492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
1705c0456c231a8b2981128cc29e211b7bad1bd997dfGreg Rose	/* Free all the Rx ring sk_buffs */
170692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < rx_ring->count; i++) {
170792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		struct ixgbevf_rx_buffer *rx_buffer_info;
170892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
170992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		rx_buffer_info = &rx_ring->rx_buffer_info[i];
171092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (rx_buffer_info->dma) {
17112a1f8794161d9d5d46881160279df62767197526Nick Nunley			dma_unmap_single(&pdev->dev, rx_buffer_info->dma,
171292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					 rx_ring->rx_buf_len,
17132a1f8794161d9d5d46881160279df62767197526Nick Nunley					 DMA_FROM_DEVICE);
171492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			rx_buffer_info->dma = 0;
171592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
171692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (rx_buffer_info->skb) {
171792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			struct sk_buff *skb = rx_buffer_info->skb;
171892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			rx_buffer_info->skb = NULL;
171992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			do {
172092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				struct sk_buff *this = skb;
172192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				skb = skb->prev;
172292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				dev_kfree_skb(this);
172392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			} while (skb);
172492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
172592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (!rx_buffer_info->page)
172692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			continue;
17272a1f8794161d9d5d46881160279df62767197526Nick Nunley		dma_unmap_page(&pdev->dev, rx_buffer_info->page_dma,
17282a1f8794161d9d5d46881160279df62767197526Nick Nunley			       PAGE_SIZE / 2, DMA_FROM_DEVICE);
172992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		rx_buffer_info->page_dma = 0;
173092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		put_page(rx_buffer_info->page);
173192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		rx_buffer_info->page = NULL;
173292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		rx_buffer_info->page_offset = 0;
173392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
173492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
173592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	size = sizeof(struct ixgbevf_rx_buffer) * rx_ring->count;
173692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	memset(rx_ring->rx_buffer_info, 0, size);
173792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
173892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* Zero out the descriptor ring */
173992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	memset(rx_ring->desc, 0, rx_ring->size);
174092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
174192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	rx_ring->next_to_clean = 0;
174292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	rx_ring->next_to_use = 0;
174392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
174492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (rx_ring->head)
174592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		writel(0, adapter->hw.hw_addr + rx_ring->head);
174692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (rx_ring->tail)
174792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		writel(0, adapter->hw.hw_addr + rx_ring->tail);
174892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
174992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
175092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
175192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_clean_tx_ring - Free Tx Buffers
175292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
175392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @tx_ring: ring to be cleaned
175492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
175592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_clean_tx_ring(struct ixgbevf_adapter *adapter,
175692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				  struct ixgbevf_ring *tx_ring)
175792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
175892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_tx_buffer *tx_buffer_info;
175992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	unsigned long size;
176092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	unsigned int i;
176192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
1762c0456c231a8b2981128cc29e211b7bad1bd997dfGreg Rose	if (!tx_ring->tx_buffer_info)
1763c0456c231a8b2981128cc29e211b7bad1bd997dfGreg Rose		return;
1764c0456c231a8b2981128cc29e211b7bad1bd997dfGreg Rose
176592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* Free all the Tx ring sk_buffs */
176692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
176792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < tx_ring->count; i++) {
176892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_buffer_info = &tx_ring->tx_buffer_info[i];
176992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_unmap_and_free_tx_resource(adapter, tx_buffer_info);
177092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
177192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
177292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	size = sizeof(struct ixgbevf_tx_buffer) * tx_ring->count;
177392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	memset(tx_ring->tx_buffer_info, 0, size);
177492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
177592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	memset(tx_ring->desc, 0, tx_ring->size);
177692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
177792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_ring->next_to_use = 0;
177892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_ring->next_to_clean = 0;
177992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
178092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (tx_ring->head)
178192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		writel(0, adapter->hw.hw_addr + tx_ring->head);
178292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (tx_ring->tail)
178392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		writel(0, adapter->hw.hw_addr + tx_ring->tail);
178492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
178592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
178692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
178792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_clean_all_rx_rings - Free Rx Buffers for all queues
178892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
178992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
179092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_clean_all_rx_rings(struct ixgbevf_adapter *adapter)
179192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
179292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int i;
179392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
179492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < adapter->num_rx_queues; i++)
179592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_clean_rx_ring(adapter, &adapter->rx_ring[i]);
179692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
179792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
179892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
179992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_clean_all_tx_rings - Free Tx Buffers for all queues
180092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
180192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
180292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_clean_all_tx_rings(struct ixgbevf_adapter *adapter)
180392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
180492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int i;
180592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
180692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < adapter->num_tx_queues; i++)
180792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_clean_tx_ring(adapter, &adapter->tx_ring[i]);
180892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
180992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
181092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosevoid ixgbevf_down(struct ixgbevf_adapter *adapter)
181192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
181292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct net_device *netdev = adapter->netdev;
181392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
181492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u32 txdctl;
181592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int i, j;
181692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
181792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* signal that we are down to the interrupt handler */
181892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	set_bit(__IXGBEVF_DOWN, &adapter->state);
181992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* disable receives */
182092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
182192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	netif_tx_disable(netdev);
182292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
182392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	msleep(10);
182492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
182592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	netif_tx_stop_all_queues(netdev);
182692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
182792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_irq_disable(adapter);
182892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
182992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_napi_disable_all(adapter);
183092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
183192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	del_timer_sync(&adapter->watchdog_timer);
183292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* can't call flush scheduled work here because it can deadlock
183392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * if linkwatch_event tries to acquire the rtnl_lock which we are
183492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * holding */
183592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	while (adapter->flags & IXGBE_FLAG_IN_WATCHDOG_TASK)
183692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		msleep(1);
183792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
183892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* disable transmits in the hardware now that interrupts are off */
183992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < adapter->num_tx_queues; i++) {
184092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		j = adapter->tx_ring[i].reg_idx;
184192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(j));
184292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(j),
184392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				(txdctl & ~IXGBE_TXDCTL_ENABLE));
184492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
184592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
184692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	netif_carrier_off(netdev);
184792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
184892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (!pci_channel_offline(adapter->pdev))
184992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_reset(adapter);
185092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
185192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_clean_all_tx_rings(adapter);
185292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_clean_all_rx_rings(adapter);
185392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
185492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
185592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosevoid ixgbevf_reinit_locked(struct ixgbevf_adapter *adapter)
185692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
1857c0456c231a8b2981128cc29e211b7bad1bd997dfGreg Rose	struct ixgbe_hw *hw = &adapter->hw;
1858c0456c231a8b2981128cc29e211b7bad1bd997dfGreg Rose
185992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	WARN_ON(in_interrupt());
1860c0456c231a8b2981128cc29e211b7bad1bd997dfGreg Rose
186192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	while (test_and_set_bit(__IXGBEVF_RESETTING, &adapter->state))
186292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		msleep(1);
186392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
1864c0456c231a8b2981128cc29e211b7bad1bd997dfGreg Rose	/*
1865c0456c231a8b2981128cc29e211b7bad1bd997dfGreg Rose	 * Check if PF is up before re-init.  If not then skip until
1866c0456c231a8b2981128cc29e211b7bad1bd997dfGreg Rose	 * later when the PF is up and ready to service requests from
1867c0456c231a8b2981128cc29e211b7bad1bd997dfGreg Rose	 * the VF via mailbox.  If the VF is up and running then the
1868c0456c231a8b2981128cc29e211b7bad1bd997dfGreg Rose	 * watchdog task will continue to schedule reset tasks until
1869c0456c231a8b2981128cc29e211b7bad1bd997dfGreg Rose	 * the PF is up and running.
1870c0456c231a8b2981128cc29e211b7bad1bd997dfGreg Rose	 */
1871c0456c231a8b2981128cc29e211b7bad1bd997dfGreg Rose	if (!hw->mac.ops.reset_hw(hw)) {
1872c0456c231a8b2981128cc29e211b7bad1bd997dfGreg Rose		ixgbevf_down(adapter);
1873c0456c231a8b2981128cc29e211b7bad1bd997dfGreg Rose		ixgbevf_up(adapter);
1874c0456c231a8b2981128cc29e211b7bad1bd997dfGreg Rose	}
187592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
187692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	clear_bit(__IXGBEVF_RESETTING, &adapter->state);
187792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
187892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
187992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosevoid ixgbevf_reset(struct ixgbevf_adapter *adapter)
188092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
188192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
188292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct net_device *netdev = adapter->netdev;
188392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
188492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (hw->mac.ops.reset_hw(hw))
188592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		hw_dbg(hw, "PF still resetting\n");
188692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	else
188792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		hw->mac.ops.init_hw(hw);
188892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
188992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (is_valid_ether_addr(adapter->hw.mac.addr)) {
189092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		memcpy(netdev->dev_addr, adapter->hw.mac.addr,
189192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		       netdev->addr_len);
189292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		memcpy(netdev->perm_addr, adapter->hw.mac.addr,
189392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		       netdev->addr_len);
189492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
189592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
189692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
189792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_acquire_msix_vectors(struct ixgbevf_adapter *adapter,
189892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					 int vectors)
189992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
190092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int err, vector_threshold;
190192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
190292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* We'll want at least 3 (vector_threshold):
190392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * 1) TxQ[0] Cleanup
190492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * 2) RxQ[0] Cleanup
190592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * 3) Other (Link Status Change, etc.)
190692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 */
190792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	vector_threshold = MIN_MSIX_COUNT;
190892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
190992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* The more we get, the more we will assign to Tx/Rx Cleanup
191092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * for the separate queues...where Rx Cleanup >= Tx Cleanup.
191192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * Right now, we simply care about how many we'll get; we'll
191292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * set them up later while requesting irq's.
191392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 */
191492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	while (vectors >= vector_threshold) {
191592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		err = pci_enable_msix(adapter->pdev, adapter->msix_entries,
191692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				      vectors);
191792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (!err) /* Success in acquiring all requested vectors. */
191892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			break;
191992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		else if (err < 0)
192092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			vectors = 0; /* Nasty failure, quit now */
192192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		else /* err == number of vectors we should try again with */
192292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			vectors = err;
192392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
192492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
192592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (vectors < vector_threshold) {
192692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* Can't allocate enough MSI-X interrupts?  Oh well.
192792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		 * This just means we'll go with either a single MSI
192892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		 * vector or fall back to legacy interrupts.
192992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		 */
193092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		hw_dbg(&adapter->hw,
193192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		       "Unable to allocate MSI-X interrupts\n");
193292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		kfree(adapter->msix_entries);
193392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->msix_entries = NULL;
193492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	} else {
193592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/*
193692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		 * Adjust for only the vectors we'll use, which is minimum
193792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		 * of max_msix_q_vectors + NON_Q_VECTORS, or the number of
193892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		 * vectors we were allocated.
193992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		 */
194092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->num_msix_vectors = vectors;
194192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
194292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
194392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
194492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/*
194525985edcedea6396277003854657b5f3cb31a628Lucas De Marchi * ixgbevf_set_num_queues: Allocate queues for device, feature dependent
194692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure to initialize
194792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
194892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * This is the top level queue allocation routine.  The order here is very
194992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * important, starting with the "most" number of features turned on at once,
195092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * and ending with the smallest set of features.  This way large combinations
195192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * can be allocated if they're turned on, and smaller combinations are the
195292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * fallthrough conditions.
195392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
195492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
195592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_set_num_queues(struct ixgbevf_adapter *adapter)
195692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
195792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* Start with base case */
195892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->num_rx_queues = 1;
195992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->num_tx_queues = 1;
196092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->num_rx_pools = adapter->num_rx_queues;
196192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->num_rx_queues_per_pool = 1;
196292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
196392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
196492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
196592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_alloc_queues - Allocate memory for all rings
196692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure to initialize
196792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
196892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * We allocate one ring per queue at run-time since we don't know the
196992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * number of queues at compile-time.  The polling_netdev array is
197092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * intended for Multiqueue, but should work fine with a single queue.
197192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
197292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int ixgbevf_alloc_queues(struct ixgbevf_adapter *adapter)
197392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
197492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int i;
197592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
197692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->tx_ring = kcalloc(adapter->num_tx_queues,
197792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				   sizeof(struct ixgbevf_ring), GFP_KERNEL);
197892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (!adapter->tx_ring)
197992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto err_tx_ring_allocation;
198092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
198192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->rx_ring = kcalloc(adapter->num_rx_queues,
198292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				   sizeof(struct ixgbevf_ring), GFP_KERNEL);
198392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (!adapter->rx_ring)
198492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto err_rx_ring_allocation;
198592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
198692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < adapter->num_tx_queues; i++) {
198792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->tx_ring[i].count = adapter->tx_ring_count;
198892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->tx_ring[i].queue_index = i;
198992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->tx_ring[i].reg_idx = i;
199092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
199192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
199292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < adapter->num_rx_queues; i++) {
199392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->rx_ring[i].count = adapter->rx_ring_count;
199492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->rx_ring[i].queue_index = i;
199592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->rx_ring[i].reg_idx = i;
199692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
199792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
199892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return 0;
199992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
200092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseerr_rx_ring_allocation:
200192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	kfree(adapter->tx_ring);
200292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseerr_tx_ring_allocation:
200392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return -ENOMEM;
200492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
200592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
200692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
200792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_set_interrupt_capability - set MSI-X or FAIL if not supported
200892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure to initialize
200992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
201092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * Attempt to configure the interrupts using the best available
201192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * capabilities of the hardware and the kernel.
201292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
201392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int ixgbevf_set_interrupt_capability(struct ixgbevf_adapter *adapter)
201492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
201592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int err = 0;
201692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int vector, v_budget;
201792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
201892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/*
201992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * It's easy to be greedy for MSI-X vectors, but it really
202092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * doesn't do us much good if we have a lot more vectors
202192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * than CPU's.  So let's be conservative and only ask for
202292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * (roughly) twice the number of vectors as there are CPU's.
202392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 */
202492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	v_budget = min(adapter->num_rx_queues + adapter->num_tx_queues,
202592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		       (int)(num_online_cpus() * 2)) + NON_Q_VECTORS;
202692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
202792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* A failure in MSI-X entry allocation isn't fatal, but it does
202892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * mean we disable MSI-X capabilities of the adapter. */
202992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->msix_entries = kcalloc(v_budget,
203092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					sizeof(struct msix_entry), GFP_KERNEL);
203192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (!adapter->msix_entries) {
203292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		err = -ENOMEM;
203392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto out;
203492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
203592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
203692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (vector = 0; vector < v_budget; vector++)
203792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->msix_entries[vector].entry = vector;
203892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
203992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_acquire_msix_vectors(adapter, v_budget);
204092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
204192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseout:
204292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return err;
204392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
204492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
204592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
204692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_alloc_q_vectors - Allocate memory for interrupt vectors
204792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure to initialize
204892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
204992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * We allocate one q_vector per queue interrupt.  If allocation fails we
205092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * return -ENOMEM.
205192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
205292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int ixgbevf_alloc_q_vectors(struct ixgbevf_adapter *adapter)
205392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
205492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int q_idx, num_q_vectors;
205592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_q_vector *q_vector;
205692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int napi_vectors;
205792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int (*poll)(struct napi_struct *, int);
205892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
205992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	num_q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
206092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	napi_vectors = adapter->num_rx_queues;
206192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	poll = &ixgbevf_clean_rxonly;
206292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
206392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (q_idx = 0; q_idx < num_q_vectors; q_idx++) {
206492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		q_vector = kzalloc(sizeof(struct ixgbevf_q_vector), GFP_KERNEL);
206592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (!q_vector)
206692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			goto err_out;
206792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		q_vector->adapter = adapter;
206892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		q_vector->v_idx = q_idx;
206992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		q_vector->eitr = adapter->eitr_param;
207092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (q_idx < napi_vectors)
207192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			netif_napi_add(adapter->netdev, &q_vector->napi,
207292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				       (*poll), 64);
207392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->q_vector[q_idx] = q_vector;
207492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
207592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
207692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return 0;
207792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
207892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseerr_out:
207992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	while (q_idx) {
208092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		q_idx--;
208192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		q_vector = adapter->q_vector[q_idx];
208292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		netif_napi_del(&q_vector->napi);
208392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		kfree(q_vector);
208492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->q_vector[q_idx] = NULL;
208592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
208692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return -ENOMEM;
208792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
208892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
208992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
209092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_free_q_vectors - Free memory allocated for interrupt vectors
209192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure to initialize
209292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
209392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * This function frees the memory allocated to the q_vectors.  In addition if
209492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * NAPI is enabled it will delete any references to the NAPI struct prior
209592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * to freeing the q_vector.
209692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
209792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_free_q_vectors(struct ixgbevf_adapter *adapter)
209892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
209992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int q_idx, num_q_vectors;
210092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int napi_vectors;
210192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
210292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	num_q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
210392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	napi_vectors = adapter->num_rx_queues;
210492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
210592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (q_idx = 0; q_idx < num_q_vectors; q_idx++) {
210692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		struct ixgbevf_q_vector *q_vector = adapter->q_vector[q_idx];
210792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
210892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->q_vector[q_idx] = NULL;
210992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (q_idx < napi_vectors)
211092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			netif_napi_del(&q_vector->napi);
211192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		kfree(q_vector);
211292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
211392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
211492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
211592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
211692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_reset_interrupt_capability - Reset MSIX setup
211792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
211892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
211992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
212092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_reset_interrupt_capability(struct ixgbevf_adapter *adapter)
212192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
212292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	pci_disable_msix(adapter->pdev);
212392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	kfree(adapter->msix_entries);
212492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->msix_entries = NULL;
212592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
212692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
212792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
212892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_init_interrupt_scheme - Determine if MSIX is supported and init
212992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure to initialize
213092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
213192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
213292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int ixgbevf_init_interrupt_scheme(struct ixgbevf_adapter *adapter)
213392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
213492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int err;
213592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
213692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* Number of supported queues */
213792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_set_num_queues(adapter);
213892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
213992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	err = ixgbevf_set_interrupt_capability(adapter);
214092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (err) {
214192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		hw_dbg(&adapter->hw,
214292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		       "Unable to setup interrupt capabilities\n");
214392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto err_set_interrupt;
214492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
214592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
214692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	err = ixgbevf_alloc_q_vectors(adapter);
214792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (err) {
214892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		hw_dbg(&adapter->hw, "Unable to allocate memory for queue "
214992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		       "vectors\n");
215092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto err_alloc_q_vectors;
215192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
215292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
215392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	err = ixgbevf_alloc_queues(adapter);
215492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (err) {
2155dbd9636e281895cd3a15682f0966fb545ddff9e8Jeff Kirsher		pr_err("Unable to allocate memory for queues\n");
215692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto err_alloc_queues;
215792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
215892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
215992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	hw_dbg(&adapter->hw, "Multiqueue %s: Rx Queue count = %u, "
216092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	       "Tx Queue count = %u\n",
216192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	       (adapter->num_rx_queues > 1) ? "Enabled" :
216292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	       "Disabled", adapter->num_rx_queues, adapter->num_tx_queues);
216392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
216492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	set_bit(__IXGBEVF_DOWN, &adapter->state);
216592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
216692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return 0;
216792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseerr_alloc_queues:
216892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_free_q_vectors(adapter);
216992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseerr_alloc_q_vectors:
217092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_reset_interrupt_capability(adapter);
217192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseerr_set_interrupt:
217292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return err;
217392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
217492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
217592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
217692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_sw_init - Initialize general software structures
217792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * (struct ixgbevf_adapter)
217892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure to initialize
217992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
218092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_sw_init initializes the Adapter private data structure.
218192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * Fields are initialized based on PCI device information and
218292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * OS network device settings (MTU size).
218392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
218492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int __devinit ixgbevf_sw_init(struct ixgbevf_adapter *adapter)
218592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
218692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
218792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct pci_dev *pdev = adapter->pdev;
218892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int err;
218992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
219092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* PCI config space info */
219192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
219292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	hw->vendor_id = pdev->vendor;
219392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	hw->device_id = pdev->device;
2194ff938e43d39e926de74b32a3656c190f979ab642Sergei Shtylyov	hw->revision_id = pdev->revision;
219592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	hw->subsystem_vendor_id = pdev->subsystem_vendor;
219692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	hw->subsystem_device_id = pdev->subsystem_device;
219792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
219892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	hw->mbx.ops.init_params(hw);
219992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	hw->mac.max_tx_queues = MAX_TX_QUEUES;
220092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	hw->mac.max_rx_queues = MAX_RX_QUEUES;
220192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	err = hw->mac.ops.reset_hw(hw);
220292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (err) {
220392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		dev_info(&pdev->dev,
220492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		         "PF still in reset state, assigning new address\n");
22051a0d6ae5795c376bae6d012fb25e8341e4c6d5f2Danny Kukawka		eth_hw_addr_random(adapter->netdev);
22061a0d6ae5795c376bae6d012fb25e8341e4c6d5f2Danny Kukawka		memcpy(adapter->hw.mac.addr, adapter->netdev->dev_addr,
22071a0d6ae5795c376bae6d012fb25e8341e4c6d5f2Danny Kukawka			adapter->netdev->addr_len);
220892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	} else {
220992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		err = hw->mac.ops.init_hw(hw);
221092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (err) {
2211dbd9636e281895cd3a15682f0966fb545ddff9e8Jeff Kirsher			pr_err("init_shared_code failed: %d\n", err);
221292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			goto out;
221392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
22141a0d6ae5795c376bae6d012fb25e8341e4c6d5f2Danny Kukawka		memcpy(adapter->netdev->dev_addr, adapter->hw.mac.addr,
22151a0d6ae5795c376bae6d012fb25e8341e4c6d5f2Danny Kukawka			adapter->netdev->addr_len);
221692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
221792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
221892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* Enable dynamic interrupt throttling rates */
221992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->eitr_param = 20000;
222092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->itr_setting = 1;
222192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
222292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* set defaults for eitr in MegaBytes */
222392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->eitr_low = 10;
222492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->eitr_high = 20;
222592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
222692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* set default ring sizes */
222792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->tx_ring_count = IXGBEVF_DEFAULT_TXD;
222892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->rx_ring_count = IXGBEVF_DEFAULT_RXD;
222992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
223092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* enable rx csum by default */
223192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->flags |= IXGBE_FLAG_RX_CSUM_ENABLED;
223292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
223392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	set_bit(__IXGBEVF_DOWN, &adapter->state);
22341a0d6ae5795c376bae6d012fb25e8341e4c6d5f2Danny Kukawka	return 0;
223592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
223692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseout:
223792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return err;
223892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
223992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
224092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#define UPDATE_VF_COUNTER_32bit(reg, last_counter, counter)	\
224192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	{							\
224292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		u32 current_counter = IXGBE_READ_REG(hw, reg);	\
224392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (current_counter < last_counter)		\
224492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			counter += 0x100000000LL;		\
224592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		last_counter = current_counter;			\
224692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		counter &= 0xFFFFFFFF00000000LL;		\
224792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		counter |= current_counter;			\
224892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
224992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
225092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#define UPDATE_VF_COUNTER_36bit(reg_lsb, reg_msb, last_counter, counter) \
225192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	{								 \
225292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		u64 current_counter_lsb = IXGBE_READ_REG(hw, reg_lsb);	 \
225392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		u64 current_counter_msb = IXGBE_READ_REG(hw, reg_msb);	 \
225492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		u64 current_counter = (current_counter_msb << 32) |      \
225592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			current_counter_lsb;                             \
225692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (current_counter < last_counter)			 \
225792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			counter += 0x1000000000LL;			 \
225892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		last_counter = current_counter;				 \
225992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		counter &= 0xFFFFFFF000000000LL;			 \
226092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		counter |= current_counter;				 \
226192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
226292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
226392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_update_stats - Update the board statistics counters.
226492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
226592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
226692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosevoid ixgbevf_update_stats(struct ixgbevf_adapter *adapter)
226792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
226892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
226992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
227092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	UPDATE_VF_COUNTER_32bit(IXGBE_VFGPRC, adapter->stats.last_vfgprc,
227192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				adapter->stats.vfgprc);
227292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	UPDATE_VF_COUNTER_32bit(IXGBE_VFGPTC, adapter->stats.last_vfgptc,
227392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				adapter->stats.vfgptc);
227492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	UPDATE_VF_COUNTER_36bit(IXGBE_VFGORC_LSB, IXGBE_VFGORC_MSB,
227592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				adapter->stats.last_vfgorc,
227692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				adapter->stats.vfgorc);
227792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	UPDATE_VF_COUNTER_36bit(IXGBE_VFGOTC_LSB, IXGBE_VFGOTC_MSB,
227892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				adapter->stats.last_vfgotc,
227992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				adapter->stats.vfgotc);
228092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	UPDATE_VF_COUNTER_32bit(IXGBE_VFMPRC, adapter->stats.last_vfmprc,
228192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				adapter->stats.vfmprc);
228292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
228392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
228492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
228592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_watchdog - Timer Call-back
228692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @data: pointer to adapter cast into an unsigned long
228792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
228892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_watchdog(unsigned long data)
228992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
229092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = (struct ixgbevf_adapter *)data;
229192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
229292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u64 eics = 0;
229392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int i;
229492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
229592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/*
229692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * Do the watchdog outside of interrupt context due to the lovely
229792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * delays that some of the newer hardware requires
229892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 */
229992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
230092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (test_bit(__IXGBEVF_DOWN, &adapter->state))
230192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto watchdog_short_circuit;
230292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
230392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* get one bit for every active tx/rx interrupt vector */
230492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < adapter->num_msix_vectors - NON_Q_VECTORS; i++) {
230592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		struct ixgbevf_q_vector *qv = adapter->q_vector[i];
230692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (qv->rxr_count || qv->txr_count)
230792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			eics |= (1 << i);
230892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
230992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
231092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	IXGBE_WRITE_REG(hw, IXGBE_VTEICS, (u32)eics);
231192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
231292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosewatchdog_short_circuit:
231392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	schedule_work(&adapter->watchdog_task);
231492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
231592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
231692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
231792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_tx_timeout - Respond to a Tx Hang
231892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @netdev: network interface device structure
231992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
232092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_tx_timeout(struct net_device *netdev)
232192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
232292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
232392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
232492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* Do the reset outside of interrupt context */
232592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	schedule_work(&adapter->reset_task);
232692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
232792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
232892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_reset_task(struct work_struct *work)
232992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
233092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter;
233192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter = container_of(work, struct ixgbevf_adapter, reset_task);
233292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
233392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* If we're already down or resetting, just bail */
233492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (test_bit(__IXGBEVF_DOWN, &adapter->state) ||
233592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	    test_bit(__IXGBEVF_RESETTING, &adapter->state))
233692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		return;
233792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
233892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->tx_timeout_count++;
233992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
234092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_reinit_locked(adapter);
234192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
234292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
234392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
234492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_watchdog_task - worker thread to bring link up
234592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @work: pointer to work_struct containing our data
234692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
234792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_watchdog_task(struct work_struct *work)
234892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
234992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = container_of(work,
235092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose						       struct ixgbevf_adapter,
235192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose						       watchdog_task);
235292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct net_device *netdev = adapter->netdev;
235392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
235492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u32 link_speed = adapter->link_speed;
235592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	bool link_up = adapter->link_up;
235692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
235792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->flags |= IXGBE_FLAG_IN_WATCHDOG_TASK;
235892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
235992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/*
236092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * Always check the link on the watchdog because we have
236192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * no LSC interrupt
236292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 */
236392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (hw->mac.ops.check_link) {
236492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if ((hw->mac.ops.check_link(hw, &link_speed,
236592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					    &link_up, false)) != 0) {
236692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			adapter->link_up = link_up;
236792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			adapter->link_speed = link_speed;
2368da6b33306801af7ee6479c177051e70842974932Greg Rose			netif_carrier_off(netdev);
2369da6b33306801af7ee6479c177051e70842974932Greg Rose			netif_tx_stop_all_queues(netdev);
237092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			schedule_work(&adapter->reset_task);
237192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			goto pf_has_reset;
237292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
237392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	} else {
237492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* always assume link is up, if no check link
237592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		 * function */
237692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		link_speed = IXGBE_LINK_SPEED_10GB_FULL;
237792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		link_up = true;
237892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
237992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->link_up = link_up;
238092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->link_speed = link_speed;
238192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
238292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (link_up) {
238392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (!netif_carrier_ok(netdev)) {
2384300bc0602489d9f09f7b548f790afd2952f6070bJoe Perches			hw_dbg(&adapter->hw, "NIC Link is Up, %u Gbps\n",
2385300bc0602489d9f09f7b548f790afd2952f6070bJoe Perches			       (link_speed == IXGBE_LINK_SPEED_10GB_FULL) ?
2386300bc0602489d9f09f7b548f790afd2952f6070bJoe Perches			       10 : 1);
238792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			netif_carrier_on(netdev);
238892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			netif_tx_wake_all_queues(netdev);
238992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
239092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	} else {
239192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->link_up = false;
239292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->link_speed = 0;
239392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (netif_carrier_ok(netdev)) {
239492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			hw_dbg(&adapter->hw, "NIC Link is Down\n");
239592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			netif_carrier_off(netdev);
239692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			netif_tx_stop_all_queues(netdev);
239792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
239892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
239992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
240092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_update_stats(adapter);
240192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
240233bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rosepf_has_reset:
240392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* Reset the timer */
240492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (!test_bit(__IXGBEVF_DOWN, &adapter->state))
240592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		mod_timer(&adapter->watchdog_timer,
240692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			  round_jiffies(jiffies + (2 * HZ)));
240792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
240892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->flags &= ~IXGBE_FLAG_IN_WATCHDOG_TASK;
240992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
241092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
241192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
241292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_free_tx_resources - Free Tx Resources per Queue
241392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
241492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @tx_ring: Tx descriptor ring for a specific queue
241592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
241692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * Free all transmit software resources
241792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
241892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosevoid ixgbevf_free_tx_resources(struct ixgbevf_adapter *adapter,
241992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			       struct ixgbevf_ring *tx_ring)
242092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
242192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct pci_dev *pdev = adapter->pdev;
242292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
242392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_clean_tx_ring(adapter, tx_ring);
242492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
242592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	vfree(tx_ring->tx_buffer_info);
242692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_ring->tx_buffer_info = NULL;
242792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
24282a1f8794161d9d5d46881160279df62767197526Nick Nunley	dma_free_coherent(&pdev->dev, tx_ring->size, tx_ring->desc,
24292a1f8794161d9d5d46881160279df62767197526Nick Nunley			  tx_ring->dma);
243092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
243192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_ring->desc = NULL;
243292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
243392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
243492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
243592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_free_all_tx_resources - Free Tx Resources for All Queues
243692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
243792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
243892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * Free all transmit software resources
243992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
244092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_free_all_tx_resources(struct ixgbevf_adapter *adapter)
244192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
244292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int i;
244392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
244492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < adapter->num_tx_queues; i++)
244592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (adapter->tx_ring[i].desc)
244692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			ixgbevf_free_tx_resources(adapter,
244792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose						  &adapter->tx_ring[i]);
244892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
244992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
245092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
245192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
245292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_setup_tx_resources - allocate Tx resources (Descriptors)
245392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
245492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @tx_ring:    tx descriptor ring (for a specific queue) to setup
245592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
245692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * Return 0 on success, negative on failure
245792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
245892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseint ixgbevf_setup_tx_resources(struct ixgbevf_adapter *adapter,
245992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			       struct ixgbevf_ring *tx_ring)
246092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
246192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct pci_dev *pdev = adapter->pdev;
246292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int size;
246392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
246492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	size = sizeof(struct ixgbevf_tx_buffer) * tx_ring->count;
246589bf67f1f080c947c92f8773482d9e57767ca292Eric Dumazet	tx_ring->tx_buffer_info = vzalloc(size);
246692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (!tx_ring->tx_buffer_info)
246792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto err;
246892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
246992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* round up to nearest 4K */
247092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_ring->size = tx_ring->count * sizeof(union ixgbe_adv_tx_desc);
247192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_ring->size = ALIGN(tx_ring->size, 4096);
247292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
24732a1f8794161d9d5d46881160279df62767197526Nick Nunley	tx_ring->desc = dma_alloc_coherent(&pdev->dev, tx_ring->size,
24742a1f8794161d9d5d46881160279df62767197526Nick Nunley					   &tx_ring->dma, GFP_KERNEL);
247592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (!tx_ring->desc)
247692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto err;
247792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
247892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_ring->next_to_use = 0;
247992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_ring->next_to_clean = 0;
248092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_ring->work_limit = tx_ring->count;
248192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return 0;
248292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
248392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseerr:
248492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	vfree(tx_ring->tx_buffer_info);
248592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_ring->tx_buffer_info = NULL;
248692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	hw_dbg(&adapter->hw, "Unable to allocate memory for the transmit "
248792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	       "descriptor ring\n");
248892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return -ENOMEM;
248992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
249092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
249192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
249292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_setup_all_tx_resources - allocate all queues Tx resources
249392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
249492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
249592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * If this function returns with an error, then it's possible one or
249692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * more of the rings is populated (while the rest are not).  It is the
249792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * callers duty to clean those orphaned rings.
249892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
249992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * Return 0 on success, negative on failure
250092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
250192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int ixgbevf_setup_all_tx_resources(struct ixgbevf_adapter *adapter)
250292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
250392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int i, err = 0;
250492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
250592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < adapter->num_tx_queues; i++) {
250692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		err = ixgbevf_setup_tx_resources(adapter, &adapter->tx_ring[i]);
250792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (!err)
250892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			continue;
250992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		hw_dbg(&adapter->hw,
251092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		       "Allocation for Tx Queue %u failed\n", i);
251192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		break;
251292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
251392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
251492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return err;
251592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
251692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
251792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
251892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_setup_rx_resources - allocate Rx resources (Descriptors)
251992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
252092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @rx_ring:    rx descriptor ring (for a specific queue) to setup
252192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
252292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * Returns 0 on success, negative on failure
252392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
252492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseint ixgbevf_setup_rx_resources(struct ixgbevf_adapter *adapter,
252592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			       struct ixgbevf_ring *rx_ring)
252692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
252792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct pci_dev *pdev = adapter->pdev;
252892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int size;
252992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
253092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	size = sizeof(struct ixgbevf_rx_buffer) * rx_ring->count;
253189bf67f1f080c947c92f8773482d9e57767ca292Eric Dumazet	rx_ring->rx_buffer_info = vzalloc(size);
2532e404decb0fb017be80552adee894b35307b6c7b4Joe Perches	if (!rx_ring->rx_buffer_info)
253392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto alloc_failed;
253492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
253592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* Round up to nearest 4K */
253692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	rx_ring->size = rx_ring->count * sizeof(union ixgbe_adv_rx_desc);
253792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	rx_ring->size = ALIGN(rx_ring->size, 4096);
253892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
25392a1f8794161d9d5d46881160279df62767197526Nick Nunley	rx_ring->desc = dma_alloc_coherent(&pdev->dev, rx_ring->size,
25402a1f8794161d9d5d46881160279df62767197526Nick Nunley					   &rx_ring->dma, GFP_KERNEL);
254192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
254292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (!rx_ring->desc) {
254392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		hw_dbg(&adapter->hw,
254492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		       "Unable to allocate memory for "
254592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		       "the receive descriptor ring\n");
254692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		vfree(rx_ring->rx_buffer_info);
254792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		rx_ring->rx_buffer_info = NULL;
254892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto alloc_failed;
254992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
255092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
255192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	rx_ring->next_to_clean = 0;
255292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	rx_ring->next_to_use = 0;
255392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
255492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return 0;
255592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosealloc_failed:
255692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return -ENOMEM;
255792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
255892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
255992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
256092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_setup_all_rx_resources - allocate all queues Rx resources
256192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
256292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
256392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * If this function returns with an error, then it's possible one or
256492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * more of the rings is populated (while the rest are not).  It is the
256592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * callers duty to clean those orphaned rings.
256692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
256792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * Return 0 on success, negative on failure
256892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
256992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int ixgbevf_setup_all_rx_resources(struct ixgbevf_adapter *adapter)
257092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
257192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int i, err = 0;
257292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
257392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < adapter->num_rx_queues; i++) {
257492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		err = ixgbevf_setup_rx_resources(adapter, &adapter->rx_ring[i]);
257592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (!err)
257692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			continue;
257792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		hw_dbg(&adapter->hw,
257892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		       "Allocation for Rx Queue %u failed\n", i);
257992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		break;
258092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
258192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return err;
258292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
258392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
258492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
258592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_free_rx_resources - Free Rx Resources
258692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
258792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @rx_ring: ring to clean the resources from
258892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
258992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * Free all receive software resources
259092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
259192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosevoid ixgbevf_free_rx_resources(struct ixgbevf_adapter *adapter,
259292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			       struct ixgbevf_ring *rx_ring)
259392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
259492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct pci_dev *pdev = adapter->pdev;
259592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
259692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_clean_rx_ring(adapter, rx_ring);
259792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
259892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	vfree(rx_ring->rx_buffer_info);
259992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	rx_ring->rx_buffer_info = NULL;
260092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
26012a1f8794161d9d5d46881160279df62767197526Nick Nunley	dma_free_coherent(&pdev->dev, rx_ring->size, rx_ring->desc,
26022a1f8794161d9d5d46881160279df62767197526Nick Nunley			  rx_ring->dma);
260392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
260492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	rx_ring->desc = NULL;
260592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
260692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
260792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
260892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_free_all_rx_resources - Free Rx Resources for All Queues
260992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @adapter: board private structure
261092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
261192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * Free all receive software resources
261292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
261392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_free_all_rx_resources(struct ixgbevf_adapter *adapter)
261492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
261592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int i;
261692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
261792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (i = 0; i < adapter->num_rx_queues; i++)
261892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (adapter->rx_ring[i].desc)
261992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			ixgbevf_free_rx_resources(adapter,
262092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose						  &adapter->rx_ring[i]);
262192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
262292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
262392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
262492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_open - Called when a network interface is made active
262592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @netdev: network interface device structure
262692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
262792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * Returns 0 on success, negative value on failure
262892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
262992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * The open entry point is called when a network interface is made
263092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * active by the system (IFF_UP).  At this point all resources needed
263192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * for transmit and receive operations are allocated, the interrupt
263292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * handler is registered with the OS, the watchdog timer is started,
263392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * and the stack is notified that the interface is ready.
263492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
263592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int ixgbevf_open(struct net_device *netdev)
263692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
263792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
263892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
263992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int err;
264092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
264192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* disallow open during test */
264292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (test_bit(__IXGBEVF_TESTING, &adapter->state))
264392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		return -EBUSY;
264492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
264592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (hw->adapter_stopped) {
264692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_reset(adapter);
264792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* if adapter is still stopped then PF isn't up and
264892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		 * the vf can't start. */
264992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (hw->adapter_stopped) {
265092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			err = IXGBE_ERR_MBX;
2651dbd9636e281895cd3a15682f0966fb545ddff9e8Jeff Kirsher			pr_err("Unable to start - perhaps the PF Driver isn't "
2652dbd9636e281895cd3a15682f0966fb545ddff9e8Jeff Kirsher			       "up yet\n");
265392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			goto err_setup_reset;
265492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
265592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
265692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
265792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* allocate transmit descriptors */
265892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	err = ixgbevf_setup_all_tx_resources(adapter);
265992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (err)
266092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto err_setup_tx;
266192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
266292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* allocate receive descriptors */
266392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	err = ixgbevf_setup_all_rx_resources(adapter);
266492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (err)
266592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto err_setup_rx;
266692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
266792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_configure(adapter);
266892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
266992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/*
267092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * Map the Tx/Rx rings to the vectors we were allotted.
267192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * if request_irq will be called in this function map_rings
267292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * must be called *before* up_complete
267392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 */
267492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_map_rings_to_vectors(adapter);
267592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
267692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	err = ixgbevf_up_complete(adapter);
267792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (err)
267892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto err_up;
267992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
268092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* clear any pending interrupts, may auto mask */
268192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	IXGBE_READ_REG(hw, IXGBE_VTEICR);
268292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	err = ixgbevf_request_irq(adapter);
268392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (err)
268492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto err_req_irq;
268592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
268692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_irq_enable(adapter, true, true);
268792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
268892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return 0;
268992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
269092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseerr_req_irq:
269192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_down(adapter);
269292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseerr_up:
269392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_free_irq(adapter);
269492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseerr_setup_rx:
269592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_free_all_rx_resources(adapter);
269692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseerr_setup_tx:
269792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_free_all_tx_resources(adapter);
269892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_reset(adapter);
269992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
270092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseerr_setup_reset:
270192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
270292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return err;
270392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
270492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
270592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
270692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_close - Disables a network interface
270792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @netdev: network interface device structure
270892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
270992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * Returns 0, this is not allowed to fail
271092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
271192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * The close entry point is called when an interface is de-activated
271292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * by the OS.  The hardware is still under the drivers control, but
271392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * needs to be disabled.  A global MAC reset is issued to stop the
271492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * hardware, and all transmit and receive resources are freed.
271592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
271692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int ixgbevf_close(struct net_device *netdev)
271792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
271892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
271992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
272092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_down(adapter);
272192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_free_irq(adapter);
272292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
272392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_free_all_tx_resources(adapter);
272492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_free_all_rx_resources(adapter);
272592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
272692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return 0;
272792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
272892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
272992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int ixgbevf_tso(struct ixgbevf_adapter *adapter,
273092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		       struct ixgbevf_ring *tx_ring,
273192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		       struct sk_buff *skb, u32 tx_flags, u8 *hdr_len)
273292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
273392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_adv_tx_context_desc *context_desc;
273492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	unsigned int i;
273592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int err;
273692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_tx_buffer *tx_buffer_info;
273792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u32 vlan_macip_lens = 0, type_tucmd_mlhl;
273892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u32 mss_l4len_idx, l4len;
273992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
274092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (skb_is_gso(skb)) {
274192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (skb_header_cloned(skb)) {
274292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
274392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			if (err)
274492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				return err;
274592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
274692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		l4len = tcp_hdrlen(skb);
274792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		*hdr_len += l4len;
274892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
274992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (skb->protocol == htons(ETH_P_IP)) {
275092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			struct iphdr *iph = ip_hdr(skb);
275192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			iph->tot_len = 0;
275292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			iph->check = 0;
275392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			tcp_hdr(skb)->check = ~csum_tcpudp_magic(iph->saddr,
275492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose								 iph->daddr, 0,
275592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose								 IPPROTO_TCP,
275692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose								 0);
275792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			adapter->hw_tso_ctxt++;
27589010bc3364db56dd88a1851e0797e597e322ce08Jeff Kirsher		} else if (skb_is_gso_v6(skb)) {
275992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			ipv6_hdr(skb)->payload_len = 0;
276092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			tcp_hdr(skb)->check =
276192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			    ~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
276292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					     &ipv6_hdr(skb)->daddr,
276392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					     0, IPPROTO_TCP, 0);
276492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			adapter->hw_tso6_ctxt++;
276592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
276692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
276792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		i = tx_ring->next_to_use;
276892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
276992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_buffer_info = &tx_ring->tx_buffer_info[i];
277092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		context_desc = IXGBE_TX_CTXTDESC_ADV(*tx_ring, i);
277192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
277292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* VLAN MACLEN IPLEN */
277392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (tx_flags & IXGBE_TX_FLAGS_VLAN)
277492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			vlan_macip_lens |=
277592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				(tx_flags & IXGBE_TX_FLAGS_VLAN_MASK);
277692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		vlan_macip_lens |= ((skb_network_offset(skb)) <<
277792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				    IXGBE_ADVTXD_MACLEN_SHIFT);
277892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		*hdr_len += skb_network_offset(skb);
277992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		vlan_macip_lens |=
278092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			(skb_transport_header(skb) - skb_network_header(skb));
278192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		*hdr_len +=
278292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			(skb_transport_header(skb) - skb_network_header(skb));
278392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		context_desc->vlan_macip_lens = cpu_to_le32(vlan_macip_lens);
278492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		context_desc->seqnum_seed = 0;
278592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
278692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* ADV DTYP TUCMD MKRLOC/ISCSIHEDLEN */
278792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		type_tucmd_mlhl = (IXGBE_TXD_CMD_DEXT |
278892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				    IXGBE_ADVTXD_DTYP_CTXT);
278992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
279092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (skb->protocol == htons(ETH_P_IP))
279192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV4;
279292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_TCP;
279392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		context_desc->type_tucmd_mlhl = cpu_to_le32(type_tucmd_mlhl);
279492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
279592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* MSS L4LEN IDX */
279692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		mss_l4len_idx =
279792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			(skb_shinfo(skb)->gso_size << IXGBE_ADVTXD_MSS_SHIFT);
279892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		mss_l4len_idx |= (l4len << IXGBE_ADVTXD_L4LEN_SHIFT);
279992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* use index 1 for TSO */
280092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		mss_l4len_idx |= (1 << IXGBE_ADVTXD_IDX_SHIFT);
280192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		context_desc->mss_l4len_idx = cpu_to_le32(mss_l4len_idx);
280292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
280392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_buffer_info->time_stamp = jiffies;
280492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_buffer_info->next_to_watch = i;
280592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
280692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		i++;
280792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (i == tx_ring->count)
280892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			i = 0;
280992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_ring->next_to_use = i;
281092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
281192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		return true;
281292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
281392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
281492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return false;
281592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
281692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
281792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic bool ixgbevf_tx_csum(struct ixgbevf_adapter *adapter,
281892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			    struct ixgbevf_ring *tx_ring,
281992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			    struct sk_buff *skb, u32 tx_flags)
282092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
282192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_adv_tx_context_desc *context_desc;
282292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	unsigned int i;
282392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_tx_buffer *tx_buffer_info;
282492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u32 vlan_macip_lens = 0, type_tucmd_mlhl = 0;
282592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
282692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (skb->ip_summed == CHECKSUM_PARTIAL ||
282792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	    (tx_flags & IXGBE_TX_FLAGS_VLAN)) {
282892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		i = tx_ring->next_to_use;
282992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_buffer_info = &tx_ring->tx_buffer_info[i];
283092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		context_desc = IXGBE_TX_CTXTDESC_ADV(*tx_ring, i);
283192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
283292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (tx_flags & IXGBE_TX_FLAGS_VLAN)
283392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			vlan_macip_lens |= (tx_flags &
283492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					    IXGBE_TX_FLAGS_VLAN_MASK);
283592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		vlan_macip_lens |= (skb_network_offset(skb) <<
283692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				    IXGBE_ADVTXD_MACLEN_SHIFT);
283792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (skb->ip_summed == CHECKSUM_PARTIAL)
283892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			vlan_macip_lens |= (skb_transport_header(skb) -
283992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					    skb_network_header(skb));
284092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
284192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		context_desc->vlan_macip_lens = cpu_to_le32(vlan_macip_lens);
284292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		context_desc->seqnum_seed = 0;
284392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
284492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		type_tucmd_mlhl |= (IXGBE_TXD_CMD_DEXT |
284592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				    IXGBE_ADVTXD_DTYP_CTXT);
284692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
284792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (skb->ip_summed == CHECKSUM_PARTIAL) {
284892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			switch (skb->protocol) {
284992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			case __constant_htons(ETH_P_IP):
285092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV4;
285192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				if (ip_hdr(skb)->protocol == IPPROTO_TCP)
285292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					type_tucmd_mlhl |=
285392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					    IXGBE_ADVTXD_TUCMD_L4T_TCP;
285492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				break;
285592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			case __constant_htons(ETH_P_IPV6):
285692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				/* XXX what about other V6 headers?? */
285792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP)
285892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					type_tucmd_mlhl |=
285992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose						IXGBE_ADVTXD_TUCMD_L4T_TCP;
286092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				break;
286192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			default:
286292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				if (unlikely(net_ratelimit())) {
2863dbd9636e281895cd3a15682f0966fb545ddff9e8Jeff Kirsher					pr_warn("partial checksum but "
2864dbd9636e281895cd3a15682f0966fb545ddff9e8Jeff Kirsher						"proto=%x!\n", skb->protocol);
286592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				}
286692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				break;
286792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			}
286892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
286992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
287092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		context_desc->type_tucmd_mlhl = cpu_to_le32(type_tucmd_mlhl);
287192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* use index zero for tx checksum offload */
287292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		context_desc->mss_l4len_idx = 0;
287392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
287492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_buffer_info->time_stamp = jiffies;
287592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_buffer_info->next_to_watch = i;
287692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
287792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->hw_csum_tx_good++;
287892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		i++;
287992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (i == tx_ring->count)
288092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			i = 0;
288192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_ring->next_to_use = i;
288292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
288392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		return true;
288492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
288592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
288692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return false;
288792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
288892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
288992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int ixgbevf_tx_map(struct ixgbevf_adapter *adapter,
289092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			  struct ixgbevf_ring *tx_ring,
289192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			  struct sk_buff *skb, u32 tx_flags,
289292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			  unsigned int first)
289392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
289492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct pci_dev *pdev = adapter->pdev;
289592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_tx_buffer *tx_buffer_info;
289692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	unsigned int len;
289792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	unsigned int total = skb->len;
28982540ddb5124f883bba3d4af5d8920d44dd66e794Kulikov Vasiliy	unsigned int offset = 0, size;
28992540ddb5124f883bba3d4af5d8920d44dd66e794Kulikov Vasiliy	int count = 0;
290092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	unsigned int nr_frags = skb_shinfo(skb)->nr_frags;
290192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	unsigned int f;
290265deeed7b34bc5b8d3cbff495e8fa2ae7b563480Greg Rose	int i;
290392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
290492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	i = tx_ring->next_to_use;
290592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
290692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	len = min(skb_headlen(skb), total);
290792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	while (len) {
290892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_buffer_info = &tx_ring->tx_buffer_info[i];
290992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		size = min(len, (unsigned int)IXGBE_MAX_DATA_PER_TXD);
291092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
291192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_buffer_info->length = size;
291292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_buffer_info->mapped_as_page = false;
29132a1f8794161d9d5d46881160279df62767197526Nick Nunley		tx_buffer_info->dma = dma_map_single(&adapter->pdev->dev,
291492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose						     skb->data + offset,
29152a1f8794161d9d5d46881160279df62767197526Nick Nunley						     size, DMA_TO_DEVICE);
29162a1f8794161d9d5d46881160279df62767197526Nick Nunley		if (dma_mapping_error(&pdev->dev, tx_buffer_info->dma))
291792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			goto dma_error;
291892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_buffer_info->time_stamp = jiffies;
291992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_buffer_info->next_to_watch = i;
292092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
292192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		len -= size;
292292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		total -= size;
292392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		offset += size;
292492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		count++;
292592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		i++;
292692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (i == tx_ring->count)
292792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			i = 0;
292892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
292992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
293092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (f = 0; f < nr_frags; f++) {
29319e903e085262ffbf1fc44a17ac06058aca03524aEric Dumazet		const struct skb_frag_struct *frag;
293292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
293392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		frag = &skb_shinfo(skb)->frags[f];
29349e903e085262ffbf1fc44a17ac06058aca03524aEric Dumazet		len = min((unsigned int)skb_frag_size(frag), total);
2935877749bf3f2f7a517ae74cd2c2fa4eed7aa9b51dIan Campbell		offset = 0;
293692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
293792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		while (len) {
293892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			tx_buffer_info = &tx_ring->tx_buffer_info[i];
293992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			size = min(len, (unsigned int)IXGBE_MAX_DATA_PER_TXD);
294092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
294192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			tx_buffer_info->length = size;
2942877749bf3f2f7a517ae74cd2c2fa4eed7aa9b51dIan Campbell			tx_buffer_info->dma =
2943877749bf3f2f7a517ae74cd2c2fa4eed7aa9b51dIan Campbell				skb_frag_dma_map(&adapter->pdev->dev, frag,
2944877749bf3f2f7a517ae74cd2c2fa4eed7aa9b51dIan Campbell						 offset, size, DMA_TO_DEVICE);
294592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			tx_buffer_info->mapped_as_page = true;
29462a1f8794161d9d5d46881160279df62767197526Nick Nunley			if (dma_mapping_error(&pdev->dev, tx_buffer_info->dma))
294792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				goto dma_error;
294892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			tx_buffer_info->time_stamp = jiffies;
294992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			tx_buffer_info->next_to_watch = i;
295092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
295192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			len -= size;
295292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			total -= size;
295392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			offset += size;
295492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			count++;
295592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			i++;
295692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			if (i == tx_ring->count)
295792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				i = 0;
295892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
295992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (total == 0)
296092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			break;
296192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
296292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
296392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (i == 0)
296492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		i = tx_ring->count - 1;
296592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	else
296692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		i = i - 1;
296792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_ring->tx_buffer_info[i].skb = skb;
296892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_ring->tx_buffer_info[first].next_to_watch = i;
296992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
297092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return count;
297192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
297292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosedma_error:
297392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	dev_err(&pdev->dev, "TX DMA map failed\n");
297492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
297592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* clear timestamp and dma mappings for failed tx_buffer_info map */
297692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_buffer_info->dma = 0;
297792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_buffer_info->time_stamp = 0;
297892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_buffer_info->next_to_watch = 0;
297992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	count--;
298092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
298192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* clear timestamp and dma mappings for remaining portion of packet */
298292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	while (count >= 0) {
298392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		count--;
298492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		i--;
298592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (i < 0)
298692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			i += tx_ring->count;
298792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_buffer_info = &tx_ring->tx_buffer_info[i];
298892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_unmap_and_free_tx_resource(adapter, tx_buffer_info);
298992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
299092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
299192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return count;
299292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
299392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
299492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_tx_queue(struct ixgbevf_adapter *adapter,
299592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			     struct ixgbevf_ring *tx_ring, int tx_flags,
299692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			     int count, u32 paylen, u8 hdr_len)
299792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
299892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	union ixgbe_adv_tx_desc *tx_desc = NULL;
299992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_tx_buffer *tx_buffer_info;
300092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u32 olinfo_status = 0, cmd_type_len = 0;
300192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	unsigned int i;
300292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
300392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u32 txd_cmd = IXGBE_TXD_CMD_EOP | IXGBE_TXD_CMD_RS | IXGBE_TXD_CMD_IFCS;
300492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
300592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	cmd_type_len |= IXGBE_ADVTXD_DTYP_DATA;
300692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
300792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	cmd_type_len |= IXGBE_ADVTXD_DCMD_IFCS | IXGBE_ADVTXD_DCMD_DEXT;
300892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
300992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (tx_flags & IXGBE_TX_FLAGS_VLAN)
301092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		cmd_type_len |= IXGBE_ADVTXD_DCMD_VLE;
301192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
301292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (tx_flags & IXGBE_TX_FLAGS_TSO) {
301392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		cmd_type_len |= IXGBE_ADVTXD_DCMD_TSE;
301492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
301592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		olinfo_status |= IXGBE_TXD_POPTS_TXSM <<
301692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			IXGBE_ADVTXD_POPTS_SHIFT;
301792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
301892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		/* use index 1 context for tso */
301992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		olinfo_status |= (1 << IXGBE_ADVTXD_IDX_SHIFT);
302092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (tx_flags & IXGBE_TX_FLAGS_IPV4)
302192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			olinfo_status |= IXGBE_TXD_POPTS_IXSM <<
302292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				IXGBE_ADVTXD_POPTS_SHIFT;
302392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
302492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	} else if (tx_flags & IXGBE_TX_FLAGS_CSUM)
302592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		olinfo_status |= IXGBE_TXD_POPTS_TXSM <<
302692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			IXGBE_ADVTXD_POPTS_SHIFT;
302792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
302892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	olinfo_status |= ((paylen - hdr_len) << IXGBE_ADVTXD_PAYLEN_SHIFT);
302992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
303092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	i = tx_ring->next_to_use;
303192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	while (count--) {
303292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_buffer_info = &tx_ring->tx_buffer_info[i];
303392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_desc = IXGBE_TX_DESC_ADV(*tx_ring, i);
303492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_desc->read.buffer_addr = cpu_to_le64(tx_buffer_info->dma);
303592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_desc->read.cmd_type_len =
303692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			cpu_to_le32(cmd_type_len | tx_buffer_info->length);
303792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_desc->read.olinfo_status = cpu_to_le32(olinfo_status);
303892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		i++;
303992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (i == tx_ring->count)
304092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			i = 0;
304192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
304292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
304392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_desc->read.cmd_type_len |= cpu_to_le32(txd_cmd);
304492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
304592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/*
304692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * Force memory writes to complete before letting h/w
304792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * know there are new descriptors to fetch.  (Only
304892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * applicable for weak-ordered memory model archs,
304992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * such as IA-64).
305092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 */
305192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	wmb();
305292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
305392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_ring->next_to_use = i;
305492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	writel(i, adapter->hw.hw_addr + tx_ring->tail);
305592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
305692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
305792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int __ixgbevf_maybe_stop_tx(struct net_device *netdev,
305892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				   struct ixgbevf_ring *tx_ring, int size)
305992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
306092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
306192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
306292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	netif_stop_subqueue(netdev, tx_ring->queue_index);
306392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* Herbert's original patch had:
306492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 *  smp_mb__after_netif_stop_queue();
306592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * but since that doesn't exist yet, just open code it. */
306692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	smp_mb();
306792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
306892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* We need to check again in a case another CPU has just
306992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * made room available. */
307092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (likely(IXGBE_DESC_UNUSED(tx_ring) < size))
307192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		return -EBUSY;
307292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
307392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* A reprieve! - use start_queue because it doesn't call schedule */
307492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	netif_start_subqueue(netdev, tx_ring->queue_index);
307592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	++adapter->restart_queue;
307692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return 0;
307792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
307892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
307992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int ixgbevf_maybe_stop_tx(struct net_device *netdev,
308092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				 struct ixgbevf_ring *tx_ring, int size)
308192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
308292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (likely(IXGBE_DESC_UNUSED(tx_ring) >= size))
308392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		return 0;
308492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return __ixgbevf_maybe_stop_tx(netdev, tx_ring, size);
308592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
308692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
308792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int ixgbevf_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
308892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
308992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
309092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_ring *tx_ring;
309192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	unsigned int first;
309292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	unsigned int tx_flags = 0;
309392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	u8 hdr_len = 0;
309492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int r_idx = 0, tso;
309592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int count = 0;
309692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
309792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	unsigned int f;
309892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
309992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tx_ring = &adapter->tx_ring[r_idx];
310092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
3101eab6d18d20fc5b5ba04a7e7fcd6f357197870e51Jesse Gross	if (vlan_tx_tag_present(skb)) {
310292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_flags |= vlan_tx_tag_get(skb);
310392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_flags <<= IXGBE_TX_FLAGS_VLAN_SHIFT;
310492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_flags |= IXGBE_TX_FLAGS_VLAN;
310592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
310692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
310792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* four things can cause us to need a context descriptor */
310892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (skb_is_gso(skb) ||
310992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	    (skb->ip_summed == CHECKSUM_PARTIAL) ||
311092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	    (tx_flags & IXGBE_TX_FLAGS_VLAN))
311192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		count++;
311292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
311392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	count += TXD_USE_COUNT(skb_headlen(skb));
311492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	for (f = 0; f < skb_shinfo(skb)->nr_frags; f++)
31159e903e085262ffbf1fc44a17ac06058aca03524aEric Dumazet		count += TXD_USE_COUNT(skb_frag_size(&skb_shinfo(skb)->frags[f]));
311692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
311792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (ixgbevf_maybe_stop_tx(netdev, tx_ring, count)) {
311892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->tx_busy++;
311992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		return NETDEV_TX_BUSY;
312092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
312192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
312292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	first = tx_ring->next_to_use;
312392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
312492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (skb->protocol == htons(ETH_P_IP))
312592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_flags |= IXGBE_TX_FLAGS_IPV4;
312692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	tso = ixgbevf_tso(adapter, tx_ring, skb, tx_flags, &hdr_len);
312792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (tso < 0) {
312892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		dev_kfree_skb_any(skb);
312992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		return NETDEV_TX_OK;
313092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
313192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
313292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (tso)
313392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_flags |= IXGBE_TX_FLAGS_TSO;
313492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	else if (ixgbevf_tx_csum(adapter, tx_ring, skb, tx_flags) &&
313592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		 (skb->ip_summed == CHECKSUM_PARTIAL))
313692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		tx_flags |= IXGBE_TX_FLAGS_CSUM;
313792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
313892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_tx_queue(adapter, tx_ring, tx_flags,
313992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			 ixgbevf_tx_map(adapter, tx_ring, skb, tx_flags, first),
314092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			 skb->len, hdr_len);
314192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
314292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_maybe_stop_tx(netdev, tx_ring, DESC_NEEDED);
314392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
314492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return NETDEV_TX_OK;
314592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
314692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
314792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
314892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_set_mac - Change the Ethernet Address of the NIC
314992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @netdev: network interface device structure
315092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @p: pointer to an address structure
315192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
315292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * Returns 0 on success, negative on failure
315392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
315492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int ixgbevf_set_mac(struct net_device *netdev, void *p)
315592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
315692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
315792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = &adapter->hw;
315892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct sockaddr *addr = p;
315992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
316092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (!is_valid_ether_addr(addr->sa_data))
316192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		return -EADDRNOTAVAIL;
316292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
316392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
316492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	memcpy(hw->mac.addr, addr->sa_data, netdev->addr_len);
316592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
316692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (hw->mac.ops.set_rar)
316792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0);
316892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
316992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return 0;
317092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
317192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
317292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
317392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_change_mtu - Change the Maximum Transfer Unit
317492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @netdev: network interface device structure
317592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @new_mtu: new value for maximum frame size
317692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
317792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * Returns 0 on success, negative on failure
317892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
317992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int ixgbevf_change_mtu(struct net_device *netdev, int new_mtu)
318092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
318192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
318269bfbec47d1c120f66f2f24d5f2cb13a72fc88dfGreg Rose	struct ixgbe_hw *hw = &adapter->hw;
318392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
318469bfbec47d1c120f66f2f24d5f2cb13a72fc88dfGreg Rose	int max_possible_frame = MAXIMUM_ETHERNET_VLAN_SIZE;
318569bfbec47d1c120f66f2f24d5f2cb13a72fc88dfGreg Rose	u32 msg[2];
318669bfbec47d1c120f66f2f24d5f2cb13a72fc88dfGreg Rose
318769bfbec47d1c120f66f2f24d5f2cb13a72fc88dfGreg Rose	if (adapter->hw.mac.type == ixgbe_mac_X540_vf)
318869bfbec47d1c120f66f2f24d5f2cb13a72fc88dfGreg Rose		max_possible_frame = IXGBE_MAX_JUMBO_FRAME_SIZE;
318992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
319092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* MTU < 68 is an error and causes problems on some kernels */
319169bfbec47d1c120f66f2f24d5f2cb13a72fc88dfGreg Rose	if ((new_mtu < 68) || (max_frame > max_possible_frame))
319292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		return -EINVAL;
319392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
319492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	hw_dbg(&adapter->hw, "changing MTU from %d to %d\n",
319592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	       netdev->mtu, new_mtu);
319692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* must set new MTU before calling down or up */
319792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	netdev->mtu = new_mtu;
319892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
319969bfbec47d1c120f66f2f24d5f2cb13a72fc88dfGreg Rose	msg[0] = IXGBE_VF_SET_LPE;
320069bfbec47d1c120f66f2f24d5f2cb13a72fc88dfGreg Rose	msg[1] = max_frame;
320169bfbec47d1c120f66f2f24d5f2cb13a72fc88dfGreg Rose	hw->mbx.ops.write_posted(hw, msg, 2);
320269bfbec47d1c120f66f2f24d5f2cb13a72fc88dfGreg Rose
320392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (netif_running(netdev))
320492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_reinit_locked(adapter);
320592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
320692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return 0;
320792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
320892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
320992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_shutdown(struct pci_dev *pdev)
321092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
321192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct net_device *netdev = pci_get_drvdata(pdev);
321292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
321392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
321492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	netif_device_detach(netdev);
321592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
321692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (netif_running(netdev)) {
321792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_down(adapter);
321892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_free_irq(adapter);
321992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_free_all_tx_resources(adapter);
322092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		ixgbevf_free_all_rx_resources(adapter);
322192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
322292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
322392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#ifdef CONFIG_PM
322492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	pci_save_state(pdev);
322592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#endif
322692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
322792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	pci_disable_device(pdev);
322892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
322992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
32304197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazetstatic struct rtnl_link_stats64 *ixgbevf_get_stats(struct net_device *netdev,
32314197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet						struct rtnl_link_stats64 *stats)
32324197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet{
32334197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
32344197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet	unsigned int start;
32354197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet	u64 bytes, packets;
32364197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet	const struct ixgbevf_ring *ring;
32374197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet	int i;
32384197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet
32394197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet	ixgbevf_update_stats(adapter);
32404197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet
32414197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet	stats->multicast = adapter->stats.vfmprc - adapter->stats.base_vfmprc;
32424197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet
32434197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet	for (i = 0; i < adapter->num_rx_queues; i++) {
32444197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet		ring = &adapter->rx_ring[i];
32454197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet		do {
32464197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet			start = u64_stats_fetch_begin_bh(&ring->syncp);
32474197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet			bytes = ring->total_bytes;
32484197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet			packets = ring->total_packets;
32494197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet		} while (u64_stats_fetch_retry_bh(&ring->syncp, start));
32504197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet		stats->rx_bytes += bytes;
32514197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet		stats->rx_packets += packets;
32524197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet	}
32534197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet
32544197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet	for (i = 0; i < adapter->num_tx_queues; i++) {
32554197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet		ring = &adapter->tx_ring[i];
32564197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet		do {
32574197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet			start = u64_stats_fetch_begin_bh(&ring->syncp);
32584197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet			bytes = ring->total_bytes;
32594197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet			packets = ring->total_packets;
32604197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet		} while (u64_stats_fetch_retry_bh(&ring->syncp, start));
32614197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet		stats->tx_bytes += bytes;
32624197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet		stats->tx_packets += packets;
32634197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet	}
32644197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet
32654197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet	return stats;
32664197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet}
32674197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet
3268c8f44affb7244f2ac3e703cab13d55ede27621bbMichał Mirosławstatic int ixgbevf_set_features(struct net_device *netdev,
3269c8f44affb7244f2ac3e703cab13d55ede27621bbMichał Mirosław	netdev_features_t features)
3270471a76ded87d3375a3449dfa3d1cec567edd0c50Michał Mirosław{
3271471a76ded87d3375a3449dfa3d1cec567edd0c50Michał Mirosław	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
3272471a76ded87d3375a3449dfa3d1cec567edd0c50Michał Mirosław
3273471a76ded87d3375a3449dfa3d1cec567edd0c50Michał Mirosław	if (features & NETIF_F_RXCSUM)
3274471a76ded87d3375a3449dfa3d1cec567edd0c50Michał Mirosław		adapter->flags |= IXGBE_FLAG_RX_CSUM_ENABLED;
3275471a76ded87d3375a3449dfa3d1cec567edd0c50Michał Mirosław	else
3276471a76ded87d3375a3449dfa3d1cec567edd0c50Michał Mirosław		adapter->flags &= ~IXGBE_FLAG_RX_CSUM_ENABLED;
3277471a76ded87d3375a3449dfa3d1cec567edd0c50Michał Mirosław
3278471a76ded87d3375a3449dfa3d1cec567edd0c50Michał Mirosław	return 0;
3279471a76ded87d3375a3449dfa3d1cec567edd0c50Michał Mirosław}
3280471a76ded87d3375a3449dfa3d1cec567edd0c50Michał Mirosław
328192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic const struct net_device_ops ixgbe_netdev_ops = {
3282c12db7695e1f52b27108c3dfde3cf655a0368c58Stephen Hemminger	.ndo_open		= ixgbevf_open,
3283c12db7695e1f52b27108c3dfde3cf655a0368c58Stephen Hemminger	.ndo_stop		= ixgbevf_close,
3284c12db7695e1f52b27108c3dfde3cf655a0368c58Stephen Hemminger	.ndo_start_xmit		= ixgbevf_xmit_frame,
3285c12db7695e1f52b27108c3dfde3cf655a0368c58Stephen Hemminger	.ndo_set_rx_mode	= ixgbevf_set_rx_mode,
32864197aa7bb81877ebb06e4f2cc1b5fea2da23a7bdEric Dumazet	.ndo_get_stats64	= ixgbevf_get_stats,
328792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	.ndo_validate_addr	= eth_validate_addr,
3288c12db7695e1f52b27108c3dfde3cf655a0368c58Stephen Hemminger	.ndo_set_mac_address	= ixgbevf_set_mac,
3289c12db7695e1f52b27108c3dfde3cf655a0368c58Stephen Hemminger	.ndo_change_mtu		= ixgbevf_change_mtu,
3290c12db7695e1f52b27108c3dfde3cf655a0368c58Stephen Hemminger	.ndo_tx_timeout		= ixgbevf_tx_timeout,
3291c12db7695e1f52b27108c3dfde3cf655a0368c58Stephen Hemminger	.ndo_vlan_rx_add_vid	= ixgbevf_vlan_rx_add_vid,
3292c12db7695e1f52b27108c3dfde3cf655a0368c58Stephen Hemminger	.ndo_vlan_rx_kill_vid	= ixgbevf_vlan_rx_kill_vid,
3293471a76ded87d3375a3449dfa3d1cec567edd0c50Michał Mirosław	.ndo_set_features	= ixgbevf_set_features,
329492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose};
329592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
329692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void ixgbevf_assign_netdev_ops(struct net_device *dev)
329792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
329892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	dev->netdev_ops = &ixgbe_netdev_ops;
329992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_set_ethtool_ops(dev);
330092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	dev->watchdog_timeo = 5 * HZ;
330192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
330292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
330392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
330492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_probe - Device Initialization Routine
330592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @pdev: PCI device information struct
330692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @ent: entry in ixgbevf_pci_tbl
330792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
330892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * Returns 0 on success, negative on failure
330992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
331092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_probe initializes an adapter identified by a pci_dev structure.
331192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * The OS initialization, configuring of the adapter private structure,
331292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * and a hardware reset occur.
331392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
331492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int __devinit ixgbevf_probe(struct pci_dev *pdev,
331592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				   const struct pci_device_id *ent)
331692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
331792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct net_device *netdev;
331892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = NULL;
331992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbe_hw *hw = NULL;
332092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	const struct ixgbevf_info *ii = ixgbevf_info_tbl[ent->driver_data];
332192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	static int cards_found;
332292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int err, pci_using_dac;
332392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
332492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	err = pci_enable_device(pdev);
332592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (err)
332692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		return err;
332792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
33282a1f8794161d9d5d46881160279df62767197526Nick Nunley	if (!dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)) &&
33292a1f8794161d9d5d46881160279df62767197526Nick Nunley	    !dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64))) {
333092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		pci_using_dac = 1;
333192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	} else {
33322a1f8794161d9d5d46881160279df62767197526Nick Nunley		err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
333392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		if (err) {
33342a1f8794161d9d5d46881160279df62767197526Nick Nunley			err = dma_set_coherent_mask(&pdev->dev,
33352a1f8794161d9d5d46881160279df62767197526Nick Nunley						    DMA_BIT_MASK(32));
333692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			if (err) {
333792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				dev_err(&pdev->dev, "No usable DMA "
333892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose					"configuration, aborting\n");
333992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				goto err_dma;
334092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			}
334192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		}
334292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		pci_using_dac = 0;
334392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
334492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
334592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	err = pci_request_regions(pdev, ixgbevf_driver_name);
334692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (err) {
334792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		dev_err(&pdev->dev, "pci_request_regions failed 0x%x\n", err);
334892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto err_pci_reg;
334992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
335092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
335192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	pci_set_master(pdev);
335292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
335392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#ifdef HAVE_TX_MQ
335492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	netdev = alloc_etherdev_mq(sizeof(struct ixgbevf_adapter),
335592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose				   MAX_TX_QUEUES);
335692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#else
335792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	netdev = alloc_etherdev(sizeof(struct ixgbevf_adapter));
335892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#endif
335992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (!netdev) {
336092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		err = -ENOMEM;
336192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto err_alloc_etherdev;
336292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
336392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
336492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	SET_NETDEV_DEV(netdev, &pdev->dev);
336592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
336692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	pci_set_drvdata(pdev, netdev);
336792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter = netdev_priv(netdev);
336892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
336992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->netdev = netdev;
337092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->pdev = pdev;
337192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	hw = &adapter->hw;
337292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	hw->back = adapter;
3373b3f4d5990bfc8b060e5010c1464789fca1f4c5b4stephen hemminger	adapter->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE);
337492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
337592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/*
337692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * call save state here in standalone driver because it relies on
337792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 * adapter struct to exist, and needs to call netdev_priv
337892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	 */
337992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	pci_save_state(pdev);
338092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
338192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	hw->hw_addr = ioremap(pci_resource_start(pdev, 0),
338292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			      pci_resource_len(pdev, 0));
338392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (!hw->hw_addr) {
338492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		err = -EIO;
338592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto err_ioremap;
338692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
338792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
338892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_assign_netdev_ops(netdev);
338992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
339092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->bd_number = cards_found;
339192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
339292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* Setup hw api */
339392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	memcpy(&hw->mac.ops, ii->mac_ops, sizeof(hw->mac.ops));
339492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	hw->mac.type  = ii->mac;
339592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
339692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	memcpy(&hw->mbx.ops, &ixgbevf_mbx_ops,
3397f416dfc0e07120d2610e836609b7235897796c90Greg Rose	       sizeof(struct ixgbe_mbx_operations));
339892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
339992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->flags &= ~IXGBE_FLAG_RX_PS_CAPABLE;
340092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->flags &= ~IXGBE_FLAG_RX_PS_ENABLED;
340192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->flags |= IXGBE_FLAG_RX_1BUF_CAPABLE;
340292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
340392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* setup the private structure */
340492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	err = ixgbevf_sw_init(adapter);
34051a0d6ae5795c376bae6d012fb25e8341e4c6d5f2Danny Kukawka	if (err)
34061a0d6ae5795c376bae6d012fb25e8341e4c6d5f2Danny Kukawka		goto err_sw_init;
34071a0d6ae5795c376bae6d012fb25e8341e4c6d5f2Danny Kukawka
34081a0d6ae5795c376bae6d012fb25e8341e4c6d5f2Danny Kukawka	/* The HW MAC address was set and/or determined in sw_init */
34091a0d6ae5795c376bae6d012fb25e8341e4c6d5f2Danny Kukawka	memcpy(netdev->perm_addr, adapter->hw.mac.addr, netdev->addr_len);
34101a0d6ae5795c376bae6d012fb25e8341e4c6d5f2Danny Kukawka
34111a0d6ae5795c376bae6d012fb25e8341e4c6d5f2Danny Kukawka	if (!is_valid_ether_addr(netdev->dev_addr)) {
34121a0d6ae5795c376bae6d012fb25e8341e4c6d5f2Danny Kukawka		pr_err("invalid MAC address\n");
34131a0d6ae5795c376bae6d012fb25e8341e4c6d5f2Danny Kukawka		err = -EIO;
34141a0d6ae5795c376bae6d012fb25e8341e4c6d5f2Danny Kukawka		goto err_sw_init;
34151a0d6ae5795c376bae6d012fb25e8341e4c6d5f2Danny Kukawka	}
341692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
3417471a76ded87d3375a3449dfa3d1cec567edd0c50Michał Mirosław	netdev->hw_features = NETIF_F_SG |
341892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			   NETIF_F_IP_CSUM |
3419471a76ded87d3375a3449dfa3d1cec567edd0c50Michał Mirosław			   NETIF_F_IPV6_CSUM |
3420471a76ded87d3375a3449dfa3d1cec567edd0c50Michał Mirosław			   NETIF_F_TSO |
3421471a76ded87d3375a3449dfa3d1cec567edd0c50Michał Mirosław			   NETIF_F_TSO6 |
3422471a76ded87d3375a3449dfa3d1cec567edd0c50Michał Mirosław			   NETIF_F_RXCSUM;
3423471a76ded87d3375a3449dfa3d1cec567edd0c50Michał Mirosław
3424471a76ded87d3375a3449dfa3d1cec567edd0c50Michał Mirosław	netdev->features = netdev->hw_features |
342592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			   NETIF_F_HW_VLAN_TX |
342692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			   NETIF_F_HW_VLAN_RX |
342792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose			   NETIF_F_HW_VLAN_FILTER;
342892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
342992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	netdev->vlan_features |= NETIF_F_TSO;
343092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	netdev->vlan_features |= NETIF_F_TSO6;
343192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	netdev->vlan_features |= NETIF_F_IP_CSUM;
34323bfacf96abc747e3a4bafa7550deb0372d7d0e20Alexander Duyck	netdev->vlan_features |= NETIF_F_IPV6_CSUM;
343392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	netdev->vlan_features |= NETIF_F_SG;
343492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
343592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (pci_using_dac)
343692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		netdev->features |= NETIF_F_HIGHDMA;
343792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
343801789349ee52e4a3faf376f1485303d9723c4f1fJiri Pirko	netdev->priv_flags |= IFF_UNICAST_FLT;
343901789349ee52e4a3faf376f1485303d9723c4f1fJiri Pirko
344092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	init_timer(&adapter->watchdog_timer);
3441c061b18df0f1fe3f50fe451dbbdc9ede3c19701aJoe Perches	adapter->watchdog_timer.function = ixgbevf_watchdog;
344292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->watchdog_timer.data = (unsigned long)adapter;
344392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
344492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	INIT_WORK(&adapter->reset_task, ixgbevf_reset_task);
344592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	INIT_WORK(&adapter->watchdog_task, ixgbevf_watchdog_task);
344692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
344792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	err = ixgbevf_init_interrupt_scheme(adapter);
344892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (err)
344992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto err_sw_init;
345092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
345192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* pick up the PCI bus settings for reporting later */
345292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (hw->mac.ops.get_bus_info)
345392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		hw->mac.ops.get_bus_info(hw);
345492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
345592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	strcpy(netdev->name, "eth%d");
345692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
345792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	err = register_netdev(netdev);
345892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (err)
345992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		goto err_register;
346092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
346192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	adapter->netdev_registered = true;
346292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
34635d426ad1af31ac27d7c2222f20eec9d0a8aeac42Greg Rose	netif_carrier_off(netdev);
34645d426ad1af31ac27d7c2222f20eec9d0a8aeac42Greg Rose
346533bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose	ixgbevf_init_last_counter_stats(adapter);
346633bd9f601ea21c4389870e425ae4eaf210d49b95Greg Rose
346792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	/* print the MAC address */
3468f794e7efe40147ed0c34f889b75298fec10e66b8Danny Kukawka	hw_dbg(hw, "%pM\n", netdev->dev_addr);
346992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
347092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	hw_dbg(hw, "MAC: %d\n", hw->mac.type);
347192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
3472d6dbee861386cd3f4cee62bcf28597e63e251e0cFrans Pop	hw_dbg(hw, "LRO is disabled\n");
347392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
347492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	hw_dbg(hw, "Intel(R) 82599 Virtual Function\n");
347592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	cards_found++;
347692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return 0;
347792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
347892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseerr_register:
347992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseerr_sw_init:
348092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_reset_interrupt_capability(adapter);
348192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	iounmap(hw->hw_addr);
348292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseerr_ioremap:
348392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	free_netdev(netdev);
348492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseerr_alloc_etherdev:
348592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	pci_release_regions(pdev);
348692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseerr_pci_reg:
348792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Roseerr_dma:
348892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	pci_disable_device(pdev);
348992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return err;
349092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
349192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
349292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
349392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_remove - Device Removal Routine
349492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * @pdev: PCI device information struct
349592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
349692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * ixgbevf_remove is called by the PCI subsystem to alert the driver
349792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * that it should release a PCI device.  The could be caused by a
349892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * Hot-Plug event, or because the driver is going to be removed from
349992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * memory.
350092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
350192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void __devexit ixgbevf_remove(struct pci_dev *pdev)
350292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
350392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct net_device *netdev = pci_get_drvdata(pdev);
350492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
350592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
350692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	set_bit(__IXGBEVF_DOWN, &adapter->state);
350792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
350892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	del_timer_sync(&adapter->watchdog_timer);
350992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
351023f333a2bfafba80339315b724808982a9de57d9Tejun Heo	cancel_work_sync(&adapter->reset_task);
351192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	cancel_work_sync(&adapter->watchdog_task);
351292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
351392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	if (adapter->netdev_registered) {
351492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		unregister_netdev(netdev);
351592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose		adapter->netdev_registered = false;
351692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	}
351792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
351892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ixgbevf_reset_interrupt_capability(adapter);
351992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
352092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	iounmap(adapter->hw.hw_addr);
352192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	pci_release_regions(pdev);
352292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
352392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	hw_dbg(&adapter->hw, "Remove complete\n");
352492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
352592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	kfree(adapter->tx_ring);
352692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	kfree(adapter->rx_ring);
352792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
352892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	free_netdev(netdev);
352992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
353092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	pci_disable_device(pdev);
353192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
353292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
353392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic struct pci_driver ixgbevf_driver = {
353492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	.name     = ixgbevf_driver_name,
353592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	.id_table = ixgbevf_pci_tbl,
353692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	.probe    = ixgbevf_probe,
353792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	.remove   = __devexit_p(ixgbevf_remove),
353892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	.shutdown = ixgbevf_shutdown,
353992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose};
354092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
354192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
354265d676c8c13c39301ebf813c7af00a13f05b2035Greg Rose * ixgbevf_init_module - Driver Registration Routine
354392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
354465d676c8c13c39301ebf813c7af00a13f05b2035Greg Rose * ixgbevf_init_module is the first routine called when the driver is
354592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * loaded. All it does is register with the PCI subsystem.
354692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
354792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic int __init ixgbevf_init_module(void)
354892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
354992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	int ret;
3550dbd9636e281895cd3a15682f0966fb545ddff9e8Jeff Kirsher	pr_info("%s - version %s\n", ixgbevf_driver_string,
3551dbd9636e281895cd3a15682f0966fb545ddff9e8Jeff Kirsher		ixgbevf_driver_version);
355292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
3553dbd9636e281895cd3a15682f0966fb545ddff9e8Jeff Kirsher	pr_info("%s\n", ixgbevf_copyright);
355492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
355592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	ret = pci_register_driver(&ixgbevf_driver);
355692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return ret;
355792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
355892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
355992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosemodule_init(ixgbevf_init_module);
356092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
356192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
356265d676c8c13c39301ebf813c7af00a13f05b2035Greg Rose * ixgbevf_exit_module - Driver Exit Cleanup Routine
356392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose *
356465d676c8c13c39301ebf813c7af00a13f05b2035Greg Rose * ixgbevf_exit_module is called just before the driver is removed
356592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * from memory.
356692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
356792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosestatic void __exit ixgbevf_exit_module(void)
356892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
356992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	pci_unregister_driver(&ixgbevf_driver);
357092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
357192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
357292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#ifdef DEBUG
357392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/**
357465d676c8c13c39301ebf813c7af00a13f05b2035Greg Rose * ixgbevf_get_hw_dev_name - return device name string
357592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose * used by hardware layer to print debugging information
357692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose **/
357792915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosechar *ixgbevf_get_hw_dev_name(struct ixgbe_hw *hw)
357892915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose{
357992915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	struct ixgbevf_adapter *adapter = hw->back;
358092915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose	return adapter->netdev->name;
358192915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose}
358292915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
358392915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose#endif
358492915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rosemodule_exit(ixgbevf_exit_module);
358592915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose
358692915f71201b43762fbe05dbfb1a1a0de9c8adb9Greg Rose/* ixgbevf_main.c */
3587