Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Or Gerlitz and committed by
Doug Ledford
ca5b91d6 45f95acd

+13 -9
+13 -9
drivers/infiniband/hw/mlx5/main.c
··· 2779 2779 struct ib_port_immutable *immutable) 2780 2780 { 2781 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 2784 int err; 2783 2785 2784 2786 err = mlx5_ib_query_port(ibdev, port_num, &attr); ··· 2790 2788 immutable->pkey_tbl_len = attr.pkey_tbl_len; 2791 2789 immutable->gid_tbl_len = attr.gid_tbl_len; 2792 2790 immutable->core_cap_flags = get_core_cap_flags(ibdev); 2793 - immutable->max_mad_size = IB_MGMT_MAD_SIZE; 2791 + if ((ll == IB_LINK_LAYER_INFINIBAND) || MLX5_CAP_GEN(dev->mdev, roce)) 2792 + immutable->max_mad_size = IB_MGMT_MAD_SIZE; 2794 2793 2795 2794 return 0; 2796 2795 } ··· 2876 2873 if (err) 2877 2874 return err; 2878 2875 2879 - err = mlx5_nic_vport_enable_roce(dev->mdev); 2880 - if (err) 2881 - goto err_unregister_netdevice_notifier; 2876 + if (MLX5_CAP_GEN(dev->mdev, roce)) { 2877 + err = mlx5_nic_vport_enable_roce(dev->mdev); 2878 + if (err) 2879 + goto err_unregister_netdevice_notifier; 2880 + } 2882 2881 2883 2882 err = mlx5_eth_lag_init(dev); 2884 2883 if (err) ··· 2889 2884 return 0; 2890 2885 2891 2886 err_disable_roce: 2892 - mlx5_nic_vport_disable_roce(dev->mdev); 2887 + if (MLX5_CAP_GEN(dev->mdev, roce)) 2888 + mlx5_nic_vport_disable_roce(dev->mdev); 2893 2889 2894 2890 err_unregister_netdevice_notifier: 2895 2891 mlx5_remove_netdev_notifier(dev); ··· 2900 2894 static void mlx5_disable_eth(struct mlx5_ib_dev *dev) 2901 2895 { 2902 2896 mlx5_eth_lag_cleanup(dev); 2903 - mlx5_nic_vport_disable_roce(dev->mdev); 2897 + if (MLX5_CAP_GEN(dev->mdev, roce)) 2898 + mlx5_nic_vport_disable_roce(dev->mdev); 2904 2899 } 2905 2900 2906 2901 static void mlx5_ib_dealloc_q_counters(struct mlx5_ib_dev *dev) ··· 3022 3015 3023 3016 port_type_cap = MLX5_CAP_GEN(mdev, port_type); 3024 3017 ll = mlx5_port_type_cap_to_rdma_ll(port_type_cap); 3025 - 3026 - if ((ll == IB_LINK_LAYER_ETHERNET) && !MLX5_CAP_GEN(mdev, roce)) 3027 - return NULL; 3028 3018 3029 3019 printk_once(KERN_INFO "%s", mlx5_version); 3030 3020