Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

e1000e: Add code to check return values on NVM accesses

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>

authored by

David Ertman and committed by
Jeff Kirsher
491a04d2 493004d0

+23 -8
+4 -1
drivers/net/ethernet/intel/e1000e/manage.c
··· 327 327 } else if ((hw->mac.type == e1000_82574) || 328 328 (hw->mac.type == e1000_82583)) { 329 329 u16 data; 330 + s32 ret_val; 330 331 331 332 factps = er32(FACTPS); 332 - e1000_read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, &data); 333 + ret_val = e1000_read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, &data); 334 + if (ret_val) 335 + return false; 333 336 334 337 if (!(factps & E1000_FACTPS_MNGCG) && 335 338 ((data & E1000_NVM_INIT_CTRL2_MNGM) ==
+16 -6
drivers/net/ethernet/intel/e1000e/netdev.c
··· 6708 6708 int bars, i, err, pci_using_dac; 6709 6709 u16 eeprom_data = 0; 6710 6710 u16 eeprom_apme_mask = E1000_EEPROM_APME; 6711 + s32 rval = 0; 6711 6712 6712 6713 if (ei->flags2 & FLAG2_DISABLE_ASPM_L0S) 6713 6714 aspm_disable_flag = PCIE_LINK_STATE_L0S; ··· 6941 6940 } else if (adapter->flags & FLAG_APME_IN_CTRL3) { 6942 6941 if (adapter->flags & FLAG_APME_CHECK_PORT_B && 6943 6942 (adapter->hw.bus.func == 1)) 6944 - e1000_read_nvm(&adapter->hw, NVM_INIT_CONTROL3_PORT_B, 6945 - 1, &eeprom_data); 6943 + rval = e1000_read_nvm(&adapter->hw, 6944 + NVM_INIT_CONTROL3_PORT_B, 6945 + 1, &eeprom_data); 6946 6946 else 6947 - e1000_read_nvm(&adapter->hw, NVM_INIT_CONTROL3_PORT_A, 6948 - 1, &eeprom_data); 6947 + rval = e1000_read_nvm(&adapter->hw, 6948 + NVM_INIT_CONTROL3_PORT_A, 6949 + 1, &eeprom_data); 6949 6950 } 6950 6951 6951 6952 /* fetch WoL from EEPROM */ 6952 - if (eeprom_data & eeprom_apme_mask) 6953 + if (rval) 6954 + e_dbg("NVM read error getting WoL initial values: %d\n", rval); 6955 + else if (eeprom_data & eeprom_apme_mask) 6953 6956 adapter->eeprom_wol |= E1000_WUFC_MAG; 6954 6957 6955 6958 /* now that we have the eeprom settings, apply the special cases ··· 6972 6967 device_wakeup_enable(&pdev->dev); 6973 6968 6974 6969 /* save off EEPROM version number */ 6975 - e1000_read_nvm(&adapter->hw, 5, 1, &adapter->eeprom_vers); 6970 + rval = e1000_read_nvm(&adapter->hw, 5, 1, &adapter->eeprom_vers); 6971 + 6972 + if (rval) { 6973 + e_dbg("NVM read error getting EEPROM version: %d\n", rval); 6974 + adapter->eeprom_vers = 0; 6975 + } 6976 6976 6977 6977 /* reset the hardware with the new settings */ 6978 6978 e1000e_reset(adapter);
+3 -1
drivers/net/ethernet/intel/e1000e/nvm.c
··· 327 327 328 328 ew32(EERD, eerd); 329 329 ret_val = e1000e_poll_eerd_eewr_done(hw, E1000_NVM_POLL_READ); 330 - if (ret_val) 330 + if (ret_val) { 331 + e_dbg("NVM read error: %d\n", ret_val); 331 332 break; 333 + } 332 334 333 335 data[i] = (er32(EERD) >> E1000_NVM_RW_REG_DATA); 334 336 }