e1000e: Invalid Image CSUM bit changed for I217
authorBruce Allan <bruce.w.allan@intel.com>
Wed, 9 Jan 2013 08:15:42 +0000 (08:15 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Wed, 16 Jan 2013 05:38:39 +0000 (21:38 -0800)
On I217, the bit that indicates an invalid EEPROM (NVM) image checksum has
changed from previous ICH/PCH LOMs.  When validating the EEPROM checksum,
check the appropriate bit on different devices.

Signed-off-by: Bruce Allan <bruce.w.allan@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/e1000e/defines.h
drivers/net/ethernet/intel/e1000e/ich8lan.c

index 20735327a7a053368f71992297e5301f2bf727d1..7326ea2fef8fc5ae88e20d6e155a29aeaa6e4a65 100644 (file)
 /* NVM Word Offsets */
 #define NVM_COMPAT                 0x0003
 #define NVM_ID_LED_SETTINGS        0x0004
+#define NVM_FUTURE_INIT_WORD1      0x0019
+#define NVM_COMPAT_VALID_CSUM      0x0001
+#define NVM_FUTURE_INIT_WORD1_VALID_CSUM       0x0040
+
 #define NVM_INIT_CONTROL2_REG      0x000F
 #define NVM_INIT_CONTROL3_PORT_B   0x0014
 #define NVM_INIT_3GIO_3            0x001A
index 976336547607e31caef68c8eaf528ddac78682da..7d5f6b7856e60e1c1f7f3782433c18b1e14646db 100644 (file)
@@ -2949,19 +2949,32 @@ static s32 e1000_validate_nvm_checksum_ich8lan(struct e1000_hw *hw)
 {
        s32 ret_val;
        u16 data;
+       u16 word;
+       u16 valid_csum_mask;
 
-       /* Read 0x19 and check bit 6.  If this bit is 0, the checksum
-        * needs to be fixed.  This bit is an indication that the NVM
-        * was prepared by OEM software and did not calculate the
-        * checksum...a likely scenario.
+       /* Read NVM and check Invalid Image CSUM bit.  If this bit is 0,
+        * the checksum needs to be fixed.  This bit is an indication that
+        * the NVM was prepared by OEM software and did not calculate
+        * the checksum...a likely scenario.
         */
-       ret_val = e1000_read_nvm(hw, 0x19, 1, &data);
+       switch (hw->mac.type) {
+       case e1000_pch_lpt:
+               word = NVM_COMPAT;
+               valid_csum_mask = NVM_COMPAT_VALID_CSUM;
+               break;
+       default:
+               word = NVM_FUTURE_INIT_WORD1;
+               valid_csum_mask = NVM_FUTURE_INIT_WORD1_VALID_CSUM;
+               break;
+       }
+
+       ret_val = e1000_read_nvm(hw, word, 1, &data);
        if (ret_val)
                return ret_val;
 
-       if (!(data & 0x40)) {
-               data |= 0x40;
-               ret_val = e1000_write_nvm(hw, 0x19, 1, &data);
+       if (!(data & valid_csum_mask)) {
+               data |= valid_csum_mask;
+               ret_val = e1000_write_nvm(hw, word, 1, &data);
                if (ret_val)
                        return ret_val;
                ret_val = e1000e_update_nvm_checksum(hw);