aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/mlx5/main.c
diff options
context:
space:
mode:
authorAchiad Shochat <achiad@mellanox.com>2015-12-23 11:47:25 -0500
committerDoug Ledford <dledford@redhat.com>2015-12-23 12:07:37 -0500
commite53505a802048dc0292609c56411ffdaad013c8e (patch)
treea27f13b8b2eefa766843ec4be785e09f6204ab59 /drivers/infiniband/hw/mlx5/main.c
parent2811ba51b04958cd001b6409c9f70e8563376346 (diff)
IB/mlx5: Support RoCE
Advertise RoCE support for IB/core layer and set the hardware to work in RoCE mode. Signed-off-by: Achiad Shochat <achiad@mellanox.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
Diffstat (limited to 'drivers/infiniband/hw/mlx5/main.c')
-rw-r--r--drivers/infiniband/hw/mlx5/main.c48
1 files changed, 44 insertions, 4 deletions
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index 3ee431ab8ea9..22ae0939b20e 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -1517,6 +1517,32 @@ static void destroy_dev_resources(struct mlx5_ib_resources *devr)
1517 mlx5_ib_dealloc_pd(devr->p0); 1517 mlx5_ib_dealloc_pd(devr->p0);
1518} 1518}
1519 1519
1520static 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
1520static int mlx5_port_immutable(struct ib_device *ibdev, u8 port_num, 1546static int mlx5_port_immutable(struct ib_device *ibdev, u8 port_num,
1521 struct ib_port_immutable *immutable) 1547 struct ib_port_immutable *immutable)
1522{ 1548{
@@ -1529,7 +1555,7 @@ static int mlx5_port_immutable(struct ib_device *ibdev, u8 port_num,
1529 1555
1530 immutable->pkey_tbl_len = attr.pkey_tbl_len; 1556 immutable->pkey_tbl_len = attr.pkey_tbl_len;
1531 immutable->gid_tbl_len = attr.gid_tbl_len; 1557 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);
1533 immutable->max_mad_size = IB_MGMT_MAD_SIZE; 1559 immutable->max_mad_size = IB_MGMT_MAD_SIZE;
1534 1560
1535 return 0; 1561 return 0;
@@ -1537,12 +1563,27 @@ static int mlx5_port_immutable(struct ib_device *ibdev, u8 port_num,
1537 1563
1538static int mlx5_enable_roce(struct mlx5_ib_dev *dev) 1564static int mlx5_enable_roce(struct mlx5_ib_dev *dev)
1539{ 1565{
1566 int err;
1567
1540 dev->roce.nb.notifier_call = mlx5_netdev_event; 1568 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
1579err_unregister_netdevice_notifier:
1580 unregister_netdevice_notifier(&dev->roce.nb);
1581 return err;
1542} 1582}
1543 1583
1544static void mlx5_disable_roce(struct mlx5_ib_dev *dev) 1584static void mlx5_disable_roce(struct mlx5_ib_dev *dev)
1545{ 1585{
1586 mlx5_nic_vport_disable_roce(dev->mdev);
1546 unregister_netdevice_notifier(&dev->roce.nb); 1587 unregister_netdevice_notifier(&dev->roce.nb);
1547} 1588}
1548 1589
@@ -1557,8 +1598,7 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev)
1557 port_type_cap = MLX5_CAP_GEN(mdev, port_type); 1598 port_type_cap = MLX5_CAP_GEN(mdev, port_type);
1558 ll = mlx5_port_type_cap_to_rdma_ll(port_type_cap); 1599 ll = mlx5_port_type_cap_to_rdma_ll(port_type_cap);
1559 1600
1560 /* don't create IB instance over Eth ports, no RoCE yet! */ 1601 if ((ll == IB_LINK_LAYER_ETHERNET) && !MLX5_CAP_GEN(mdev, roce))
1561 if (ll == IB_LINK_LAYER_ETHERNET)
1562 return NULL; 1602 return NULL;
1563 1603
1564 printk_once(KERN_INFO "%s", mlx5_version); 1604 printk_once(KERN_INFO "%s", mlx5_version);