> -----Original Message-----
> From: Korba, Przemyslaw <[email protected]>
> Sent: Wednesday, June 3, 2026 1:48 PM
> To: [email protected]
> Cc: [email protected]; Nguyen, Anthony L <[email protected]>; 
> Kitszel, Przemyslaw <[email protected]>;
> Lobakin, Aleksander <[email protected]>; Korba, Przemyslaw 
> <[email protected]>
> Subject: [PATCH iwl-net v2] ice: fall back to SBQ when LL PHY timer interface 
> times out
> 
> The low-latency (LL) PHY timer interface relies on a tight, atomic poll
> of the PF_SB_ATQBAL register with a 2ms timeout. After an NVM update /
> EMPR, FW may need significantly longer than 2ms to start responding to
> ATQBAL commands. The first PHY adjust or incval write issued by
> ice_ptp_rebuild_owner() fails with -ETIMEDOUT.
> 
> Fix this by falling back to the existing SBQ-based PHY register write
> path when LL times out. This makes sure PTP is initialized when FW takes
> longer than expected to come back online.
> 
> Steps to reproduce:
> ./nvmupdate64e -if devlink -f
> Update E810 card with nvmupdate64e, and observe dmesg errors:
>   Failed to write PHC increment value, status -110
>   PTP reset failed, error: -110 (-ETIMEDOUT)
> 
> Fixes: ef9a64c07294 ("ice: implement low latency PHY timer updates")
> Signed-off-by: Przemyslaw Korba <[email protected]>
> ---
> v2:
> * add TIMEDOUT check in ice_prep_phy_adj_e810
> v1:
> https://lore.kernel.org/intel-wired-lan/[email protected]/
> ---
>  drivers/net/ethernet/intel/ice/ice_ptp_hw.c | 40 +++++++++++----------
>  1 file changed, 22 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/ice/ice_ptp_hw.c 
> b/drivers/net/ethernet/intel/ice/ice_ptp_hw.c
> index 2c18e16fe053..9cd323bd9739 100644
> --- a/drivers/net/ethernet/intel/ice/ice_ptp_hw.c
> +++ b/drivers/net/ethernet/intel/ice/ice_ptp_hw.c
> @@ -4771,15 +4771,12 @@ static int ice_ptp_prep_phy_adj_ll_e810(struct ice_hw 
> *hw, s32 adj)
>                                      !FIELD_GET(REG_LL_PROXY_H_EXEC, val),
>                                      10, REG_LL_PROXY_H_TIMEOUT_US, false, hw,
>                                      REG_LL_PROXY_H);
> -     if (err) {
> -             ice_debug(hw, ICE_DBG_PTP, "Failed to prepare PHY timer 
> adjustment using low latency interface\n");
> -             spin_unlock_irq(&params->atqbal_wq.lock);
> -             return err;
> -     }
> -
>       spin_unlock_irq(&params->atqbal_wq.lock);
> 
> -     return 0;
> +     if (err)
> +             ice_debug(hw, ICE_DBG_PTP, "Failed to prepare PHY timer 
> adjustment using low latency interface\n");
> +
> +     return err;
>  }
> 
>  /**
> @@ -4800,8 +4797,13 @@ static int ice_ptp_prep_phy_adj_e810(struct ice_hw 
> *hw, s32 adj)
>       u8 tmr_idx;
>       int err;
> 
> -     if (hw->dev_caps.ts_dev_info.ll_phy_tmr_update)
> -             return ice_ptp_prep_phy_adj_ll_e810(hw, adj);
> +     if (hw->dev_caps.ts_dev_info.ll_phy_tmr_update) {
> +             err = ice_ptp_prep_phy_adj_ll_e810(hw, adj);
> +             if (!err)
> +                     return 0;
> +             ice_debug(hw, ICE_DBG_PTP, "LL adj failed (%d), falling back to 
> SBQ\n",
> +                       err);
> +     }
> 
>       tmr_idx = hw->func_caps.ts_func_info.tmr_index_owned;
> 
> @@ -4864,15 +4866,12 @@ static int ice_ptp_prep_phy_incval_ll_e810(struct 
> ice_hw *hw, u64 incval)
>                                      !FIELD_GET(REG_LL_PROXY_H_EXEC, val),
>                                      10, REG_LL_PROXY_H_TIMEOUT_US, false, hw,
>                                      REG_LL_PROXY_H);
> -     if (err) {
> -             ice_debug(hw, ICE_DBG_PTP, "Failed to prepare PHY timer 
> increment using low latency interface\n");
> -             spin_unlock_irq(&params->atqbal_wq.lock);
> -             return err;
> -     }
> -
>       spin_unlock_irq(&params->atqbal_wq.lock);
> 
> -     return 0;
> +     if (err)
> +             ice_debug(hw, ICE_DBG_PTP, "Failed to prepare PHY timer 
> increment using low latency interface\n");
> +
> +     return err;
>  }
> 
>  /**
> @@ -4890,8 +4889,13 @@ static int ice_ptp_prep_phy_incval_e810(struct ice_hw 
> *hw, u64 incval)
>       u8 tmr_idx;
>       int err;
> 
> -     if (hw->dev_caps.ts_dev_info.ll_phy_tmr_update)
> -             return ice_ptp_prep_phy_incval_ll_e810(hw, incval);
> +     if (hw->dev_caps.ts_dev_info.ll_phy_tmr_update) {
> +             err = ice_ptp_prep_phy_incval_ll_e810(hw, incval);
> +             if (!err)
> +                     return 0;
> +             ice_debug(hw, ICE_DBG_PTP, "LL incval failed (%d), falling back 
> to SBQ\n",
> +                       err);
> +     }
> 
>       tmr_idx = hw->func_caps.ts_func_info.tmr_index_owned;
>       low = lower_32_bits(incval);
> 
> base-commit: 80b47e88f7ead00b0795e9f2833f1d0cafe11d90
> --
> 2.43.0

Sorry, made a mistake ad did not update the code in this version properly! Sent 
v3

Reply via email to