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