diff mbox series

[V1,net-next,1/5] net: ena: Register ena device to devlink

Message ID 20230108103533.10104-2-darinzon@amazon.com (mailing list archive)
State Changes Requested
Delegated to: Netdev Maintainers
Headers show
Series Add devlink support to ena | expand

Checks

Context Check Description
netdev/tree_selection success Clearly marked for net-next
netdev/fixes_present success Fixes tag not required for -next series
netdev/subject_prefix success Link
netdev/cover_letter success Series has a cover letter
netdev/patch_count success Link
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit fail Errors and warnings before: 0 this patch: 10
netdev/cc_maintainers warning 2 maintainers not CCed: edumazet@google.com pabeni@redhat.com
netdev/build_clang fail Errors and warnings before: 2 this patch: 11
netdev/module_param success Was 0 now: 0
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn fail Errors and warnings before: 0 this patch: 10
netdev/checkpatch warning WARNING: added, moved or deleted file(s), does MAINTAINERS need updating? WARNING: line length of 85 exceeds 80 columns
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

David Arinzon Jan. 8, 2023, 10:35 a.m. UTC
This patch registers ena as a device that supports devlink.
This makes it listed when running
        $ devlink dev show

The patch lands the base upon which the driver's devlink callbacks will
be added.

Signed-off-by: Shay Agroskin <shayagr@amazon.com>
Signed-off-by: David Arinzon <darinzon@amazon.com>
---
 drivers/net/ethernet/amazon/Kconfig           |  1 +
 drivers/net/ethernet/amazon/ena/Makefile      |  2 +-
 drivers/net/ethernet/amazon/ena/ena_devlink.c | 42 +++++++++++++++++++
 drivers/net/ethernet/amazon/ena/ena_devlink.h | 20 +++++++++
 drivers/net/ethernet/amazon/ena/ena_netdev.c  | 24 ++++++++++-
 drivers/net/ethernet/amazon/ena/ena_netdev.h  |  2 +
 6 files changed, 88 insertions(+), 3 deletions(-)
 create mode 100644 drivers/net/ethernet/amazon/ena/ena_devlink.c
 create mode 100644 drivers/net/ethernet/amazon/ena/ena_devlink.h

Comments

Kuniyuki Iwashima Jan. 9, 2023, 5:59 a.m. UTC | #1
From: David Arinzon <darinzon@amazon.com>
Date:   Sun, 8 Jan 2023 10:35:29 +0000
> This patch registers ena as a device that supports devlink.
> This makes it listed when running
>         $ devlink dev show
> 
> The patch lands the base upon which the driver's devlink callbacks will
> be added.
> 
> Signed-off-by: Shay Agroskin <shayagr@amazon.com>
> Signed-off-by: David Arinzon <darinzon@amazon.com>
> ---
>  drivers/net/ethernet/amazon/Kconfig           |  1 +
>  drivers/net/ethernet/amazon/ena/Makefile      |  2 +-
>  drivers/net/ethernet/amazon/ena/ena_devlink.c | 42 +++++++++++++++++++
>  drivers/net/ethernet/amazon/ena/ena_devlink.h | 20 +++++++++
>  drivers/net/ethernet/amazon/ena/ena_netdev.c  | 24 ++++++++++-
>  drivers/net/ethernet/amazon/ena/ena_netdev.h  |  2 +
>  6 files changed, 88 insertions(+), 3 deletions(-)
>  create mode 100644 drivers/net/ethernet/amazon/ena/ena_devlink.c
>  create mode 100644 drivers/net/ethernet/amazon/ena/ena_devlink.h
> 
> diff --git a/drivers/net/ethernet/amazon/Kconfig b/drivers/net/ethernet/amazon/Kconfig
> index c37fa393b99e..8f1b3302a89e 100644
> --- a/drivers/net/ethernet/amazon/Kconfig
> +++ b/drivers/net/ethernet/amazon/Kconfig
> @@ -18,6 +18,7 @@ if NET_VENDOR_AMAZON
>  
>  config ENA_ETHERNET
>  	tristate "Elastic Network Adapter (ENA) support"
> +	select NET_DEVLINK
>  	depends on PCI_MSI && !CPU_BIG_ENDIAN
>  	select DIMLIB
>  	help
> diff --git a/drivers/net/ethernet/amazon/ena/Makefile b/drivers/net/ethernet/amazon/ena/Makefile
> index f1f752a8f7bb..34abcedd9132 100644
> --- a/drivers/net/ethernet/amazon/ena/Makefile
> +++ b/drivers/net/ethernet/amazon/ena/Makefile
> @@ -5,4 +5,4 @@
>  
>  obj-$(CONFIG_ENA_ETHERNET) += ena.o
>  
> -ena-y := ena_netdev.o ena_com.o ena_eth_com.o ena_ethtool.o
> +ena-y := ena_netdev.o ena_com.o ena_eth_com.o ena_ethtool.o ena_devlink.o
> diff --git a/drivers/net/ethernet/amazon/ena/ena_devlink.c b/drivers/net/ethernet/amazon/ena/ena_devlink.c
> new file mode 100644
> index 000000000000..6897d60d8376
> --- /dev/null
> +++ b/drivers/net/ethernet/amazon/ena/ena_devlink.c
> @@ -0,0 +1,42 @@
> +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
> +/*
> + * Copyright 2015-2021 Amazon.com, Inc. or its affiliates. All rights reserved.

nit: s/2015-2021 //

---8<---
Copyright dates are not needed in open source code that Amazon creates. I.e.,
“Copyright [YEAR]-[YEAR] Amazon.com Inc. or its affiliates” will become
“Copyright Amazon.com Inc. or its affiliates.”
---8<---


> + */
> +
> +#include "linux/pci.h"
> +
> +#include "ena_devlink.h"
> +
> +static const struct devlink_ops ena_devlink_ops = {};
> +
> +struct devlink *ena_devlink_alloc(struct ena_adapter *adapter)
> +{
> +	struct device *dev = &adapter->pdev->dev;
> +	struct devlink *devlink;
> +
> +	devlink = devlink_alloc(&ena_devlink_ops, sizeof(struct ena_adapter *), dev);
> +	if (!devlink) {
> +		netdev_err(adapter->netdev, "Failed to allocate devlink struct\n");
> +		return NULL;
> +	}
> +
> +	ENA_DEVLINK_PRIV(devlink) = adapter;
> +	adapter->devlink = devlink;
> +
> +	return devlink;
> +}
> +
> +void ena_devlink_free(struct devlink *devlink)
> +{
> +	devlink_free(devlink);
> +}
> +
> +void ena_devlink_register(struct devlink *devlink, struct device *dev)
> +{
> +	devlink_register(devlink);
> +}
> +
> +void ena_devlink_unregister(struct devlink *devlink)
> +{
> +	devlink_unregister(devlink);
> +}
> diff --git a/drivers/net/ethernet/amazon/ena/ena_devlink.h b/drivers/net/ethernet/amazon/ena/ena_devlink.h
> new file mode 100644
> index 000000000000..6f737884b850
> --- /dev/null
> +++ b/drivers/net/ethernet/amazon/ena/ena_devlink.h
> @@ -0,0 +1,20 @@
> +/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
> +/*
> + * Copyright 2015-2021 Amazon.com, Inc. or its affiliates. All rights reserved.

Same here.


> + */
> +
> +#ifndef DEVLINK_H
> +#define DEVLINK_H
> +
> +#include "ena_netdev.h"
> +#include <net/devlink.h>
> +
> +#define ENA_DEVLINK_PRIV(devlink) \
> +	(*(struct ena_adapter **)devlink_priv(devlink))
> +
> +struct devlink *ena_devlink_alloc(struct ena_adapter *adapter);
> +void ena_devlink_free(struct devlink *devlink);
> +void ena_devlink_register(struct devlink *devlink, struct device *dev);
> +void ena_devlink_unregister(struct devlink *devlink);
> +
> +#endif /* DEVLINK_H */
> diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c
> index e8ad5ea31aff..ce79a0c42e6a 100644
> --- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
> +++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
> @@ -22,6 +22,8 @@
>  #include <linux/bpf_trace.h>
>  #include "ena_pci_id_tbl.h"
>  
> +#include "ena_devlink.h"
> +
>  MODULE_AUTHOR("Amazon.com, Inc. or its affiliates");
>  MODULE_DESCRIPTION(DEVICE_NAME);
>  MODULE_LICENSE("GPL");
> @@ -4243,6 +4245,7 @@ static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>  	struct ena_adapter *adapter;
>  	struct net_device *netdev;
>  	static int adapters_found;
> +	struct devlink *devlink;
>  	u32 max_num_io_queues;
>  	bool wd_state;
>  	int bars, rc;
> @@ -4308,12 +4311,18 @@ static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>  
>  	pci_set_drvdata(pdev, adapter);
>  
> -	rc = ena_device_init(ena_dev, pdev, &get_feat_ctx, &wd_state);
> +	devlink = ena_devlink_alloc(adapter);
> +	if (!devlink) {
> +		netdev_err(netdev, "ena_devlink_alloc failed\n");
> +		goto err_netdev_destroy;
> +	}
> +
> +	rc = ena_device_init(adapter, pdev, &get_feat_ctx, &wd_state);
>  	if (rc) {
>  		dev_err(&pdev->dev, "ENA device init failed\n");
>  		if (rc == -ETIME)
>  			rc = -EPROBE_DEFER;
> -		goto err_netdev_destroy;
> +		goto err_devlink_destroy;
>  	}
>  
>  	rc = ena_map_llq_mem_bar(pdev, ena_dev, bars);
> @@ -4362,6 +4371,7 @@ static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>  			"Failed to query interrupt moderation feature\n");
>  		goto err_device_destroy;
>  	}
> +
>  	ena_init_io_rings(adapter,
>  			  0,
>  			  adapter->xdp_num_queues +
> @@ -4420,6 +4430,8 @@ static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>  
>  	adapters_found++;
>  
> +	ena_devlink_register(devlink, &pdev->dev);
> +
>  	return 0;
>  
>  err_rss:
> @@ -4436,6 +4448,8 @@ static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>  err_device_destroy:
>  	ena_com_delete_host_info(ena_dev);
>  	ena_com_admin_destroy(ena_dev);
> +err_devlink_destroy:
> +	ena_devlink_free(devlink);
>  err_netdev_destroy:
>  	free_netdev(netdev);
>  err_free_region:
> @@ -4462,10 +4476,15 @@ static void __ena_shutoff(struct pci_dev *pdev, bool shutdown)
>  	struct ena_adapter *adapter = pci_get_drvdata(pdev);
>  	struct ena_com_dev *ena_dev;
>  	struct net_device *netdev;
> +	struct devlink *devlink;
>  
>  	ena_dev = adapter->ena_dev;
>  	netdev = adapter->netdev;
>  
> +	devlink = adapter->devlink;
> +	ena_devlink_unregister(devlink);
> +	ena_devlink_free(devlink);
> +
>  #ifdef CONFIG_RFS_ACCEL
>  	if ((adapter->msix_vecs >= 1) && (netdev->rx_cpu_rmap)) {
>  		free_irq_cpu_rmap(netdev->rx_cpu_rmap);
> @@ -4482,6 +4501,7 @@ static void __ena_shutoff(struct pci_dev *pdev, bool shutdown)
>  	rtnl_lock(); /* lock released inside the below if-else block */
>  	adapter->reset_reason = ENA_REGS_RESET_SHUTDOWN;
>  	ena_destroy_device(adapter, true);
> +
>  	if (shutdown) {
>  		netif_device_detach(netdev);
>  		dev_close(netdev);
> diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.h b/drivers/net/ethernet/amazon/ena/ena_netdev.h
> index 2cb141079474..c6132aa229df 100644
> --- a/drivers/net/ethernet/amazon/ena/ena_netdev.h
> +++ b/drivers/net/ethernet/amazon/ena/ena_netdev.h
> @@ -313,6 +313,8 @@ struct ena_adapter {
>  	struct net_device *netdev;
>  	struct pci_dev *pdev;
>  
> +	struct devlink *devlink;
> +
>  	/* rx packets that shorter that this len will be copied to the skb
>  	 * header
>  	 */
> -- 
> 2.38.1
David Arinzon Jan. 10, 2023, 3:17 p.m. UTC | #2
Thank you! This feedback will be addressed in the next version of the patchset.

> -----Original Message-----
> From: Iwashima, Kuniyuki <kuniyu@amazon.co.jp>
> Sent: Monday, January 9, 2023 7:59 AM
> To: Arinzon, David <darinzon@amazon.com>
> Cc: Kiyanovski, Arthur <akiyano@amazon.com>; Saidi, Ali
> <alisaidi@amazon.com>; davem@davemloft.net; Itzko, Shahar
> <itzko@amazon.com>; kuba@kernel.org; Matushevsky, Alexander
> <matua@amazon.com>; Bshara, Nafea <nafea@amazon.com>; Dagan,
> Noam <ndagan@amazon.com>; netdev@vger.kernel.org; Abboud, Osama
> <osamaabb@amazon.com>; Bshara, Saeed <saeedb@amazon.com>;
> Agroskin, Shay <shayagr@amazon.com>; Machulsky, Zorik
> <zorik@amazon.com>; Iwashima, Kuniyuki <kuniyu@amazon.co.jp>
> Subject: Re: [PATCH V1 net-next 1/5] net: ena: Register ena device to
> devlink
> 
> From: David Arinzon <darinzon@amazon.com>
> Date:   Sun, 8 Jan 2023 10:35:29 +0000
> > This patch registers ena as a device that supports devlink.
> > This makes it listed when running
> >         $ devlink dev show
> >
> > The patch lands the base upon which the driver's devlink callbacks
> > will be added.
> >
> > Signed-off-by: Shay Agroskin <shayagr@amazon.com>
> > Signed-off-by: David Arinzon <darinzon@amazon.com>
> > ---
> >  drivers/net/ethernet/amazon/Kconfig           |  1 +
> >  drivers/net/ethernet/amazon/ena/Makefile      |  2 +-
> >  drivers/net/ethernet/amazon/ena/ena_devlink.c | 42
> > +++++++++++++++++++
> drivers/net/ethernet/amazon/ena/ena_devlink.h |
> > 20 +++++++++  drivers/net/ethernet/amazon/ena/ena_netdev.c  | 24
> > ++++++++++-  drivers/net/ethernet/amazon/ena/ena_netdev.h  |  2 +
> >  6 files changed, 88 insertions(+), 3 deletions(-)  create mode 100644
> > drivers/net/ethernet/amazon/ena/ena_devlink.c
> >  create mode 100644 drivers/net/ethernet/amazon/ena/ena_devlink.h
> >
> > diff --git a/drivers/net/ethernet/amazon/Kconfig
> > b/drivers/net/ethernet/amazon/Kconfig
> > index c37fa393b99e..8f1b3302a89e 100644
> > --- a/drivers/net/ethernet/amazon/Kconfig
> > +++ b/drivers/net/ethernet/amazon/Kconfig
> > @@ -18,6 +18,7 @@ if NET_VENDOR_AMAZON
> >
> >  config ENA_ETHERNET
> >  	tristate "Elastic Network Adapter (ENA) support"
> > +	select NET_DEVLINK
> >  	depends on PCI_MSI && !CPU_BIG_ENDIAN
> >  	select DIMLIB
> >  	help
> > diff --git a/drivers/net/ethernet/amazon/ena/Makefile
> > b/drivers/net/ethernet/amazon/ena/Makefile
> > index f1f752a8f7bb..34abcedd9132 100644
> > --- a/drivers/net/ethernet/amazon/ena/Makefile
> > +++ b/drivers/net/ethernet/amazon/ena/Makefile
> > @@ -5,4 +5,4 @@
> >
> >  obj-$(CONFIG_ENA_ETHERNET) += ena.o
> >
> > -ena-y := ena_netdev.o ena_com.o ena_eth_com.o ena_ethtool.o
> > +ena-y := ena_netdev.o ena_com.o ena_eth_com.o ena_ethtool.o
> > +ena_devlink.o
> > diff --git a/drivers/net/ethernet/amazon/ena/ena_devlink.c
> > b/drivers/net/ethernet/amazon/ena/ena_devlink.c
> > new file mode 100644
> > index 000000000000..6897d60d8376
> > --- /dev/null
> > +++ b/drivers/net/ethernet/amazon/ena/ena_devlink.c
> > @@ -0,0 +1,42 @@
> > +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
> > +/*
> > + * Copyright 2015-2021 Amazon.com, Inc. or its affiliates. All rights
> reserved.
> 
> nit: s/2015-2021 //
> 
> ---8<---
> Copyright dates are not needed in open source code that Amazon creates.
> I.e., “Copyright [YEAR]-[YEAR] Amazon.com Inc. or its affiliates” will
> become “Copyright Amazon.com Inc. or its affiliates.”
> ---8<---
> 
> 
> > + */
> > +
> > +#include "linux/pci.h"
> > +
> > +#include "ena_devlink.h"
> > +
> > +static const struct devlink_ops ena_devlink_ops = {};
> > +
> > +struct devlink *ena_devlink_alloc(struct ena_adapter *adapter) {
> > +	struct device *dev = &adapter->pdev->dev;
> > +	struct devlink *devlink;
> > +
> > +	devlink = devlink_alloc(&ena_devlink_ops, sizeof(struct
> ena_adapter *), dev);
> > +	if (!devlink) {
> > +		netdev_err(adapter->netdev, "Failed to allocate devlink
> struct\n");
> > +		return NULL;
> > +	}
> > +
> > +	ENA_DEVLINK_PRIV(devlink) = adapter;
> > +	adapter->devlink = devlink;
> > +
> > +	return devlink;
> > +}
> > +
> > +void ena_devlink_free(struct devlink *devlink) {
> > +	devlink_free(devlink);
> > +}
> > +
> > +void ena_devlink_register(struct devlink *devlink, struct device
> > +*dev) {
> > +	devlink_register(devlink);
> > +}
> > +
> > +void ena_devlink_unregister(struct devlink *devlink) {
> > +	devlink_unregister(devlink);
> > +}
> > diff --git a/drivers/net/ethernet/amazon/ena/ena_devlink.h
> > b/drivers/net/ethernet/amazon/ena/ena_devlink.h
> > new file mode 100644
> > index 000000000000..6f737884b850
> > --- /dev/null
> > +++ b/drivers/net/ethernet/amazon/ena/ena_devlink.h
> > @@ -0,0 +1,20 @@
> > +/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
> > +/*
> > + * Copyright 2015-2021 Amazon.com, Inc. or its affiliates. All rights
> reserved.
> 
> Same here.
> 
> 
> > + */
> > +
> > +#ifndef DEVLINK_H
> > +#define DEVLINK_H
> > +
> > +#include "ena_netdev.h"
> > +#include <net/devlink.h>
> > +
> > +#define ENA_DEVLINK_PRIV(devlink) \
> > +	(*(struct ena_adapter **)devlink_priv(devlink))
> > +
> > +struct devlink *ena_devlink_alloc(struct ena_adapter *adapter); void
> > +ena_devlink_free(struct devlink *devlink); void
> > +ena_devlink_register(struct devlink *devlink, struct device *dev);
> > +void ena_devlink_unregister(struct devlink *devlink);
> > +
> > +#endif /* DEVLINK_H */
> > diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c
> > b/drivers/net/ethernet/amazon/ena/ena_netdev.c
> > index e8ad5ea31aff..ce79a0c42e6a 100644
> > --- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
> > +++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
> > @@ -22,6 +22,8 @@
> >  #include <linux/bpf_trace.h>
> >  #include "ena_pci_id_tbl.h"
> >
> > +#include "ena_devlink.h"
> > +
> >  MODULE_AUTHOR("Amazon.com, Inc. or its affiliates");
> > MODULE_DESCRIPTION(DEVICE_NAME);  MODULE_LICENSE("GPL"); @@ -
> 4243,6
> > +4245,7 @@ static int ena_probe(struct pci_dev *pdev, const struct
> pci_device_id *ent)
> >  	struct ena_adapter *adapter;
> >  	struct net_device *netdev;
> >  	static int adapters_found;
> > +	struct devlink *devlink;
> >  	u32 max_num_io_queues;
> >  	bool wd_state;
> >  	int bars, rc;
> > @@ -4308,12 +4311,18 @@ static int ena_probe(struct pci_dev *pdev,
> > const struct pci_device_id *ent)
> >
> >  	pci_set_drvdata(pdev, adapter);
> >
> > -	rc = ena_device_init(ena_dev, pdev, &get_feat_ctx, &wd_state);
> > +	devlink = ena_devlink_alloc(adapter);
> > +	if (!devlink) {
> > +		netdev_err(netdev, "ena_devlink_alloc failed\n");
> > +		goto err_netdev_destroy;
> > +	}
> > +
> > +	rc = ena_device_init(adapter, pdev, &get_feat_ctx, &wd_state);
> >  	if (rc) {
> >  		dev_err(&pdev->dev, "ENA device init failed\n");
> >  		if (rc == -ETIME)
> >  			rc = -EPROBE_DEFER;
> > -		goto err_netdev_destroy;
> > +		goto err_devlink_destroy;
> >  	}
> >
> >  	rc = ena_map_llq_mem_bar(pdev, ena_dev, bars); @@ -4362,6
> +4371,7 @@
> > static int ena_probe(struct pci_dev *pdev, const struct pci_device_id
> *ent)
> >  			"Failed to query interrupt moderation feature\n");
> >  		goto err_device_destroy;
> >  	}
> > +
> >  	ena_init_io_rings(adapter,
> >  			  0,
> >  			  adapter->xdp_num_queues +
> > @@ -4420,6 +4430,8 @@ static int ena_probe(struct pci_dev *pdev,
> const
> > struct pci_device_id *ent)
> >
> >  	adapters_found++;
> >
> > +	ena_devlink_register(devlink, &pdev->dev);
> > +
> >  	return 0;
> >
> >  err_rss:
> > @@ -4436,6 +4448,8 @@ static int ena_probe(struct pci_dev *pdev,
> const
> > struct pci_device_id *ent)
> >  err_device_destroy:
> >  	ena_com_delete_host_info(ena_dev);
> >  	ena_com_admin_destroy(ena_dev);
> > +err_devlink_destroy:
> > +	ena_devlink_free(devlink);
> >  err_netdev_destroy:
> >  	free_netdev(netdev);
> >  err_free_region:
> > @@ -4462,10 +4476,15 @@ static void __ena_shutoff(struct pci_dev
> *pdev, bool shutdown)
> >  	struct ena_adapter *adapter = pci_get_drvdata(pdev);
> >  	struct ena_com_dev *ena_dev;
> >  	struct net_device *netdev;
> > +	struct devlink *devlink;
> >
> >  	ena_dev = adapter->ena_dev;
> >  	netdev = adapter->netdev;
> >
> > +	devlink = adapter->devlink;
> > +	ena_devlink_unregister(devlink);
> > +	ena_devlink_free(devlink);
> > +
> >  #ifdef CONFIG_RFS_ACCEL
> >  	if ((adapter->msix_vecs >= 1) && (netdev->rx_cpu_rmap)) {
> >  		free_irq_cpu_rmap(netdev->rx_cpu_rmap);
> > @@ -4482,6 +4501,7 @@ static void __ena_shutoff(struct pci_dev
> *pdev, bool shutdown)
> >  	rtnl_lock(); /* lock released inside the below if-else block */
> >  	adapter->reset_reason = ENA_REGS_RESET_SHUTDOWN;
> >  	ena_destroy_device(adapter, true);
> > +
> >  	if (shutdown) {
> >  		netif_device_detach(netdev);
> >  		dev_close(netdev);
> > diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.h
> > b/drivers/net/ethernet/amazon/ena/ena_netdev.h
> > index 2cb141079474..c6132aa229df 100644
> > --- a/drivers/net/ethernet/amazon/ena/ena_netdev.h
> > +++ b/drivers/net/ethernet/amazon/ena/ena_netdev.h
> > @@ -313,6 +313,8 @@ struct ena_adapter {
> >  	struct net_device *netdev;
> >  	struct pci_dev *pdev;
> >
> > +	struct devlink *devlink;
> > +
> >  	/* rx packets that shorter that this len will be copied to the skb
> >  	 * header
> >  	 */
> > --
> > 2.38.1
diff mbox series

Patch

diff --git a/drivers/net/ethernet/amazon/Kconfig b/drivers/net/ethernet/amazon/Kconfig
index c37fa393b99e..8f1b3302a89e 100644
--- a/drivers/net/ethernet/amazon/Kconfig
+++ b/drivers/net/ethernet/amazon/Kconfig
@@ -18,6 +18,7 @@  if NET_VENDOR_AMAZON
 
 config ENA_ETHERNET
 	tristate "Elastic Network Adapter (ENA) support"
+	select NET_DEVLINK
 	depends on PCI_MSI && !CPU_BIG_ENDIAN
 	select DIMLIB
 	help
diff --git a/drivers/net/ethernet/amazon/ena/Makefile b/drivers/net/ethernet/amazon/ena/Makefile
index f1f752a8f7bb..34abcedd9132 100644
--- a/drivers/net/ethernet/amazon/ena/Makefile
+++ b/drivers/net/ethernet/amazon/ena/Makefile
@@ -5,4 +5,4 @@ 
 
 obj-$(CONFIG_ENA_ETHERNET) += ena.o
 
-ena-y := ena_netdev.o ena_com.o ena_eth_com.o ena_ethtool.o
+ena-y := ena_netdev.o ena_com.o ena_eth_com.o ena_ethtool.o ena_devlink.o
diff --git a/drivers/net/ethernet/amazon/ena/ena_devlink.c b/drivers/net/ethernet/amazon/ena/ena_devlink.c
new file mode 100644
index 000000000000..6897d60d8376
--- /dev/null
+++ b/drivers/net/ethernet/amazon/ena/ena_devlink.c
@@ -0,0 +1,42 @@ 
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
+/*
+ * Copyright 2015-2021 Amazon.com, Inc. or its affiliates. All rights reserved.
+ */
+
+#include "linux/pci.h"
+
+#include "ena_devlink.h"
+
+static const struct devlink_ops ena_devlink_ops = {};
+
+struct devlink *ena_devlink_alloc(struct ena_adapter *adapter)
+{
+	struct device *dev = &adapter->pdev->dev;
+	struct devlink *devlink;
+
+	devlink = devlink_alloc(&ena_devlink_ops, sizeof(struct ena_adapter *), dev);
+	if (!devlink) {
+		netdev_err(adapter->netdev, "Failed to allocate devlink struct\n");
+		return NULL;
+	}
+
+	ENA_DEVLINK_PRIV(devlink) = adapter;
+	adapter->devlink = devlink;
+
+	return devlink;
+}
+
+void ena_devlink_free(struct devlink *devlink)
+{
+	devlink_free(devlink);
+}
+
+void ena_devlink_register(struct devlink *devlink, struct device *dev)
+{
+	devlink_register(devlink);
+}
+
+void ena_devlink_unregister(struct devlink *devlink)
+{
+	devlink_unregister(devlink);
+}
diff --git a/drivers/net/ethernet/amazon/ena/ena_devlink.h b/drivers/net/ethernet/amazon/ena/ena_devlink.h
new file mode 100644
index 000000000000..6f737884b850
--- /dev/null
+++ b/drivers/net/ethernet/amazon/ena/ena_devlink.h
@@ -0,0 +1,20 @@ 
+/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
+/*
+ * Copyright 2015-2021 Amazon.com, Inc. or its affiliates. All rights reserved.
+ */
+
+#ifndef DEVLINK_H
+#define DEVLINK_H
+
+#include "ena_netdev.h"
+#include <net/devlink.h>
+
+#define ENA_DEVLINK_PRIV(devlink) \
+	(*(struct ena_adapter **)devlink_priv(devlink))
+
+struct devlink *ena_devlink_alloc(struct ena_adapter *adapter);
+void ena_devlink_free(struct devlink *devlink);
+void ena_devlink_register(struct devlink *devlink, struct device *dev);
+void ena_devlink_unregister(struct devlink *devlink);
+
+#endif /* DEVLINK_H */
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index e8ad5ea31aff..ce79a0c42e6a 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -22,6 +22,8 @@ 
 #include <linux/bpf_trace.h>
 #include "ena_pci_id_tbl.h"
 
+#include "ena_devlink.h"
+
 MODULE_AUTHOR("Amazon.com, Inc. or its affiliates");
 MODULE_DESCRIPTION(DEVICE_NAME);
 MODULE_LICENSE("GPL");
@@ -4243,6 +4245,7 @@  static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	struct ena_adapter *adapter;
 	struct net_device *netdev;
 	static int adapters_found;
+	struct devlink *devlink;
 	u32 max_num_io_queues;
 	bool wd_state;
 	int bars, rc;
@@ -4308,12 +4311,18 @@  static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
 	pci_set_drvdata(pdev, adapter);
 
-	rc = ena_device_init(ena_dev, pdev, &get_feat_ctx, &wd_state);
+	devlink = ena_devlink_alloc(adapter);
+	if (!devlink) {
+		netdev_err(netdev, "ena_devlink_alloc failed\n");
+		goto err_netdev_destroy;
+	}
+
+	rc = ena_device_init(adapter, pdev, &get_feat_ctx, &wd_state);
 	if (rc) {
 		dev_err(&pdev->dev, "ENA device init failed\n");
 		if (rc == -ETIME)
 			rc = -EPROBE_DEFER;
-		goto err_netdev_destroy;
+		goto err_devlink_destroy;
 	}
 
 	rc = ena_map_llq_mem_bar(pdev, ena_dev, bars);
@@ -4362,6 +4371,7 @@  static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 			"Failed to query interrupt moderation feature\n");
 		goto err_device_destroy;
 	}
+
 	ena_init_io_rings(adapter,
 			  0,
 			  adapter->xdp_num_queues +
@@ -4420,6 +4430,8 @@  static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
 	adapters_found++;
 
+	ena_devlink_register(devlink, &pdev->dev);
+
 	return 0;
 
 err_rss:
@@ -4436,6 +4448,8 @@  static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 err_device_destroy:
 	ena_com_delete_host_info(ena_dev);
 	ena_com_admin_destroy(ena_dev);
+err_devlink_destroy:
+	ena_devlink_free(devlink);
 err_netdev_destroy:
 	free_netdev(netdev);
 err_free_region:
@@ -4462,10 +4476,15 @@  static void __ena_shutoff(struct pci_dev *pdev, bool shutdown)
 	struct ena_adapter *adapter = pci_get_drvdata(pdev);
 	struct ena_com_dev *ena_dev;
 	struct net_device *netdev;
+	struct devlink *devlink;
 
 	ena_dev = adapter->ena_dev;
 	netdev = adapter->netdev;
 
+	devlink = adapter->devlink;
+	ena_devlink_unregister(devlink);
+	ena_devlink_free(devlink);
+
 #ifdef CONFIG_RFS_ACCEL
 	if ((adapter->msix_vecs >= 1) && (netdev->rx_cpu_rmap)) {
 		free_irq_cpu_rmap(netdev->rx_cpu_rmap);
@@ -4482,6 +4501,7 @@  static void __ena_shutoff(struct pci_dev *pdev, bool shutdown)
 	rtnl_lock(); /* lock released inside the below if-else block */
 	adapter->reset_reason = ENA_REGS_RESET_SHUTDOWN;
 	ena_destroy_device(adapter, true);
+
 	if (shutdown) {
 		netif_device_detach(netdev);
 		dev_close(netdev);
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.h b/drivers/net/ethernet/amazon/ena/ena_netdev.h
index 2cb141079474..c6132aa229df 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.h
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.h
@@ -313,6 +313,8 @@  struct ena_adapter {
 	struct net_device *netdev;
 	struct pci_dev *pdev;
 
+	struct devlink *devlink;
+
 	/* rx packets that shorter that this len will be copied to the skb
 	 * header
 	 */