net/mlx5e: Add support for devlink-port in non-representors mode
authorVladyslav Tarasiuk <vladyslavt@mellanox.com>
Wed, 13 Nov 2019 15:19:47 +0000 (17:19 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Fri, 28 Feb 2020 00:40:14 +0000 (16:40 -0800)
Added devlink_port field to mlx5e_priv structure and a callback to
netdev ops to enable devlink to get info about the port. The port
registration happens at driver initialization.

Signed-off-by: Vladyslav Tarasiuk <vladyslavt@mellanox.com>
Reviewed-by: Moshe Shemesh <moshe@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/Makefile
drivers/net/ethernet/mellanox/mlx5/core/en.h
drivers/net/ethernet/mellanox/mlx5/core/en/devlink.c [new file with mode: 0644]
drivers/net/ethernet/mellanox/mlx5/core/en/devlink.h [new file with mode: 0644]
drivers/net/ethernet/mellanox/mlx5/core/en_main.c

index e0bb8e12356e0ef9635527e56e61a79db823a5ce..f3dec6b4143638d22b21da67903d52aa10ec44ba 100644 (file)
@@ -25,7 +25,7 @@ mlx5_core-$(CONFIG_MLX5_CORE_EN) += en_main.o en_common.o en_fs.o en_ethtool.o \
                en_tx.o en_rx.o en_dim.o en_txrx.o en/xdp.o en_stats.o \
                en_selftest.o en/port.o en/monitor_stats.o en/health.o \
                en/reporter_tx.o en/reporter_rx.o en/params.o en/xsk/umem.o \
-               en/xsk/setup.o en/xsk/rx.o en/xsk/tx.o
+               en/xsk/setup.o en/xsk/rx.o en/xsk/tx.o en/devlink.o
 
 #
 # Netdev extra
index 3cc439ab32539e6695e7b57912840dd14ede83ef..93ca9ea5a96e3da85ab60334ccd3a46597243951 100644 (file)
@@ -880,6 +880,7 @@ struct mlx5e_priv {
 #endif
        struct devlink_health_reporter *tx_reporter;
        struct devlink_health_reporter *rx_reporter;
+       struct devlink_port             dl_phy_port;
        struct mlx5e_xsk           xsk;
 #if IS_ENABLED(CONFIG_PCI_HYPERV_INTERFACE)
        struct mlx5e_hv_vhca_stats_agent stats_agent;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/devlink.c b/drivers/net/ethernet/mellanox/mlx5/core/en/devlink.c
new file mode 100644 (file)
index 0000000..1a87a3f
--- /dev/null
@@ -0,0 +1,38 @@
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
+/* Copyright (c) 2020, Mellanox Technologies inc.  All rights reserved. */
+
+#include "en/devlink.h"
+
+int mlx5e_devlink_phy_port_register(struct net_device *dev)
+{
+       struct mlx5e_priv *priv;
+       struct devlink *devlink;
+       int err;
+
+       priv = netdev_priv(dev);
+       devlink = priv_to_devlink(priv->mdev);
+
+       devlink_port_attrs_set(&priv->dl_phy_port,
+                              DEVLINK_PORT_FLAVOUR_PHYSICAL,
+                              PCI_FUNC(priv->mdev->pdev->devfn),
+                              false, 0,
+                              NULL, 0);
+       err = devlink_port_register(devlink, &priv->dl_phy_port, 1);
+       if (err)
+               return err;
+       devlink_port_type_eth_set(&priv->dl_phy_port, dev);
+       return 0;
+}
+
+void mlx5e_devlink_phy_port_unregister(struct mlx5e_priv *priv)
+{
+       devlink_port_unregister(&priv->dl_phy_port);
+}
+
+struct devlink_port *mlx5e_get_devlink_phy_port(struct net_device *dev)
+{
+       struct mlx5e_priv *priv = netdev_priv(dev);
+
+       return &priv->dl_phy_port;
+}
+
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/devlink.h b/drivers/net/ethernet/mellanox/mlx5/core/en/devlink.h
new file mode 100644 (file)
index 0000000..b8cd63b
--- /dev/null
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
+/* Copyright (c) 2020, Mellanox Technologies inc.  All rights reserved. */
+
+#ifndef __MLX5E_EN_DEVLINK_H
+#define __MLX5E_EN_DEVLINK_H
+
+#include <net/devlink.h>
+#include "en.h"
+
+int mlx5e_devlink_phy_port_register(struct net_device *dev);
+void mlx5e_devlink_phy_port_unregister(struct mlx5e_priv *priv);
+struct devlink_port *mlx5e_get_devlink_phy_port(struct net_device *dev);
+
+#endif
+
index d29e53c023f148f885a9e6744ea225111da38e1d..fc14b7be7ca83c8976a48eee7613040ac1e8e03f 100644 (file)
@@ -63,6 +63,7 @@
 #include "en/xsk/rx.h"
 #include "en/xsk/tx.h"
 #include "en/hv_vhca_stats.h"
+#include "en/devlink.h"
 #include "lib/mlx5.h"
 
 
@@ -4605,6 +4606,7 @@ const struct net_device_ops mlx5e_netdev_ops = {
        .ndo_set_vf_link_state   = mlx5e_set_vf_link_state,
        .ndo_get_vf_stats        = mlx5e_get_vf_stats,
 #endif
+       .ndo_get_devlink_port    = mlx5e_get_devlink_phy_port,
 };
 
 static int mlx5e_check_required_hca_cap(struct mlx5_core_dev *mdev)
@@ -5472,11 +5474,19 @@ static void *mlx5e_add(struct mlx5_core_dev *mdev)
                goto err_detach;
        }
 
+       err = mlx5e_devlink_phy_port_register(netdev);
+       if (err) {
+               mlx5_core_err(mdev, "mlx5e_devlink_phy_port_register failed, %d\n", err);
+               goto err_unregister_netdev;
+       }
+
 #ifdef CONFIG_MLX5_CORE_EN_DCB
        mlx5e_dcbnl_init_app(priv);
 #endif
        return priv;
 
+err_unregister_netdev:
+       unregister_netdev(netdev);
 err_detach:
        mlx5e_detach(mdev, priv);
 err_destroy_netdev:
@@ -5498,6 +5508,7 @@ static void mlx5e_remove(struct mlx5_core_dev *mdev, void *vpriv)
 #ifdef CONFIG_MLX5_CORE_EN_DCB
        mlx5e_dcbnl_delete_app(priv);
 #endif
+       mlx5e_devlink_phy_port_unregister(priv);
        unregister_netdev(priv->netdev);
        mlx5e_detach(mdev, vpriv);
        mlx5e_destroy_netdev(priv);