netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next 0/4] convert 3 drivers to ndo_hwtstamp API
@ 2025-09-22 16:51 Vadim Fedorenko
  2025-09-22 16:51 ` [PATCH net-next 1/4] tg3: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set() Vadim Fedorenko
                   ` (3 more replies)
  0 siblings, 4 replies; 11+ messages in thread
From: Vadim Fedorenko @ 2025-09-22 16:51 UTC (permalink / raw)
  To: Jakub Kicinski, Paolo Abeni, Simon Horman, Richard Cochran,
	Andrew Lunn, Michael Chan, Pavan Chebbi, Tariq Toukan,
	Saeed Mahameed, Mark Bloch, Vadim Fedorenko
  Cc: netdev

Convert tg3, bnxt_en and mlx5 to use ndo_hwtstamp API. These 3 drivers
were chosen because I have access to the HW and is able to test the
changes. Also there is a selftest provided to validated that the driver
correctly sets up timestamp configuration, according to what is exposed
as supported by the hardware. Selftest allows driver to fallback to some
wider scope of RX timestamping, i.e. it allows the driver to set up
ptpv2-event filter when ptpv2-l2-event is requested.

Vadim Fedorenko (4):
  tg3: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set()
  bnxt_en: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set()
  mlx5: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set()
  selftests: drv-net: add HW timestamping tests

 drivers/net/ethernet/broadcom/bnxt/bnxt.c     |  8 +-
 drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c | 35 ++++-----
 drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h |  7 +-
 drivers/net/ethernet/broadcom/tg3.c           | 66 +++++++---------
 drivers/net/ethernet/mellanox/mlx5/core/en.h  | 13 ++--
 .../net/ethernet/mellanox/mlx5/core/en/ptp.h  |  2 +-
 .../net/ethernet/mellanox/mlx5/core/en/trap.h |  2 +-
 .../net/ethernet/mellanox/mlx5/core/en/txrx.h |  2 +-
 .../net/ethernet/mellanox/mlx5/core/en_main.c | 47 +++++-------
 .../net/ethernet/mellanox/mlx5/core/en_rx.c   |  2 +-
 .../ethernet/mellanox/mlx5/core/ipoib/ipoib.c | 17 +----
 .../ethernet/mellanox/mlx5/core/ipoib/ipoib.h |  1 -
 .../mellanox/mlx5/core/ipoib/ipoib_vlan.c     |  9 +--
 .../ethernet/mellanox/mlx5/core/lib/clock.h   | 14 ++--
 .../selftests/drivers/net/hw/nic_timestamp.py | 75 +++++++++++++++++++
 15 files changed, 167 insertions(+), 133 deletions(-)
 create mode 100755 tools/testing/selftests/drivers/net/hw/nic_timestamp.py

-- 
2.47.3


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH net-next 1/4] tg3: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set()
  2025-09-22 16:51 [PATCH net-next 0/4] convert 3 drivers to ndo_hwtstamp API Vadim Fedorenko
@ 2025-09-22 16:51 ` Vadim Fedorenko
  2025-09-22 22:15   ` Michael Chan
  2025-09-23  3:47   ` Pavan Chebbi
  2025-09-22 16:51 ` [PATCH net-next 2/4] bnxt_en: " Vadim Fedorenko
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 11+ messages in thread
From: Vadim Fedorenko @ 2025-09-22 16:51 UTC (permalink / raw)
  To: Jakub Kicinski, Paolo Abeni, Simon Horman, Richard Cochran,
	Andrew Lunn, Michael Chan, Pavan Chebbi, Tariq Toukan,
	Saeed Mahameed, Mark Bloch, Vadim Fedorenko
  Cc: netdev

Convert tg3 driver to new timestamping configuration API.

Signed-off-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
---
 drivers/net/ethernet/broadcom/tg3.c | 66 +++++++++++++----------------
 1 file changed, 29 insertions(+), 37 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
index b4dc93a48718..7f00ec7fd7b9 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -13929,22 +13929,20 @@ static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest,
 
 }
 
