summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyle Moffett <Kyle.D.Moffett@boeing.com>2011-10-18 11:05:27 +0000
committerWolfgang Denk <wd@denx.de>2011-10-28 00:35:08 +0200
commit114d7fc053470d900b406711ba8cb69cf9131316 (patch)
tree060b938eff0ab541056d470f0eb0a016f99dfd7e
parentd60626f8c11e3d76cb53c3ba16249c7b054c5a1e (diff)
downloadu-boot-imx-114d7fc053470d900b406711ba8cb69cf9131316.zip
u-boot-imx-114d7fc053470d900b406711ba8cb69cf9131316.tar.gz
u-boot-imx-114d7fc053470d900b406711ba8cb69cf9131316.tar.bz2
e1000: Rewrite EEPROM checksum error to give more information
As an aide to debugging, we should print out the expected value of the EEPROM checksum in addition to just saying that it is wrong. Signed-off-by: Kyle Moffett <Kyle.D.Moffett@boeing.com> Cc: Ben Warren <biggerbadderben@gmail.com>
-rw-r--r--drivers/net/e1000.c46
1 files changed, 28 insertions, 18 deletions
diff --git a/drivers/net/e1000.c b/drivers/net/e1000.c
index c7c745a..39057d2 100644
--- a/drivers/net/e1000.c
+++ b/drivers/net/e1000.c
@@ -876,29 +876,41 @@ e1000_read_eeprom(struct e1000_hw *hw, uint16_t offset,
* If the the sum of the 64 16 bit words is 0xBABA, the EEPROM's checksum is
* valid.
*****************************************************************************/
-static int
-e1000_validate_eeprom_checksum(struct eth_device *nic)
+static int e1000_validate_eeprom_checksum(struct e1000_hw *hw)
{
- struct e1000_hw *hw = nic->priv;
- uint16_t checksum = 0;
- uint16_t i, eeprom_data;
+ uint16_t i, checksum, checksum_reg, *buf;
DEBUGFUNC();
- for (i = 0; i < (EEPROM_CHECKSUM_REG + 1); i++) {
- if (e1000_read_eeprom(hw, i, 1, &eeprom_data) < 0) {
- DEBUGOUT("EEPROM Read Error\n");
- return -E1000_ERR_EEPROM;
- }
- checksum += eeprom_data;
+ /* Allocate a temporary buffer */
+ buf = malloc(sizeof(buf[0]) * (EEPROM_CHECKSUM_REG + 1));
+ if (!buf) {
+ E1000_ERR(hw->nic, "Unable to allocate EEPROM buffer!\n");
+ return -E1000_ERR_EEPROM;
}
- if (checksum == (uint16_t) EEPROM_SUM) {
- return 0;
- } else {
- DEBUGOUT("EEPROM Checksum Invalid\n");
+ /* Read the EEPROM */
+ if (e1000_read_eeprom(hw, 0, EEPROM_CHECKSUM_REG + 1, buf) < 0) {
+ E1000_ERR(hw->nic, "Unable to read EEPROM!\n");
return -E1000_ERR_EEPROM;
}
+
+ /* Compute the checksum */
+ for (i = 0; i < EEPROM_CHECKSUM_REG; i++)
+ checksum += buf[i];
+ checksum = ((uint16_t)EEPROM_SUM) - checksum;
+ checksum_reg = buf[i];
+
+ /* Verify it! */
+ if (checksum == checksum_reg)
+ return 0;
+
+ /* Hrm, verification failed, print an error */
+ E1000_ERR(hw->nic, "EEPROM checksum is incorrect!\n");
+ E1000_ERR(hw->nic, " ...register was 0x%04hx, calculated 0x%04hx\n",
+ checksum_reg, checksum);
+
+ return -E1000_ERR_EEPROM;
}
/*****************************************************************************
@@ -5243,10 +5255,8 @@ e1000_initialize(bd_t * bis)
E1000_ERR(nic, "EEPROM is invalid!\n");
continue;
}
- if (e1000_validate_eeprom_checksum(nic) < 0) {
- E1000_ERR(nic, "EEPROM checksum is bad!\n");
+ if (e1000_validate_eeprom_checksum(hw))
continue;
- }
#endif
e1000_read_mac_addr(nic);
e1000_get_bus_type(hw);