PHC support in ENA driver
Subsystems (5)
David Arinzon
maintainerv13 cover PHC support in ENA driver
Changes in v13
- Remove unnecessary out-of-tree driver documentation
Changes in v12 (https://lore.kernel.org/netdev/[email protected]/):
- Add devlink port support
- Remove unnecessary checks from devlink reload up and reload down
Changes in v11 (https://lore.kernel.org/netdev/[email protected]/):
- Change PHC enablement devlink parameter to be generic instead of device specific
Changes in v10 (https://lore.kernel.org/netdev/[email protected]/):
- Remove error checks for debugfs calls
Changes in v9 (https://lore.kernel.org/netdev/[email protected]/):
- Use devlink instead of sysfs for PHC enablement
- Use debugfs instead of sysfs for PHC stats
- Add PHC error flags and break down phc_err into two errors
- Various style changes
Changes in v8 (https://lore.kernel.org/netdev/[email protected]/):
- Create a sysfs entry for each PHC stat
Changes in v7 (https://lore.kernel.org/netdev/[email protected]/):
- Move PHC stats to sysfs
- Add information about PHC enablement
- Remove unrelated style changes
Changes in v6 (https://lore.kernel.org/netdev/[email protected]/):
- Remove PHC error bound
Changes in v5 (https://lore.kernel.org/netdev/[email protected]/):
- Add PHC error bound
- Add PHC enablement and error bound retrieval through sysfs
Changes in v4 (https://lore.kernel.org/netdev/[email protected]/):
- Minor documentation change (resolution instead of accuracy)
Changes in v3 (https://lore.kernel.org/netdev/[email protected]/):
- Resolve a compilation error
Changes in v2 (https://lore.kernel.org/netdev/[email protected]/):
- CCd PTP maintainer
- Fixed style issues
- Fixed documentation warning
v1 (https://lore.kernel.org/netdev/[email protected]/)
This patchset adds the support for PHC (PTP Hardware Clock) in the ENA driver. The documentation part of the patchset includes additional information, including statistics, utilization and invocation examples through the testptp utility.
David Arinzon (9):
net: ena: Add PHC support in the ENA driver
net: ena: PHC silent reset
net: ena: Add device reload capability through devlink
net: ena: Add devlink port support
devlink: Add new "enable_phc" generic device param
net: ena: Control PHC enable through devlink
net: ena: Add debugfs support to the ENA driver
net: ena: View PHC stats using debugfs
net: ena: Add PHC documentation
.../device_drivers/ethernet/amazon/ena.rst | 108 +++++++ .../networking/devlink/devlink-params.rst | 3 + drivers/net/ethernet/amazon/Kconfig | 2 + drivers/net/ethernet/amazon/ena/Makefile | 2 +- .../net/ethernet/amazon/ena/ena_admin_defs.h | 74 ++++- drivers/net/ethernet/amazon/ena/ena_com.c | 267 ++++++++++++++++++ drivers/net/ethernet/amazon/ena/ena_com.h | 84 ++++++ drivers/net/ethernet/amazon/ena/ena_debugfs.c | 62 ++++ drivers/net/ethernet/amazon/ena/ena_debugfs.h | 27 ++ drivers/net/ethernet/amazon/ena/ena_devlink.c | 210 ++++++++++++++ drivers/net/ethernet/amazon/ena/ena_devlink.h | 21 ++ drivers/net/ethernet/amazon/ena/ena_ethtool.c | 16 +- drivers/net/ethernet/amazon/ena/ena_netdev.c | 62 +++- drivers/net/ethernet/amazon/ena/ena_netdev.h | 14 + drivers/net/ethernet/amazon/ena/ena_phc.c | 233 +++++++++++++++ drivers/net/ethernet/amazon/ena/ena_phc.h | 37 +++ .../net/ethernet/amazon/ena/ena_regs_defs.h | 8 + include/net/devlink.h | 4 + net/devlink/param.c | 5 + 19 files changed, 1229 insertions(+), 10 deletions(-) create mode 100644 drivers/net/ethernet/amazon/ena/ena_debugfs.c create mode 100644 drivers/net/ethernet/amazon/ena/ena_debugfs.h create mode 100644 drivers/net/ethernet/amazon/ena/ena_devlink.c create mode 100644 drivers/net/ethernet/amazon/ena/ena_devlink.h create mode 100644 drivers/net/ethernet/amazon/ena/ena_phc.c create mode 100644 drivers/net/ethernet/amazon/ena/ena_phc.h
Signature · 1 line
2.47.1
David Arinzon
maintainerPATCH v13 1/9 net: ena: Add PHC support in the ENA driver
The ENA driver will be extended to support the new PHC feature using ptp_clock interface [1]. this will provide timestamp reference for user space to allow measuring time offset between the PHC and the system clock in order to achieve nanosecond accuracy.
[1] - https://www.kernel.org/doc/html/latest/driver-api/ptp.html
--- .../device_drivers/ethernet/amazon/ena.rst | 1 + drivers/net/ethernet/amazon/Kconfig | 1 + drivers/net/ethernet/amazon/ena/Makefile | 2 +- .../net/ethernet/amazon/ena/ena_admin_defs.h | 74 ++++- drivers/net/ethernet/amazon/ena/ena_com.c | 267 ++++++++++++++++++ drivers/net/ethernet/amazon/ena/ena_com.h | 84 ++++++ drivers/net/ethernet/amazon/ena/ena_ethtool.c | 16 +- drivers/net/ethernet/amazon/ena/ena_netdev.c | 24 +- drivers/net/ethernet/amazon/ena/ena_netdev.h | 4 + drivers/net/ethernet/amazon/ena/ena_phc.c | 223 +++++++++++++++ drivers/net/ethernet/amazon/ena/ena_phc.h | 37 +++ .../net/ethernet/amazon/ena/ena_regs_defs.h | 8 + 12 files changed, 736 insertions(+), 5 deletions(-) create mode 100644 drivers/net/ethernet/amazon/ena/ena_phc.c create mode 100644 drivers/net/ethernet/amazon/ena/ena_phc.h
Documentation/networking/device_drivers/ethernet/amazon/ena.rst +1 -0
@@ -56,6 +56,7 @@ ena_netdev.[ch] Main Linux kernel driver. ena_ethtool.c ethtool callbacks. ena_xdp.[ch] XDP files ena_pci_id_tbl.h Supported device IDs. +ena_phc.[ch] PTP hardware clock infrastructure (see `PHC`_ for more info) ================= ====================================================== Management Interface:
drivers/net/ethernet/amazon/Kconfig +1 -0
@@ -19,6 +19,7 @@ if NET_VENDOR_AMAZON config ENA_ETHERNET tristate "Elastic Network Adapter (ENA) support" depends on PCI_MSI && !CPU_BIG_ENDIAN + depends on PTP_1588_CLOCK_OPTIONAL select DIMLIB help This driver supports Elastic Network Adapter (ENA)"
drivers/net/ethernet/amazon/ena/Makefile +1 -1
@@ -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_xdp.o +ena-y := ena_netdev.o ena_com.o ena_eth_com.o ena_ethtool.o ena_xdp.o ena_phc.o
drivers/net/ethernet/amazon/ena/ena_admin_defs.h +73 -1
122 lines not on this page · raw message
drivers/net/ethernet/amazon/ena/ena_com.c +267 -0
279 lines not on this page · raw message
drivers/net/ethernet/amazon/ena/ena_com.h +84 -0
108 lines not on this page · raw message
drivers/net/ethernet/amazon/ena/ena_ethtool.c +15 -1
@@ -5,9 +5,11 @@#include <linux/ethtool.h> #include <linux/pci.h> +#include <linux/net_tstamp.h> #include "ena_netdev.h" #include "ena_xdp.h" +#include "ena_phc.h" struct ena_stats {char name[ETH_GSTRING_LEN ];
@@ -298,6 +300,18 @@ static void ena_get_ethtool_stats(struct net_device *netdev,ena_get_stats (adapter, data, true); } +static int ena_get_ts_info (struct net_device *netdev, +struct kernel_ethtool_ts_info *info) +{ +struct ena_adapter *adapter =netdev_priv (netdev); + + info->so_timestamping =SOF_TIMESTAMPING_TX_SOFTWARE ; + + info->phc_index =ena_phc_get_index (adapter); + +return 0 ; +} +static int ena_get_sw_stats_count (struct ena_adapter *adapter) {return adapter->num_io_queues * (ENA_STATS_ARRAY_TX +ENA_STATS_ARRAY_RX )
@@ -1107,7 +1121,7 @@ static const struct ethtool_ops ena_ethtool_ops = { .set_channels = ena_set_channels, .get_tunable = ena_get_tunable, .set_tunable = ena_set_tunable, - .get_ts_info = ethtool_op_get_ts_info, + .get_ts_info = ena_get_ts_info, };void ena_set_ethtool_ops (struct net_device *netdev)
drivers/net/ethernet/amazon/ena/ena_netdev.c +22 -2
@@ -19,6 +19,8 @@#include "ena_pci_id_tbl.h" #include "ena_xdp.h" +#include "ena_phc.h" +MODULE_AUTHOR ("Amazon.com, Inc. or its affiliates" );MODULE_DESCRIPTION (DEVICE_NAME );MODULE_LICENSE ("GPL" );
@@ -2743,7 +2745,8 @@ static void ena_config_host_info(struct ena_com_dev *ena_dev, struct pci_dev *pdENA_ADMIN_HOST_INFO_INTERRUPT_MODERATION_MASK |ENA_ADMIN_HOST_INFO_RX_BUF_MIRRORING_MASK |ENA_ADMIN_HOST_INFO_RSS_CONFIGURABLE_FUNCTION_KEY_MASK | -ENA_ADMIN_HOST_INFO_RX_PAGE_REUSE_MASK ; +ENA_ADMIN_HOST_INFO_RX_PAGE_REUSE_MASK | +ENA_ADMIN_HOST_INFO_PHC_MASK ; rc =ena_com_set_host_attributes (ena_dev);if (rc) {
@@ -3188,6 +3191,10 @@ static int ena_device_init(struct ena_adapter *adapter, struct pci_dev *pdev,if (unlikely (rc)) goto err_admin_init; + rc =ena_phc_init (adapter); +if (unlikely (rc && (rc != -EOPNOTSUPP ))) +netdev_err (netdev,"Failed initializing PHC, error: %d\n" , rc); +return 0 ; err_admin_init:
@@ -3271,6 +3278,8 @@ static int ena_destroy_device(struct ena_adapter *adapter, bool graceful)ena_com_admin_destroy (ena_dev); +ena_phc_destroy (adapter); +ena_com_mmio_reg_read_request_destroy (ena_dev);/* return reset reason to default value */
@@ -3344,6 +3353,7 @@ err_device_destroy:ena_com_wait_for_abort_completion (ena_dev);ena_com_admin_destroy (ena_dev);ena_com_dev_reset (ena_dev,ENA_REGS_RESET_DRIVER_INVALID_STATE ); +ena_phc_destroy (adapter);ena_com_mmio_reg_read_request_destroy (ena_dev); err:clear_bit (ENA_FLAG_DEVICE_RUNNING , &adapter->flags);
@@ -3932,10 +3942,16 @@ static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent)pci_set_drvdata (pdev, adapter); + rc =ena_phc_alloc (adapter); +if (rc) { +netdev_err (netdev,"ena_phc_alloc failed\n" ); + goto err_netdev_destroy; + } + rc =ena_com_allocate_customer_metrics_buffer (ena_dev);if (rc) {netdev_err (netdev,"ena_com_allocate_customer_metrics_buffer failed\n" ); - goto err_netdev_destroy; + goto err_free_phc; } rc =ena_map_llq_mem_bar (pdev, ena_dev, bars);
@@ -4072,6 +4088,8 @@ err_device_destroy:ena_com_admin_destroy (ena_dev); err_metrics_destroy:ena_com_delete_customer_metrics_buffer (ena_dev); +err_free_phc: +ena_phc_free (adapter); err_netdev_destroy:free_netdev (netdev); err_free_region:
@@ -4112,6 +4130,8 @@ static void __ena_shutoff(struct pci_dev *pdev, bool shutdown) adapter->reset_reason =ENA_REGS_RESET_SHUTDOWN ;ena_destroy_device (adapter, true); +ena_phc_free (adapter); +if (shutdown) {netif_device_detach (netdev);dev_close (netdev);
drivers/net/ethernet/amazon/ena/ena_netdev.h +4 -0
@@ -110,6 +110,8 @@#define ENA_MMIO_DISABLE_REG_READ BIT(0) +struct ena_phc_info ; +struct ena_irq {irq_handler_t handler;void *data;
@@ -348,6 +350,8 @@ struct ena_adapter {char name[ENA_NAME_MAX_LEN ]; +struct ena_phc_info *phc_info; +unsigned long flags;/* TX */ struct ena_ring tx_ring[ENA_MAX_NUM_IO_QUEUES ]
drivers/net/ethernet/amazon/ena/ena_phc.c new file +223 -0
223 lines not on this page · raw message
drivers/net/ethernet/amazon/ena/ena_phc.h new file +37 -0
@@ -0,0 +1,37 @@ +/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ +/* +* Copyright 2015-2022 Amazon.com, Inc. or its affiliates. All rights reserved. +*/ + +#ifndef ENA_PHC_H +#define ENA_PHC_H + +#include <linux/ptp_clock_kernel.h> + +struct ena_phc_info { +/* PTP hardware capabilities */ +struct ptp_clock_info clock_info; + +/* Registered PTP clock device */ +struct ptp_clock *clock; + +/* Adapter specific private data structure */ +struct ena_adapter *adapter; + +/* PHC lock */ +spinlock_t lock; + +/* Enabled by kernel */ +bool enabled; +}; + +void ena_phc_enable (struct ena_adapter *adapter,bool enable); +bool ena_phc_is_enabled (struct ena_adapter *adapter); +bool ena_phc_is_active (struct ena_adapter *adapter); +int ena_phc_get_index (struct ena_adapter *adapter); +int ena_phc_init (struct ena_adapter *adapter); +void ena_phc_destroy (struct ena_adapter *adapter); +int ena_phc_alloc (struct ena_adapter *adapter); +void ena_phc_free (struct ena_adapter *adapter); + +#endif /* ENA_PHC_H */
drivers/net/ethernet/amazon/ena/ena_regs_defs.h +8 -0
@@ -53,6 +53,11 @@ enum ena_regs_reset_reason_types {#define ENA_REGS_MMIO_RESP_HI_OFF 0x64#define ENA_REGS_RSS_IND_ENTRY_UPDATE_OFF 0x68 +/* phc_registers offsets */ + +/* 100 base */ +#define ENA_REGS_PHC_DB_OFF 0x100 +/* version register */ #define ENA_REGS_VERSION_MINOR_VERSION_MASK 0xff#define ENA_REGS_VERSION_MAJOR_VERSION_SHIFT 8
@@ -129,4 +134,7 @@ enum ena_regs_reset_reason_types {#define ENA_REGS_RSS_IND_ENTRY_UPDATE_CQ_IDX_SHIFT 16#define ENA_REGS_RSS_IND_ENTRY_UPDATE_CQ_IDX_MASK 0xffff0000 +/* phc_db_req_id register */ +#define ENA_REGS_PHC_DB_REQ_ID_MASK 0xffff +#endif /* _ENA_REGS_H_ */
Signature · 1 line
2.47.1
David Arinzon
maintainerPATCH v13 2/9 net: ena: PHC silent reset
In reply to David ArinzonEach PHC device kernel registration receives a unique kernel index, which is associated with a new PHC device file located at "/dev/ptp<index>".
This device file serves as an interface for obtaining PHC timestamps. Examples of tools that use "/dev/ptp" include testptp [1] and chrony [2].
A reset flow may occur in the ENA driver while PHC is active. During a reset, the driver will unregister and then re-register the PHC device with the kernel.
Under race conditions, particularly during heavy PHC loads, the driver’s reset flow might complete faster than the kernel’s PHC unregister/register process.
This can result in the PHC index being different from what it was prior to the reset, as the PHC index is selected using kernel ID allocation [3].
While driver rmmod/insmod are done by the user, a reset may occur at anytime, without the user awareness, consequently, the driver might receive a new PHC index after the reset, potentially compromising the user experience.
To prevent this issue, the PHC flow will detect the reset during PHC destruction and will skip the PHC unregister/register calls to preserve the kernel PHC index.
During the reset flow, any attempt to get a PHC timestamp will fail as expected, but the kernel PHC index will remain unchanged.
[1]: https://github.com/torvalds/linux/blob/v6.1/tools/testing/selftests/ptp/testptp.c
[2]: https://github.com/mlichvar/chrony
[3]: https://www.kernel.org/doc/html/latest/core-api/idr.html
--- drivers/net/ethernet/amazon/ena/ena_phc.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/net/ethernet/amazon/ena/ena_phc.c +9 -1
@@ -108,6 +108,10 @@ static int ena_phc_register(struct ena_adapter *adapter) phc_info = adapter->phc_info; clock_info = &phc_info->clock_info; +/* PHC may already be registered in case of a reset */ +if (ena_phc_is_active (adapter)) +return 0 ; + phc_info->adapter = adapter;spin_lock_init (&phc_info->lock);
@@ -134,7 +138,11 @@ static void ena_phc_unregister(struct ena_adapter *adapter) {struct ena_phc_info *phc_info = adapter->phc_info; -if (ena_phc_is_active (adapter)) { +/* During reset flow, PHC must stay registered +* to keep kernel's PHC index +*/ +if (ena_phc_is_active (adapter) && + !test_bit (ENA_FLAG_TRIGGER_RESET , &adapter->flags)) {ptp_clock_unregister (phc_info->clock); phc_info->clock =NULL ; }
Signature · 1 line
2.47.1
David Arinzon
maintainerPATCH v13 3/9 net: ena: Add device reload capability through devlink
In reply to David ArinzonAdding basic devlink capability support of reloading the driver. This capability is required to support driver init type devlink params (DEVLINK_PARAM_CMODE_DRIVERINIT). Such params require reloading of the driver (destroy/restore sequence). The reloading is done by the devlink framework using the hooks provided by the driver.
--- .../device_drivers/ethernet/amazon/ena.rst | 13 +++ drivers/net/ethernet/amazon/Kconfig | 1 + drivers/net/ethernet/amazon/ena/Makefile | 2 +- drivers/net/ethernet/amazon/ena/ena_devlink.c | 94 +++++++++++++++++++ drivers/net/ethernet/amazon/ena/ena_devlink.h | 19 ++++ drivers/net/ethernet/amazon/ena/ena_netdev.c | 30 +++++- drivers/net/ethernet/amazon/ena/ena_netdev.h | 5 + 7 files changed, 158 insertions(+), 6 deletions(-) create mode 100644 drivers/net/ethernet/amazon/ena/ena_devlink.c create mode 100644 drivers/net/ethernet/amazon/ena/ena_devlink.h
Documentation/networking/device_drivers/ethernet/amazon/ena.rst +13 -0
@@ -57,6 +57,7 @@ ena_ethtool.c ethtool callbacks. ena_xdp.[ch] XDP files ena_pci_id_tbl.h Supported device IDs. ena_phc.[ch] PTP hardware clock infrastructure (see `PHC`_ for more info) +ena_devlink.[ch] devlink files. ================= ====================================================== Management Interface:
@@ -269,6 +270,18 @@ RSS - The user can provide a hash key, hash function, and configure the indirection table through `ethtool(8)`. +DEVLINK SUPPORT +=============== +.. _`devlink`: https://www.kernel.org/doc/html/latest/networking/devlink/index.html + +`devlink`_ supports reloading the driver and initiating re-negotiation with the ENA device + +.. code-block:: shell + + sudo devlink dev reload pci/<domain:bus:slot.function> + # for example: + sudo devlink dev reload pci/0000:00:06.0 + DATA PATH =========
drivers/net/ethernet/amazon/Kconfig +1 -0
@@ -21,6 +21,7 @@ config ENA_ETHERNET depends on PCI_MSI && !CPU_BIG_ENDIAN depends on PTP_1588_CLOCK_OPTIONAL select DIMLIB + select NET_DEVLINK help This driver supports Elastic Network Adapter (ENA)"
drivers/net/ethernet/amazon/ena/Makefile +1 -1
@@ -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_xdp.o ena_phc.o +ena-y := ena_netdev.o ena_com.o ena_eth_com.o ena_ethtool.o ena_xdp.o ena_phc.o ena_devlink.o
drivers/net/ethernet/amazon/ena/ena_devlink.c new file +94 -0
94 lines not on this page · raw message
drivers/net/ethernet/amazon/ena/ena_devlink.h new file +19 -0
@@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ +/* Copyright (c) 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 */
drivers/net/ethernet/amazon/ena/ena_netdev.c +25 -5
@@ -21,6 +21,8 @@#include "ena_phc.h" +#include "ena_devlink.h" +MODULE_AUTHOR ("Amazon.com, Inc. or its affiliates" );MODULE_DESCRIPTION (DEVICE_NAME );MODULE_LICENSE ("GPL" );
@@ -41,8 +43,6 @@ MODULE_DEVICE_TABLE(pci, ena_pci_tbl);static int ena_rss_init_default (struct ena_adapter *adapter);static void check_for_admin_com_state (struct ena_adapter *adapter); -static int ena_destroy_device (struct ena_adapter *adapter,bool graceful); -static int ena_restore_device (struct ena_adapter *adapter);static void ena_tx_timeout (struct net_device *dev,unsigned int txqueue) {
@@ -3240,7 +3240,7 @@ err_disable_msix:return rc; } -static int ena_destroy_device (struct ena_adapter *adapter,bool graceful) +int ena_destroy_device (struct ena_adapter *adapter,bool graceful) {struct net_device *netdev = adapter->netdev;struct ena_com_dev *ena_dev = adapter->ena_dev;
@@ -3291,7 +3291,7 @@ static int ena_destroy_device(struct ena_adapter *adapter, bool graceful)return rc; } -static int ena_restore_device (struct ena_adapter *adapter) +int ena_restore_device (struct ena_adapter *adapter) {struct ena_com_dev_get_features_ctx get_feat_ctx;struct ena_com_dev *ena_dev = adapter->ena_dev;
@@ -3877,6 +3877,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;
@@ -3960,12 +3961,20 @@ static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent) goto err_metrics_destroy; } +/* Need to do this before ena_device_init */ + devlink =ena_devlink_alloc (adapter); +if (!devlink) { +netdev_err (netdev,"ena_devlink_alloc failed\n" ); + rc = -ENOMEM ; + goto err_metrics_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_metrics_destroy; + goto ena_devlink_destroy; }/* Initial TX and RX interrupt delay. Assumes 1 usec granularity.
@@ -4070,6 +4079,12 @@ static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent) adapters_found++; +/* From this point, the devlink device is visible to users. +* Perform the registration last to ensure that all the resources +* are available and that the netdevice is registered. +*/ +ena_devlink_register (devlink, &pdev->dev); +return 0 ; err_rss:
@@ -4086,6 +4101,8 @@ err_worker_destroy: err_device_destroy:ena_com_delete_host_info (ena_dev);ena_com_admin_destroy (ena_dev); +ena_devlink_destroy: +ena_devlink_free (devlink); err_metrics_destroy:ena_com_delete_customer_metrics_buffer (ena_dev); err_free_phc:
@@ -4132,6 +4149,9 @@ static void __ena_shutoff(struct pci_dev *pdev, bool shutdown)ena_phc_free (adapter); +ena_devlink_unregister (adapter->devlink); +ena_devlink_free (adapter->devlink); +if (shutdown) {netif_device_detach (netdev);dev_close (netdev);
drivers/net/ethernet/amazon/ena/ena_netdev.h +5 -0
@@ -16,6 +16,7 @@#include <linux/skbuff.h> #include <net/xdp.h> #include <uapi/linux/bpf.h> +#include <net/devlink.h> #include "ena_com.h" #include "ena_eth_com.h"
@@ -387,6 +388,8 @@ struct ena_adapter {struct bpf_prog *xdp_bpf_prog;u32 xdp_first_ring;u32 xdp_num_queues; + +struct devlink *devlink; };void ena_set_ethtool_ops (struct net_device *netdev);
@@ -416,6 +419,8 @@ static inline void ena_reset_device(struct ena_adapter *adapter,set_bit (ENA_FLAG_TRIGGER_RESET , &adapter->flags); } +int ena_destroy_device (struct ena_adapter *adapter,bool graceful); +int ena_restore_device (struct ena_adapter *adapter);int handle_invalid_req_id (struct ena_ring *ring,u16 req_id,struct ena_tx_buffer *tx_info,bool is_xdp);
Signature · 1 line
2.47.1
David Arinzon
maintainerPATCH v13 4/9 net: ena: Add devlink port support
In reply to David ArinzonAdd the basic functionality to support devlink port for devlink model completeness purposes. Current support is for registration/un-registration.
--- drivers/net/ethernet/amazon/ena/ena_devlink.c | 31 +++++++++++++++++-- drivers/net/ethernet/amazon/ena/ena_netdev.h | 1 + 2 files changed, 30 insertions(+), 2 deletions(-)
drivers/net/ethernet/amazon/ena/ena_devlink.c +29 -2
@@ -6,6 +6,23 @@#include "linux/pci.h" #include "ena_devlink.h" +static void ena_devlink_port_register (struct devlink *devlink) +{ +struct ena_adapter *adapter =ENA_DEVLINK_PRIV (devlink); +struct devlink_port_attrs attrs = {}; + + attrs.flavour =DEVLINK_PORT_FLAVOUR_PHYSICAL ; +devlink_port_attrs_set (&adapter->devlink_port, &attrs); +devl_port_register (devlink, &adapter->devlink_port,0 ); +} + +static void ena_devlink_port_unregister (struct devlink *devlink) +{ +struct ena_adapter *adapter =ENA_DEVLINK_PRIV (devlink); + +devl_port_unregister (&adapter->devlink_port); +} + static int ena_devlink_reload_down(struct devlink *devlink, bool netns_change, enum devlink_reload_action action,
@@ -20,6 +37,8 @@ static int ena_devlink_reload_down(struct devlink *devlink,return -EOPNOTSUPP ; } +ena_devlink_port_unregister (devlink); +rtnl_lock ();ena_destroy_device (adapter, false);rtnl_unlock ();
@@ -46,6 +65,8 @@ static int ena_devlink_reload_up(struct devlink *devlink,rtnl_unlock (); +ena_devlink_port_register (devlink); +if (!err) *actions_performed =BIT (DEVLINK_RELOAD_ACTION_DRIVER_REINIT );
@@ -85,10 +106,16 @@ void ena_devlink_free(struct devlink *devlink)void ena_devlink_register (struct devlink *devlink,struct device *dev) { -devlink_register (devlink); +devl_lock (devlink); +ena_devlink_port_register (devlink); +devl_register (devlink); +devl_unlock (devlink); }void ena_devlink_unregister (struct devlink *devlink) { -devlink_unregister (devlink); +devl_lock (devlink); +ena_devlink_port_unregister (devlink); +devl_unregister (devlink); +devl_unlock (devlink); }
drivers/net/ethernet/amazon/ena/ena_netdev.h +1 -0
@@ -390,6 +390,7 @@ struct ena_adapter {u32 xdp_num_queues;struct devlink *devlink; +struct devlink_port devlink_port; };void ena_set_ethtool_ops (struct net_device *netdev);
Signature · 1 line
2.47.1
David Arinzon
maintainerPATCH v13 5/9 devlink: Add new "enable_phc" generic device param
In reply to David ArinzonAdd a new device generic parameter to enable/disable the PHC (PTP Hardware Clock) functionality in the device associated with the devlink instance.
--- Documentation/networking/devlink/devlink-params.rst | 3 +++ include/net/devlink.h | 4 ++++ net/devlink/param.c | 5 +++++ 3 files changed, 12 insertions(+)
Documentation/networking/devlink/devlink-params.rst +3 -0
@@ -137,3 +137,6 @@ own name. * - ``event_eq_size`` - u32 - Control the size of asynchronous control events EQ. + * - ``enable_phc`` + - Boolean + - Enable PHC (PTP Hardware Clock) functionality in the device.
include/net/devlink.h +4 -0
@@ -520,6 +520,7 @@ enum devlink_param_generic_id {DEVLINK_PARAM_GENERIC_ID_ENABLE_IWARP ,DEVLINK_PARAM_GENERIC_ID_IO_EQ_SIZE ,DEVLINK_PARAM_GENERIC_ID_EVENT_EQ_SIZE , +DEVLINK_PARAM_GENERIC_ID_ENABLE_PHC ,/* add new param generic ids above here*/ __DEVLINK_PARAM_GENERIC_ID_MAX,
@@ -578,6 +579,9 @@ enum devlink_param_generic_id {#define DEVLINK_PARAM_GENERIC_EVENT_EQ_SIZE_NAME "event_eq_size"#define DEVLINK_PARAM_GENERIC_EVENT_EQ_SIZE_TYPE DEVLINK_PARAM_TYPE_U32 +#define DEVLINK_PARAM_GENERIC_ENABLE_PHC_NAME "enable_phc" +#define DEVLINK_PARAM_GENERIC_ENABLE_PHC_TYPE DEVLINK_PARAM_TYPE_BOOL +#define DEVLINK_PARAM_GENERIC (_id, _cmodes, _get, _set, _validate) \ { \ .id = DEVLINK_PARAM_GENERIC_ID_##_id, \
net/devlink/param.c +5 -0
@@ -92,6 +92,11 @@ static const struct devlink_param devlink_param_generic[] = { .name = DEVLINK_PARAM_GENERIC_EVENT_EQ_SIZE_NAME, .type = DEVLINK_PARAM_GENERIC_EVENT_EQ_SIZE_TYPE, }, + { + .id = DEVLINK_PARAM_GENERIC_ID_ENABLE_PHC, + .name = DEVLINK_PARAM_GENERIC_ENABLE_PHC_NAME, + .type = DEVLINK_PARAM_GENERIC_ENABLE_PHC_TYPE, + }, };static int devlink_param_generic_verify (const struct devlink_param *param)
Signature · 1 line
2.47.1
David Arinzon
maintainerPATCH v13 6/9 net: ena: Control PHC enable through devlink
In reply to David ArinzonAdd the capability to set parameters through the devlink framework.
The parameter used for controlling PHC (enable/disable) details are as follows:
- Name: enable_phc
- Type: Boolean (true - enable/false - disable)
- Mode: DEVLINK_PARAM_CMODE_DRIVERINIT
- Effect: Changes take place during driver initialization, any changes require a devlink reload to take effect.
--- drivers/net/ethernet/amazon/ena/ena_devlink.c | 89 +++++++++++++++++++ drivers/net/ethernet/amazon/ena/ena_devlink.h | 2 + drivers/net/ethernet/amazon/ena/ena_netdev.c | 2 + drivers/net/ethernet/amazon/ena/ena_phc.c | 2 + 4 files changed, 95 insertions(+)
drivers/net/ethernet/amazon/ena/ena_devlink.c +89 -0
@@ -5,6 +5,59 @@#include "linux/pci.h" #include "ena_devlink.h" +#include "ena_phc.h" + +static int ena_devlink_enable_phc_validate (struct devlink *devlink,u32 id, +union devlink_param_value val, +struct netlink_ext_ack *extack) +{ +struct ena_adapter *adapter =ENA_DEVLINK_PRIV (devlink); + +if (!val.vbool) +return 0 ; + +if (!ena_com_phc_supported (adapter->ena_dev)) { +NL_SET_ERR_MSG_MOD (extack,"Device doesn't support PHC" ); +return -EOPNOTSUPP ; + } + +return 0 ; +} + +static const struct devlink_param ena_devlink_params[] = { +DEVLINK_PARAM_GENERIC (ENABLE_PHC , +BIT (DEVLINK_PARAM_CMODE_DRIVERINIT ), +NULL , +NULL , + ena_devlink_enable_phc_validate), +}; + +void ena_devlink_params_get (struct devlink *devlink) +{ +struct ena_adapter *adapter =ENA_DEVLINK_PRIV (devlink); +union devlink_param_value val; +int err; + + err =devl_param_driverinit_value_get (devlink, +DEVLINK_PARAM_GENERIC_ID_ENABLE_PHC , + &val); +if (err) { +netdev_err (adapter->netdev,"Failed to query PHC param\n" ); +return ; + } + +ena_phc_enable (adapter, val.vbool); +} + +void ena_devlink_disable_phc_param (struct devlink *devlink) +{ +union devlink_param_value value; + + value.vbool = false; +devl_param_driverinit_value_set (devlink, +DEVLINK_PARAM_GENERIC_ID_ENABLE_PHC , + value); +}static void ena_devlink_port_register (struct devlink *devlink) {
@@ -79,6 +132,27 @@ static const struct devlink_ops ena_devlink_ops = { .reload_up = ena_devlink_reload_up, }; +static int ena_devlink_configure_params (struct devlink *devlink) +{ +struct ena_adapter *adapter =ENA_DEVLINK_PRIV (devlink); +union devlink_param_value value; +int rc; + + rc =devlink_params_register (devlink, ena_devlink_params, +ARRAY_SIZE (ena_devlink_params)); +if (rc) { +netdev_err (adapter->netdev,"Failed to register devlink params\n" ); +return rc; + } + + value.vbool =ena_phc_is_enabled (adapter); +devl_param_driverinit_value_set (devlink, +DEVLINK_PARAM_GENERIC_ID_ENABLE_PHC , + value); + +return 0 ; +} +struct devlink *ena_devlink_alloc (struct ena_adapter *adapter) {struct device *dev = &adapter->pdev->dev;
@@ -96,11 +170,26 @@ struct devlink *ena_devlink_alloc(struct ena_adapter *adapter)ENA_DEVLINK_PRIV (devlink) = adapter; adapter->devlink = devlink; +if (ena_devlink_configure_params (devlink)) + goto free_devlink; +return devlink; + +free_devlink: +devlink_free (devlink); +return NULL ; +} + +static void ena_devlink_configure_params_clean (struct devlink *devlink) +{ +devlink_params_unregister (devlink, ena_devlink_params, +ARRAY_SIZE (ena_devlink_params)); }void ena_devlink_free (struct devlink *devlink) { +ena_devlink_configure_params_clean (devlink); +devlink_free (devlink); }
drivers/net/ethernet/amazon/ena/ena_devlink.h +2 -0
@@ -15,5 +15,7 @@ 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); +void ena_devlink_params_get (struct devlink *devlink); +void ena_devlink_disable_phc_param (struct devlink *devlink);#endif /* DEVLINK_H */
drivers/net/ethernet/amazon/ena/ena_netdev.c +2 -0
@@ -3138,6 +3138,8 @@ static int ena_device_init(struct ena_adapter *adapter, struct pci_dev *pdev, goto err_mmio_read_less; } +ena_devlink_params_get (adapter->devlink); +/* ENA admin level init */ rc =ena_com_admin_init (ena_dev, &aenq_handlers);if (rc) {
drivers/net/ethernet/amazon/ena/ena_phc.c +2 -0
@@ -6,6 +6,7 @@#include <linux/pci.h> #include "ena_netdev.h" #include "ena_phc.h" +#include "ena_devlink.h" static int ena_phc_adjtime (struct ptp_clock_info *clock_info,s64 delta) {
@@ -213,6 +214,7 @@ err_ena_com_phc_config:ena_com_phc_destroy (ena_dev); err_ena_com_phc_init:ena_phc_enable (adapter, false); +ena_devlink_disable_phc_param (adapter->devlink);return rc; }
Signature · 1 line
2.47.1
David Arinzon
maintainerPATCH v13 7/9 net: ena: Add debugfs support to the ENA driver
In reply to David ArinzonAdding the base directory of debugfs to the driver. In order for the folder to be unique per driver instantiation, the chosen name is the device name.
This commit contains the initialization and the
base folder.
The creation of the base folder may fail, but is considered non-fatal.
--- .../device_drivers/ethernet/amazon/ena.rst | 1 + drivers/net/ethernet/amazon/ena/Makefile | 2 +- drivers/net/ethernet/amazon/ena/ena_debugfs.c | 27 +++++++++++++++++++ drivers/net/ethernet/amazon/ena/ena_debugfs.h | 27 +++++++++++++++++++ drivers/net/ethernet/amazon/ena/ena_netdev.c | 6 +++++ drivers/net/ethernet/amazon/ena/ena_netdev.h | 4 +++ 6 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 drivers/net/ethernet/amazon/ena/ena_debugfs.c create mode 100644 drivers/net/ethernet/amazon/ena/ena_debugfs.h
Documentation/networking/device_drivers/ethernet/amazon/ena.rst +1 -0
@@ -58,6 +58,7 @@ ena_xdp.[ch] XDP files ena_pci_id_tbl.h Supported device IDs. ena_phc.[ch] PTP hardware clock infrastructure (see `PHC`_ for more info) ena_devlink.[ch] devlink files. +ena_debugfs.[ch] debugfs files. ================= ====================================================== Management Interface:
drivers/net/ethernet/amazon/ena/Makefile +1 -1
@@ -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_xdp.o ena_phc.o ena_devlink.o +ena-y := ena_netdev.o ena_com.o ena_eth_com.o ena_ethtool.o ena_xdp.o ena_phc.o ena_devlink.o ena_debugfs.o
drivers/net/ethernet/amazon/ena/ena_debugfs.c new file +27 -0
@@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB +/* Copyright (c) Amazon.com, Inc. or its affiliates. +* All rights reserved. +*/ + +#ifdef CONFIG_DEBUG_FS + +#include <linux/seq_file.h> +#include <linux/pci.h> +#include "ena_debugfs.h" + +void ena_debugfs_init (struct net_device *dev) +{ +struct ena_adapter *adapter =netdev_priv (dev); + + adapter->debugfs_base = +debugfs_create_dir (dev_name (&adapter->pdev->dev),NULL ); +} + +void ena_debugfs_terminate (struct net_device *dev) +{ +struct ena_adapter *adapter =netdev_priv (dev); + +debugfs_remove_recursive (adapter->debugfs_base); +} + +#endif /* CONFIG_DEBUG_FS */
drivers/net/ethernet/amazon/ena/ena_debugfs.h new file +27 -0
@@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ +/* Copyright (c) Amazon.com, Inc. or its affiliates. +* All rights reserved. +*/ + +#ifndef __ENA_DEBUGFS_H__ +#define __ENA_DEBUGFS_H__ + +#include <linux/debugfs.h> +#include <linux/netdevice.h> +#include "ena_netdev.h" + +#ifdef CONFIG_DEBUG_FS + +void ena_debugfs_init (struct net_device *dev); + +void ena_debugfs_terminate (struct net_device *dev); + +#else /* CONFIG_DEBUG_FS */ + +static inline void ena_debugfs_init (struct net_device *dev) {} + +static inline void ena_debugfs_terminate (struct net_device *dev) {} + +#endif /* CONFIG_DEBUG_FS */ + +#endif /* __ENA_DEBUGFS_H__ */
drivers/net/ethernet/amazon/ena/ena_netdev.c +6 -0
@@ -23,6 +23,8 @@#include "ena_devlink.h" +#include "ena_debugfs.h" +MODULE_AUTHOR ("Amazon.com, Inc. or its affiliates" );MODULE_DESCRIPTION (DEVICE_NAME );MODULE_LICENSE ("GPL" );
@@ -4060,6 +4062,8 @@ static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent) goto err_rss; } +ena_debugfs_init (netdev); +INIT_WORK (&adapter->reset_task, ena_fw_reset_device); adapter->last_keep_alive_jiffies = jiffies;
@@ -4139,6 +4143,8 @@ static void __ena_shutoff(struct pci_dev *pdev, bool shutdown) ena_dev = adapter->ena_dev; netdev = adapter->netdev; +ena_debugfs_terminate (netdev); +/* Make sure timer and reset routine won't be called after * freeing device resources. */
drivers/net/ethernet/amazon/ena/ena_netdev.h +4 -0
@@ -391,6 +391,10 @@ struct ena_adapter {struct devlink *devlink;struct devlink_port devlink_port; +#ifdef CONFIG_DEBUG_FS + +struct dentry *debugfs_base; +#endif /* CONFIG_DEBUG_FS */ };void ena_set_ethtool_ops (struct net_device *netdev);
Signature · 1 line
2.47.1
David Arinzon
maintainerPATCH v13 8/9 net: ena: View PHC stats using debugfs
In reply to David ArinzonAdd an entry named phc_stats to view the PHC statistics. If PHC is enabled, the stats are printed, as below:
phc_cnt: 0phc_exp: 0phc_skp: 0phc_err_dv: 0phc_err_ts: 0
If PHC is disabled, no statistics will be displayed.
--- drivers/net/ethernet/amazon/ena/ena_debugfs.c | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+)
drivers/net/ethernet/amazon/ena/ena_debugfs.c +35 -0
@@ -8,6 +8,35 @@#include <linux/seq_file.h> #include <linux/pci.h> #include "ena_debugfs.h" +#include "ena_phc.h" + +static int phc_stats_show (struct seq_file *file,void *priv) +{ +struct ena_adapter *adapter = file->private; + +if (!ena_phc_is_active (adapter)) +return 0 ; + +seq_printf (file, +"phc_cnt: %llu\n" , + adapter->ena_dev->phc.stats.phc_cnt); +seq_printf (file, +"phc_exp: %llu\n" , + adapter->ena_dev->phc.stats.phc_exp); +seq_printf (file, +"phc_skp: %llu\n" , + adapter->ena_dev->phc.stats.phc_skp); +seq_printf (file, +"phc_err_dv: %llu\n" , + adapter->ena_dev->phc.stats.phc_err_dv); +seq_printf (file, +"phc_err_ts: %llu\n" , + adapter->ena_dev->phc.stats.phc_err_ts); + +return 0 ; +} + +DEFINE_SHOW_ATTRIBUTE (phc_stats);void ena_debugfs_init (struct net_device *dev) {
@@ -15,6 +44,12 @@ void ena_debugfs_init(struct net_device *dev) adapter->debugfs_base =debugfs_create_dir (dev_name (&adapter->pdev->dev),NULL ); + +debugfs_create_file ("phc_stats" , +0400 , + adapter->debugfs_base, + adapter, + &phc_stats_fops); }void ena_debugfs_terminate (struct net_device *dev)
Signature · 1 line
2.47.1
David Arinzon
maintainerPATCH v13 9/9 net: ena: Add PHC documentation
In reply to David ArinzonProvide the relevant information and guidelines
about the feature support in the ENA driver.
--- .../device_drivers/ethernet/amazon/ena.rst | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+)
Documentation/networking/device_drivers/ethernet/amazon/ena.rst +93 -0
@@ -224,6 +224,99 @@ descriptor it was received on would be recycled. When a packet smaller than RX copybreak bytes is received, it is copied into a new memory buffer and the RX descriptor is returned to HW. +.. _`PHC`: + +PTP Hardware Clock (PHC) +======================== +.. _`ptp-userspace-api`: https://docs.kernel.org/driver-api/ptp.html#ptp-hardware-clock-user-space-api +.. _`testptp`: https://elixir.bootlin.com/linux/latest/source/tools/testing/selftests/ptp/testptp.c + +ENA Linux driver supports PTP hardware clock providing timestamp reference to achieve nanosecond resolution. + +**PHC support** + +PHC depends on the PTP module, which needs to be either loaded as a module or compiled into the kernel. + +Verify if the PTP module is present: + +.. code-block:: shell + + grep -w '^CONFIG_PTP_1588_CLOCK=[ym]' /boot/config-`uname -r` + +- If no output is provided, the ENA driver cannot be loaded with PHC support. + +**PHC activation** + +The feature is turned off by default, in order to turn the feature on, the ENA driver +can be loaded in the following way: + +- devlink: + +.. code-block:: shell + + sudo devlink dev param set pci/<domain:bus:slot.function> name enable_phc value true cmode driverinit + sudo devlink dev reload pci/<domain:bus:slot.function> + # for example: + sudo devlink dev param set pci/0000:00:06.0 name enable_phc value true cmode driverinit + sudo devlink dev reload pci/0000:00:06.0 + +All available PTP clock sources can be tracked here: + +.. code-block:: shell + + ls /sys/class/ptp + +PHC support and capabilities can be verified using ethtool: + +.. code-block:: shell + + ethtool -T <interface> + +**PHC timestamp** + +To retrieve PHC timestamp, use `ptp-userspace-api`_, usage example using `testptp`_: + +.. code-block:: shell + + testptp -d /dev/ptp$(ethtool -T <interface> | awk '/PTP Hardware Clock:/ {print $NF}') -k 1 + +PHC get time requests should be within reasonable bounds, +avoid excessive utilization to ensure optimal performance and efficiency. +The ENA device restricts the frequency of PHC get time requests to a maximum +of 125 requests per second. If this limit is surpassed, the get time request +will fail, leading to an increment in the phc_err_ts statistic. + +**PHC statistics** + +PHC can be monitored using debugfs (if mounted): + +.. code-block:: shell + + sudo cat /sys/kernel/debug/<domain:bus:slot.function>/phc_stats + + # for example: + sudo cat /sys/kernel/debug/0000:00:06.0/phc_stats + +PHC errors must remain below 1% of all PHC requests to maintain the desired level of accuracy and reliability + +================= ====================================================== +**phc_cnt** | Number of successful retrieved timestamps (below expire timeout). +**phc_exp** | Number of expired retrieved timestamps (above expire timeout). +**phc_skp** | Number of skipped get time attempts (during block period). +**phc_err_dv** | Number of failed get time attempts due to device errors (entering into block state). +**phc_err_ts** | Number of failed get time attempts due to timestamp errors (entering into block state), + | This occurs if driver exceeded the request limit or device received an invalid timestamp. +================= ====================================================== + +PHC timeouts: + +================= ====================================================== +**expire** | Max time for a valid timestamp retrieval, passing this threshold will fail + | the get time request and block new requests until block timeout. +**block** | Blocking period starts once get time request expires or fails, + | all get time requests during block period will be skipped. +================= ====================================================== + Statistics ==========
Signature · 1 line
2.47.1
This series was applied to netdev/net-next.git (main) by Jakub Kicinski <[email protected]>:
Hello:
This series was applied to netdev/net-next.git (main) by Jakub Kicinski <[email protected]>:
Quoted 8 lines · On Tue, 17 Jun 2025 14:05:36 +0300 you wrote:
Changes in v13
- Remove unnecessary out-of-tree driver documentationChanges in v12 (https://lore.kernel.org/netdev/[email protected]/):
- Add devlink port support
- Remove unnecessary checks from devlink reload up and reload down[...]
Here is the summary with links:
- [v13,net-next,1/9] net: ena: Add PHC support in the ENA driver
https://git.kernel.org/netdev/net-next/c/e0ea34158ee8 - [v13,net-next,2/9] net: ena: PHC silent reset https://git.kernel.org/netdev/net-next/c/51d58804a53b - [v13,net-next,3/9] net: ena: Add device reload capability through devlink https://git.kernel.org/netdev/net-next/c/15115b1a2554 - [v13,net-next,4/9] net: ena: Add devlink port support https://git.kernel.org/netdev/net-next/c/9d67d534e4e0 - [v13,net-next,5/9] devlink: Add new "enable_phc" generic device param https://git.kernel.org/netdev/net-next/c/cea465a96a29 - [v13,net-next,6/9] net: ena: Control PHC enable through devlink https://git.kernel.org/netdev/net-next/c/816b52624cf6 - [v13,net-next,7/9] net: ena: Add debugfs support to the ENA driver https://git.kernel.org/netdev/net-next/c/60e28350b1ca - [v13,net-next,8/9] net: ena: View PHC stats using debugfs https://git.kernel.org/netdev/net-next/c/e14521e97b83 - [v13,net-next,9/9] net: ena: Add PHC documentation https://git.kernel.org/netdev/net-next/c/c9223021433d
You are awesome, thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html