-static int tg3_hwtstamp_set(struct net_device *dev, struct ifreq *ifr)
+static int tg3_hwtstamp_set(struct net_device *dev,
+			    struct kernel_hwtstamp_config *stmpconf,
+			    struct netlink_ext_ack *extack)
 {
 	struct tg3 *tp = netdev_priv(dev);
-	struct hwtstamp_config stmpconf;
 
 	if (!tg3_flag(tp, PTP_CAPABLE))
 		return -EOPNOTSUPP;
 
-	if (copy_from_user(&stmpconf, ifr->ifr_data, sizeof(stmpconf)))
-		return -EFAULT;
-
-	if (stmpconf.tx_type != HWTSTAMP_TX_ON &&
-	    stmpconf.tx_type != HWTSTAMP_TX_OFF)
+	if (stmpconf->tx_type != HWTSTAMP_TX_ON &&
+	    stmpconf->tx_type != HWTSTAMP_TX_OFF)
 		return -ERANGE;
 
-	switch (stmpconf.rx_filter) {
+	switch (stmpconf->rx_filter) {
 	case HWTSTAMP_FILTER_NONE:
 		tp->rxptpctl = 0;
 		break;
@@ -14004,74 +14002,72 @@ static int tg3_hwtstamp_set(struct net_device *dev, struct ifreq *ifr)
 		tw32(TG3_RX_PTP_CTL,
 		     tp->rxptpctl | TG3_RX_PTP_CTL_HWTS_INTERLOCK);
 
-	if (stmpconf.tx_type == HWTSTAMP_TX_ON)
+	if (stmpconf->tx_type == HWTSTAMP_TX_ON)
 		tg3_flag_set(tp, TX_TSTAMP_EN);
 	else
 		tg3_flag_clear(tp, TX_TSTAMP_EN);
 
-	return copy_to_user(ifr->ifr_data, &stmpconf, sizeof(stmpconf)) ?
-		-EFAULT : 0;
+	return 0;
 }
 
-static int tg3_hwtstamp_get(struct net_device *dev, struct ifreq *ifr)
+static int tg3_hwtstamp_get(struct net_device *dev,
+			    struct kernel_hwtstamp_config *stmpconf)
 {
 	struct tg3 *tp = netdev_priv(dev);
-	struct hwtstamp_config stmpconf;
 
 	if (!tg3_flag(tp, PTP_CAPABLE))
 		return -EOPNOTSUPP;
 
-	stmpconf.flags = 0;
-	stmpconf.tx_type = (tg3_flag(tp, TX_TSTAMP_EN) ?
-			    HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF);
+	stmpconf->flags = 0;
+	stmpconf->tx_type = tg3_flag(tp, TX_TSTAMP_EN) ?
+			    HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF;
 
 	switch (tp->rxptpctl) {
 	case 0:
-		stmpconf.rx_filter = HWTSTAMP_FILTER_NONE;
+		stmpconf->rx_filter = HWTSTAMP_FILTER_NONE;
 		break;
 	case TG3_RX_PTP_CTL_RX_PTP_V1_EN | TG3_RX_PTP_CTL_ALL_V1_EVENTS:
-		stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_EVENT;
+		stmpconf->rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_EVENT;
 		break;
 	case TG3_RX_PTP_CTL_RX_PTP_V1_EN | TG3_RX_PTP_CTL_SYNC_EVNT:
-		stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_SYNC;
+		stmpconf->rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_SYNC;
 		break;
 	case TG3_RX_PTP_CTL_RX_PTP_V1_EN | TG3_RX_PTP_CTL_DELAY_REQ:
-		stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ;
+		stmpconf->rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ;
 		break;
 	case TG3_RX_PTP_CTL_RX_PTP_V2_EN | TG3_RX_PTP_CTL_ALL_V2_EVENTS:
-		stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT;
+		stmpconf->rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT;
 		break;
 	case TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN | TG3_RX_PTP_CTL_ALL_V2_EVENTS:
-		stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_EVENT;
+		stmpconf->rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_EVENT;
 		break;
 	case TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN | TG3_RX_PTP_CTL_ALL_V2_EVENTS:
-		stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_EVENT;
+		stmpconf->rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_EVENT;
 		break;
 	case TG3_RX_PTP_CTL_RX_PTP_V2_EN | TG3_RX_PTP_CTL_SYNC_EVNT:
-		stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_SYNC;
+		stmpconf->rx_filter = HWTSTAMP_FILTER_PTP_V2_SYNC;
 		break;
 	case TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN | TG3_RX_PTP_CTL_SYNC_EVNT:
-		stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_SYNC;
+		stmpconf->rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_SYNC;
 		break;
 	case TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN | TG3_RX_PTP_CTL_SYNC_EVNT:
-		stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_SYNC;
+		stmpconf->rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_SYNC;
 		break;
 	case TG3_RX_PTP_CTL_RX_PTP_V2_EN | TG3_RX_PTP_CTL_DELAY_REQ:
-		stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_DELAY_REQ;
+		stmpconf->rx_filter = HWTSTAMP_FILTER_PTP_V2_DELAY_REQ;
 		break;
 	case TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN | TG3_RX_PTP_CTL_DELAY_REQ:
-		stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ;
+		stmpconf->rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ;
 		break;
 	case TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN | TG3_RX_PTP_CTL_DELAY_REQ:
-		stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ;
+		stmpconf->rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ;
 		break;
 	default:
 		WARN_ON_ONCE(1);
 		return -ERANGE;
 	}
 
-	return copy_to_user(ifr->ifr_data, &stmpconf, sizeof(stmpconf)) ?
-		-EFAULT : 0;
+	return 0;
 }
 
 static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
@@ -14126,12 +14122,6 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 
 		return err;
 
-	case SIOCSHWTSTAMP:
-		return tg3_hwtstamp_set(dev, ifr);
-
-	case SIOCGHWTSTAMP:
-		return tg3_hwtstamp_get(dev, ifr);
-
 	default:
 		/* do nothing */
 		break;
@@ -14407,6 +14397,8 @@ static const struct net_device_ops tg3_netdev_ops = {
 #ifdef CONFIG_NET_POLL_CONTROLLER
 	.ndo_poll_controller	= tg3_poll_controller,
 #endif
+	.ndo_hwtstamp_get	= tg3_hwtstamp_get,
+	.ndo_hwtstamp_set	= tg3_hwtstamp_set,
 };
 
 static void tg3_get_eeprom_size(struct tg3 *tp)
-- 
2.47.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH net-next 2/4] bnxt_en: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set()
  2025-09-22 16:51 [PATCH net-next 0/4] convert 3 drivers to ndo_hwtstamp API Vadim Fedorenko
  2025-09-22 16:51 ` [PATCH net-next 1/4] tg3: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set() Vadim Fedorenko
@ 2025-09-22 16:51 ` Vadim Fedorenko
  2025-09-22 22:17   ` Michael Chan
  2025-09-23  3:48   ` Pavan Chebbi
  2025-09-22 16:51 ` [PATCH net-next 3/4] mlx5: " Vadim Fedorenko
  2025-09-22 16:51 ` [PATCH net-next 4/4] selftests: drv-net: add HW timestamping tests Vadim Fedorenko
  3 siblings, 2 replies; 11+ messages in thread
From: Vadim Fedorenko @ 2025-09-22 16:51 UTC (permalink / raw)
  To: Jakub Kicinski, Paolo Abeni, Simon Horman, Richard Cochran,
	Andrew Lunn, Michael Chan, Pavan Chebbi, Tariq Toukan,
	Saeed Mahameed, Mark Bloch, Vadim Fedorenko
  Cc: netdev

Convert bnxt dirver to use new timestamping configuration API.

Signed-off-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
---
 drivers/net/ethernet/broadcom/bnxt/bnxt.c     |  8 ++---
 drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c | 35 +++++++++----------
 drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h |  7 ++--
 3 files changed, 23 insertions(+), 27 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index d59612d1e176..1d0e0e7362bd 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -13278,12 +13278,6 @@ static int bnxt_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 		return bnxt_hwrm_port_phy_write(bp, mdio->phy_id, mdio->reg_num,
 						mdio->val_in);
 
-	case SIOCSHWTSTAMP:
-		return bnxt_hwtstamp_set(dev, ifr);
-
-	case SIOCGHWTSTAMP:
-		return bnxt_hwtstamp_get(dev, ifr);
-
 	default:
 		/* do nothing */
 		break;
@@ -15806,6 +15800,8 @@ static const struct net_device_ops bnxt_netdev_ops = {
 	.ndo_xdp_xmit		= bnxt_xdp_xmit,
 	.ndo_bridge_getlink	= bnxt_bridge_getlink,
 	.ndo_bridge_setlink	= bnxt_bridge_setlink,
+	.ndo_hwtstamp_get	= bnxt_hwtstamp_get,
+	.ndo_hwtstamp_set	= bnxt_hwtstamp_set,
 };
 
 static void bnxt_get_queue_stats_rx(struct net_device *dev, int i,
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c
index ca660e6d28a4..db81cf6d5289 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c
@@ -560,10 +560,11 @@ static int bnxt_hwrm_ptp_cfg(struct bnxt *bp)
 	return bnxt_ptp_cfg_tstamp_filters(bp);
 }
 
-int bnxt_hwtstamp_set(struct net_device *dev, struct ifreq *ifr)
+int bnxt_hwtstamp_set(struct net_device *dev,
+		      struct kernel_hwtstamp_config *stmpconf,
+		      struct netlink_ext_ack *extack)
 {
 	struct bnxt *bp = netdev_priv(dev);
-	struct hwtstamp_config stmpconf;
 	struct bnxt_ptp_cfg *ptp;
 	u16 old_rxctl;
 	int old_rx_filter, rc;
@@ -573,17 +574,14 @@ int bnxt_hwtstamp_set(struct net_device *dev, struct ifreq *ifr)
 	if (!ptp)
 		return -EOPNOTSUPP;
 
-	if (copy_from_user(&stmpconf, ifr->ifr_data, sizeof(stmpconf)))
-		return -EFAULT;
-
-	if (stmpconf.tx_type != HWTSTAMP_TX_ON &&
-	    stmpconf.tx_type != HWTSTAMP_TX_OFF)
+	if (stmpconf->tx_type != HWTSTAMP_TX_ON &&
+	    stmpconf->tx_type != HWTSTAMP_TX_OFF)
 		return -ERANGE;
 
 	old_rx_filter = ptp->rx_filter;
 	old_rxctl = ptp->rxctl;
 	old_tx_tstamp_en = ptp->tx_tstamp_en;
-	switch (stmpconf.rx_filter) {
+	switch (stmpconf->rx_filter) {
 	case HWTSTAMP_FILTER_NONE:
 		ptp->rxctl = 0;
 		ptp->rx_filter = HWTSTAMP_FILTER_NONE;
@@ -616,7 +614,7 @@ int bnxt_hwtstamp_set(struct net_device *dev, struct ifreq *ifr)
 		return -ERANGE;
 	}
 
-	if (stmpconf.tx_type == HWTSTAMP_TX_ON)
+	if (stmpconf->tx_type == HWTSTAMP_TX_ON)
 		ptp->tx_tstamp_en = 1;
 	else
 		ptp->tx_tstamp_en = 0;
@@ -625,9 +623,8 @@ int bnxt_hwtstamp_set(struct net_device *dev, struct ifreq *ifr)
 	if (rc)
 		goto ts_set_err;
 
-	stmpconf.rx_filter = ptp->rx_filter;
-	return copy_to_user(ifr->ifr_data, &stmpconf, sizeof(stmpconf)) ?
-		-EFAULT : 0;
+	stmpconf->rx_filter = ptp->rx_filter;
+	return 0;
 
 ts_set_err:
 	ptp->rx_filter = old_rx_filter;
@@ -636,22 +633,22 @@ int bnxt_hwtstamp_set(struct net_device *dev, struct ifreq *ifr)
 	return rc;
 }
 
-int bnxt_hwtstamp_get(struct net_device *dev, struct ifreq *ifr)
+int bnxt_hwtstamp_get(struct net_device *dev,
+		      struct kernel_hwtstamp_config *stmpconf)
 {
 	struct bnxt *bp = netdev_priv(dev);
-	struct hwtstamp_config stmpconf;
 	struct bnxt_ptp_cfg *ptp;
 
 	ptp = bp->ptp_cfg;
 	if (!ptp)
 		return -EOPNOTSUPP;
 
-	stmpconf.flags = 0;
-	stmpconf.tx_type = ptp->tx_tstamp_en ? HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF;
+	stmpconf->flags = 0;
+	stmpconf->tx_type = ptp->tx_tstamp_en ? HWTSTAMP_TX_ON
+					      : HWTSTAMP_TX_OFF;
 
-	stmpconf.rx_filter = ptp->rx_filter;
-	return copy_to_user(ifr->ifr_data, &stmpconf, sizeof(stmpconf)) ?
-		-EFAULT : 0;
+	stmpconf->rx_filter = ptp->rx_filter;
+	return 0;
 }
 
 static int bnxt_map_regs(struct bnxt *bp, u32 *reg_arr, int count, int reg_win)
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h
index 0481161d26ef..8cc2fae47644 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h
@@ -160,8 +160,11 @@ void bnxt_ptp_update_current_time(struct bnxt *bp);
 void bnxt_ptp_pps_event(struct bnxt *bp, u32 data1, u32 data2);
 int bnxt_ptp_cfg_tstamp_filters(struct bnxt *bp);
 void bnxt_ptp_reapply_pps(struct bnxt *bp);
-int bnxt_hwtstamp_set(struct net_device *dev, struct ifreq *ifr);
-int bnxt_hwtstamp_get(struct net_device *dev, struct ifreq *ifr);
+int bnxt_hwtstamp_set(struct net_device *dev,
+		      struct kernel_hwtstamp_config *stmpconf,
+		      struct netlink_ext_ack *extack);
+int bnxt_hwtstamp_get(struct net_device *dev,
+		      struct kernel_hwtstamp_config *stmpconf);
 void bnxt_ptp_free_txts_skbs(struct bnxt_ptp_cfg *ptp);
 int bnxt_ptp_get_txts_prod(struct bnxt_ptp_cfg *ptp, u16 *prod);
 void bnxt_get_tx_ts_p5(struct bnxt *bp, struct sk_buff *skb, u16 prod);
-- 
2.47.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH net-next 3/4] mlx5: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set()
  2025-09-22 16:51 [PATCH net-next 0/4] convert 3 drivers to ndo_hwtstamp API Vadim Fedorenko
  2025-09-22 16:51 ` [PATCH net-next 1/4] tg3: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set() Vadim Fedorenko
  2025-09-22 16:51 ` [PATCH net-next 2/4] bnxt_en: " Vadim Fedorenko
@ 2025-09-22 16:51 ` Vadim Fedorenko
  2025-09-23 17:44   ` Carolina Jubran
  2025-09-22 16:51 ` [PATCH net-next 4/4] selftests: drv-net: add HW timestamping tests Vadim Fedorenko
  3 siblings, 1 reply; 11+ messages in thread
From: Vadim Fedorenko @ 2025-09-22 16:51 UTC (permalink / raw)
  To: Jakub Kicinski, Paolo Abeni, Simon Horman, Richard Cochran,
	Andrew Lunn, Michael Chan, Pavan Chebbi, Tariq Toukan,
	Saeed Mahameed, Mark Bloch, Vadim Fedorenko
  Cc: netdev

Convert mlx5 driver to use new timestamping configuration API.

Signed-off-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
---
 drivers/net/ethernet/mellanox/mlx5/core/en.h  | 13 +++--
 .../net/ethernet/mellanox/mlx5/core/en/ptp.h  |  2 +-
 .../net/ethernet/mellanox/mlx5/core/en/trap.h |  2 +-
 .../net/ethernet/mellanox/mlx5/core/en/txrx.h |  2 +-
 .../net/ethernet/mellanox/mlx5/core/en_main.c | 47 +++++++------------
 .../net/ethernet/mellanox/mlx5/core/en_rx.c   |  2 +-
 .../ethernet/mellanox/mlx5/core/ipoib/ipoib.c | 17 +------
 .../ethernet/mellanox/mlx5/core/ipoib/ipoib.h |  1 -
 .../mellanox/mlx5/core/ipoib/ipoib_vlan.c     |  9 +---
 .../ethernet/mellanox/mlx5/core/lib/clock.h   | 14 +++---
 10 files changed, 40 insertions(+), 69 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h
index 4ffbc263d60f..eca0712150d9 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h
@@ -696,7 +696,7 @@ struct mlx5e_rq {
 	struct mlx5e_rq_stats *stats;
 	struct mlx5e_cq        cq;
 	struct mlx5e_cq_decomp cqd;
-	struct hwtstamp_config *tstamp;
+	struct kernel_hwtstamp_config *tstamp;
 	struct mlx5_clock      *clock;
 	struct mlx5e_icosq    *icosq;
 	struct mlx5e_priv     *priv;
@@ -784,7 +784,7 @@ struct mlx5e_channel {
 	/* control */
 	struct mlx5e_priv         *priv;
 	struct mlx5_core_dev      *mdev;
-	struct hwtstamp_config    *tstamp;
+	struct kernel_hwtstamp_config *tstamp;
 	DECLARE_BITMAP(state, MLX5E_CHANNEL_NUM_STATES);
 	int                        ix;
 	int                        vec_ix;
@@ -918,7 +918,7 @@ struct mlx5e_priv {
 	u8                         max_opened_tc;
 	bool                       tx_ptp_opened;
 	bool                       rx_ptp_opened;
-	struct hwtstamp_config     tstamp;
+	struct kernel_hwtstamp_config tstamp;
 	u16                        q_counter[MLX5_SD_MAX_GROUP_SZ];
 	u16                        drop_rq_q_counter;
 	struct notifier_block      events_nb;
@@ -1026,8 +1026,11 @@ void mlx5e_self_test(struct net_device *ndev, struct ethtool_test *etest,
 		     u64 *buf);
 void mlx5e_set_rx_mode_work(struct work_struct *work);
 
-int mlx5e_hwstamp_set(struct mlx5e_priv *priv, struct ifreq *ifr);
-int mlx5e_hwstamp_get(struct mlx5e_priv *priv, struct ifreq *ifr);
+int mlx5e_hwstamp_set(struct net_device *dev,
+		      struct kernel_hwtstamp_config *config,
+		      struct netlink_ext_ack *extack);
+int mlx5e_hwstamp_get(struct net_device *dev,
+		      struct kernel_hwtstamp_config *config);
 int mlx5e_modify_rx_cqe_compression_locked(struct mlx5e_priv *priv, bool val, bool rx_filter);
 
 int mlx5e_vlan_rx_add_vid(struct net_device *dev, __always_unused __be16 proto,
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/ptp.h b/drivers/net/ethernet/mellanox/mlx5/core/en/ptp.h
index 1b3c9648220b..abc1f203ecb9 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/ptp.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/ptp.h
@@ -64,7 +64,7 @@ struct mlx5e_ptp {
 	/* control */
 	struct mlx5e_priv         *priv;
 	struct mlx5_core_dev      *mdev;
-	struct hwtstamp_config    *tstamp;
+	struct kernel_hwtstamp_config *tstamp;
 	DECLARE_BITMAP(state, MLX5E_PTP_STATE_NUM_STATES);
 	struct mlx5_sq_bfreg      *bfreg;
 };
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/trap.h b/drivers/net/ethernet/mellanox/mlx5/core/en/trap.h
index aa3f17658c6d..fe30fe30a47c 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/trap.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/trap.h
@@ -22,7 +22,7 @@ struct mlx5e_trap {
 	/* control */
 	struct mlx5e_priv         *priv;
 	struct mlx5_core_dev      *mdev;
-	struct hwtstamp_config    *tstamp;
+	struct kernel_hwtstamp_config *tstamp;
 	DECLARE_BITMAP(state, MLX5E_CHANNEL_NUM_STATES);
 
 	struct mlx5e_params        params;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h b/drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h
index 6760bb0336df..7e191e1569e8 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h
@@ -92,7 +92,7 @@ int mlx5e_poll_rx_cq(struct mlx5e_cq *cq, int budget);
 void mlx5e_free_rx_descs(struct mlx5e_rq *rq);
 void mlx5e_free_rx_missing_descs(struct mlx5e_rq *rq);
 
-static inline bool mlx5e_rx_hw_stamp(struct hwtstamp_config *config)
+static inline bool mlx5e_rx_hw_stamp(struct kernel_hwtstamp_config *config)
 {
 	return config->rx_filter == HWTSTAMP_FILTER_ALL;
 }
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index 5e007bb3bad1..74a63371ab69 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@ -4755,9 +4755,11 @@ static int mlx5e_hwstamp_config_ptp_rx(struct mlx5e_priv *priv, bool ptp_rx)
 					&new_params.ptp_rx, true);
 }
 
-int mlx5e_hwstamp_set(struct mlx5e_priv *priv, struct ifreq *ifr)
+int mlx5e_hwstamp_set(struct net_device *dev,
+		      struct kernel_hwtstamp_config *config,
+		      struct netlink_ext_ack *extack)
 {
-	struct hwtstamp_config config;
+	struct mlx5e_priv *priv = netdev_priv(dev);
 	bool rx_cqe_compress_def;
 	bool ptp_rx;
 	int err;
@@ -4766,11 +4768,8 @@ int mlx5e_hwstamp_set(struct mlx5e_priv *priv, struct ifreq *ifr)
 	    (mlx5_clock_get_ptp_index(priv->mdev) == -1))
 		return -EOPNOTSUPP;
 
-	if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
-		return -EFAULT;
-
 	/* TX HW timestamp */
-	switch (config.tx_type) {
+	switch (config->tx_type) {
 	case HWTSTAMP_TX_OFF:
 	case HWTSTAMP_TX_ON:
 		break;
@@ -4782,7 +4781,7 @@ int mlx5e_hwstamp_set(struct mlx5e_priv *priv, struct ifreq *ifr)
 	rx_cqe_compress_def = priv->channels.params.rx_cqe_compress_def;
 
 	/* RX HW timestamp */
-	switch (config.rx_filter) {
+	switch (config->rx_filter) {
 	case HWTSTAMP_FILTER_NONE:
 		ptp_rx = false;
 		break;
@@ -4801,7 +4800,7 @@ int mlx5e_hwstamp_set(struct mlx5e_priv *priv, struct ifreq *ifr)
 	case HWTSTAMP_FILTER_PTP_V2_SYNC:
 	case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
 	case HWTSTAMP_FILTER_NTP_ALL:
-		config.rx_filter = HWTSTAMP_FILTER_ALL;
+		config->rx_filter = HWTSTAMP_FILTER_ALL;
 		/* ptp_rx is set if both HW TS is set and CQE
 		 * compression is set
 		 */
@@ -4814,47 +4813,34 @@ int mlx5e_hwstamp_set(struct mlx5e_priv *priv, struct ifreq *ifr)
 
 	if (!mlx5e_profile_feature_cap(priv->profile, PTP_RX))
 		err = mlx5e_hwstamp_config_no_ptp_rx(priv,
-						     config.rx_filter != HWTSTAMP_FILTER_NONE);
+						     config->rx_filter != HWTSTAMP_FILTER_NONE);
 	else
 		err = mlx5e_hwstamp_config_ptp_rx(priv, ptp_rx);
 	if (err)
 		goto err_unlock;
 
-	memcpy(&priv->tstamp, &config, sizeof(config));
+	memcpy(&priv->tstamp, config, sizeof(*config));
 	mutex_unlock(&priv->state_lock);
 
 	/* might need to fix some features */
 	netdev_update_features(priv->netdev);
 
-	return copy_to_user(ifr->ifr_data, &config,
-			    sizeof(config)) ? -EFAULT : 0;
+	return 0;
 err_unlock:
 	mutex_unlock(&priv->state_lock);
 	return err;
 }
 
-int mlx5e_hwstamp_get(struct mlx5e_priv *priv, struct ifreq *ifr)
+int mlx5e_hwstamp_get(struct net_device *dev,
+		      struct kernel_hwtstamp_config *config)
 {
-	struct hwtstamp_config *cfg = &priv->tstamp;
+	struct mlx5e_priv *priv = netdev_priv(dev);
 
 	if (!MLX5_CAP_GEN(priv->mdev, device_frequency_khz))
 		return -EOPNOTSUPP;
 
-	return copy_to_user(ifr->ifr_data, cfg, sizeof(*cfg)) ? -EFAULT : 0;
-}
-
-static int mlx5e_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
-{
-	struct mlx5e_priv *priv = netdev_priv(dev);
-
-	switch (cmd) {
-	case SIOCSHWTSTAMP:
-		return mlx5e_hwstamp_set(priv, ifr);
-	case SIOCGHWTSTAMP:
-		return mlx5e_hwstamp_get(priv, ifr);
-	default:
-		return -EOPNOTSUPP;
-	}
+	*config = priv->tstamp;
+	return 0;
 }
 
 #ifdef CONFIG_MLX5_ESWITCH
@@ -5295,7 +5281,6 @@ const struct net_device_ops mlx5e_netdev_ops = {
 	.ndo_set_features        = mlx5e_set_features,
 	.ndo_fix_features        = mlx5e_fix_features,
 	.ndo_change_mtu          = mlx5e_change_nic_mtu,
-	.ndo_eth_ioctl            = mlx5e_ioctl,
 	.ndo_set_tx_maxrate      = mlx5e_set_tx_maxrate,
 	.ndo_features_check      = mlx5e_features_check,
 	.ndo_tx_timeout          = mlx5e_tx_timeout,
@@ -5321,6 +5306,8 @@ const struct net_device_ops mlx5e_netdev_ops = {
 	.ndo_has_offload_stats   = mlx5e_has_offload_stats,
 	.ndo_get_offload_stats   = mlx5e_get_offload_stats,
 #endif
+	.ndo_hwtstamp_get	 = mlx5e_hwstamp_get,
+	.ndo_hwtstamp_set	 = mlx5e_hwstamp_set,
 };
 
 void mlx5e_build_nic_params(struct mlx5e_priv *priv, struct mlx5e_xsk *xsk, u16 mtu)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
index 4ed43ee9aa35..f774fee2e391 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
@@ -2609,7 +2609,7 @@ static inline void mlx5i_complete_rx_cqe(struct mlx5e_rq *rq,
 					 u32 cqe_bcnt,
 					 struct sk_buff *skb)
 {
-	struct hwtstamp_config *tstamp;
+	struct kernel_hwtstamp_config *tstamp;
 	struct mlx5e_rq_stats *stats;
 	struct net_device *netdev;
 	struct mlx5e_priv *priv;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
index 79ae3a51a4b3..ff8ffd997b17 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
@@ -52,7 +52,8 @@ static const struct net_device_ops mlx5i_netdev_ops = {
 	.ndo_init                = mlx5i_dev_init,
 	.ndo_uninit              = mlx5i_dev_cleanup,
 	.ndo_change_mtu          = mlx5i_change_mtu,
-	.ndo_eth_ioctl            = mlx5i_ioctl,
+	.ndo_hwtstamp_get        = mlx5e_hwstamp_get,
+	.ndo_hwtstamp_set        = mlx5e_hwstamp_set,
 };
 
 /* IPoIB mlx5 netdev profile */
@@ -557,20 +558,6 @@ int mlx5i_dev_init(struct net_device *dev)
 	return 0;
 }
 
-int mlx5i_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
-{
-	struct mlx5e_priv *priv = mlx5i_epriv(dev);
-
-	switch (cmd) {
-	case SIOCSHWTSTAMP:
-		return mlx5e_hwstamp_set(priv, ifr);
-	case SIOCGHWTSTAMP:
-		return mlx5e_hwstamp_get(priv, ifr);
-	default:
-		return -EOPNOTSUPP;
-	}
-}
-
 void mlx5i_dev_cleanup(struct net_device *dev)
 {
 	struct mlx5e_priv    *priv   = mlx5i_epriv(dev);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.h b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.h
index 2ab6437a1c49..98229bdd8a8a 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.h
@@ -88,7 +88,6 @@ struct net_device *mlx5i_pkey_get_netdev(struct net_device *netdev, u32 qpn);
 /* Shared ndo functions */
 int mlx5i_dev_init(struct net_device *dev);
 void mlx5i_dev_cleanup(struct net_device *dev);
-int mlx5i_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
 
 /* Parent profile functions */
 int mlx5i_init(struct mlx5_core_dev *mdev, struct net_device *netdev);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib_vlan.c b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib_vlan.c
index 028a76944d82..c44c0b2c82ea 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib_vlan.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib_vlan.c
@@ -140,7 +140,6 @@ static int mlx5i_pkey_close(struct net_device *netdev);
 static int mlx5i_pkey_dev_init(struct net_device *dev);
 static void mlx5i_pkey_dev_cleanup(struct net_device *netdev);
 static int mlx5i_pkey_change_mtu(struct net_device *netdev, int new_mtu);
-static int mlx5i_pkey_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
 
 static const struct net_device_ops mlx5i_pkey_netdev_ops = {
 	.ndo_open                = mlx5i_pkey_open,
@@ -149,7 +148,8 @@ static const struct net_device_ops mlx5i_pkey_netdev_ops = {
 	.ndo_get_stats64         = mlx5i_get_stats,
 	.ndo_uninit              = mlx5i_pkey_dev_cleanup,
 	.ndo_change_mtu          = mlx5i_pkey_change_mtu,
-	.ndo_eth_ioctl            = mlx5i_pkey_ioctl,
+	.ndo_hwtstamp_get        = mlx5e_hwstamp_get,
+	.ndo_hwtstamp_set        = mlx5e_hwstamp_set,
 };
 
 /* Child NDOs */
@@ -184,11 +184,6 @@ static int mlx5i_pkey_dev_init(struct net_device *dev)
 	return mlx5i_dev_init(dev);
 }
 
-static int mlx5i_pkey_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
-{
-	return mlx5i_ioctl(dev, ifr, cmd);
-}
-
 static void mlx5i_pkey_dev_cleanup(struct net_device *netdev)
 {
 	mlx5i_parent_put(netdev);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.h b/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.h
index c18a652c0faa..e65220f50524 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.h
@@ -53,13 +53,13 @@ struct mlx5_timer {
 };
 
 struct mlx5_clock {
-	seqlock_t                  lock;
-	struct hwtstamp_config     hwtstamp_config;
-	struct ptp_clock          *ptp;
-	struct ptp_clock_info      ptp_info;
-	struct mlx5_pps            pps_info;
-	struct mlx5_timer          timer;
-	bool                       shared;
+	seqlock_t                     lock;
+	struct kernel_hwtstamp_config hwtstamp_config;
+	struct ptp_clock             *ptp;
+	struct ptp_clock_info         ptp_info;
+	struct mlx5_pps               pps_info;
+	struct mlx5_timer             timer;
+	bool                          shared;
 };
 
 static inline bool mlx5_is_real_time_rq(struct mlx5_core_dev *mdev)
-- 
2.47.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH net-next 4/4] selftests: drv-net: add HW timestamping tests
  2025-09-22 16:51 [PATCH net-next 0/4] convert 3 drivers to ndo_hwtstamp API Vadim Fedorenko
                   ` (2 preceding siblings ...)
  2025-09-22 16:51 ` [PATCH net-next 3/4] mlx5: " Vadim Fedorenko
@ 2025-09-22 16:51 ` Vadim Fedorenko
  3 siblings, 0 replies; 11+ messages in thread
From: Vadim Fedorenko @ 2025-09-22 16:51 UTC (permalink / raw)
  To: Jakub Kicinski, Paolo Abeni, Simon Horman, Richard Cochran,
	Andrew Lunn, Michael Chan, Pavan Chebbi, Tariq Toukan,
	Saeed Mahameed, Mark Bloch, Vadim Fedorenko
  Cc: netdev

Add simple tests to validate that the driver sets up timestamping
configuration according to what is reported in capabilities.

For RX timestamping we allow driver to fallback to wider scope for
timestamping if filter is applied. That actually means that driver
can enable ptpv2-event when it reports ptpv2-l4-event is supported,
but not vice versa.

Signed-off-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
---
 .../selftests/drivers/net/hw/nic_timestamp.py | 75 +++++++++++++++++++
 1 file changed, 75 insertions(+)
 create mode 100755 tools/testing/selftests/drivers/net/hw/nic_timestamp.py

diff --git a/tools/testing/selftests/drivers/net/hw/nic_timestamp.py b/tools/testing/selftests/drivers/net/hw/nic_timestamp.py
new file mode 100755
index 000000000000..758d00c6f965
--- /dev/null
+++ b/tools/testing/selftests/drivers/net/hw/nic_timestamp.py
@@ -0,0 +1,75 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: GPL-2.0
+
+import datetime
+import random
+from lib.py import ksft_run, ksft_exit, ksft_ge, ksft_eq, KsftSkipEx
+from lib.py import NetDrvEnv, EthtoolFamily, NlError
+
+def _getHWTimeStampSupport(cfg):
+    tsinfo = cfg.ethnl.tsinfo_get({'header': {'dev-name': cfg.ifname}})
+    ctx = {}
+    tx = tsinfo.get('tx-types', {})
+    rx = tsinfo.get('rx-filters', {})
+
+    bits = tx.get('bits', {})
+    ctx['tx'] = bits.get('bit', [])
+    bits = rx.get('bits', {})
+    ctx['rx'] = bits.get('bit', [])
+    return ctx
+
+def _getHWTimeStampConfig(cfg):
+    try:
+        tscfg = cfg.ethnl.tsconfig_get({'header': {'dev-name': cfg.ifname}})
+    except NlError as e:
+        if e.error == errno.EOPNOTSUPP:
+            raise KsftSkipEx("timestamping configuration is not supported via netlink") from e
+        raise
+    return tscfg
+
+def _setHWTimeStampConfig(cfg, ts):
+    ts['header'] = {'dev-name': cfg.ifname}
+    try:
+        res = cfg.ethnl.tsconfig_set(ts)
+    except NlError as e:
+	    if e.error == errno.EOPNOTSUPP:
+	        raise KsftSkipEx("timestamping configuration is not supported via netlink") from e
+	    raise
+    return res
+
+def test_hwtstamp_tx(cfg):
+    orig_tscfg = _getHWTimeStampConfig(cfg)
+    ts = _getHWTimeStampSupport(cfg)
+    tx = ts['tx']
+    for t in tx:
+        tscfg = orig_tscfg
+        tscfg['tx-types']['bits']['bit'] = [t]
+        res = _setHWTimeStampConfig(cfg, tscfg)
+        ksft_eq(res['tx-types']['bits']['bit'], [t])
+    _setHWTimeStampConfig(cfg, orig_tscfg)
+
+def test_hwtstamp_rx(cfg):
+    orig_tscfg = _getHWTimeStampConfig(cfg)
+    ts = _getHWTimeStampSupport(cfg)
+    rx = ts['rx']
+    for r in rx:
+        tscfg = orig_tscfg
+        tscfg['rx-filters']['bits']['bit'] = [r]
+        res = _setHWTimeStampConfig(cfg, tscfg)
+        if res is None:
+            res = _getHWTimeStampConfig(cfg)
+        if r['index'] == 0 or r['index'] == 1:
+            ksft_eq(res['rx-filters']['bits']['bit'][0]['index'], r['index'])
+        else:
+            # the driver can fallback to some value which has higher coverage for timestamping
+            ksft_ge(res['rx-filters']['bits']['bit'][0]['index'], r['index'])
+    _setHWTimeStampConfig(cfg, orig_tscfg)
+
+def main() -> None:
+    with NetDrvEnv(__file__, nsim_test=False) as cfg:
+        cfg.ethnl = EthtoolFamily()
+        ksft_run([test_hwtstamp_tx, test_hwtstamp_rx], args=(cfg,))
+        ksft_exit()
+
+if __name__ == "__main__":
+    main()
-- 
2.47.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH net-next 1/4] tg3: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set()
  2025-09-22 16:51 ` [PATCH net-next 1/4] tg3: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set() Vadim Fedorenko
@ 2025-09-22 22:15   ` Michael Chan
  2025-09-23  3:47   ` Pavan Chebbi
  1 sibling, 0 replies; 11+ messages in thread
From: Michael Chan @ 2025-09-22 22:15 UTC (permalink / raw)
  To: Vadim Fedorenko
  Cc: Jakub Kicinski, Paolo Abeni, Simon Horman, Richard Cochran,
	Andrew Lunn, Pavan Chebbi, Tariq Toukan, Saeed Mahameed,
	Mark Bloch, netdev

On Mon, Sep 22, 2025 at 10:00 AM Vadim Fedorenko
<vadim.fedorenko@linux.dev> wrote:
>
> Convert tg3 driver to new timestamping configuration API.
>
> Signed-off-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>

Thanks.
Reviewed-by: Michael Chan <michael.chan@broadcom.com>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH net-next 2/4] bnxt_en: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set()
  2025-09-22 16:51 ` [PATCH net-next 2/4] bnxt_en: " Vadim Fedorenko
