]> git.ipfire.org Git - thirdparty/kernel/stable.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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 7 Mar 2025 17:25:41 +0000 (18:25 +0100)
commit a562d0c4a893eae3ea51d512c4d90ab858a6b7ec upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/ethernet/freescale/enetc/enetc.c
drivers/net/ethernet/freescale/enetc/enetc_ethtool.c

index c1535a4508bd8789d3574a6eae405d7064c99c10..be7596c8bff1d9cef6387da3ab0f33e92142e19f 100644 (file)
@@ -2945,6 +2945,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 2563eb8ac7b63aef67458323b4c3244c289a74e1..6a24324703bf49f465d1c6278f4ab890ca097612 100644 (file)
@@ -843,6 +843,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);
@@ -863,8 +864,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);