Re: [PATCH net v3 1/2] net: ravb: handle unavailable PTP clock

Vadim Fedorenko <[email protected]>
Newsgroups org.kernel.vger.netdev,org.kernel.vger.linux-renesas-soc,org.kernel.vger.stable
Message-ID <[email protected]>
On 06/08/2026 10:51, [email protected] wrote:
> From: Xuanqiang Luo <[email protected]>
> 
> The PTP clock is registered by ravb_open(), not ravb_probe(). Therefore,
> priv->ptp.clock is NULL between register_netdev() and the first open, and
> ethtool -T triggers a NULL dereference in ptp_clock_index().
> 
> ptp_clock_register() may also return an error pointer, which can reach
> ptp_clock_index() or ptp_clock_unregister().
> 
> Normalize registration errors to NULL and only query or unregister the
> clock when it is present. Leave phc_index at -1 when no PHC is registered,
> while preserving the static hardware timestamping capabilities.
> 
> Fixes: a0d2f20650e8 ("Renesas Ethernet AVB PTP clock driver")
> Cc: [email protected]
> Signed-off-by: Xuanqiang Luo <[email protected]>
> ---
>   drivers/net/ethernet/renesas/ravb_main.c |  3 ++-
>   drivers/net/ethernet/renesas/ravb_ptp.c  | 12 ++++++++++--
>   2 files changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
> index 5f88733094d0f..3a9d9f8718216 100644
> --- a/drivers/net/ethernet/renesas/ravb_main.c
> +++ b/drivers/net/ethernet/renesas/ravb_main.c
> @@ -1779,7 +1779,8 @@ static int ravb_get_ts_info(struct net_device *ndev,
>   			(1 << HWTSTAMP_FILTER_NONE) |
>   			(1 << HWTSTAMP_FILTER_PTP_V2_L2_EVENT) |
>   			(1 << HWTSTAMP_FILTER_ALL);
> -		info->phc_index = ptp_clock_index(priv->ptp.clock);
> +		if (priv->ptp.clock)
> +			info->phc_index = ptp_clock_index(priv->ptp.clock);
>   	}
>   
>   	return 0;
> diff --git a/drivers/net/ethernet/renesas/ravb_ptp.c b/drivers/net/ethernet/renesas/ravb_ptp.c
> index 226c6c0ab945b..eaf07cb8eadfa 100644
> --- a/drivers/net/ethernet/renesas/ravb_ptp.c
> +++ b/drivers/net/ethernet/renesas/ravb_ptp.c
> @@ -315,6 +315,7 @@ void ravb_ptp_interrupt(struct net_device *ndev)
>   void ravb_ptp_init(struct net_device *ndev, struct platform_device *pdev)
>   {
>   	struct ravb_private *priv = netdev_priv(ndev);
> +	struct ptp_clock *clock;
>   	unsigned long flags;
>   
>   	priv->ptp.info = ravb_ptp_info;
> @@ -327,7 +328,13 @@ void ravb_ptp_init(struct net_device *ndev, struct platform_device *pdev)
>   	ravb_modify(ndev, GCCR, GCCR_TCSS, GCCR_TCSS_ADJGPTP);
>   	spin_unlock_irqrestore(&priv->lock, flags);
>   
> -	priv->ptp.clock = ptp_clock_register(&priv->ptp.info, &pdev->dev);
> +	clock = ptp_clock_register(&priv->ptp.info, &pdev->dev);
> +	if (IS_ERR(clock)) {
> +		netdev_err(ndev, "failed to register PTP clock: %pe\n", clock);
> +		clock = NULL;
> +	}
> +
> +	priv->ptp.clock = clock;
>   }
>   
>   void ravb_ptp_stop(struct net_device *ndev)
> @@ -337,5 +344,6 @@ void ravb_ptp_stop(struct net_device *ndev)
>   	ravb_write(ndev, 0, GIC);
>   	ravb_write(ndev, 0, GIS);
>   
> -	ptp_clock_unregister(priv->ptp.clock);
> +	if (priv->ptp.clock)
> +		ptp_clock_unregister(priv->ptp.clock);
>   }

Reviewed-by: Vadim Fedorenko <[email protected]>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.