@ 2025-09-22 22:17   ` Michael Chan
  2025-09-23  3:48   ` Pavan Chebbi
  1 sibling, 0 replies; 11+ messages in thread
From: Michael Chan @ 2025-09-22 22:17 UTC (permalink / raw)
  To: Vadim Fedorenko
  Cc: Jakub Kicinski, Paolo Abeni, Simon Horman, Richard Cochran,
	Andrew Lunn, Pavan Chebbi, Tariq Toukan, Saeed Mahameed,
	Mark Bloch, netdev

On Mon, Sep 22, 2025 at 10:00 AM Vadim Fedorenko
<vadim.fedorenko@linux.dev> wrote:
>
> Convert bnxt dirver to use new timestamping configuration API.
>
> Signed-off-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>

Thanks.
Reviewed-by: Michael Chan <michael.chan@broadcom.com>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH net-next 1/4] tg3: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set()
  2025-09-22 16:51 ` [PATCH net-next 1/4] tg3: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set() Vadim Fedorenko
  2025-09-22 22:15   ` Michael Chan
@ 2025-09-23  3:47   ` Pavan Chebbi
  1 sibling, 0 replies; 11+ messages in thread
From: Pavan Chebbi @ 2025-09-23  3:47 UTC (permalink / raw)
  To: Vadim Fedorenko
  Cc: Jakub Kicinski, Paolo Abeni, Simon Horman, Richard Cochran,
	Andrew Lunn, Michael Chan, Tariq Toukan, Saeed Mahameed,
	Mark Bloch, netdev

On Mon, Sep 22, 2025 at 10:30 PM Vadim Fedorenko
<vadim.fedorenko@linux.dev> wrote:
>
> Convert tg3 driver to new timestamping configuration API.
>
> Signed-off-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
> ---
>  drivers/net/ethernet/broadcom/tg3.c | 66 +++++++++++++----------------
>  1 file changed, 29 insertions(+), 37 deletions(-)
>
> diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
> index b4dc93a48718..7f00ec7fd7b9 100644
> --- a/drivers/net/ethernet/broadcom/tg3.c
> +++ b/drivers/net/ethernet/broadcom/tg3.c
> @@ -13929,22 +13929,20 @@ static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest,
>
>  }

Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH net-next 2/4] bnxt_en: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set()
  2025-09-22 16:51 ` [PATCH net-next 2/4] bnxt_en: " Vadim Fedorenko
  2025-09-22 22:17   ` Michael Chan
@ 2025-09-23  3:48   ` Pavan Chebbi
  1 sibling, 0 replies; 11+ messages in thread
