]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ice: fix ice_ptp_read_tx_hwtstamp_status_eth56g
authorJacob Keller <jacob.e.keller@intel.com>
Tue, 21 Apr 2026 00:51:28 +0000 (17:51 -0700)
committerJakub Kicinski <kuba@kernel.org>
Thu, 23 Apr 2026 04:10:10 +0000 (21:10 -0700)
The ice_ptp_read_tx_hwtstamp_status_eth56g function calls
ice_read_phy_eth56g with a PHY index. However the function actually expects
a port index. This causes the function to read the wrong PHY_PTP_INT_STATUS
registers, and effectively makes the status wrong for the second set of
ports from 4 to 7.

The ice_read_phy_eth56g function uses the provided port index to determine
which PHY device to read. We could refactor the entire chain to take a PHY
index, but this would impact many code sites. Instead, multiply the PHY
index by the number of ports, so that we read from the first port of each
PHY.

Fixes: 7cab44f1c35f ("ice: Introduce ETH56G PHY model for E825C products")
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
Reviewed-by: Petr Oros <poros@redhat.com>
Tested-by: Sunitha Mekala <sunithax.d.mekala@intel.com>
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20260420-jk-iwl-net-2026-04-20-ptp-e825c-phy-interrupt-fixes-v1-4-bc2240f42251@intel.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/intel/ice/ice_ptp_hw.c

index 4795af06b983e5186eca2a72df1aaed93ad83d2f..24fb7a3e14d63e18c6ebf823de220dc5bdd15dc5 100644 (file)
@@ -2219,13 +2219,19 @@ int ice_ptp_read_tx_hwtstamp_status_eth56g(struct ice_hw *hw, u32 *ts_status)
        *ts_status = 0;
 
        for (phy = 0; phy < params->num_phys; phy++) {
+               u8 port;
                int err;
 
-               err = ice_read_phy_eth56g(hw, phy, PHY_PTP_INT_STATUS, &status);
+               /* ice_read_phy_eth56g expects a port index, so use the first
+                * port of the PHY
+                */
+               port = phy * hw->ptp.ports_per_phy;
+
+               err = ice_read_phy_eth56g(hw, port, PHY_PTP_INT_STATUS, &status);
                if (err)
                        return err;
 
-               *ts_status |= (status & mask) << (phy * hw->ptp.ports_per_phy);
+               *ts_status |= (status & mask) << port;
        }
 
        ice_debug(hw, ICE_DBG_PTP, "PHY interrupt err: %x\n", *ts_status);