Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next
Jeff Kirsher says:
====================
Intel Wired LAN Driver Updates
This series contains updates to igb, igbvf, i40e, ixgbe and ixgbevf.
Dan Carpenter provides a patch for igbvf to fix a bug found by a static
checker. If the new MTU is very large, then "new_mtu + ETH_HLEN +
ETH_FCS_LEN" can wrap and the check on the next line can underflow.
Wei Yongjun provides 2 patches, the first against igbvf adds a missing
iounmap() before the return from igbvf_probe(). The second against
i40e, removes the include <linux/version.h> because it is not needed.
Carolyn provides a patch for igb to fix a call to set the master/slave
mode for all m88 generation 2 PHY's and removes the call for I210
devices which do not need it.
Stefan Assmann provides a patch for igb to fix an issue which was broke
by:
commit fa44f2f185
Author: Greg Rose <gregory.v.rose@intel.com>
Date: Thu Jan 17 01:03:06 2013 -0800
igb: Enable SR-IOV configuration via PCI sysfs interface
which breaks the reloading of igb when VFs are assigned to a guest, in
several ways.
Jacob provides a patch for ixgbe and ixgbevf. First, against ixgbe,
cleans up ixgbe_enumerate_functions to reduce code complexity. The
second, against ixgbevf, adds support for ethtool's get_coalesce and
set_coalesce command for the ixgbevf driver.
Yijing Wang provides a patch for ixgbe to use pcie_capability_read_word()
to simplify the code.
Emil provides a ixgbe patch to fix an issue where the logic used to
detect changes in rx-usecs was incorrect and was masked by the call to
ixgbe_update_rsc().
Don provides 2 patches for ixgbevf. First creates a new function to set
PSRTYPE. The second bumps the ixgbevf driver version.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
a00f6fcc7d
|
@ -46,7 +46,6 @@
|
|||
#include <linux/sctp.h>
|
||||
#include <linux/pkt_sched.h>
|
||||
#include <linux/ipv6.h>
|
||||
#include <linux/version.h>
|
||||
#include <net/checksum.h>
|
||||
#include <net/ip6_checksum.h>
|
||||
#include <linux/ethtool.h>
|
||||
|
|
|
@ -708,11 +708,6 @@ s32 igb_copper_link_setup_m88(struct e1000_hw *hw)
|
|||
hw_dbg("Error committing the PHY changes\n");
|
||||
goto out;
|
||||
}
|
||||
if (phy->type == e1000_phy_i210) {
|
||||
ret_val = igb_set_master_slave_mode(hw);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
out:
|
||||
return ret_val;
|
||||
|
@ -806,6 +801,9 @@ s32 igb_copper_link_setup_m88_gen2(struct e1000_hw *hw)
|
|||
hw_dbg("Error committing the PHY changes\n");
|
||||
return ret_val;
|
||||
}
|
||||
ret_val = igb_set_master_slave_mode(hw);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -182,6 +182,7 @@ static void igb_check_vf_rate_limit(struct igb_adapter *);
|
|||
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
static int igb_vf_configure(struct igb_adapter *adapter, int vf);
|
||||
static int igb_pci_enable_sriov(struct pci_dev *dev, int num_vfs);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
@ -2429,7 +2430,7 @@ err_dma:
|
|||
}
|
||||
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
static int igb_disable_sriov(struct pci_dev *pdev)
|
||||
static int igb_disable_sriov(struct pci_dev *pdev)
|
||||
{
|
||||
struct net_device *netdev = pci_get_drvdata(pdev);
|
||||
struct igb_adapter *adapter = netdev_priv(netdev);
|
||||
|
@ -2470,27 +2471,19 @@ static int igb_enable_sriov(struct pci_dev *pdev, int num_vfs)
|
|||
int err = 0;
|
||||
int i;
|
||||
|
||||
if (!adapter->msix_entries) {
|
||||
if (!adapter->msix_entries || num_vfs > 7) {
|
||||
err = -EPERM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!num_vfs)
|
||||
goto out;
|
||||
else if (old_vfs && old_vfs == num_vfs)
|
||||
goto out;
|
||||
else if (old_vfs && old_vfs != num_vfs)
|
||||
err = igb_disable_sriov(pdev);
|
||||
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
if (num_vfs > 7) {
|
||||
err = -EPERM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
adapter->vfs_allocated_count = num_vfs;
|
||||
if (old_vfs) {
|
||||
dev_info(&pdev->dev, "%d pre-allocated VFs found - override max_vfs setting of %d\n",
|
||||
old_vfs, max_vfs);
|
||||
adapter->vfs_allocated_count = old_vfs;
|
||||
} else
|
||||
adapter->vfs_allocated_count = num_vfs;
|
||||
|
||||
adapter->vf_data = kcalloc(adapter->vfs_allocated_count,
|
||||
sizeof(struct vf_data_storage), GFP_KERNEL);
|
||||
|
@ -2504,10 +2497,12 @@ static int igb_enable_sriov(struct pci_dev *pdev, int num_vfs)
|
|||
goto out;
|
||||
}
|
||||
|
||||
err = pci_enable_sriov(pdev, adapter->vfs_allocated_count);
|
||||
if (err)
|
||||
goto err_out;
|
||||
|
||||
/* only call pci_enable_sriov() if no VFs are allocated already */
|
||||
if (!old_vfs) {
|
||||
err = pci_enable_sriov(pdev, adapter->vfs_allocated_count);
|
||||
if (err)
|
||||
goto err_out;
|
||||
}
|
||||
dev_info(&pdev->dev, "%d VFs allocated\n",
|
||||
adapter->vfs_allocated_count);
|
||||
for (i = 0; i < adapter->vfs_allocated_count; i++)
|
||||
|
@ -2623,7 +2618,7 @@ static void igb_probe_vfs(struct igb_adapter *adapter)
|
|||
return;
|
||||
|
||||
pci_sriov_set_totalvfs(pdev, 7);
|
||||
igb_enable_sriov(pdev, max_vfs);
|
||||
igb_pci_enable_sriov(pdev, max_vfs);
|
||||
|
||||
#endif /* CONFIG_PCI_IOV */
|
||||
}
|
||||
|
|
|
@ -2343,10 +2343,9 @@ static int igbvf_change_mtu(struct net_device *netdev, int new_mtu)
|
|||
struct igbvf_adapter *adapter = netdev_priv(netdev);
|
||||
int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
|
||||
|
||||
if ((new_mtu < 68) || (max_frame > MAX_JUMBO_FRAME_SIZE)) {
|
||||
dev_err(&adapter->pdev->dev, "Invalid MTU setting\n");
|
||||
if (new_mtu < 68 || new_mtu > INT_MAX - ETH_HLEN - ETH_FCS_LEN ||
|
||||
max_frame > MAX_JUMBO_FRAME_SIZE)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#define MAX_STD_JUMBO_FRAME_SIZE 9234
|
||||
if (max_frame > MAX_STD_JUMBO_FRAME_SIZE) {
|
||||
|
@ -2699,7 +2698,7 @@ static int igbvf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
if (ei->get_variants) {
|
||||
err = ei->get_variants(adapter);
|
||||
if (err)
|
||||
goto err_ioremap;
|
||||
goto err_get_variants;
|
||||
}
|
||||
|
||||
/* setup adapter struct */
|
||||
|
@ -2796,6 +2795,7 @@ err_hw_init:
|
|||
kfree(adapter->rx_ring);
|
||||
err_sw_init:
|
||||
igbvf_reset_interrupt_capability(adapter);
|
||||
err_get_variants:
|
||||
iounmap(adapter->hw.hw_addr);
|
||||
err_ioremap:
|
||||
free_netdev(netdev);
|
||||
|
|
|
@ -2257,13 +2257,13 @@ static int ixgbe_set_coalesce(struct net_device *netdev,
|
|||
|
||||
#if IS_ENABLED(CONFIG_BQL)
|
||||
/* detect ITR changes that require update of TXDCTL.WTHRESH */
|
||||
if ((adapter->tx_itr_setting > 1) &&
|
||||
if ((adapter->tx_itr_setting != 1) &&
|
||||
(adapter->tx_itr_setting < IXGBE_100K_ITR)) {
|
||||
if ((tx_itr_prev == 1) ||
|
||||
(tx_itr_prev > IXGBE_100K_ITR))
|
||||
(tx_itr_prev >= IXGBE_100K_ITR))
|
||||
need_reset = true;
|
||||
} else {
|
||||
if ((tx_itr_prev > 1) &&
|
||||
if ((tx_itr_prev != 1) &&
|
||||
(tx_itr_prev < IXGBE_100K_ITR))
|
||||
need_reset = true;
|
||||
}
|
||||
|
|
|
@ -153,7 +153,6 @@ MODULE_VERSION(DRV_VERSION);
|
|||
static int ixgbe_read_pci_cfg_word_parent(struct ixgbe_adapter *adapter,
|
||||
u32 reg, u16 *value)
|
||||
{
|
||||
int pos = 0;
|
||||
struct pci_dev *parent_dev;
|
||||
struct pci_bus *parent_bus;
|
||||
|
||||
|
@ -165,11 +164,10 @@ static int ixgbe_read_pci_cfg_word_parent(struct ixgbe_adapter *adapter,
|
|||
if (!parent_dev)
|
||||
return -1;
|
||||
|
||||
pos = pci_find_capability(parent_dev, PCI_CAP_ID_EXP);
|
||||
if (!pos)
|
||||
if (!pci_is_pcie(parent_dev))
|
||||
return -1;
|
||||
|
||||
pci_read_config_word(parent_dev, pos + reg, value);
|
||||
pcie_capability_read_word(parent_dev, reg, value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -7362,19 +7360,16 @@ static const struct net_device_ops ixgbe_netdev_ops = {
|
|||
**/
|
||||
static inline int ixgbe_enumerate_functions(struct ixgbe_adapter *adapter)
|
||||
{
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
struct list_head *entry;
|
||||
int physfns = 0;
|
||||
|
||||
/* Some cards can not use the generic count PCIe functions method, and
|
||||
* so must be hardcoded to the correct value.
|
||||
/* Some cards can not use the generic count PCIe functions method,
|
||||
* because they are behind a parent switch, so we hardcode these with
|
||||
* the correct number of functions.
|
||||
*/
|
||||
switch (hw->device_id) {
|
||||
case IXGBE_DEV_ID_82599_SFP_SF_QP:
|
||||
case IXGBE_DEV_ID_82599_QSFP_SF_QP:
|
||||
if (ixgbe_pcie_from_parent(&adapter->hw)) {
|
||||
physfns = 4;
|
||||
break;
|
||||
default:
|
||||
} else {
|
||||
list_for_each(entry, &adapter->pdev->bus_list) {
|
||||
struct pci_dev *pdev =
|
||||
list_entry(entry, struct pci_dev, bus_list);
|
||||
|
|
|
@ -634,6 +634,85 @@ static int ixgbevf_nway_reset(struct net_device *netdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int ixgbevf_get_coalesce(struct net_device *netdev,
|
||||
struct ethtool_coalesce *ec)
|
||||
{
|
||||
struct ixgbevf_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
/* only valid if in constant ITR mode */
|
||||
if (adapter->rx_itr_setting <= 1)
|
||||
ec->rx_coalesce_usecs = adapter->rx_itr_setting;
|
||||
else
|
||||
ec->rx_coalesce_usecs = adapter->rx_itr_setting >> 2;
|
||||
|
||||
/* if in mixed tx/rx queues per vector mode, report only rx settings */
|
||||
if (adapter->q_vector[0]->tx.count && adapter->q_vector[0]->rx.count)
|
||||
return 0;
|
||||
|
||||
/* only valid if in constant ITR mode */
|
||||
if (adapter->tx_itr_setting <= 1)
|
||||
ec->tx_coalesce_usecs = adapter->tx_itr_setting;
|
||||
else
|
||||
ec->tx_coalesce_usecs = adapter->tx_itr_setting >> 2;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ixgbevf_set_coalesce(struct net_device *netdev,
|
||||
struct ethtool_coalesce *ec)
|
||||
{
|
||||
struct ixgbevf_adapter *adapter = netdev_priv(netdev);
|
||||
struct ixgbevf_q_vector *q_vector;
|
||||
int num_vectors, i;
|
||||
u16 tx_itr_param, rx_itr_param;
|
||||
|
||||
/* don't accept tx specific changes if we've got mixed RxTx vectors */
|
||||
if (adapter->q_vector[0]->tx.count && adapter->q_vector[0]->rx.count
|
||||
&& ec->tx_coalesce_usecs)
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
if ((ec->rx_coalesce_usecs > (IXGBE_MAX_EITR >> 2)) ||
|
||||
(ec->tx_coalesce_usecs > (IXGBE_MAX_EITR >> 2)))
|
||||
return -EINVAL;
|
||||
|
||||
if (ec->rx_coalesce_usecs > 1)
|
||||
adapter->rx_itr_setting = ec->rx_coalesce_usecs << 2;
|
||||
else
|
||||
adapter->rx_itr_setting = ec->rx_coalesce_usecs;
|
||||
|
||||
if (adapter->rx_itr_setting == 1)
|
||||
rx_itr_param = IXGBE_20K_ITR;
|
||||
else
|
||||
rx_itr_param = adapter->rx_itr_setting;
|
||||
|
||||
|
||||
if (ec->tx_coalesce_usecs > 1)
|
||||
adapter->tx_itr_setting = ec->tx_coalesce_usecs << 2;
|
||||
else
|
||||
adapter->tx_itr_setting = ec->tx_coalesce_usecs;
|
||||
|
||||
if (adapter->tx_itr_setting == 1)
|
||||
tx_itr_param = IXGBE_10K_ITR;
|
||||
else
|
||||
tx_itr_param = adapter->tx_itr_setting;
|
||||
|
||||
num_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
|
||||
|
||||
for (i = 0; i < num_vectors; i++) {
|
||||
q_vector = adapter->q_vector[i];
|
||||
if (q_vector->tx.count && !q_vector->rx.count)
|
||||
/* tx only */
|
||||
q_vector->itr = tx_itr_param;
|
||||
else
|
||||
/* rx only or mixed */
|
||||
q_vector->itr = rx_itr_param;
|
||||
ixgbevf_write_eitr(q_vector);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct ethtool_ops ixgbevf_ethtool_ops = {
|
||||
.get_settings = ixgbevf_get_settings,
|
||||
.get_drvinfo = ixgbevf_get_drvinfo,
|
||||
|
@ -649,6 +728,8 @@ static const struct ethtool_ops ixgbevf_ethtool_ops = {
|
|||
.get_sset_count = ixgbevf_get_sset_count,
|
||||
.get_strings = ixgbevf_get_strings,
|
||||
.get_ethtool_stats = ixgbevf_get_ethtool_stats,
|
||||
.get_coalesce = ixgbevf_get_coalesce,
|
||||
.set_coalesce = ixgbevf_set_coalesce,
|
||||
};
|
||||
|
||||
void ixgbevf_set_ethtool_ops(struct net_device *netdev)
|
||||
|
|
|
@ -293,6 +293,8 @@ void ixgbevf_free_tx_resources(struct ixgbevf_adapter *, struct ixgbevf_ring *);
|
|||
void ixgbevf_update_stats(struct ixgbevf_adapter *adapter);
|
||||
int ethtool_ioctl(struct ifreq *ifr);
|
||||
|
||||
extern void ixgbevf_write_eitr(struct ixgbevf_q_vector *q_vector);
|
||||
|
||||
void ixgbe_napi_add_all(struct ixgbevf_adapter *adapter);
|
||||
void ixgbe_napi_del_all(struct ixgbevf_adapter *adapter);
|
||||
|
||||
|
|
|
@ -58,7 +58,7 @@ const char ixgbevf_driver_name[] = "ixgbevf";
|
|||
static const char ixgbevf_driver_string[] =
|
||||
"Intel(R) 10 Gigabit PCI Express Virtual Function Network Driver";
|
||||
|
||||
#define DRV_VERSION "2.7.12-k"
|
||||
#define DRV_VERSION "2.11.3-k"
|
||||
const char ixgbevf_driver_version[] = DRV_VERSION;
|
||||
static char ixgbevf_copyright[] =
|
||||
"Copyright (c) 2009 - 2012 Intel Corporation.";
|
||||
|
@ -580,7 +580,7 @@ static int ixgbevf_poll(struct napi_struct *napi, int budget)
|
|||
* ixgbevf_write_eitr - write VTEITR register in hardware specific way
|
||||
* @q_vector: structure containing interrupt and ring information
|
||||
*/
|
||||
static void ixgbevf_write_eitr(struct ixgbevf_q_vector *q_vector)
|
||||
void ixgbevf_write_eitr(struct ixgbevf_q_vector *q_vector)
|
||||
{
|
||||
struct ixgbevf_adapter *adapter = q_vector->adapter;
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
|
@ -1082,6 +1082,21 @@ static void ixgbevf_configure_srrctl(struct ixgbevf_adapter *adapter, int index)
|
|||
IXGBE_WRITE_REG(hw, IXGBE_VFSRRCTL(index), srrctl);
|
||||
}
|
||||
|
||||
static void ixgbevf_setup_psrtype(struct ixgbevf_adapter *adapter)
|
||||
{
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
|
||||
/* PSRTYPE must be initialized in 82599 */
|
||||
u32 psrtype = IXGBE_PSRTYPE_TCPHDR | IXGBE_PSRTYPE_UDPHDR |
|
||||
IXGBE_PSRTYPE_IPV4HDR | IXGBE_PSRTYPE_IPV6HDR |
|
||||
IXGBE_PSRTYPE_L2HDR;
|
||||
|
||||
if (adapter->num_rx_queues > 1)
|
||||
psrtype |= 1 << 29;
|
||||
|
||||
IXGBE_WRITE_REG(hw, IXGBE_VFPSRTYPE, psrtype);
|
||||
}
|
||||
|
||||
static void ixgbevf_set_rx_buffer_len(struct ixgbevf_adapter *adapter)
|
||||
{
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
|
@ -1129,8 +1144,7 @@ static void ixgbevf_configure_rx(struct ixgbevf_adapter *adapter)
|
|||
int i, j;
|
||||
u32 rdlen;
|
||||
|
||||
/* PSRTYPE must be initialized in 82599 */
|
||||
IXGBE_WRITE_REG(hw, IXGBE_VFPSRTYPE, 0);
|
||||
ixgbevf_setup_psrtype(adapter);
|
||||
|
||||
/* set_rx_buffer_len must be called before ring initialization */
|
||||
ixgbevf_set_rx_buffer_len(adapter);
|
||||
|
|
Loading…
Reference in New Issue