From: Pavan Chebbi @ 2025-09-23  3:48 UTC (permalink / raw)
  To: Vadim Fedorenko
  Cc: Jakub Kicinski, Paolo Abeni, Simon Horman, Richard Cochran,
	Andrew Lunn, Michael Chan, Tariq Toukan, Saeed Mahameed,
	Mark Bloch, netdev

On Mon, Sep 22, 2025 at 10:30 PM Vadim Fedorenko
<vadim.fedorenko@linux.dev> wrote:
>
> Convert bnxt dirver to use new timestamping configuration API.
>
> Signed-off-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
> ---
>  drivers/net/ethernet/broadcom/bnxt/bnxt.c     |  8 ++---
>  drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c | 35 +++++++++----------
>  drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h |  7 ++--
>  3 files changed, 23 insertions(+), 27 deletions(-)
>

Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH net-next 3/4] mlx5: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set()
  2025-09-22 16:51 ` [PATCH net-next 3/4] mlx5: " Vadim Fedorenko
@ 2025-09-23 17:44   ` Carolina Jubran
  2025-09-23 20:48     ` Vadim Fedorenko
  0 siblings, 1 reply; 11+ messages in thread
From: Carolina Jubran @ 2025-09-23 17:44 UTC (permalink / raw)
  To: Vadim Fedorenko
  Cc: netdev, Jakub Kicinski, Paolo Abeni, Simon Horman,
	Richard Cochran, Andrew Lunn, Michael Chan, Pavan Chebbi,
	Tariq Toukan, Saeed Mahameed, Mark Bloch


On 22/09/2025 19:51, Vadim Fedorenko wrote:
Hi Vadim, thanks for the patch!
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
> index 5e007bb3bad1..74a63371ab69 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
> @@ -4755,9 +4755,11 @@ static int mlx5e_hwstamp_config_ptp_rx(struct mlx5e_priv *priv, bool ptp_rx)
>   					&new_params.ptp_rx, true);
>   }
>   
> -int mlx5e_hwstamp_set(struct mlx5e_priv *priv, struct ifreq *ifr)
> +int mlx5e_hwstamp_set(struct net_device *dev,
> +		      struct kernel_hwtstamp_config *config,
> +		      struct netlink_ext_ack *extack)
>   {
> -	struct hwtstamp_config config;
> +	struct mlx5e_priv *priv = netdev_priv(dev);
>   	bool rx_cqe_compress_def;
>   	bool ptp_rx;
>   	int err;
> @@ -4766,11 +4768,8 @@ int mlx5e_hwstamp_set(struct mlx5e_priv *priv, struct ifreq *ifr)
>   	    (mlx5_clock_get_ptp_index(priv->mdev) == -1))


I would add an |extack| message here.

> @@ -4814,47 +4813,34 @@ int mlx5e_hwstamp_set(struct mlx5e_priv *priv, struct ifreq *ifr)
>   
>   	if (!mlx5e_profile_feature_cap(priv->profile, PTP_RX))
>   		err = mlx5e_hwstamp_config_no_ptp_rx(priv,
> -						     config.rx_filter != HWTSTAMP_FILTER_NONE);
> +						     config->rx_filter != HWTSTAMP_FILTER_NONE);
>   	else
>   		err = mlx5e_hwstamp_config_ptp_rx(priv, ptp_rx);
>   	if (err)
>   		goto err_unlock;
>   
> -	memcpy(&priv->tstamp, &config, sizeof(config));
> +	memcpy(&priv->tstamp, config, sizeof(*config));


A direct assignment would be cleaner.

> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
> index 79ae3a51a4b3..ff8ffd997b17 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
> @@ -52,7 +52,8 @@ static const struct net_device_ops mlx5i_netdev_ops = {
>   	.ndo_init                = mlx5i_dev_init,
>   	.ndo_uninit              = mlx5i_dev_cleanup,
>   	.ndo_change_mtu          = mlx5i_change_mtu,
> -	.ndo_eth_ioctl            = mlx5i_ioctl,
> +	.ndo_hwtstamp_get        = mlx5e_hwstamp_get,
> +	.ndo_hwtstamp_set        = mlx5e_hwstamp_set,
>   };
>   
>   /* IPoIB mlx5 netdev profile */
> @@ -557,20 +558,6 @@ int mlx5i_dev_init(struct net_device *dev)
>   	return 0;
>   }
>   
> -int mlx5i_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
> -{
> -	struct mlx5e_priv *priv = mlx5i_epriv(dev);
> -


mlx5i_epriv should still be used here. on IPoIB netdev_priv gives you a
struct mlx5i_priv .

Carolina


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH net-next 3/4] mlx5: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set()
  2025-09-23 17:44   ` Carolina Jubran
