tg3: Fix NVRAM page writes on newer devices
authorMatt Carlson <mcarlson@broadcom.com>
Mon, 13 Feb 2012 15:20:11 +0000 (15:20 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 14 Feb 2012 01:45:05 +0000 (20:45 -0500)
On newer devices, the hardware expects the NVRAM address register
to be written only once per NVRAM page.  To do otherwise causes NVRAM
corruption.  This patch fixes the problem.

Signed-off-by: Matt Carlson <mcarlson@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/tg3.c

index cb17885..67b6d61 100644 (file)
@@ -3140,8 +3140,6 @@ static int tg3_nvram_write_block_buffered(struct tg3 *tp, u32 offset, u32 len,
 
                phy_addr = tg3_nvram_phys_addr(tp, offset);
 
-               tw32(NVRAM_ADDR, phy_addr);
-
                nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE | NVRAM_CMD_WR;
 
                if (page_off == 0 || i == 0)
@@ -3152,6 +3150,11 @@ static int tg3_nvram_write_block_buffered(struct tg3 *tp, u32 offset, u32 len,
                if (i == (len - 4))
                        nvram_cmd |= NVRAM_CMD_LAST;
 
+               if ((nvram_cmd & NVRAM_CMD_FIRST) ||
+                   !tg3_flag(tp, FLASH) ||
+                   !tg3_flag(tp, 57765_PLUS))
+                       tw32(NVRAM_ADDR, phy_addr);
+
                if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5752 &&
                    !tg3_flag(tp, 5755_PLUS) &&
                    (tp->nvram_jedecnum == JEDEC_ST) &&