e1000e: Add code to check return values on NVM accesses
authorDavid Ertman <david.m.ertman@intel.com>
Wed, 9 Jul 2014 16:07:42 +0000 (16:07 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Sat, 26 Jul 2014 03:51:00 +0000 (20:51 -0700)
Adding code to check and respond to previously ignored return values
from NVM access functions.

Issue discovered through static analysis.

Signed-off-by: Dave Ertman <david.m.ertman@intel.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/e1000e/manage.c
drivers/net/ethernet/intel/e1000e/netdev.c
drivers/net/ethernet/intel/e1000e/nvm.c

index cb37ff1f1321991c34f17b80d820e9d923d0d3aa..58856032298db4847d1ad7fe546ccbf9e9f85884 100644 (file)
@@ -327,9 +327,12 @@ bool e1000e_enable_mng_pass_thru(struct e1000_hw *hw)
        } else if ((hw->mac.type == e1000_82574) ||
                   (hw->mac.type == e1000_82583)) {
                u16 data;
+               s32 ret_val;
 
                factps = er32(FACTPS);
-               e1000_read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, &data);
+               ret_val = e1000_read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, &data);
+               if (ret_val)
+                       return false;
 
                if (!(factps & E1000_FACTPS_MNGCG) &&
                    ((data & E1000_NVM_INIT_CTRL2_MNGM) ==
index 201cc93f36256d5776e882399d3afdf594b81192..fe3e42a6c8e994b37286a21a9cda1208a2dd07b8 100644 (file)
@@ -6708,6 +6708,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        int bars, i, err, pci_using_dac;
        u16 eeprom_data = 0;
        u16 eeprom_apme_mask = E1000_EEPROM_APME;
+       s32 rval = 0;
 
        if (ei->flags2 & FLAG2_DISABLE_ASPM_L0S)
                aspm_disable_flag = PCIE_LINK_STATE_L0S;
@@ -6940,15 +6941,19 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        } else if (adapter->flags & FLAG_APME_IN_CTRL3) {
                if (adapter->flags & FLAG_APME_CHECK_PORT_B &&
                    (adapter->hw.bus.func == 1))
-                       e1000_read_nvm(&adapter->hw, NVM_INIT_CONTROL3_PORT_B,
-                                      1, &eeprom_data);
+                       rval = e1000_read_nvm(&adapter->hw,
+                                             NVM_INIT_CONTROL3_PORT_B,
+                                             1, &eeprom_data);
                else
-                       e1000_read_nvm(&adapter->hw, NVM_INIT_CONTROL3_PORT_A,
-                                      1, &eeprom_data);
+                       rval = e1000_read_nvm(&adapter->hw,
+                                             NVM_INIT_CONTROL3_PORT_A,
+                                             1, &eeprom_data);
        }
 
        /* fetch WoL from EEPROM */
-       if (eeprom_data & eeprom_apme_mask)
+       if (rval)
+               e_dbg("NVM read error getting WoL initial values: %d\n", rval);
+       else if (eeprom_data & eeprom_apme_mask)
                adapter->eeprom_wol |= E1000_WUFC_MAG;
 
        /* now that we have the eeprom settings, apply the special cases
@@ -6967,7 +6972,12 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                device_wakeup_enable(&pdev->dev);
 
        /* save off EEPROM version number */
-       e1000_read_nvm(&adapter->hw, 5, 1, &adapter->eeprom_vers);
+       rval = e1000_read_nvm(&adapter->hw, 5, 1, &adapter->eeprom_vers);
+
+       if (rval) {
+               e_dbg("NVM read error getting EEPROM version: %d\n", rval);
+               adapter->eeprom_vers = 0;
+       }
 
        /* reset the hardware with the new settings */
        e1000e_reset(adapter);
index b1f212b7baf7e71f0b2a3a160463898019778a00..fa6b1036a327d318333f24a28781cdad697b6451 100644 (file)
@@ -327,8 +327,10 @@ s32 e1000e_read_nvm_eerd(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
 
                ew32(EERD, eerd);
                ret_val = e1000e_poll_eerd_eewr_done(hw, E1000_NVM_POLL_READ);
-               if (ret_val)
+               if (ret_val) {
+                       e_dbg("NVM read error: %d\n", ret_val);
                        break;
+               }
 
                data[i] = (er32(EERD) >> E1000_NVM_RW_REG_DATA);
        }