From 3c995054721d638b6c94b53279a1046f5aa9c774 Mon Sep 17 00:00:00 2001 From: Vladimir Sokolovsky Date: Mon, 16 Jan 2017 10:24:48 +0200 Subject: [PATCH] mlx4: Added RHEL7.0 support Signed-off-by: Vladimir Sokolovsky --- patches/0002-BACKPORT-mlx4.patch | 90 ++++++++++++++++++++++++-------- 1 file changed, 68 insertions(+), 22 deletions(-) diff --git a/patches/0002-BACKPORT-mlx4.patch b/patches/0002-BACKPORT-mlx4.patch index 89bf88f..b714a6f 100644 --- a/patches/0002-BACKPORT-mlx4.patch +++ b/patches/0002-BACKPORT-mlx4.patch @@ -10,17 +10,17 @@ Signed-off-by: Vladimir Sokolovsky 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 #include -@@ -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); -- 2.41.0