aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/e1000e/ethtool.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/e1000e/ethtool.c')
-rw-r--r--drivers/net/e1000e/ethtool.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/drivers/net/e1000e/ethtool.c b/drivers/net/e1000e/ethtool.c
index 34f1f639429d..e48956d924b0 100644
--- a/drivers/net/e1000e/ethtool.c
+++ b/drivers/net/e1000e/ethtool.c
@@ -492,18 +492,19 @@ static int e1000_get_eeprom(struct net_device *netdev,
492 for (i = 0; i < last_word - first_word + 1; i++) { 492 for (i = 0; i < last_word - first_word + 1; i++) {
493 ret_val = e1000_read_nvm(hw, first_word + i, 1, 493 ret_val = e1000_read_nvm(hw, first_word + i, 1,
494 &eeprom_buff[i]); 494 &eeprom_buff[i]);
495 if (ret_val) { 495 if (ret_val)
496 /* a read error occurred, throw away the
497 * result */
498 memset(eeprom_buff, 0xff, sizeof(eeprom_buff));
499 break; 496 break;
500 }
501 } 497 }
502 } 498 }
503 499
504 /* Device's eeprom is always little-endian, word addressable */ 500 if (ret_val) {
505 for (i = 0; i < last_word - first_word + 1; i++) 501 /* a read error occurred, throw away the result */
506 le16_to_cpus(&eeprom_buff[i]); 502 memset(eeprom_buff, 0xff, sizeof(eeprom_buff));
503 } else {
504 /* Device's eeprom is always little-endian, word addressable */
505 for (i = 0; i < last_word - first_word + 1; i++)
506 le16_to_cpus(&eeprom_buff[i]);
507 }
507 508
508 memcpy(bytes, (u8 *)eeprom_buff + (eeprom->offset & 1), eeprom->len); 509 memcpy(bytes, (u8 *)eeprom_buff + (eeprom->offset & 1), eeprom->len);
509 kfree(eeprom_buff); 510 kfree(eeprom_buff);
@@ -555,6 +556,9 @@ static int e1000_set_eeprom(struct net_device *netdev,
555 ret_val = e1000_read_nvm(hw, last_word, 1, 556 ret_val = e1000_read_nvm(hw, last_word, 1,
556 &eeprom_buff[last_word - first_word]); 557 &eeprom_buff[last_word - first_word]);
557 558
559 if (ret_val)
560 goto out;
561
558 /* Device's eeprom is always little-endian, word addressable */ 562 /* Device's eeprom is always little-endian, word addressable */
559 for (i = 0; i < last_word - first_word + 1; i++) 563 for (i = 0; i < last_word - first_word + 1; i++)
560 le16_to_cpus(&eeprom_buff[i]); 564 le16_to_cpus(&eeprom_buff[i]);
@@ -567,15 +571,18 @@ static int e1000_set_eeprom(struct net_device *netdev,
567 ret_val = e1000_write_nvm(hw, first_word, 571 ret_val = e1000_write_nvm(hw, first_word,
568 last_word - first_word + 1, eeprom_buff); 572 last_word - first_word + 1, eeprom_buff);
569 573
574 if (ret_val)
575 goto out;
576
570 /* 577 /*
571 * Update the checksum over the first part of the EEPROM if needed 578 * Update the checksum over the first part of the EEPROM if needed
572 * and flush shadow RAM for 82573 controllers 579 * and flush shadow RAM for applicable controllers
573 */ 580 */
574 if ((ret_val == 0) && ((first_word <= NVM_CHECKSUM_REG) || 581 if ((first_word <= NVM_CHECKSUM_REG) ||
575 (hw->mac.type == e1000_82574) || 582 (hw->mac.type == e1000_82574) || (hw->mac.type == e1000_82573))
576 (hw->mac.type == e1000_82573))) 583 ret_val = e1000e_update_nvm_checksum(hw);
577 e1000e_update_nvm_checksum(hw);
578 584
585out:
579 kfree(eeprom_buff); 586 kfree(eeprom_buff);
580 return ret_val; 587 return ret_val;
581} 588}
@@ -860,7 +867,7 @@ static int e1000_eeprom_test(struct e1000_adapter *adapter, u64 *data)
860 for (i = 0; i < (NVM_CHECKSUM_REG + 1); i++) { 867 for (i = 0; i < (NVM_CHECKSUM_REG + 1); i++) {
861 if ((e1000_read_nvm(&adapter->hw, i, 1, &temp)) < 0) { 868 if ((e1000_read_nvm(&adapter->hw, i, 1, &temp)) < 0) {
862 *data = 1; 869 *data = 1;
863 break; 870 return *data;
864 } 871 }
865 checksum += temp; 872 checksum += temp;
866 } 873 }