Subject: Re: [PATCH v4 net-next 1/8] sfc: add devlink support for ef100

From: Jiri Pirko <[email-masked]>
Date: Tue, 31 Jan 2023 17:00:02 +0100

Tue, Jan 31, 2023 at 03:58:15PM CET, [email-masked] wrote:
>From: Alejandro Lucero <[email-masked]>
>
>Basic devlink infrastructure support.
>
>Signed-off-by: Alejandro Lucero <[email-masked]>
>---
> drivers/net/ethernet/sfc/Kconfig        |  1 +
> drivers/net/ethernet/sfc/Makefile       |  3 +-
> drivers/net/ethernet/sfc/ef100_netdev.c | 12 +++++
> drivers/net/ethernet/sfc/ef100_nic.c    |  3 +-
> drivers/net/ethernet/sfc/efx_devlink.c  | 71 +++++++++++++++++++++++++
> drivers/net/ethernet/sfc/efx_devlink.h  | 22 ++++++++
> drivers/net/ethernet/sfc/net_driver.h   |  2 +
> 7 files changed, 111 insertions(+), 3 deletions(-)
> create mode 100644 drivers/net/ethernet/sfc/efx_devlink.c
> create mode 100644 drivers/net/ethernet/sfc/efx_devlink.h
>
>diff --git a/drivers/net/ethernet/sfc/Kconfig b/drivers/net/ethernet/sfc/Kconfig
>index 0950e6b0508f..4af36ba8906b 100644
>--- a/drivers/net/ethernet/sfc/Kconfig
>+++ b/drivers/net/ethernet/sfc/Kconfig
>@@ -22,6 +22,7 @@ config SFC
> 	depends on PTP_1588_CLOCK_OPTIONAL
> 	select MDIO
> 	select CRC32
>+	select NET_DEVLINK
> 	help
> 	  This driver supports 10/40-gigabit Ethernet cards based on
> 	  the Solarflare SFC9100-family controllers.
>diff --git a/drivers/net/ethernet/sfc/Makefile b/drivers/net/ethernet/sfc/Makefile
>index 712a48d00069..55b9c73cd8ef 100644
>--- a/drivers/net/ethernet/sfc/Makefile
>+++ b/drivers/net/ethernet/sfc/Makefile
>@@ -6,7 +6,8 @@ sfc-y			+= efx.o efx_common.o efx_channels.o nic.o \
> 			   mcdi.o mcdi_port.o mcdi_port_common.o \
> 			   mcdi_functions.o mcdi_filters.o mcdi_mon.o \
> 			   ef100.o ef100_nic.o ef100_netdev.o \
>-			   ef100_ethtool.o ef100_rx.o ef100_tx.o
>+			   ef100_ethtool.o ef100_rx.o ef100_tx.o \
>+			   efx_devlink.o
> sfc-$(CONFIG_SFC_MTD)	+= mtd.o
> sfc-$(CONFIG_SFC_SRIOV)	+= sriov.o ef10_sriov.o ef100_sriov.o ef100_rep.o \
>                            mae.o tc.o tc_bindings.o tc_counters.o
>diff --git a/drivers/net/ethernet/sfc/ef100_netdev.c b/drivers/net/ethernet/sfc/ef100_netdev.c
>index ddcc325ed570..b10a226f4a07 100644
>--- a/drivers/net/ethernet/sfc/ef100_netdev.c
>+++ b/drivers/net/ethernet/sfc/ef100_netdev.c
>@@ -24,6 +24,7 @@
> #include "rx_common.h"
> #include "ef100_sriov.h"
> #include "tc_bindings.h"
>+#include "efx_devlink.h"
> 
> static void ef100_update_name(struct efx_nic *efx)
> {
>@@ -332,6 +333,8 @@ void ef100_remove_netdev(struct efx_probe_data *probe_data)
> 		efx_ef100_pci_sriov_disable(efx, true);
> #endif
> 
>+	/* devlink lock */
>+	efx_fini_devlink_start(efx);
> 	ef100_unregister_netdev(efx);
> 
> #ifdef CONFIG_SFC_SRIOV
>@@ -345,6 +348,9 @@ void ef100_remove_netdev(struct efx_probe_data *probe_data)
> 	kfree(efx->phy_data);
> 	efx->phy_data = NULL;
> 
>+	/* devlink unlock */
>+	efx_fini_devlink(efx);
>+
> 	free_netdev(efx->net_dev);
> 	efx->net_dev = NULL;
> 	efx->state = STATE_PROBED;
>@@ -405,6 +411,10 @@ int ef100_probe_netdev(struct efx_probe_data *probe_data)
> 	/* Don't fail init if RSS setup doesn't work. */
> 	efx_mcdi_push_default_indir_table(efx, efx->n_rx_channels);
> 
>+	/* devlink creation, registration and lock */
>+	if (efx_probe_devlink(efx))

Use variable to store the return value and check that in if.

>+		pci_info(efx->pci_dev, "devlink registration failed");
>+
> 	rc = ef100_register_netdev(efx);
> 	if (rc)
> 		goto fail;
>@@ -424,5 +434,7 @@ int ef100_probe_netdev(struct efx_probe_data *probe_data)
> 	}
> 
> fail:
>+	/* devlink unlock */
>+	efx_probe_devlink_done(efx);
> 	return rc;
> }
>diff --git a/drivers/net/ethernet/sfc/ef100_nic.c b/drivers/net/ethernet/sfc/ef100_nic.c
>index ad686c671ab8..e4aacb4ec666 100644
>--- a/drivers/net/ethernet/sfc/ef100_nic.c
>+++ b/drivers/net/ethernet/sfc/ef100_nic.c
>@@ -1120,11 +1120,10 @@ int ef100_probe_netdev_pf(struct efx_nic *efx)
> 		return rc;
> 
> 	rc = efx_ef100_get_base_mport(efx);
>-	if (rc) {
>+	if (rc)
> 		netif_warn(efx, probe, net_dev,
> 			   "Failed to probe base mport rc %d; representors will not function\n",
> 			   rc);
>-	}

I don't see how this hunk is related to this patch. Please remove.

> 
> 	rc = efx_init_tc(efx);
> 	if (rc) {
>diff --git a/drivers/net/ethernet/sfc/efx_devlink.c b/drivers/net/ethernet/sfc/efx_devlink.c
>new file mode 100644
>index 000000000000..fab06aaa4b8a
>--- /dev/null
>+++ b/drivers/net/ethernet/sfc/efx_devlink.c
>@@ -0,0 +1,71 @@
>+// SPDX-License-Identifier: GPL-2.0-only
>+/****************************************************************************
>+ * Driver for AMD network controllers and boards
>+ * Copyright (C) 2023, Advanced Micro Devices, Inc.
>+ *
>+ * This program is free software; you can redistribute it and/or modify it
>+ * under the terms of the GNU General Public License version 2 as published
>+ * by the Free Software Foundation, incorporated herein by reference.
>+ */
>+
>+#include <linux/rtc.h>
>+#include "net_driver.h"
>+#include "ef100_nic.h"
>+#include "efx_devlink.h"
>+#include "nic.h"
>+#include "mcdi.h"
>+#include "mcdi_functions.h"
>+#include "mcdi_pcol.h"
>+
>+struct efx_devlink {
>+	struct efx_nic *efx;
>+};
>+
>+static const struct devlink_ops sfc_devlink_ops = {
>+};
>+
>+void efx_fini_devlink_start(struct efx_nic *efx)
>+{
>+	if (efx->devlink)
>+		devl_lock(efx->devlink);
>+}
>+
>+void efx_fini_devlink(struct efx_nic *efx)
>+{
>+	if (efx->devlink) {
>+		devl_unregister(efx->devlink);
>+		devl_unlock(efx->devlink);
>+		devlink_free(efx->devlink);
>+		efx->devlink = NULL;
>+	}
>+}
>+
>+int efx_probe_devlink(struct efx_nic *efx)
>+{
>+	struct efx_devlink *devlink_private;
>+
>+	if (efx->type->is_vf)
>+		return 0;
>+
>+	efx->devlink = devlink_alloc(&sfc_devlink_ops,
>+				     sizeof(struct efx_devlink),
>+				     &efx->pci_dev->dev);
>+	if (!efx->devlink)
>+		return -ENOMEM;
>+
>+	devl_lock(efx->devlink);
>+	devlink_private = devlink_priv(efx->devlink);
>+	devlink_private->efx = efx;
>+
>+	devl_register(efx->devlink);
>+
>+	return 0;
>+}
>+
>+void efx_probe_devlink_done(struct efx_nic *efx)
>+{
>+	if (!efx->devlink)
>+		return;
>+
>+	devl_unlock(efx->devlink);
>+}
>diff --git a/drivers/net/ethernet/sfc/efx_devlink.h b/drivers/net/ethernet/sfc/efx_devlink.h
>new file mode 100644
>index 000000000000..55d0d8aeca1e
>--- /dev/null
>+++ b/drivers/net/ethernet/sfc/efx_devlink.h
>@@ -0,0 +1,22 @@
>+/* SPDX-License-Identifier: GPL-2.0-only */
>+/****************************************************************************
>+ * Driver for AMD network controllers and boards
>+ * Copyright (C) 2023, Advanced Micro Devices, Inc.
>+ *
>+ * This program is free software; you can redistribute it and/or modify it
>+ * under the terms of the GNU General Public License version 2 as published
>+ * by the Free Software Foundation, incorporated herein by reference.
>+ */
>+
>+#ifndef _EFX_DEVLINK_H
>+#define _EFX_DEVLINK_H
>+
>+#include "net_driver.h"
>+#include <net/devlink.h>
>+
>+int efx_probe_devlink(struct efx_nic *efx);
>+void efx_probe_devlink_done(struct efx_nic *efx);
>+void efx_fini_devlink_start(struct efx_nic *efx);
>+void efx_fini_devlink(struct efx_nic *efx);

Odd naming... Just saying.

>+
>+#endif	/* _EFX_DEVLINK_H */
>diff --git a/drivers/net/ethernet/sfc/net_driver.h b/drivers/net/ethernet/sfc/net_driver.h
>index 3b49e216768b..d036641dc043 100644
>--- a/drivers/net/ethernet/sfc/net_driver.h
>+++ b/drivers/net/ethernet/sfc/net_driver.h
>@@ -994,6 +994,7 @@ enum efx_xdp_tx_queues_mode {
>  *      xdp_rxq_info structures?
>  * @netdev_notifier: Netdevice notifier.
>  * @tc: state for TC offload (EF100).
>+ * @devlink: reference to devlink structure owned by this device
>  * @mem_bar: The BAR that is mapped into membase.
>  * @reg_base: Offset from the start of the bar to the function control window.
>  * @monitor_work: Hardware monitor workitem
>@@ -1179,6 +1180,7 @@ struct efx_nic {
> 	struct notifier_block netdev_notifier;
> 	struct efx_tc_state *tc;
> 
>+	struct devlink *devlink;
> 	unsigned int mem_bar;
> 	u32 reg_base;
> 
>-- 
>2.17.1
>