]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
e1000e: ignore uninitialized checksum word on tgp
authorJacek Kowalski <jacek@jacekk.info>
Mon, 30 Jun 2025 08:35:00 +0000 (10:35 +0200)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Mon, 21 Jul 2025 17:31:09 +0000 (10:31 -0700)
As described by Vitaly Lifshits:

> Starting from Tiger Lake, LAN NVM is locked for writes by SW, so the
> driver cannot perform checksum validation and correction. This means
> that all NVM images must leave the factory with correct checksum and
> checksum valid bit set.

Unfortunately some systems have left the factory with an uninitialized
value of 0xFFFF at register address 0x3F (checksum word location).
So on Tiger Lake platform we ignore the computed checksum when such
condition is encountered.

Signed-off-by: Jacek Kowalski <jacek@jacekk.info>
Tested-by: Vlad URSU <vlad@ursu.me>
Fixes: 4051f68318ca9 ("e1000e: Do not take care about recovery NVM checksum")
Cc: stable@vger.kernel.org
Reviewed-by: Simon Horman <horms@kernel.org>
Reviewed-by: Vitaly Lifshits <vitaly.lifshits@intel.com>
Tested-by: Mor Bar-Gabay <morx.bar.gabay@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/e1000e/defines.h
drivers/net/ethernet/intel/e1000e/nvm.c

index 8294a7c4f122c3c6e39a1c368a66ead99e36d4c1..ba331899d1861b337af9bb4bd3e230d34bd08ba2 100644 (file)
 /* For checksumming, the sum of all words in the NVM should equal 0xBABA. */
 #define NVM_SUM                    0xBABA
 
+/* Uninitialized ("empty") checksum word value */
+#define NVM_CHECKSUM_UNINITIALIZED 0xFFFF
+
 /* PBA (printed board assembly) number words */
 #define NVM_PBA_OFFSET_0           8
 #define NVM_PBA_OFFSET_1           9
index e609f4df86f4554f560a8585b943ba7749067672..16369e6d245a4a40b454eedc27e9ecc7e45fc839 100644 (file)
@@ -558,6 +558,12 @@ s32 e1000e_validate_nvm_checksum_generic(struct e1000_hw *hw)
                checksum += nvm_data;
        }
 
+       if (hw->mac.type == e1000_pch_tgp &&
+           nvm_data == NVM_CHECKSUM_UNINITIALIZED) {
+               e_dbg("Uninitialized NVM Checksum on TGP platform - ignoring\n");
+               return 0;
+       }
+
        if (checksum != (u16)NVM_SUM) {
                e_dbg("NVM Checksum Invalid\n");
                return -E1000_ERR_NVM;