aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOr Gerlitz <ogerlitz@mellanox.com>2016-11-27 09:51:36 -0500
committerDoug Ledford <dledford@redhat.com>2016-12-13 13:39:49 -0500
commitca5b91d63192ceaa41a6145f8c923debb64c71fa (patch)
tree7ad14569f0c6719ad8288f06fd3f5a9edc3e2dea
parent45f95acd63222dd1dc752fa904536327b10f1082 (diff)
IB/mlx5: Support RAW Ethernet when RoCE is disabled
On some environments, such as certain SRIOV VF configurations, RoCE is not supported for mlx5 Ethernet ports. Currently, the driver will not open IB device on that port. This is problematic, since we do want user-space RAW Ethernet (RAW_PACKET QPs) functionality to remain in place. For that end, enhance the relevant driver flows such that we do create a device instance in that case. Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Reviewed-by: Matan Barak <matanb@mellanox.com> Signed-off-by: Leon Romanovsky <leon@kernel.org> Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r--drivers/infiniband/hw/mlx5/main.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index b5b7459e9af0..8b013f8b832a 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -2779,6 +2779,8 @@ static int mlx5_port_immutable(struct ib_device *ibdev, u8 port_num,
2779 struct ib_port_immutable *immutable) 2779 struct ib_port_immutable *immutable)
2780{ 2780{
2781 struct ib_port_attr attr; 2781 struct ib_port_attr attr;
2782 struct mlx5_ib_dev *dev = to_mdev(ibdev);
2783 enum rdma_link_layer ll = mlx5_ib_port_link_layer(ibdev, port_num);
2782 int err; 2784 int err;
2783 2785
2784 err = mlx5_ib_query_port(ibdev, port_num, &attr); 2786 err = mlx5_ib_query_port(ibdev, port_num, &attr);
@@ -2788,7 +2790,8 @@ static int mlx5_port_immutable(struct ib_device *ibdev, u8 port_num,
2788 immutable->pkey_tbl_len = attr.pkey_tbl_len; 2790 immutable->pkey_tbl_len = attr.pkey_tbl_len;
2789 immutable->gid_tbl_len = attr.gid_tbl_len; 2791 immutable->gid_tbl_len = attr.gid_tbl_len;
2790 immutable->core_cap_flags = get_core_cap_flags(ibdev); 2792 immutable->core_cap_flags = get_core_cap_flags(ibdev);
2791 immutable->max_mad_size = IB_MGMT_MAD_SIZE; 2793 if ((ll == IB_LINK_LAYER_INFINIBAND) || MLX5_CAP_GEN(dev->mdev, roce))
2794 immutable->max_mad_size = IB_MGMT_MAD_SIZE;
2792 2795
2793 return 0; 2796 return 0;
2794} 2797}
@@ -2873,9 +2876,11 @@ static int mlx5_enable_eth(struct mlx5_ib_dev *dev)
2873 if (err) 2876 if (err)
2874 return err; 2877 return err;
2875 2878
2876 err = mlx5_nic_vport_enable_roce(dev->mdev); 2879 if (MLX5_CAP_GEN(dev->mdev, roce)) {
2877 if (err) 2880 err = mlx5_nic_vport_enable_roce(dev->mdev);
2878 goto err_unregister_netdevice_notifier; 2881 if (err)
2882 goto err_unregister_netdevice_notifier;
2883 }
2879 2884
2880 err = mlx5_eth_lag_init(dev); 2885 err = mlx5_eth_lag_init(dev);
2881 if (err) 2886 if (err)
@@ -2884,7 +2889,8 @@ static int mlx5_enable_eth(struct mlx5_ib_dev *dev)
2884 return 0; 2889 return 0;
2885 2890
2886err_disable_roce: 2891err_disable_roce:
2887 mlx5_nic_vport_disable_roce(dev->mdev); 2892 if (MLX5_CAP_GEN(dev->mdev, roce))
2893 mlx5_nic_vport_disable_roce(dev->mdev);
2888 2894
2889err_unregister_netdevice_notifier: 2895err_unregister_netdevice_notifier:
2890 mlx5_remove_netdev_notifier(dev); 2896 mlx5_remove_netdev_notifier(dev);
@@ -2894,7 +2900,8 @@ err_unregister_netdevice_notifier:
2894static void mlx5_disable_eth(struct mlx5_ib_dev *dev) 2900static void mlx5_disable_eth(struct mlx5_ib_dev *dev)
2895{ 2901{
2896 mlx5_eth_lag_cleanup(dev); 2902 mlx5_eth_lag_cleanup(dev);
2897 mlx5_nic_vport_disable_roce(dev->mdev); 2903 if (MLX5_CAP_GEN(dev->mdev, roce))
2904 mlx5_nic_vport_disable_roce(dev->mdev);
2898} 2905}
2899 2906
2900static void mlx5_ib_dealloc_q_counters(struct mlx5_ib_dev *dev) 2907static void mlx5_ib_dealloc_q_counters(struct mlx5_ib_dev *dev)
@@ -3016,9 +3023,6 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev)
3016 port_type_cap = MLX5_CAP_GEN(mdev, port_type); 3023 port_type_cap = MLX5_CAP_GEN(mdev, port_type);
3017 ll = mlx5_port_type_cap_to_rdma_ll(port_type_cap); 3024 ll = mlx5_port_type_cap_to_rdma_ll(port_type_cap);
3018 3025
3019 if ((ll == IB_LINK_LAYER_ETHERNET) && !MLX5_CAP_GEN(mdev, roce))
3020 return NULL;
3021
3022 printk_once(KERN_INFO "%s", mlx5_version); 3026 printk_once(KERN_INFO "%s", mlx5_version);
3023 3027
3024 dev = (struct mlx5_ib_dev *)ib_alloc_device(sizeof(*dev)); 3028 dev = (struct mlx5_ib_dev *)ib_alloc_device(sizeof(*dev));