Commit 7947b20e authored by Michael Chan's avatar Michael Chan Committed by David S. Miller

[BNX2]: Fix netdev watchdog on 5708.

There's a bug in the driver that only initializes half of the context
memory on the 5708.  Surprisingly, this works most of the time except
for some occasional netdev watchdogs when sending a lot of 64-byte
packets.  The fix is to add the missing code to initialize the 2nd
halves of all context memory.
Signed-off-by: default avatarMichael Chan <mchan@broadcom.com>
Acked-by: default avatarJeff Garzik <jeff@garzik.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7244d545
...@@ -1811,6 +1811,7 @@ bnx2_init_context(struct bnx2 *bp) ...@@ -1811,6 +1811,7 @@ bnx2_init_context(struct bnx2 *bp)
vcid = 96; vcid = 96;
while (vcid) { while (vcid) {
u32 vcid_addr, pcid_addr, offset; u32 vcid_addr, pcid_addr, offset;
int i;
vcid--; vcid--;
...@@ -1831,16 +1832,20 @@ bnx2_init_context(struct bnx2 *bp) ...@@ -1831,16 +1832,20 @@ bnx2_init_context(struct bnx2 *bp)
pcid_addr = vcid_addr; pcid_addr = vcid_addr;
} }
REG_WR(bp, BNX2_CTX_VIRT_ADDR, 0x00); for (i = 0; i < (CTX_SIZE / PHY_CTX_SIZE); i++) {
REG_WR(bp, BNX2_CTX_PAGE_TBL, pcid_addr); vcid_addr += (i << PHY_CTX_SHIFT);
pcid_addr += (i << PHY_CTX_SHIFT);
/* Zero out the context. */ REG_WR(bp, BNX2_CTX_VIRT_ADDR, 0x00);
for (offset = 0; offset < PHY_CTX_SIZE; offset += 4) { REG_WR(bp, BNX2_CTX_PAGE_TBL, pcid_addr);
CTX_WR(bp, 0x00, offset, 0);
}
REG_WR(bp, BNX2_CTX_VIRT_ADDR, vcid_addr); /* Zero out the context. */
REG_WR(bp, BNX2_CTX_PAGE_TBL, pcid_addr); for (offset = 0; offset < PHY_CTX_SIZE; offset += 4)
CTX_WR(bp, 0x00, offset, 0);
REG_WR(bp, BNX2_CTX_VIRT_ADDR, vcid_addr);
REG_WR(bp, BNX2_CTX_PAGE_TBL, pcid_addr);
}
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment