[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <Y+X/zoltG4QlaUql@gmail.com>
Date: Fri, 10 Feb 2023 08:28:10 +0000
From: Martin Habets <habetsm.xilinx@...il.com>
To: alejandro.lucero-palau@....com
Cc: netdev@...r.kernel.org, linux-net-drivers@....com,
davem@...emloft.net, kuba@...nel.org, pabeni@...hat.com,
edumazet@...gle.com, ecree.xilinx@...il.com,
linux-doc@...r.kernel.org, corbet@....net, jiri@...dia.com
Subject: Re: [PATCH v6 net-next 1/8] sfc: add devlink support for ef100
On Wed, Feb 08, 2023 at 02:25:12PM +0000, alejandro.lucero-palau@....com wrote:
> From: Alejandro Lucero <alejandro.lucero-palau@....com>
>
> Add devlink infrastructure support. Further patches add devlink
> info and devlink port support.
>
> Signed-off-by: Alejandro Lucero <alejandro.lucero-palau@....com>
> Reviewed-by: Jiri Pirko <jiri@...dia.com>
Acked-by: Martin Habets <habetsm.xilinx@...il.com>
> ---
> drivers/net/ethernet/sfc/Kconfig | 1 +
> drivers/net/ethernet/sfc/Makefile | 3 +-
> drivers/net/ethernet/sfc/ef100_netdev.c | 10 ++++
> drivers/net/ethernet/sfc/efx_devlink.c | 64 +++++++++++++++++++++++++
> drivers/net/ethernet/sfc/efx_devlink.h | 22 +++++++++
> drivers/net/ethernet/sfc/net_driver.h | 2 +
> 6 files changed, 101 insertions(+), 1 deletion(-)
> 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..6cf74788b27a 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,7 @@ void ef100_remove_netdev(struct efx_probe_data *probe_data)
> efx_ef100_pci_sriov_disable(efx, true);
> #endif
>
> + efx_fini_devlink_lock(efx);
> ef100_unregister_netdev(efx);
>
> #ifdef CONFIG_SFC_SRIOV
> @@ -345,6 +347,8 @@ void ef100_remove_netdev(struct efx_probe_data *probe_data)
> kfree(efx->phy_data);
> efx->phy_data = NULL;
>
> + efx_fini_devlink_and_unlock(efx);
> +
> free_netdev(efx->net_dev);
> efx->net_dev = NULL;
> efx->state = STATE_PROBED;
> @@ -405,6 +409,11 @@ 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 */
> + rc = efx_probe_devlink_and_lock(efx);
> + if (rc)
> + pci_info(efx->pci_dev, "devlink registration failed");
> +
> rc = ef100_register_netdev(efx);
> if (rc)
> goto fail;
> @@ -424,5 +433,6 @@ int ef100_probe_netdev(struct efx_probe_data *probe_data)
> }
>
> fail:
> + efx_probe_devlink_unlock(efx);
> return 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..57a7023d3cb6
> --- /dev/null
> +++ b/drivers/net/ethernet/sfc/efx_devlink.c
> @@ -0,0 +1,64 @@
> +// 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 "efx_devlink.h"
> +
> +struct efx_devlink {
> + struct efx_nic *efx;
> +};
> +
> +static const struct devlink_ops sfc_devlink_ops = {
> +};
> +
> +void efx_fini_devlink_lock(struct efx_nic *efx)
> +{
> + if (efx->devlink)
> + devl_lock(efx->devlink);
> +}
> +
> +void efx_fini_devlink_and_unlock(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_and_lock(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_unlock(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..8ff85b035e87
> --- /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_and_lock(struct efx_nic *efx);
> +void efx_probe_devlink_unlock(struct efx_nic *efx);
> +void efx_fini_devlink_lock(struct efx_nic *efx);
> +void efx_fini_devlink_and_unlock(struct efx_nic *efx);
> +
> +#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
Powered by blists - more mailing lists