aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJakub Kicinski <kuba@kernel.org>2026-10-05 18:19:20 -0700
committerJakub Kicinski <kuba@kernel.org>2026-10-05 18:19:42 -0700
commitd5a007b9b457c915ab1a53227e8939e4018aa97a (patch)
tree7910c5b317a8ddf063304caad26bab161a1139b0
parentnet: airoha: Add retry mechanism to airoha_qdma_set_trtcm_param() (diff)
Revert "net: stmmac: propagate PTP addend and system time programming errors"davem/net
This reverts commit 232d49dd4b40a666283de9e722899f088ed581b2. Anirudh reports a regression from this change. It is not appropriate for net this late in the release cycle in the first place, so let's revert and revisit in net-next. Reported-by: Anirudh Srinivasan <asrinivasan@oss.tenstorrent.com> Link: https://lore.kernel.org/CAEev2e8+fr1tJnSErD+2TtLDw5fGJbQOMcM5eefMnLyFUR+m7w@mail.gmail.com Fixes: 232d49dd4b40 ("net: stmmac: propagate PTP addend and system time programming errors") Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/stmmac_main.c106
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c10
2 files changed, 32 insertions, 84 deletions
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index 77d2bffb8dc1..b837e8e27a35 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -601,64 +601,31 @@ static void stmmac_get_rx_hwtstamp(struct stmmac_priv *priv, struct dma_desc *p,
}
}
-static void stmmac_restore_subsecond_increment(struct stmmac_priv *priv,
- u32 default_addend)
+static void stmmac_update_subsecond_increment(struct stmmac_priv *priv)
{
bool xmac = dwmac_is_xmac(priv->plat->core_type);
u32 sec_inc = 0;
-
- stmmac_config_addend(priv, priv->ptpaddr, default_addend);
- stmmac_config_hw_tstamping(priv, priv->ptpaddr, priv->systime_flags);
- stmmac_config_sub_second_increment(priv, priv->ptpaddr,
- priv->plat->clk_ptp_rate,
- xmac, &sec_inc);
- priv->default_addend = default_addend;
- priv->sub_second_inc = sec_inc;
-}
-
-static int stmmac_update_subsecond_increment(struct stmmac_priv *priv,
- u32 systime_flags)
-{
- bool xmac = dwmac_is_xmac(priv->plat->core_type);
- u32 sec_inc = 0, val;
u64 temp = 0;
- int ret;
- stmmac_config_hw_tstamping(priv, priv->ptpaddr, systime_flags);
+ stmmac_config_hw_tstamping(priv, priv->ptpaddr, priv->systime_flags);
/* program Sub Second Increment reg */
stmmac_config_sub_second_increment(priv, priv->ptpaddr,
priv->plat->clk_ptp_rate,
xmac, &sec_inc);
- if (!sec_inc) {
- ret = -EINVAL;
- goto error;
- }
+ temp = div_u64(1000000000ULL, sec_inc);
+
+ /* Store sub second increment for later use */
+ priv->sub_second_inc = sec_inc;
/* calculate default added value:
* formula is :
* addend = (2^32)/freq_div_ratio;
* where, freq_div_ratio = 1e9ns/sec_inc
*/
- temp = div_u64(1000000000ULL, sec_inc);
temp = (u64)(temp << 32);
- val = div_u64(temp, priv->plat->clk_ptp_rate);
-
- ret = stmmac_config_addend(priv, priv->ptpaddr, val);
- if (ret)
- goto error;
-
- priv->sub_second_inc = sec_inc;
- priv->default_addend = val;
-
- return 0;
-error:
- /* Restore previous configuration */
- stmmac_config_hw_tstamping(priv, priv->ptpaddr, priv->systime_flags);
- stmmac_config_sub_second_increment(priv, priv->ptpaddr,
- priv->plat->clk_ptp_rate, xmac,
- NULL);
- return ret;
+ priv->default_addend = div_u64(temp, priv->plat->clk_ptp_rate);
+ stmmac_config_addend(priv, priv->ptpaddr, priv->default_addend);
}
/**
@@ -887,42 +854,35 @@ static int stmmac_hwtstamp_get(struct net_device *dev,
/**
* stmmac_init_tstamp_counter - init hardware timestamping counter
* @priv: driver private structure
+ * @systime_flags: timestamping flags
* Description:
* Initialize hardware counter for packet timestamping.
* This is valid as long as the interface is open and not suspended.
* Will be rerun after resuming from suspend, case in which the timestamping
* flags updated by stmmac_hwtstamp_set() also need to be restored.
*/
-static int stmmac_init_tstamp_counter(struct stmmac_priv *priv)
+static int stmmac_init_tstamp_counter(struct stmmac_priv *priv,
+ u32 systime_flags)
{
- u32 default_addend = priv->default_addend;
struct timespec64 now;
- int ret;
if (!priv->plat->clk_ptp_rate) {
netdev_err(priv->dev, "Invalid PTP clock rate");
return -EINVAL;
}
- ret = stmmac_update_subsecond_increment(priv, priv->systime_flags);
- if (ret)
- return ret;
+ stmmac_config_hw_tstamping(priv, priv->ptpaddr, systime_flags);
+ priv->systime_flags = systime_flags;
+
+ stmmac_update_subsecond_increment(priv);
/* initialize system time */
ktime_get_real_ts64(&now);
/* lower 32 bits of tv_sec are safe until y2106 */
- ret = stmmac_init_systime(priv, priv->ptpaddr, (u32)now.tv_sec,
- now.tv_nsec);
- if (ret)
- goto error;
+ stmmac_init_systime(priv, priv->ptpaddr, (u32)now.tv_sec, now.tv_nsec);
return 0;
-error:
- /* Restore previous configuration */
- stmmac_restore_subsecond_increment(priv, default_addend);
-
- return ret;
}
/**
@@ -945,14 +905,8 @@ static int stmmac_init_timestamping(struct stmmac_priv *priv)
return -EOPNOTSUPP;
}
- /* Reset hw ts configuration */
- memset(&priv->tstamp_config, 0, sizeof(priv->tstamp_config));
- priv->systime_flags = STMMAC_HWTS_ACTIVE | PTP_TCR_TSCFUPDT;
- priv->tsfupdt_coarse = false;
- priv->hwts_tx_en = 0;
- priv->hwts_rx_en = 0;
-
- ret = stmmac_init_tstamp_counter(priv);
+ ret = stmmac_init_tstamp_counter(priv, STMMAC_HWTS_ACTIVE |
+ PTP_TCR_TSCFUPDT);
if (ret) {
netdev_warn(priv->dev, "PTP init failed\n");
return ret;
@@ -973,6 +927,10 @@ static int stmmac_init_timestamping(struct stmmac_priv *priv)
netdev_info(priv->dev,
"IEEE 1588-2008 Advanced Timestamp supported\n");
+ memset(&priv->tstamp_config, 0, sizeof(priv->tstamp_config));
+ priv->hwts_tx_en = 0;
+ priv->hwts_rx_en = 0;
+
if (priv->plat->flags & STMMAC_FLAG_HWTSTAMP_CORRECT_LATENCY)
stmmac_hwtstamp_correct_latency(priv, priv);
@@ -7749,26 +7707,18 @@ static int stmmac_dl_ts_coarse_set(struct devlink *dl, u32 id,
{
struct stmmac_devlink_priv *dl_priv = devlink_priv(dl);
struct stmmac_priv *priv = dl_priv->stmmac_priv;
- u32 systime_flags = priv->systime_flags;
- int ret;
- if (ctx->val.vbool)
- systime_flags &= ~PTP_TCR_TSCFUPDT;
+ priv->tsfupdt_coarse = ctx->val.vbool;
+
+ if (priv->tsfupdt_coarse)
+ priv->systime_flags &= ~PTP_TCR_TSCFUPDT;
else
- systime_flags |= PTP_TCR_TSCFUPDT;
+ priv->systime_flags |= PTP_TCR_TSCFUPDT;
/* In Coarse mode, we can use a smaller subsecond increment, let's
* reconfigure the systime, subsecond increment and addend.
*/
- ret = stmmac_update_subsecond_increment(priv, systime_flags);
- if (ret) {
- NL_SET_ERR_MSG_MOD(extack,
- "failed to reconfigure PTP adjustment");
- return ret;
- }
-
- priv->tsfupdt_coarse = ctx->val.vbool;
- priv->systime_flags = systime_flags;
+ stmmac_update_subsecond_increment(priv);
return 0;
}
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c
index 493c5d81a36b..3bfcc9760dce 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c
@@ -28,15 +28,14 @@ static int stmmac_adjust_freq(struct ptp_clock_info *ptp, long scaled_ppm)
container_of(ptp, struct stmmac_priv, ptp_clock_ops);
unsigned long flags;
u32 addend;
- int ret;
addend = adjust_by_scaled_ppm(priv->default_addend, scaled_ppm);
write_lock_irqsave(&priv->ptp_lock, flags);
- ret = stmmac_config_addend(priv, priv->ptpaddr, addend);
+ stmmac_config_addend(priv, priv->ptpaddr, addend);
write_unlock_irqrestore(&priv->ptp_lock, flags);
- return ret;
+ return 0;
}
/**
@@ -154,13 +153,12 @@ static int stmmac_set_time(struct ptp_clock_info *ptp,
struct stmmac_priv *priv =
container_of(ptp, struct stmmac_priv, ptp_clock_ops);
unsigned long flags;
- int ret;
write_lock_irqsave(&priv->ptp_lock, flags);
- ret = stmmac_init_systime(priv, priv->ptpaddr, ts->tv_sec, ts->tv_nsec);
+ stmmac_init_systime(priv, priv->ptpaddr, ts->tv_sec, ts->tv_nsec);
write_unlock_irqrestore(&priv->ptp_lock, flags);
- return ret;
+ return 0;
}
static int stmmac_enable(struct ptp_clock_info *ptp,