]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
e1000e: set fixed clock frequency indication for Nahum 11 and Nahum 13
authorVitaly Lifshits <vitaly.lifshits@intel.com>
Sun, 25 May 2025 08:38:43 +0000 (11:38 +0300)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Tue, 17 Jun 2025 17:09:24 +0000 (10:09 -0700)
On some systems with Nahum 11 and Nahum 13 the value of the XTAL clock in
the software STRAP is incorrect. This causes the PTP timer to run at the
wrong rate and can lead to synchronization issues.

The STRAP value is configured by the system firmware, and a firmware
update is not always possible. Since the XTAL clock on these systems
always runs at 38.4MHz, the driver may ignore the STRAP and just set
the correct value.

Fixes: cc23f4f0b6b9 ("e1000e: Add support for Meteor Lake")
Signed-off-by: Vitaly Lifshits <vitaly.lifshits@intel.com>
Tested-by: Mor Bar-Gabay <morx.bar.gabay@intel.com>
Reviewed-by: Gil Fine <gil.fine@linux.intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/e1000e/netdev.c
drivers/net/ethernet/intel/e1000e/ptp.c

index a96f4cfa6e17218f49f63ee1a4623fd8364dc8b5..7719e15813eeac151190ba5b896d43ec145c956b 100644 (file)
@@ -3534,9 +3534,6 @@ s32 e1000e_get_base_timinca(struct e1000_adapter *adapter, u32 *timinca)
        case e1000_pch_cnp:
        case e1000_pch_tgp:
        case e1000_pch_adp:
-       case e1000_pch_mtp:
-       case e1000_pch_lnp:
-       case e1000_pch_ptp:
        case e1000_pch_nvp:
                if (er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_SYSCFI) {
                        /* Stable 24MHz frequency */
@@ -3552,6 +3549,17 @@ s32 e1000e_get_base_timinca(struct e1000_adapter *adapter, u32 *timinca)
                        adapter->cc.shift = shift;
                }
                break;
+       case e1000_pch_mtp:
+       case e1000_pch_lnp:
+       case e1000_pch_ptp:
+               /* System firmware can misreport this value, so set it to a
+                * stable 38400KHz frequency.
+                */
+               incperiod = INCPERIOD_38400KHZ;
+               incvalue = INCVALUE_38400KHZ;
+               shift = INCVALUE_SHIFT_38400KHZ;
+               adapter->cc.shift = shift;
+               break;
        case e1000_82574:
        case e1000_82583:
                /* Stable 25MHz frequency */
index 89d57dd911dc8940f4d01115eb4d2eed7ce16085..ea3c3eb2ef2020d513d49c1368679f27d17edb04 100644 (file)
@@ -295,15 +295,17 @@ void e1000e_ptp_init(struct e1000_adapter *adapter)
        case e1000_pch_cnp:
        case e1000_pch_tgp:
        case e1000_pch_adp:
-       case e1000_pch_mtp:
-       case e1000_pch_lnp:
-       case e1000_pch_ptp:
        case e1000_pch_nvp:
                if (er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_SYSCFI)
                        adapter->ptp_clock_info.max_adj = MAX_PPB_24MHZ;
                else
                        adapter->ptp_clock_info.max_adj = MAX_PPB_38400KHZ;
                break;
+       case e1000_pch_mtp:
+       case e1000_pch_lnp:
+       case e1000_pch_ptp:
+               adapter->ptp_clock_info.max_adj = MAX_PPB_38400KHZ;
+               break;
        case e1000_82574:
        case e1000_82583:
                adapter->ptp_clock_info.max_adj = MAX_PPB_25MHZ;