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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Feb 08, 2023 at 02:25:12PM +0000, alejandro.lucero-palau@xxxxxxx wrote:
> From: Alejandro Lucero <alejandro.lucero-palau@xxxxxxx>
> 
> Add devlink infrastructure support. Further patches add devlink
> info and devlink port support.
> 
> Signed-off-by: Alejandro Lucero <alejandro.lucero-palau@xxxxxxx>
> Reviewed-by: Jiri Pirko <jiri@xxxxxxxxxx>

Acked-by: Martin Habets <habetsm.xilinx@xxxxxxxxx>

> ---
>  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



[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux