]> git.openfabrics.org - compat-rdma/compat-rdma.git/commitdiff
mlx4: Added RHEL7.0 support
authorVladimir Sokolovsky <vlad@mellanox.com>
Mon, 16 Jan 2017 08:24:48 +0000 (10:24 +0200)
committerVladimir Sokolovsky <vlad@mellanox.com>
Mon, 16 Jan 2017 08:24:48 +0000 (10:24 +0200)
Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.com>
patches/0002-BACKPORT-mlx4.patch

index 89bf88f51328f861f2d9c4be0468ac1d1d989dea..b714a6f0c5dbfe10a922589e93b0a5d9ae1a8e62 100644 (file)
@@ -10,17 +10,17 @@ Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.com>
  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
@@ -1615,7 +1615,7 @@ 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;
 +
@@ -1654,7 +1654,7 @@ index xxxxxxx..xxxxxxx xxxxxx
 +      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,
@@ -1820,7 +1820,7 @@ index xxxxxxx..xxxxxxx xxxxxx
  
  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;
  
@@ -1841,7 +1841,18 @@ index xxxxxxx..xxxxxxx xxxxxx
        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);
@@ -1852,7 +1863,7 @@ index xxxxxxx..xxxxxxx xxxxxx
  #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;
@@ -1862,7 +1873,7 @@ index xxxxxxx..xxxxxxx xxxxxx
  
        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;
@@ -1874,7 +1885,7 @@ index xxxxxxx..xxxxxxx xxxxxx
        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;
  
@@ -1882,7 +1893,7 @@ index xxxxxxx..xxxxxxx xxxxxx
        /* 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;
        }
@@ -1893,7 +1904,7 @@ index xxxxxxx..xxxxxxx xxxxxx
                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;
@@ -1906,7 +1917,7 @@ index xxxxxxx..xxxxxxx xxxxxx
        }
  
        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;
@@ -2428,7 +2439,42 @@ index xxxxxxx..xxxxxxx xxxxxx
  
  #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)
  {
@@ -2446,7 +2492,7 @@ index xxxxxxx..xxxxxxx xxxxxx
  
        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);
@@ -2456,7 +2502,7 @@ index xxxxxxx..xxxxxxx xxxxxx
                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);
@@ -2466,7 +2512,7 @@ index xxxxxxx..xxxxxxx xxxxxx
                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);
@@ -2476,7 +2522,7 @@ index xxxxxxx..xxxxxxx xxxxxx
  
  #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;
  }
  
@@ -2484,7 +2530,7 @@ index xxxxxxx..xxxxxxx xxxxxx
  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,
  };
@@ -2525,7 +2571,7 @@ index xxxxxxx..xxxxxxx xxxxxx
        }
        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);
  
@@ -2562,7 +2608,7 @@ index xxxxxxx..xxxxxxx xxxxxx
        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);
@@ -2572,7 +2618,7 @@ index xxxxxxx..xxxxxxx xxxxxx
        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);