From: Paolo Abeni <pabeni@redhat.com>
To: sukhdeeps@marvell.com
Cc: netdev@vger.kernel.org, irusskikh@marvell.com,
epomozov@marvell.com, richardcochran@gmail.com,
andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com,
kuba@kernel.org, pabeni@redhat.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH net-next 9/9] net: atlantic: add PTP support for AQC113 (Antigua) (Antigua)
Date: Tue, 12 May 2026 11:54:20 +0200 [thread overview]
Message-ID: <20260512095420.134936-1-pabeni@redhat.com> (raw)
In-Reply-To: <20260506135706.2834-10-sukhdeeps@marvell.com>
From: AI Reviewer <ai@example.com>
This is an AI-generated review of your patch. The human sending this
email has considered the AI review valid, or at least plausible.
Full review at: https://netdev-ai.bots.linux.dev/sashiko/
---
net: atlantic: add PTP support for AQC113 (Antigua) (Antigua)
This patch adds IEEE 1588 PTP support for the AQC113 (Antigua) controller
alongside the existing AQC107 implementation, covering dual TSG clocks,
descriptor-writeback TX timestamps, per-instance PTP offsets, L3/L4
multicast filters, and direct hardware clock control.
A few observations and questions below.
> diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_main.c b/drivers/net/ethernet/aquantia/atlantic/aq_main.c
> index 4ef4fe64b8ac..aadf3f7f40d0 100644
> --- a/drivers/net/ethernet/aquantia/atlantic/aq_main.c
> +++ b/drivers/net/ethernet/aquantia/atlantic/aq_main.c
> @@ -113,16 +110,25 @@ static netdev_tx_t aq_ndev_start_xmit(struct sk_buff *skb, struct net_device *nd
> * and hardware PTP design of the chip. Otherwise ptp stream
> * will fail to sync
> */
> - if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) ||
> - unlikely((ip_hdr(skb)->version == 4) &&
> - (ip_hdr(skb)->protocol == IPPROTO_UDP) &&
> - ((udp_hdr(skb)->dest == htons(319)) ||
> - (udp_hdr(skb)->dest == htons(320)))) ||
> - unlikely(eth_hdr(skb)->h_proto == htons(ETH_P_1588)))
> + if (unlikely(skb->protocol == htons(ETH_P_IP) &&
> + ip_hdr(skb)->protocol == IPPROTO_UDP &&
> + (udp_hdr(skb)->dest == htons(PTP_EV_PORT) ||
> + udp_hdr(skb)->dest == htons(PTP_GEN_PORT))))
> + return aq_ptp_xmit(aq_nic, skb);
> +
> + /* PTP over IPv6 does not use extension headers */
> + if (unlikely(skb->protocol == htons(ETH_P_IPV6) &&
> + ipv6_hdr(skb)->nexthdr == IPPROTO_UDP &&
> + (udp_hdr(skb)->dest == htons(PTP_EV_PORT) ||
> + udp_hdr(skb)->dest == htons(PTP_GEN_PORT))))
> + return aq_ptp_xmit(aq_nic, skb);
> +
> + if (unlikely(eth_hdr(skb)->h_proto == htons(ETH_P_1588)))
> return aq_ptp_xmit(aq_nic, skb);
> }
> #endif
>
> + skb_tx_timestamp(skb);
> return aq_nic_xmit(aq_nic, skb);
> }
The commit message states:
Move skb_tx_timestamp() to non-PTP path to avoid double timestamps
Was there actually a pre-existing double-timestamp? The prior code had
exactly one skb_tx_timestamp() per packet (aq_nic_xmit() for non-PTP,
aq_ptp_xmit() for PTP), so this move appears functionally equivalent for
the PTP case.
However, the new placement in aq_ndev_start_xmit() is before
aq_nic_xmit()'s __netif_subqueue_stopped()/map-failure/NETDEV_TX_BUSY
handling, so software TX timestamps may now be generated for frames that
end up returning NETDEV_TX_BUSY. Is that intentional? It changes a
user-visible SO_TIMESTAMPING point for all atlantic chips, not just
AQC113.
> diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
> index 3cec853e9fad..63a4987a60de 100644
> --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
> +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
> @@ -172,7 +180,11 @@ static int aq_nic_update_link_status(struct aq_nic_s *self)
> aq_nic_update_interrupt_moderation_settings(self);
>
> if (self->aq_ptp) {
> - aq_ptp_clock_init(self);
> + /* PTP does not work in some modes even if physical link is up */
> + bool ptp_link_good = (self->aq_hw->aq_link_status.mbps >= 100 &&
> + self->aq_hw->aq_link_status.full_duplex);
> +
> + aq_ptp_clock_init(self, ptp_link_good ? AQ_PTP_LINK_UP : AQ_PTP_NO_LINK);
> aq_ptp_tm_offset_set(self,
> self->aq_hw->aq_link_status.mbps);
> aq_ptp_link_change(self);
aq_ptp_clock_init() now calls aq_ptp_dpath_enable(), which writes
hw_filter_l3l4_set/hw_filter_l2_set and mutates aq_ptp->udp_filter[i].cmd
and aq_ptp->eth_type_filter.
The caller of aq_nic_update_link_status() is the service task and
aq_linkstate_threaded_isr, neither of which hold rtnl_lock. The
hwtstamp ioctl path enters aq_ptp_hwtstamp_config_set() (and thence
aq_ptp_dpath_enable()) under rtnl_lock. Is there a lock covering both
sides? The same filter structures and registers can be programmed
concurrently from the two paths, and hwtstamp_config.rx_filter is read
unsynchronized from the link path while written by the ioctl path.
[ ... ]
> diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ptp.c b/drivers/net/ethernet/aquantia/atlantic/aq_ptp.c
> index 7486a28d7ff8..781d865e1127 100644
> --- a/drivers/net/ethernet/aquantia/atlantic/aq_ptp.c
> +++ b/drivers/net/ethernet/aquantia/atlantic/aq_ptp.c
[ ... ]
> +static int aq_ptp_dpath_enable(struct aq_ptp_s *aq_ptp,
> + int enable_flags, u16 rx_queue)
> +{
[ ... ]
> + if (enable_flags & AQ_HW_PTP_L2_ENABLE) {
> + aq_ptp->eth_type_filter.ethertype = ETH_P_1588;
> + aq_ptp->eth_type_filter.queue = rx_queue;
> + }
> +
> + if (hw_ops->hw_filter_l3l4_set) {
> + for (i = 0; i < flt_idx; i++) {
> + err = hw_ops->hw_filter_l3l4_set(aq_nic->aq_hw,
> + &aq_ptp->udp_filter[i]);
[ ... ]
> + }
> +
> + if (!err && hw_ops->hw_filter_l2_set) {
> + err = hw_ops->hw_filter_l2_set(aq_nic->aq_hw,
> + &aq_ptp->eth_type_filter);
When enable_flags is AQ_HW_PTP_L4_ENABLE only (for example
HWTSTAMP_FILTER_PTP_V1_L4_* or HWTSTAMP_FILTER_PTP_V2_L4_*), the block
that sets eth_type_filter.ethertype/queue is skipped, but
hw_filter_l2_set is still called unconditionally. Will that install a
stale L2 filter (zero ethertype from kzalloc, or leftover ETH_P_1588
from a previous call) into hardware?
The pre-patch aq_ptp_prepare_filters() populated both filter
descriptions together, so this is a new behavior.
> + } else {
> + /* PTP disabled, clear all UDP/L2 filters */
> + for (i = 0; i < PTP_UDP_FILTERS_CNT; i++) {
> + aq_ptp->udp_filter[i].cmd &=
> + ~HW_ATL_RX_ENABLE_FLTR_L3L4;
> + if (hw_ops->hw_filter_l3l4_set) {
> + err = hw_ops->hw_filter_l3l4_set(aq_nic->aq_hw,
> + &aq_ptp->udp_filter[i]);
On the a1_ptp path, only udp_filter[0] is ever populated with real cmd
content; slots 1..3 have only their location field set. This disable
branch now pushes all four slots through hw_filter_l3l4_set on every
hwtstamp-disable. Is programming the extra three zero-cmd filter
entries intended for AQC107?
[ ... ]
> @@ -1035,46 +1246,49 @@ static struct ptp_clock_info aq_ptp_clock = {
[ ... ]
> +int aq_ptp_init(struct aq_nic_s *aq_nic, unsigned int idx_ptp_vec)
> {
> bool a1_ptp = ATL_HW_IS_CHIP_FEATURE(aq_nic->aq_hw, ATLANTIC);
> + bool a2_ptp = ATL_HW_IS_CHIP_FEATURE(aq_nic->aq_hw, ANTIGUA);
[ ... ]
> - hw_atl_utils_mpi_read_stats(aq_nic->aq_hw, &mbox);
> -
> - if (!(mbox.info.caps_ex & BIT(CAPS_EX_PHY_PTP_EN))) {
> + if (a1_ptp) {
> + hw_atl_utils_mpi_read_stats(aq_nic->aq_hw, &mbox);
> + if (!(mbox.info.caps_ex & BIT(CAPS_EX_PHY_PTP_EN))) {
> + aq_nic->aq_ptp = NULL;
> + return 0;
> + }
> + } else {
> + memset(&mbox, 0, sizeof(mbox));
> +
> + if (a2_ptp) {
> + mbox.info.ptp_offset.ingress_100 = HW_ATL2_PTP_OFFSET_INGRESS_100;
[ ... ]
> + }
> + }
The A1 path gates PTP on caps_ex & BIT(CAPS_EX_PHY_PTP_EN), but the A2
path enables PTP unconditionally on any ATL_HW_IS_CHIP_FEATURE(...,
ANTIGUA) chip. The commit message only mentions AQC113, but AQC115c
and AQC116c also match ANTIGUA. Is there a capability bit that should
gate this for the non-AQC113 Antigua variants?
[ ... ]
> /* enable ptp counter */
> + aq_ptp->ptp_clock_sel = ATL_TSG_CLOCK_SEL_0;
> aq_utils_obj_set(&aq_nic->aq_hw->flags, AQ_HW_PTP_AVAILABLE);
> - mutex_lock(&aq_nic->fwreq_mutex);
> - aq_nic->aq_fw_ops->enable_ptp(aq_nic->aq_hw, 1);
> - aq_ptp_clock_init(aq_nic);
> - mutex_unlock(&aq_nic->fwreq_mutex);
> + if (a1_ptp) {
> + mutex_lock(&aq_nic->fwreq_mutex);
> + aq_nic->aq_fw_ops->enable_ptp(aq_nic->aq_hw, 1);
> + mutex_unlock(&aq_nic->fwreq_mutex);
> + }
> + if (a2_ptp)
> + aq_nic->aq_hw_ops->enable_ptp(aq_nic->aq_hw, aq_ptp->ptp_clock_sel, 1);
The A1 enable_ptp call is wrapped in fwreq_mutex, but the A2
enable_ptp (which performs hw_atl2_tsg_clock_reset / _en /
hw_atl2_adj_clock_freq / hw_atl2_tpb_tps_highest_priority_tc_enable_set)
is not. aq_ptp_hw_pin_conf() holds fwreq_mutex when programming the
same TSG/GPIO block via hw_gpio_pulse(). hw_atl2_hw_reset() also calls
hw_atl2_enable_ptp() without fwreq_mutex. Should the A2 enable_ptp
paths also take fwreq_mutex to avoid concurrent writes to the TSG
block?
[ ... ]
> @@ -1244,30 +1514,45 @@ void aq_ptp_unregister(struct aq_nic_s *aq_nic)
[ ... ]
> void aq_ptp_free(struct aq_nic_s *aq_nic)
> {
> struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp;
> + int i;
>
> if (!aq_ptp)
> return;
>
> + /* disable ptp */
> + if (aq_ptp->a1_ptp) {
> + mutex_lock(&aq_nic->fwreq_mutex);
> + aq_nic->aq_fw_ops->enable_ptp(aq_nic->aq_hw, 0);
> + mutex_unlock(&aq_nic->fwreq_mutex);
> + }
> +
> + if (aq_ptp->a2_ptp)
> + aq_nic->aq_hw_ops->enable_ptp(aq_nic->aq_hw,
> + aq_ptp->ptp_clock_sel, 0);
> +
> + cancel_delayed_work_sync(&aq_ptp->poll_sync);
> +
> aq_nic_release_filter(aq_nic, aq_rx_filter_ethertype,
> aq_ptp->eth_type_filter.location);
[ ... ]
The pre-patch code cancelled poll_sync first, then disabled PTP. The
new order disables PTP before cancel_delayed_work_sync(&aq_ptp->poll_sync).
A poll_sync worker running concurrently will call
aq_ptp_check_sync1588() / hw_ts_to_sys_clock() against TSG clocks that
enable_ptp(..., 0) has just torn down. For A2 the same worker may race
with hw_atl2_tsg_clock_en register writes.
Is there a reason to invert this ordering? The standard pattern is
cancel_delayed_work_sync() first, then tear down the resources the
worker uses.
> diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
> index e270327e47fd..a52d6d3fe464 100644
> --- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
> +++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
> @@ -308,24 +308,30 @@ bool aq_ring_tx_clean(struct aq_ring_s *self)
> }
> }
>
> - if (likely(!buff->is_eop))
> - goto out;
[ ... ]
> + if (unlikely(buff->is_eop)) {
> + if (unlikely(buff->request_ts) &&
> + self->aq_nic->aq_hw_ops->hw_ring_tx_ptp_get_ts) {
> + u64 ts = self->aq_nic->aq_hw_ops->hw_ring_tx_ptp_get_ts(self);
> +
> + if (!ts)
> + break;
>
> -out:
> + aq_ptp_tx_hwtstamp(self->aq_nic, ts);
> + }
> + if (buff->skb) {
[ ... ]
> + }
> + }
> buff->skb = NULL;
> buff->xdpf = NULL;
> buff->pa = 0U;
When hw_ring_tx_ptp_get_ts() returns 0 (TX timestamp not yet ready),
the loop does break. At that point dma_unmap_single()/dma_unmap_page()
has already run earlier in the iteration, but buff->is_mapped remains
1, buff->pa still holds the original DMA address, buff->skb is still
set, and sw_head is not advanced.
On the next aq_ring_tx_clean() call the same descriptor is revisited
and dma_unmap is called a second time on the already-unmapped address.
Under CONFIG_DMA_API_DEBUG this triggers a WARN; under an IOMMU it may
corrupt mappings.
The commit message also says:
Poll for TX timestamp completion in aq_ring_tx_clean() with a
timeout mechanism (aq_ptp_tx_ts_timedout/clear)
but no aq_ptp_tx_ts_timedout or aq_ptp_tx_ts_clear helper appears in
this patch. Where is the timeout that bounds this polling loop?
If the HW never writes back DD|TS_VALID (silicon quirk, link flap, lost
packet), does the TX ring stall indefinitely and leak the skb and DMA
mapping?
> diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2.c
> index c71e8d1adfc9..3047bda619c0 100644
> --- a/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2.c
> +++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2.c
> @@ -719,14 +735,24 @@ static int hw_atl2_hw_ring_rx_init(struct aq_hw_s *self,
> struct aq_ring_s *aq_ring,
> struct aq_ring_param_s *aq_ring_param)
> {
> - return hw_atl_b0_hw_ring_rx_init(self, aq_ring, aq_ring_param);
> + int res = hw_atl_b0_hw_ring_rx_init(self, aq_ring, aq_ring_param);
> +
> + if (aq_ptp_ring(aq_ring->aq_nic, aq_ring))
> + hw_atl2_hw_rx_ptp_ring_init(self, aq_ring);
> +
> + return res;
> }
>
> static int hw_atl2_hw_ring_tx_init(struct aq_hw_s *self,
> struct aq_ring_s *aq_ring,
> struct aq_ring_param_s *aq_ring_param)
> {
> - return hw_atl_b0_hw_ring_tx_init(self, aq_ring, aq_ring_param);
> + int res = hw_atl_b0_hw_ring_tx_init(self, aq_ring, aq_ring_param);
> +
> + if (aq_ptp_ring(aq_ring->aq_nic, aq_ring))
> + hw_atl2_hw_tx_ptp_ring_init(self, aq_ring);
> +
> + return res;
> }
hw_atl2_hw_{rx,tx}_ptp_ring_init() return aq_hw_err_from_flags(self),
which reports -ENXIO/-EIO when AQ_HW_FLAG_ERR_UNPLUG or
AQ_HW_FLAG_ERR_HW is set. The return value is discarded here, so PTP
ring setup errors are hidden from the caller. Should this be something
like:
return res ? res : aq_hw_err_from_flags(self);
[ ... ]
> +static u64 hw_atl2_hw_ring_tx_ptp_get_ts(struct aq_ring_s *ring)
> +{
> + struct hw_atl2_txts_s *txts;
> +
> + txts = (struct hw_atl2_txts_s *)&ring->dx_ring[ring->sw_head *
> + HW_ATL2_TXD_SIZE];
> + /* DD + TS_VALID */
> + if ((txts->ctrl & HW_ATL2_TXTS_DD) && (txts->ctrl & HW_ATL2_TXTS_TS_VALID))
> + return txts->ts;
> +
> + return 0;
> +}
txts lives in DMA-coherent memory written by the device. The compiler
can issue two separate loads of txts->ctrl between the two bitmask
checks, producing a torn state (DD set, TS_VALID appears unset, or vice
versa). On weakly-ordered architectures (arm64, powerpc) the CPU can
also speculate txts->ts ahead of the ctrl check.
Should this use a READ_ONCE on ctrl followed by dma_rmb() before
reading txts->ts?
> +static u16 hw_atl2_hw_rx_extract_ts(struct aq_hw_s *self, u8 *p,
> + unsigned int len, u64 *timestamp)
> +{
> + unsigned int offset = HW_ATL2_RX_TS_SIZE;
> + u8 *ptr;
> +
> + if (len <= offset || !timestamp)
> + return 0;
> +
> + ptr = p + (len - offset);
> + memcpy(timestamp, ptr, sizeof(*timestamp));
> +
> + return HW_ATL2_RX_TS_SIZE;
> +}
The data at ptr is written by the device in a defined wire byte order,
but is being copied into a plain host-order u64 with no byteswap.
The A1 helper hw_atl_b0_rx_extract_ts() handles this with explicit
__be64/__be32 locals and be64_to_cpu/be32_to_cpu accessors. Is the AQC113
field really host-endian, or should big-endian hosts byteswap here as
well? Also, struct hw_atl2_txts_s declares ts as u64 rather than a
__bitwise type, which will not be caught by sparse.
[ ... ]
aq_ptp_ring_alloc() error path in aq_ptp.c:
> + if (aq_ptp->a1_ptp) {
> + err = aq_ring_hwts_rx_alloc(&aq_ptp->hwts_rx, aq_nic, PTP_HWST_RING_IDX,
> + aq_nic->aq_nic_cfg.rxds,
> + aq_nic->aq_nic_cfg.aq_hw_caps->rxd_size);
> + if (err)
> + goto err_exit_ptp_rx;
> + }
[ ... ]
> err_exit_hwts_rx:
> - aq_ring_hwts_rx_free(&aq_ptp->hwts_rx);
> + if (aq_ptp->a1_ptp)
> + aq_ring_free(&aq_ptp->hwts_rx);
aq_ring_hwts_rx_alloc() allocates sz = size * dx_size + AQ_CFG_RXDS_DEF
bytes of DMA-coherent memory, but the err_exit_hwts_rx label now calls
aq_ring_free() which frees size * dx_size (the AQ_CFG_RXDS_DEF padding
is dropped). The pre-patch code used aq_ring_hwts_rx_free() which
matched the allocation size. Should this stay as aq_ring_hwts_rx_free()
in the error path so dma_free_coherent() sees the original allocation
size?
--
This is an AI-generated review.
next prev parent reply other threads:[~2026-05-12 9:54 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-06 13:56 [PATCH net-next 0/9] net: atlantic: add PTP support for AQC113 (Antigua) sukhdeeps
2026-05-06 13:56 ` [PATCH net-next 1/9] net: atlantic: correct L3L4 filter flow_type masking and IPv6 handling masking and IPv6 handling sukhdeeps
2026-05-06 13:56 ` [PATCH net-next 2/9] net: atlantic: move active_ipv4/ipv6 bitmap updates after HW write updates after HW write sukhdeeps
2026-05-12 9:53 ` Paolo Abeni
2026-05-06 13:57 ` [PATCH net-next 3/9] net: atlantic: decouple aq_set_data_fl3l4() from driver internals driver internals sukhdeeps
2026-05-06 13:57 ` [PATCH net-next 4/9] net: atlantic: add AQC113 hardware register definitions and accessors definitions and accessors sukhdeeps
2026-05-06 13:57 ` [PATCH net-next 5/9] net: atlantic: add AQC113 filter data structures and firmware query and firmware query firmware query sukhdeeps
2026-05-12 9:53 ` Paolo Abeni
2026-05-06 13:57 ` [PATCH net-next 6/9] net: atlantic: implement AQC113 L2/L3/L4 RX filter management filter management management sukhdeeps
2026-05-06 22:43 ` Vadim Fedorenko
2026-05-08 6:56 ` [EXTERNAL] " Sukhdeep Soni [C]
2026-05-12 9:54 ` Paolo Abeni
2026-05-06 13:57 ` [PATCH net-next 7/9] net: atlantic: add AQC113 PTP traffic class and TX path setup TX path setup sukhdeeps
2026-05-12 9:54 ` Paolo Abeni
2026-05-06 13:57 ` [PATCH net-next 8/9] net: atlantic: extend hw_ops and TX descriptor for AQC113 PTP for AQC113 PTP sukhdeeps
2026-05-06 13:57 ` [PATCH net-next 9/9] net: atlantic: add PTP support for AQC113 (Antigua) (Antigua) sukhdeeps
2026-05-12 9:54 ` Paolo Abeni [this message]
2026-05-08 12:01 ` [PATCH net-next v2 0/9] net: atlantic: add PTP support for AQC113 (Antigua) sukhdeeps
2026-05-08 12:01 ` [PATCH net-next v2 1/9] net: atlantic: correct L3L4 filter flow_type masking and IPv6 handling masking and IPv6 handling sukhdeeps
2026-05-08 12:01 ` [PATCH net-next v2 2/9] net: atlantic: move active_ipv4/ipv6 bitmap updates after HW write updates after HW write sukhdeeps
2026-05-08 12:01 ` [PATCH net-next v2 3/9] net: atlantic: decouple aq_set_data_fl3l4() from driver internals driver internals sukhdeeps
2026-05-08 12:01 ` [PATCH net-next v2 4/9] net: atlantic: add AQC113 hardware register definitions and accessors definitions and accessors sukhdeeps
2026-05-08 12:01 ` [PATCH net-next v2 5/9] net: atlantic: add AQC113 filter data structures and firmware query and firmware query firmware query sukhdeeps
2026-05-08 12:01 ` [PATCH net-next v2 6/9] net: atlantic: implement AQC113 L2/L3/L4 RX filter management filter management management sukhdeeps
2026-05-12 10:00 ` Paolo Abeni
2026-05-12 10:04 ` Paolo Abeni
2026-05-08 12:01 ` [PATCH net-next v2 7/9] net: atlantic: add AQC113 PTP traffic class and TX path setup TX path setup sukhdeeps
2026-05-08 12:01 ` [PATCH net-next v2 8/9] net: atlantic: extend hw_ops and TX descriptor for AQC113 PTP for AQC113 PTP sukhdeeps
2026-05-08 12:01 ` [PATCH net-next v2 9/9] net: atlantic: add PTP support for AQC113 (Antigua) (Antigua) sukhdeeps
2026-05-12 10:01 ` Paolo Abeni
2026-05-12 10:17 ` Paolo Abeni
2026-05-08 23:06 ` [PATCH net-next v2 0/9] net: atlantic: add PTP support for AQC113 (Antigua) Jakub Kicinski
2026-05-11 12:26 ` [EXTERNAL] " Sukhdeep Soni [C]
2026-05-11 23:50 ` Jakub Kicinski
2026-05-12 11:27 ` Simon Horman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260512095420.134936-1-pabeni@redhat.com \
--to=pabeni@redhat.com \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=epomozov@marvell.com \
--cc=irusskikh@marvell.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=richardcochran@gmail.com \
--cc=sukhdeeps@marvell.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox