> -----Original Message-----
> From: Petr Oros <[email protected]>
> Sent: Friday, March 27, 2026 8:47 AM
> To: [email protected]
> Cc: [email protected]; Oros, Petr <[email protected]>; Nguyen,
> Anthony L <[email protected]>; Kitszel, Przemyslaw
> <[email protected]>; Andrew Lunn <[email protected]>;
> David S. Miller <[email protected]>; Eric Dumazet
> <[email protected]>; Jakub Kicinski <[email protected]>; Paolo Abeni
> <[email protected]>; Richard Cochran <[email protected]>;
> Kubalewski, Arkadiusz <[email protected]>; Nitka,
> Grzegorz <[email protected]>; Loktionov, Aleksandr
> <[email protected]>; Vecera, Ivan <[email protected]>;
> [email protected]; [email protected]
> Subject: [PATCH iwl-net] ice: fix PTP timestamping broken by SyncE
> code on E825C
> 
> The E825C SyncE support added in commit ad1df4f2d591 ("ice: dpll:
> Support E825-C SyncE and dynamic pin discovery") introduced a SyncE
> reconfiguration block in ice_ptp_link_change() that prevents
> ice_ptp_port_phy_restart() from being called in several error paths.
> Without the PHY restart, PTP timestamps stop working after any link
> change event.
> 
> There are three ways the PHY restart gets blocked:
> 
> 1. When DPLL initialization fails (e.g. missing ACPI firmware node
>    properties), ICE_FLAG_DPLL is not set and the function returns
> early
>    before reaching the PHY restart.
> 
> 2. When ice_tspll_bypass_mux_active_e825c() fails to read the CGU
>    register, WARN_ON_ONCE fires and the function returns early.
> 
> 3. When ice_tspll_cfg_synce_ethdiv_e825c() fails to configure the
>    clock divider for an active pin, same early return.
> 
> SyncE and PTP are independent features. SyncE reconfiguration failures
> must not prevent the PTP PHY restart that is essential for timestamp
> recovery after link changes.
> 
> Fix by making the entire SyncE block conditional on ICE_FLAG_DPLL
> without an early return, and replacing the WARN_ON_ONCE + return error
> handling inside the loop with dev_err_once + break. The function
> always proceeds to ice_ptp_port_phy_restart() regardless of SyncE
> errors.
> 
> Fixes: ad1df4f2d591 ("ice: dpll: Support E825-C SyncE and dynamic pin
> discovery")
> Signed-off-by: Petr Oros <[email protected]>
> ---
>  drivers/net/ethernet/intel/ice/ice_ptp.c | 22 ++++++++++++----------
>  1 file changed, 12 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c
> b/drivers/net/ethernet/intel/ice/ice_ptp.c
> index 094e96219f4565..60bc47099432a2 100644
> --- a/drivers/net/ethernet/intel/ice/ice_ptp.c
> +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
> @@ -1296,12 +1296,10 @@ void ice_ptp_link_change(struct ice_pf *pf,
> bool linkup)
>       if (pf->hw.reset_ongoing)
>               return;
> 
> -     if (hw->mac_type == ICE_MAC_GENERIC_3K_E825) {
> +     if (hw->mac_type == ICE_MAC_GENERIC_3K_E825 &&
> +         test_bit(ICE_FLAG_DPLL, pf->flags)) {
>               int pin, err;
> 
> -             if (!test_bit(ICE_FLAG_DPLL, pf->flags))
> -                     return;
> -
>               mutex_lock(&pf->dplls.lock);
>               for (pin = 0; pin < ICE_SYNCE_CLK_NUM; pin++) {
>                       enum ice_synce_clk clk_pin;
> @@ -1314,15 +1312,19 @@ void ice_ptp_link_change(struct ice_pf *pf,
> bool linkup)
>                                                               port_num,
>                                                               &active,
>                                                               clk_pin);
> -                     if (WARN_ON_ONCE(err)) {
> -                             mutex_unlock(&pf->dplls.lock);
> -                             return;
> +                     if (err) {
> +                             dev_err_once(ice_pf_to_dev(pf),
> +                                          "Failed to read SyncE bypass
> mux for pin %d, err %d\n",
> +                                          pin, err);
> +                             break;
>                       }
> 
>                       err = ice_tspll_cfg_synce_ethdiv_e825c(hw,
> clk_pin);
> -                     if (active && WARN_ON_ONCE(err)) {
> -                             mutex_unlock(&pf->dplls.lock);
> -                             return;
> +                     if (active && err) {
> +                             dev_err_once(ice_pf_to_dev(pf),
> +                                          "Failed to configure SyncE ETH
> divider for pin %d, err %d\n",
> +                                          pin, err);
> +                             break;
>                       }
>               }
>               mutex_unlock(&pf->dplls.lock);
> --
> 2.52.0

Reviewed-by: Aleksandr Loktionov <[email protected]>

Reply via email to