]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: dsa: sja1105: round up PTP perout pin duration
authorAleksandrova Alyona <aga@itb.spb.ru>
Thu, 18 Jun 2026 11:05:08 +0000 (14:05 +0300)
committerJakub Kicinski <kuba@kernel.org>
Tue, 23 Jun 2026 21:42:38 +0000 (14:42 -0700)
pin_duration is converted from the user-provided period to SJA1105
clock ticks and is later passed as the cycle_time argument to
future_base_time().

Very small period values may become zero after the conversion,
which can lead to a division by zero in future_base_time().

Round zero pin_duration up to 1 tick so that the smallest unsupported
periods use the minimum non-zero hardware duration instead of passing
zero to future_base_time().

Fixes: 747e5eb31d59 ("net: dsa: sja1105: configure the PTP_CLK pin as EXT_TS or PER_OUT")
Signed-off-by: Aleksandrova Alyona <aga@itb.spb.ru>
Link: https://patch.msgid.link/20260618110508.53094-1-aga@itb.spb.ru
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/dsa/sja1105/sja1105_ptp.c

index fefe46e2a5e612e1169006d0bd4c43252f51260e..350f958dcb2af1ab3a5349ed666e5ad25a35e34f 100644 (file)
@@ -755,7 +755,7 @@ static int sja1105_per_out_enable(struct sja1105_private *priv,
                 * 2 edges on PTP_CLK. So check for truncation which happens
                 * at periods larger than around 68.7 seconds.
                 */
-               pin_duration = ns_to_sja1105_ticks(pin_duration / 2);
+               pin_duration = max_t(u64, ns_to_sja1105_ticks(pin_duration / 2), 1);
                if (pin_duration > U32_MAX) {
                        rc = -ERANGE;
                        goto out;