From: Pengpeng Hou <[email protected]> 
Sent: Thursday, June 25, 2026 5:03 AM

>ice_ptp_calc_deskew_eth56g() returns a u32 deskew value, but it also
>returns the negative read_poll_timeout() error when the DESKEW valid bit
>never appears. That converts the negative error into a large unsigned
>deskew contribution, which can then be folded into the RX timestamp
>offset and programmed into hardware.
>
>Return the deskew value through an output parameter and propagate the
>read error from ice_phy_set_offsets_eth56g() instead of using it as
>offset data.

Hi
looks like fix so please add fixes tag

>
>Signed-off-by: Pengpeng Hou <[email protected]>
>---
> drivers/net/ethernet/intel/ice/ice_ptp_hw.c | 27 +++++++++++++++------
> 1 file changed, 19 insertions(+), 8 deletions(-)
>
>diff --git a/drivers/net/ethernet/intel/ice/ice_ptp_hw.c 
>b/drivers/net/ethernet/intel/ice/ice_ptp_hw.c
>index 8e5f97835954..bd2e31b816a8 100644
>--- a/drivers/net/ethernet/intel/ice/ice_ptp_hw.c
>+++ b/drivers/net/ethernet/intel/ice/ice_ptp_hw.c
>@@ -1736,17 +1736,21 @@ static u32 ice_ptp_calc_bitslip_eth56g(struct ice_hw 
>*hw, u8 port, u32 bs,
>  * @ds: deskew multiplier
>  * @rs: RS-FEC enabled
>  * @spd: link speed
>+ * @deskew: calculated deskew value
>  *
>- * Return: calculated deskew value
>+ * Return: 0 on success, negative error code otherwise

please state it clear that @deskew is also an output 

>  */
>-static u32 ice_ptp_calc_deskew_eth56g(struct ice_hw *hw, u8 port, u32 ds,
>-                                    bool rs, enum ice_eth56g_link_spd spd)
>+static int ice_ptp_calc_deskew_eth56g(struct ice_hw *hw, u8 port, u32 ds,
>+                                    bool rs, enum ice_eth56g_link_spd spd,
>+                                    u32 *deskew)
> {
>       u32 deskew_i, deskew_f;
>       int err;
> 
>-      if (!ds)
>+      if (!ds) {
>+              *deskew = 0;
>               return 0;
>+      }
> 
>       read_poll_timeout(ice_read_ptp_reg_eth56g, err,
>                         FIELD_GET(PHY_REG_DESKEW_0_VALID, deskew_i), 500,
>@@ -1766,7 +1770,9 @@ static u32 ice_ptp_calc_deskew_eth56g(struct ice_hw *hw, 
>u8 port, u32 ds,
>       deskew_i = FIELD_PREP(ICE_ETH56G_MAC_CFG_RX_OFFSET_INT, deskew_i);
>       /* Shift 3 fractional bits to the end of the integer part */
>       deskew_f <<= ICE_ETH56G_MAC_CFG_FRAC_W - PHY_REG_DESKEW_0_RLEVEL_FRAC_W;
>-      return mul_u32_u32_fx_q9(deskew_i | deskew_f, ds);
>+      *deskew = mul_u32_u32_fx_q9(deskew_i | deskew_f, ds);
>+
>+      return 0;
> }
> 
> /**
>@@ -1789,6 +1795,7 @@ static int ice_phy_set_offsets_eth56g(struct ice_hw *hw, 
>u8 port,
> {
>       u32 rx_offset, tx_offset, bs_ds;
>       bool onestep, sfd;
>+      int err;
> 
>       onestep = hw->ptp.phy.eth56g.onestep_ena;
>       sfd = hw->ptp.phy.eth56g.sfd_ena;
>@@ -1805,11 +1812,15 @@ static int ice_phy_set_offsets_eth56g(struct ice_hw 
>*hw, u8 port,
>       if (sfd)
>               rx_offset = add_u32_u32_fx(rx_offset, cfg->rx_offset.sfd);
> 
>-      if (spd < ICE_ETH56G_LNK_SPD_40G)
>+      if (spd < ICE_ETH56G_LNK_SPD_40G) {
>               bs_ds = ice_ptp_calc_bitslip_eth56g(hw, port, bs_ds, fc, rs,
>                                                   spd);
>-      else
>-              bs_ds = ice_ptp_calc_deskew_eth56g(hw, port, bs_ds, rs, spd);
>+      } else {
>+              err = ice_ptp_calc_deskew_eth56g(hw, port, bs_ds, rs, spd,
>+                                               &bs_ds);
>+              if (err)
>+                      return err;
>+      }
>       rx_offset = add_u32_u32_fx(rx_offset, bs_ds);
>       rx_offset &= ICE_ETH56G_MAC_CFG_RX_OFFSET_INT |
>                    ICE_ETH56G_MAC_CFG_RX_OFFSET_FRAC;
>-- 
>2.50.1 (Apple Git-155)


Reply via email to