[RFC net-next 7/8] net/mlx5: Add devlink subdev life cycle command support
From: Parav Pandit
Date: Fri Mar 01 2019 - 00:38:29 EST
Implement devlink device add/del command which cretes dummy subdev
devices that actual driver can bind to using standard device driver
model.
Signed-off-by: Parav Pandit <parav@xxxxxxxxxxxx>
---
drivers/net/ethernet/mellanox/mlx5/core/Makefile | 1 +
drivers/net/ethernet/mellanox/mlx5/core/main.c | 4 ++
.../net/ethernet/mellanox/mlx5/core/mlx5_core.h | 4 ++
drivers/net/ethernet/mellanox/mlx5/core/subdev.c | 55 ++++++++++++++++++++++
4 files changed, 64 insertions(+)
create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/subdev.c
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/Makefile b/drivers/net/ethernet/mellanox/mlx5/core/Makefile
index 82d636b..f218789 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/Makefile
+++ b/drivers/net/ethernet/mellanox/mlx5/core/Makefile
@@ -16,6 +16,7 @@ mlx5_core-y := main.o cmd.o debugfs.o fw.o eq.o uar.o pagealloc.o \
transobj.o vport.o sriov.o fs_cmd.o fs_core.o \
fs_counters.o rl.o lag.o dev.o events.o wq.o lib/gid.o \
lib/devcom.o diag/fs_tracepoint.o diag/fw_tracer.o
+mlx5_core-$(CONFIG_SUBDEV) += subdev.o
#
# Netdev basic
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c
index 40d591c..5f8cf0d 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c
@@ -1213,6 +1213,10 @@ static int mlx5_unload_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv,
.eswitch_encap_mode_set = mlx5_devlink_eswitch_encap_mode_set,
.eswitch_encap_mode_get = mlx5_devlink_eswitch_encap_mode_get,
#endif
+#if IS_ENABLED(CONFIG_SUBDEV)
+ .dev_add = mlx5_devlink_dev_add,
+ .dev_del = mlx5_devlink_dev_del,
+#endif
};
#define MLX5_IB_MOD "mlx5_ib"
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h b/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
index 9529cf9..2a54148 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
@@ -202,4 +202,8 @@ enum {
u8 mlx5_get_nic_state(struct mlx5_core_dev *dev);
void mlx5_set_nic_state(struct mlx5_core_dev *dev, u8 state);
+
+struct devlink *mlx5_devlink_dev_add(struct devlink *devlink);
+void mlx5_devlink_dev_del(struct devlink *devlink);
+
#endif /* __MLX5_CORE_H__ */
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/subdev.c b/drivers/net/ethernet/mellanox/mlx5/core/subdev.c
new file mode 100644
index 0000000..9e78ea01
--- /dev/null
+++ b/drivers/net/ethernet/mellanox/mlx5/core/subdev.c
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
+// Copyright (c) 2018-19 Mellanox Technologies
+
+#include <linux/subdev_bus.h>
+#include <linux/subdev_ids.h>
+#include <linux/mlx5/driver.h>
+#include <net/devlink.h>
+
+#include "mlx5_core.h"
+
+struct mlx5_subdev {
+ struct subdev subdev;
+ struct devlink dl;
+};
+
+struct devlink *mlx5_devlink_dev_add(struct devlink *devlink)
+{
+ struct mlx5_subdev *subdev;
+ int ret;
+
+ subdev = subdev_alloc_dev(mlx5_subdev, subdev);
+ if (!subdev)
+ return ERR_PTR(-ENOMEM);
+
+ devlink_init(&subdev->dl, NULL);
+
+ ret = subdev_add_dev(&subdev->subdev, devlink->dev,
+ SUBDEV_VENDOR_ID_MELLANOX,
+ SUBDEV_DEVICE_ID_MELLANOX_SF);
+ if (ret)
+ goto add_err;
+
+ ret = __devlink_register(&subdev->dl, &subdev->subdev.dev, devlink);
+ if (ret)
+ goto reg_err;
+
+ return &subdev->dl;
+
+reg_err:
+ devlink_cleanup(&subdev->dl);
+add_err:
+ subdev_free_dev(&subdev->subdev);
+ return ERR_PTR(ret);
+}
+
+void mlx5_devlink_dev_del(struct devlink *devlink)
+{
+ struct mlx5_subdev *subdev =
+ container_of(devlink, struct mlx5_subdev, dl);
+
+ __devlink_unregister(devlink);
+ devlink_cleanup(devlink);
+ subdev_delete_dev(&subdev->subdev);
+ subdev_free_dev(&subdev->subdev);
+}
--
1.8.3.1