@@ -1517,6 +1517,32 @@ static void destroy_dev_resources(struct mlx5_ib_resources *devr)
15171517 mlx5_ib_dealloc_pd (devr -> p0 );
15181518}
15191519
1520+ static u32 get_core_cap_flags (struct ib_device * ibdev )
1521+ {
1522+ struct mlx5_ib_dev * dev = to_mdev (ibdev );
1523+ enum rdma_link_layer ll = mlx5_ib_port_link_layer (ibdev , 1 );
1524+ u8 l3_type_cap = MLX5_CAP_ROCE (dev -> mdev , l3_type );
1525+ u8 roce_version_cap = MLX5_CAP_ROCE (dev -> mdev , roce_version );
1526+ u32 ret = 0 ;
1527+
1528+ if (ll == IB_LINK_LAYER_INFINIBAND )
1529+ return RDMA_CORE_PORT_IBA_IB ;
1530+
1531+ if (!(l3_type_cap & MLX5_ROCE_L3_TYPE_IPV4_CAP ))
1532+ return 0 ;
1533+
1534+ if (!(l3_type_cap & MLX5_ROCE_L3_TYPE_IPV6_CAP ))
1535+ return 0 ;
1536+
1537+ if (roce_version_cap & MLX5_ROCE_VERSION_1_CAP )
1538+ ret |= RDMA_CORE_PORT_IBA_ROCE ;
1539+
1540+ if (roce_version_cap & MLX5_ROCE_VERSION_2_CAP )
1541+ ret |= RDMA_CORE_PORT_IBA_ROCE_UDP_ENCAP ;
1542+
1543+ return ret ;
1544+ }
1545+
15201546static int mlx5_port_immutable (struct ib_device * ibdev , u8 port_num ,
15211547 struct ib_port_immutable * immutable )
15221548{
@@ -1529,20 +1555,35 @@ static int mlx5_port_immutable(struct ib_device *ibdev, u8 port_num,
15291555
15301556 immutable -> pkey_tbl_len = attr .pkey_tbl_len ;
15311557 immutable -> gid_tbl_len = attr .gid_tbl_len ;
1532- immutable -> core_cap_flags = RDMA_CORE_PORT_IBA_IB ;
1558+ immutable -> core_cap_flags = get_core_cap_flags ( ibdev ) ;
15331559 immutable -> max_mad_size = IB_MGMT_MAD_SIZE ;
15341560
15351561 return 0 ;
15361562}
15371563
15381564static int mlx5_enable_roce (struct mlx5_ib_dev * dev )
15391565{
1566+ int err ;
1567+
15401568 dev -> roce .nb .notifier_call = mlx5_netdev_event ;
1541- return register_netdevice_notifier (& dev -> roce .nb );
1569+ err = register_netdevice_notifier (& dev -> roce .nb );
1570+ if (err )
1571+ return err ;
1572+
1573+ err = mlx5_nic_vport_enable_roce (dev -> mdev );
1574+ if (err )
1575+ goto err_unregister_netdevice_notifier ;
1576+
1577+ return 0 ;
1578+
1579+ err_unregister_netdevice_notifier :
1580+ unregister_netdevice_notifier (& dev -> roce .nb );
1581+ return err ;
15421582}
15431583
15441584static void mlx5_disable_roce (struct mlx5_ib_dev * dev )
15451585{
1586+ mlx5_nic_vport_disable_roce (dev -> mdev );
15461587 unregister_netdevice_notifier (& dev -> roce .nb );
15471588}
15481589
@@ -1557,8 +1598,7 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev)
15571598 port_type_cap = MLX5_CAP_GEN (mdev , port_type );
15581599 ll = mlx5_port_type_cap_to_rdma_ll (port_type_cap );
15591600
1560- /* don't create IB instance over Eth ports, no RoCE yet! */
1561- if (ll == IB_LINK_LAYER_ETHERNET )
1601+ if ((ll == IB_LINK_LAYER_ETHERNET ) && !MLX5_CAP_GEN (mdev , roce ))
15621602 return NULL ;
15631603
15641604 printk_once (KERN_INFO "%s" , mlx5_version );
0 commit comments