@ 2025-09-23 20:48     ` Vadim Fedorenko
  0 siblings, 0 replies; 11+ messages in thread
From: Vadim Fedorenko @ 2025-09-23 20:48 UTC (permalink / raw)
  To: Carolina Jubran
  Cc: netdev, Jakub Kicinski, Paolo Abeni, Simon Horman,
	Richard Cochran, Andrew Lunn, Michael Chan, Pavan Chebbi,
	Tariq Toukan, Saeed Mahameed, Mark Bloch

On 23/09/2025 18:44, Carolina Jubran wrote:
> 
> On 22/09/2025 19:51, Vadim Fedorenko wrote:
> Hi Vadim, thanks for the patch!
>> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/ 
>> drivers/net/ethernet/mellanox/mlx5/core/en_main.c
>> index 5e007bb3bad1..74a63371ab69 100644
>> --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
>> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
>> @@ -4755,9 +4755,11 @@ static int mlx5e_hwstamp_config_ptp_rx(struct 
>> mlx5e_priv *priv, bool ptp_rx)
>>                       &new_params.ptp_rx, true);
>>   }
>> -int mlx5e_hwstamp_set(struct mlx5e_priv *priv, struct ifreq *ifr)
>> +int mlx5e_hwstamp_set(struct net_device *dev,
>> +              struct kernel_hwtstamp_config *config,
>> +              struct netlink_ext_ack *extack)
>>   {
>> -    struct hwtstamp_config config;
>> +    struct mlx5e_priv *priv = netdev_priv(dev);
>>       bool rx_cqe_compress_def;
>>       bool ptp_rx;
>>       int err;
>> @@ -4766,11 +4768,8 @@ int mlx5e_hwstamp_set(struct mlx5e_priv *priv, 
>> struct ifreq *ifr)
>>           (mlx5_clock_get_ptp_index(priv->mdev) == -1))
> 
> 
> I would add an |extack| message here.

Yeah, but the !MLX5_CAP_GEN(priv->mdev, device_frequency_khz) check
looks redundant as mdev->clock->ptp will be null in case of absent of
device_frequency_khz, according to mlx5_init_clock()

> 
>> @@ -4814,47 +4813,34 @@ int mlx5e_hwstamp_set(struct mlx5e_priv *priv, 
>> struct ifreq *ifr)
>>       if (!mlx5e_profile_feature_cap(priv->profile, PTP_RX))
>>           err = mlx5e_hwstamp_config_no_ptp_rx(priv,
>> -                             config.rx_filter != HWTSTAMP_FILTER_NONE);
>> +                             config->rx_filter != HWTSTAMP_FILTER_NONE);
>>       else
>>           err = mlx5e_hwstamp_config_ptp_rx(priv, ptp_rx);
>>       if (err)
>>           goto err_unlock;
>> -    memcpy(&priv->tstamp, &config, sizeof(config));
>> +    memcpy(&priv->tstamp, config, sizeof(*config));
> 
> 
> A direct assignment would be cleaner.

Just wanted to follow original style. I'll change it in the next ver

> 
>> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c b/ 
>> drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
>> index 79ae3a51a4b3..ff8ffd997b17 100644
>> --- a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
>> +++ b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
>> @@ -52,7 +52,8 @@ static const struct net_device_ops mlx5i_netdev_ops = {
>>       .ndo_init                = mlx5i_dev_init,
>>       .ndo_uninit              = mlx5i_dev_cleanup,
>>       .ndo_change_mtu          = mlx5i_change_mtu,
>> -    .ndo_eth_ioctl            = mlx5i_ioctl,
>> +    .ndo_hwtstamp_get        = mlx5e_hwstamp_get,
>> +    .ndo_hwtstamp_set        = mlx5e_hwstamp_set,
>>   };
>>   /* IPoIB mlx5 netdev profile */
>> @@ -557,20 +558,6 @@ int mlx5i_dev_init(struct net_device *dev)
>>       return 0;
>>   }
>> -int mlx5i_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
>> -{
>> -    struct mlx5e_priv *priv = mlx5i_epriv(dev);
>> -
> 
> 
> mlx5i_epriv should still be used here. on IPoIB netdev_priv gives you a
> struct mlx5i_priv .

Oh, I see... we have to have slightly different hwstamp functions for
mlx5i and mlx5e because of different netdev->priv type. Let me see how
it can be factorized.

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2025-09-23 20:48 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-22 16:51 [PATCH net-next 0/4] convert 3 drivers to ndo_hwtstamp API Vadim Fedorenko
2025-09-22 16:51 ` [PATCH net-next 1/4] tg3: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set() Vadim Fedorenko
2025-09-22 22:15   ` Michael Chan
2025-09-23  3:47   ` Pavan Chebbi
2025-09-22 16:51 ` [PATCH net-next 2/4] bnxt_en: " Vadim Fedorenko
2025-09-22 22:17   ` Michael Chan
2025-09-23  3:48   ` Pavan Chebbi
2025-09-22 16:51 ` [PATCH net-next 3/4] mlx5: " Vadim Fedorenko
2025-09-23 17:44   ` Carolina Jubran
2025-09-23 20:48     ` Vadim Fedorenko
2025-09-22 16:51 ` [PATCH net-next 4/4] selftests: drv-net: add HW timestamping tests Vadim Fedorenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).