]> www.infradead.org Git - users/hch/misc.git/commitdiff
net: enetc: VFs do not support HWTSTAMP_TX_ONESTEP_SYNC
authorWei Fang <wei.fang@nxp.com>
Mon, 24 Feb 2025 11:12:47 +0000 (19:12 +0800)
committerJakub Kicinski <kuba@kernel.org>
Wed, 26 Feb 2025 03:10:58 +0000 (19:10 -0800)
Actually ENETC VFs do not support HWTSTAMP_TX_ONESTEP_SYNC because only
ENETC PF can access PMa_SINGLE_STEP registers. And there will be a crash
if VFs are used to test one-step timestamp, the crash log as follows.

[  129.110909] Unable to handle kernel paging request at virtual address 00000000000080c0
[  129.287769] Call trace:
[  129.290219]  enetc_port_mac_wr+0x30/0xec (P)
[  129.294504]  enetc_start_xmit+0xda4/0xe74
[  129.298525]  enetc_xmit+0x70/0xec
[  129.301848]  dev_hard_start_xmit+0x98/0x118

Fixes: 41514737ecaa ("enetc: add get_ts_info interface for ethtool")
Cc: stable@vger.kernel.org
Signed-off-by: Wei Fang <wei.fang@nxp.com>
Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Tested-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Link: https://patch.msgid.link/20250224111251.1061098-5-wei.fang@nxp.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/freescale/enetc/enetc.c
drivers/net/ethernet/freescale/enetc/enetc_ethtool.c

index 3cb9ebb13b19b5b4ac9023c5a5601eb480e2e01f..e946d865279048d97eb3a02075b6fd2519be5706 100644 (file)
@@ -3244,6 +3244,9 @@ static int enetc_hwtstamp_set(struct net_device *ndev, struct ifreq *ifr)
                new_offloads |= ENETC_F_TX_TSTAMP;
                break;
        case HWTSTAMP_TX_ONESTEP_SYNC:
+               if (!enetc_si_is_pf(priv->si))
+                       return -EOPNOTSUPP;
+
                new_offloads &= ~ENETC_F_TX_TSTAMP_MASK;
                new_offloads |= ENETC_F_TX_ONESTEP_SYNC_TSTAMP;
                break;
index bf34b5bb1e35815cc71cd2c885f559b16670539d..ece3ae28ba827fe64c438217f4f6e3bfa1aa99c7 100644 (file)
@@ -832,6 +832,7 @@ static int enetc_set_coalesce(struct net_device *ndev,
 static int enetc_get_ts_info(struct net_device *ndev,
                             struct kernel_ethtool_ts_info *info)
 {
+       struct enetc_ndev_priv *priv = netdev_priv(ndev);
        int *phc_idx;
 
        phc_idx = symbol_get(enetc_phc_index);
@@ -852,8 +853,10 @@ static int enetc_get_ts_info(struct net_device *ndev,
                                SOF_TIMESTAMPING_TX_SOFTWARE;
 
        info->tx_types = (1 << HWTSTAMP_TX_OFF) |
-                        (1 << HWTSTAMP_TX_ON) |
-                        (1 << HWTSTAMP_TX_ONESTEP_SYNC);
+                        (1 << HWTSTAMP_TX_ON);
+
+       if (enetc_si_is_pf(priv->si))
+               info->tx_types |= (1 << HWTSTAMP_TX_ONESTEP_SYNC);
 
        info->rx_filters = (1 << HWTSTAMP_FILTER_NONE) |
                           (1 << HWTSTAMP_FILTER_ALL);