drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c | 19 +
drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 488 +++++++++++++++++++++++-
drivers/net/ethernet/mellanox/mlx4/en_main.c | 4 +
- drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 222 +++++++++++
+ drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 229 +++++++++++
drivers/net/ethernet/mellanox/mlx4/en_rx.c | 76 ++++
drivers/net/ethernet/mellanox/mlx4/en_tx.c | 54 +++
drivers/net/ethernet/mellanox/mlx4/intf.c | 4 +
- drivers/net/ethernet/mellanox/mlx4/main.c | 47 +++
+ drivers/net/ethernet/mellanox/mlx4/main.c | 66 ++++
drivers/net/ethernet/mellanox/mlx4/mlx4.h | 4 +
drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 30 ++
drivers/net/ethernet/mellanox/mlx4/pd.c | 4 +
include/linux/mlx4/cmd.h | 2 +
include/linux/mlx4/device.h | 4 +
- 17 files changed, 1016 insertions(+), 3 deletions(-)
+ 17 files changed, 1042 insertions(+), 3 deletions(-)
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c
index xxxxxxx..xxxxxxx xxxxxx
+{
+ struct mlx4_en_priv *priv = netdev_priv(dev);
+ __be16 current_port;
-+
+
+ if (priv->mdev->dev->caps.tunnel_offload_mode != MLX4_TUNNEL_OFFLOAD_MODE_VXLAN)
+ return;
+
+ queue_work(priv->mdev->workqueue, &priv->vxlan_del_task);
+}
+#endif
-
++
+#ifdef HAVE_NETDEV_FEATURES_T
static netdev_features_t mlx4_en_features_check(struct sk_buff *skb,
struct net_device *dev,
void mlx4_en_update_pfc_stats_bitmap(struct mlx4_dev *dev,
struct mlx4_en_stats_bitmap *stats_bitmap,
-@@ -3050,12 +3245,20 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
+@@ -3050,16 +3245,31 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
int i;
int err;
netif_set_real_num_rx_queues(dev, prof->rx_ring_num);
SET_NETDEV_DEV(dev, &mdev->dev->persist->pdev->dev);
-@@ -3074,8 +3277,10 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
++#ifdef HAVE_NET_DEVICE_DEV_PORT
+ dev->dev_port = port - 1;
++#elif defined(HAVE_NETDEV_EXTENDED_DEV_PORT)
++ netdev_extended(dev)->dev_port = port - 1;
++#else
++ /* fallback to dev_id when dev_port does not exist */
++ dev->dev_id = port - 1;
++#endif
+
+ /*
+ * Initialize driver private data
+@@ -3074,8 +3284,10 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
INIT_WORK(&priv->linkstate_task, mlx4_en_linkstate);
INIT_DELAYED_WORK(&priv->stats_task, mlx4_en_do_get_stats);
INIT_DELAYED_WORK(&priv->service_task, mlx4_en_service_task);
#ifdef CONFIG_RFS_ACCEL
INIT_LIST_HEAD(&priv->filters);
spin_lock_init(&priv->filters_lock);
-@@ -3094,7 +3299,9 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
+@@ -3094,7 +3306,9 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
priv->num_tx_rings_p_up = mdev->profile.num_tx_rings_p_up;
priv->tx_ring_num = prof->tx_ring_num;
priv->tx_work_limit = MLX4_EN_DEFAULT_TX_WORK;
priv->tx_ring = kzalloc(sizeof(struct mlx4_en_tx_ring *) * MAX_TX_RINGS,
GFP_KERNEL);
-@@ -3189,7 +3396,11 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
+@@ -3189,7 +3403,11 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
else
dev->netdev_ops = &mlx4_netdev_ops;
dev->watchdog_timeo = MLX4_EN_WATCHDOG_TIMEOUT;
netif_set_real_num_rx_queues(dev, priv->rx_ring_num);
dev->ethtool_ops = &mlx4_en_ethtool_ops;
-@@ -3245,6 +3456,7 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
+@@ -3245,6 +3463,7 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
if (mdev->dev->caps.steering_mode != MLX4_STEERING_MODE_A0)
dev->priv_flags |= IFF_UNICAST_FLT;
/* Setting a default hash function value */
if (mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_RSS_TOP) {
priv->rss_hash_fn = ETH_RSS_HASH_TOP;
-@@ -3255,8 +3467,10 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
+@@ -3255,8 +3474,10 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
"No RSS hash capabilities exposed, using Toeplitz\n");
priv->rss_hash_fn = ETH_RSS_HASH_TOP;
}
dev->hw_features |= NETIF_F_GSO_UDP_TUNNEL |
NETIF_F_GSO_UDP_TUNNEL_CSUM |
NETIF_F_GSO_PARTIAL;
-@@ -3264,6 +3478,12 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
+@@ -3264,6 +3485,12 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
NETIF_F_GSO_UDP_TUNNEL_CSUM |
NETIF_F_GSO_PARTIAL;
dev->gso_partial_features = NETIF_F_GSO_UDP_TUNNEL_CSUM;
}
mdev->pndev[port] = dev;
-@@ -3327,8 +3547,10 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
+@@ -3327,8 +3554,10 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
}
priv->registered = 1;
#include <linux/mlx4/device.h>
#include <linux/mlx4/doorbell.h>
-@@ -2918,13 +2920,17 @@ no_msi:
+@@ -2828,6 +2830,9 @@ static void mlx4_enable_msi_x(struct mlx4_dev *dev)
+ struct msix_entry *entries;
+ int i;
+ int port = 0;
++#ifndef HAVE_PCI_ENABLE_MSIX_RANGE
++ int err;
++#endif
+
+ if (msi_x) {
+ int nreq = dev->caps.num_ports * num_online_cpus() + 1;
+@@ -2844,8 +2849,24 @@ static void mlx4_enable_msi_x(struct mlx4_dev *dev)
+ for (i = 0; i < nreq; ++i)
+ entries[i].entry = i;
+
++#ifdef HAVE_PCI_ENABLE_MSIX_RANGE
+ nreq = pci_enable_msix_range(dev->persist->pdev, entries, 2,
+ nreq);
++#else
++retry:
++ err = pci_enable_msix(dev->persist->pdev, entries, nreq);
++ if (err) {
++ /* Try again if at least 2 vectors are available */
++ if (err > 1) {
++ mlx4_info(dev, "Requested %d vectors, "
++ "but only %d MSI-X vectors available, "
++ "trying again\n", nreq, err);
++ nreq = err;
++ goto retry;
++ }
++ nreq = -1;
++ }
++#endif
+
+ if (nreq < 0 || nreq < MLX4_EQ_ASYNC) {
+ kfree(entries);
+@@ -2918,13 +2939,17 @@ no_msi:
static int mlx4_init_port_info(struct mlx4_dev *dev, int port)
{
info->dev = dev;
info->port = port;
-@@ -2949,7 +2955,9 @@ static int mlx4_init_port_info(struct mlx4_dev *dev, int port)
+@@ -2949,7 +2974,9 @@ static int mlx4_init_port_info(struct mlx4_dev *dev, int port)
err = device_create_file(&dev->persist->pdev->dev, &info->port_attr);
if (err) {
mlx4_err(dev, "Failed to create file for port %d\n", port);
info->port = -1;
}
-@@ -2970,7 +2978,9 @@ static int mlx4_init_port_info(struct mlx4_dev *dev, int port)
+@@ -2970,7 +2997,9 @@ static int mlx4_init_port_info(struct mlx4_dev *dev, int port)
mlx4_err(dev, "Failed to create mtu file for port %d\n", port);
device_remove_file(&info->dev->persist->pdev->dev,
&info->port_attr);
info->port = -1;
}
-@@ -2985,7 +2995,9 @@ static void mlx4_cleanup_port_info(struct mlx4_port_info *info)
+@@ -2985,7 +3014,9 @@ static void mlx4_cleanup_port_info(struct mlx4_port_info *info)
device_remove_file(&info->dev->persist->pdev->dev, &info->port_attr);
device_remove_file(&info->dev->persist->pdev->dev,
&info->port_mtu_attr);
#ifdef CONFIG_RFS_ACCEL
free_irq_cpu_rmap(info->rmap);
-@@ -3753,6 +3765,7 @@ err_disable_pdev:
+@@ -3753,6 +3784,7 @@ err_disable_pdev:
return err;
}
static int mlx4_devlink_port_type_set(struct devlink_port *devlink_port,
enum devlink_port_type port_type)
{
-@@ -3781,26 +3794,40 @@ static int mlx4_devlink_port_type_set(struct devlink_port *devlink_port,
+@@ -3781,26 +3813,40 @@ static int mlx4_devlink_port_type_set(struct devlink_port *devlink_port,
static const struct devlink_ops mlx4_devlink_ops = {
.port_type_set = mlx4_devlink_port_type_set,
};
}
dev->persist->pdev = pdev;
dev->persist->dev = dev;
-@@ -3810,23 +3837,36 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
+@@ -3810,23 +3856,36 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
mutex_init(&dev->persist->interface_state_mutex);
mutex_init(&dev->persist->pci_status_mutex);
return ret;
}
-@@ -3927,7 +3967,9 @@ static void mlx4_remove_one(struct pci_dev *pdev)
+@@ -3927,7 +3986,9 @@ static void mlx4_remove_one(struct pci_dev *pdev)
struct mlx4_dev_persistent *persist = pci_get_drvdata(pdev);
struct mlx4_dev *dev = persist->dev;
struct mlx4_priv *priv = mlx4_priv(dev);
int active_vfs = 0;
mutex_lock(&persist->interface_state_mutex);
-@@ -3958,9 +4000,14 @@ static void mlx4_remove_one(struct pci_dev *pdev)
+@@ -3958,9 +4019,14 @@ static void mlx4_remove_one(struct pci_dev *pdev)
pci_release_regions(pdev);
mlx4_pci_disable_device(dev);