]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ice: ptp: use primary NAC semaphore on E825
authorGrzegorz Nitka <grzegorz.nitka@intel.com>
Fri, 15 May 2026 18:24:12 +0000 (11:24 -0700)
committerJakub Kicinski <kuba@kernel.org>
Tue, 19 May 2026 02:00:44 +0000 (19:00 -0700)
For E825 2xNAC configurations, PTP semaphore operations must hit the
primary NAC register block so both sides coordinate on the same lock.

Commit e2193f9f9ec9 ("ice: enable timesync operation on 2xNAC E825
devices") updated other primary-only PTP register accesses to
use the primary NAC on non-primary functions, but left ice_ptp_lock()
and ice_ptp_unlock() operating on the local NAC. As a result, secondary
NAC PTP paths can take a different semaphore than the primary side.

Select the primary hardware in ice_ptp_lock() and ice_ptp_unlock() when
the current function is not primary, keeping semaphore operations
symmetric and consistent with the rest of the 2xNAC PTP register access
path.

Fixes: e2193f9f9ec9 ("ice: enable timesync operation on 2xNAC E825 devices")
Reviewed-by: Arkadiusz Kubalewski <Arkadiusz.kubalewski@intel.com>
Signed-off-by: Grzegorz Nitka <grzegorz.nitka@intel.com>
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
Tested-by: Alexander Nowlin <alexander.nowlin@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Link: https://patch.msgid.link/20260515182419.1597859-6-anthony.l.nguyen@intel.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/intel/ice/ice_ptp_hw.c

index 8bb94e785f2a80fb6482c05ec47fb486576b3081..2c18e16fe053e020a54d7ec6d340432aa517aa8d 100644 (file)
@@ -5264,9 +5264,13 @@ static void ice_ptp_init_phy_e830(struct ice_ptp_hw *ptp)
  */
 bool ice_ptp_lock(struct ice_hw *hw)
 {
+       struct ice_pf *pf = container_of(hw, struct ice_pf, hw);
        u32 hw_lock;
        int i;
 
+       if (!ice_is_primary(hw))
+               hw = ice_get_primary_hw(pf);
+
 #define MAX_TRIES 15
 
        for (i = 0; i < MAX_TRIES; i++) {
@@ -5293,6 +5297,11 @@ bool ice_ptp_lock(struct ice_hw *hw)
  */
 void ice_ptp_unlock(struct ice_hw *hw)
 {
+       struct ice_pf *pf = container_of(hw, struct ice_pf, hw);
+
+       if (!ice_is_primary(hw))
+               hw = ice_get_primary_hw(pf);
+
        wr32(hw, PFTSYN_SEM + (PFTSYN_SEM_BYTES * hw->pf_id), 0);
 }