From patchwork Sun May 15 12:57:46 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Or Gerlitz X-Patchwork-Id: 9096351 Return-Path: X-Original-To: patchwork-linux-rdma@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id DC4A2BF29F for ; Sun, 15 May 2016 12:58:25 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id E8B1C2028D for ; Sun, 15 May 2016 12:58:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id E0C9020272 for ; Sun, 15 May 2016 12:58:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754181AbcEOM6X (ORCPT ); Sun, 15 May 2016 08:58:23 -0400 Received: from [193.47.165.129] ([193.47.165.129]:47435 "EHLO mellanox.co.il" rhost-flags-FAIL-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1754175AbcEOM6W (ORCPT ); Sun, 15 May 2016 08:58:22 -0400 Received: from Internal Mail-Server by MTLPINE1 (envelope-from ogerlitz@mellanox.com) with ESMTPS (AES256-SHA encrypted); 15 May 2016 15:57:55 +0300 Received: from r-vnc04.mtr.labs.mlnx (r-vnc04.mtr.labs.mlnx [10.208.0.116]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id u4FCvtAT017125; Sun, 15 May 2016 15:57:55 +0300 From: Or Gerlitz To: Doug Ledford Cc: linux-rdma@vger.kernel.org, Matan Barak , Or Gerlitz Subject: [PATCH rdma-next] IB/mlx5: Support RAW Ethernet when RoCE is disabled Date: Sun, 15 May 2016 15:57:46 +0300 Message-Id: <1463317066-29900-1-git-send-email-ogerlitz@mellanox.com> X-Mailer: git-send-email 1.7.8.2 Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Spam-Status: No, score=-8.3 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP On some environments, such as certain SRIOV VF configurations, RoCE is not supported for an Ethernet port. 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 Reviewed-by: Matan Barak --- drivers/infiniband/hw/mlx5/main.c | 55 +++++++++++++++------------------------ 1 file changed, 21 insertions(+), 34 deletions(-) diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index 4cb81f6..965e414 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c @@ -2195,6 +2195,8 @@ static int mlx5_port_immutable(struct ib_device *ibdev, u8 port_num, struct ib_port_immutable *immutable) { struct ib_port_attr attr; + struct mlx5_ib_dev *dev = to_mdev(ibdev); + enum rdma_link_layer ll = mlx5_ib_port_link_layer(ibdev, 1); int err; err = mlx5_ib_query_port(ibdev, port_num, &attr); @@ -2204,37 +2206,12 @@ static int mlx5_port_immutable(struct ib_device *ibdev, u8 port_num, immutable->pkey_tbl_len = attr.pkey_tbl_len; immutable->gid_tbl_len = attr.gid_tbl_len; immutable->core_cap_flags = get_core_cap_flags(ibdev); - immutable->max_mad_size = IB_MGMT_MAD_SIZE; + if ((ll == IB_LINK_LAYER_INFINIBAND) || MLX5_CAP_GEN(dev->mdev, roce)) + immutable->max_mad_size = IB_MGMT_MAD_SIZE; return 0; } -static int mlx5_enable_roce(struct mlx5_ib_dev *dev) -{ - int err; - - dev->roce.nb.notifier_call = mlx5_netdev_event; - err = register_netdevice_notifier(&dev->roce.nb); - if (err) - return err; - - err = mlx5_nic_vport_enable_roce(dev->mdev); - if (err) - goto err_unregister_netdevice_notifier; - - return 0; - -err_unregister_netdevice_notifier: - unregister_netdevice_notifier(&dev->roce.nb); - return err; -} - -static void mlx5_disable_roce(struct mlx5_ib_dev *dev) -{ - mlx5_nic_vport_disable_roce(dev->mdev); - unregister_netdevice_notifier(&dev->roce.nb); -} - static void *mlx5_ib_add(struct mlx5_core_dev *mdev) { struct mlx5_ib_dev *dev; @@ -2246,9 +2223,6 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev) port_type_cap = MLX5_CAP_GEN(mdev, port_type); ll = mlx5_port_type_cap_to_rdma_ll(port_type_cap); - if ((ll == IB_LINK_LAYER_ETHERNET) && !MLX5_CAP_GEN(mdev, roce)) - return NULL; - printk_once(KERN_INFO "%s", mlx5_version); dev = (struct mlx5_ib_dev *)ib_alloc_device(sizeof(*dev)); @@ -2396,9 +2370,15 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev) mutex_init(&dev->cap_mask_mutex); if (ll == IB_LINK_LAYER_ETHERNET) { - err = mlx5_enable_roce(dev); + dev->roce.nb.notifier_call = mlx5_netdev_event; + err = register_netdevice_notifier(&dev->roce.nb); if (err) goto err_dealloc; + if (MLX5_CAP_GEN(mdev, roce)) { + err = mlx5_nic_vport_enable_roce(dev->mdev); + if (err) + goto err_unreg_notifier; + } } err = create_dev_resources(&dev->devr); @@ -2441,8 +2421,12 @@ err_rsrc: destroy_dev_resources(&dev->devr); err_disable_roce: + if (ll == IB_LINK_LAYER_ETHERNET && MLX5_CAP_GEN(mdev, roce)) + mlx5_nic_vport_disable_roce(dev->mdev); + +err_unreg_notifier: if (ll == IB_LINK_LAYER_ETHERNET) - mlx5_disable_roce(dev); + unregister_netdevice_notifier(&dev->roce.nb); err_dealloc: ib_dealloc_device((struct ib_device *)dev); @@ -2459,8 +2443,11 @@ static void mlx5_ib_remove(struct mlx5_core_dev *mdev, void *context) destroy_umrc_res(dev); mlx5_ib_odp_remove_one(dev); destroy_dev_resources(&dev->devr); - if (ll == IB_LINK_LAYER_ETHERNET) - mlx5_disable_roce(dev); + if (ll == IB_LINK_LAYER_ETHERNET) { + if (MLX5_CAP_GEN(mdev, roce)) + mlx5_nic_vport_disable_roce(dev->mdev); + unregister_netdevice_notifier(&dev->roce.nb); + } ib_dealloc_device(&dev->ib_dev); }