diff options
author | Michael Chan <mchan@broadcom.com> | 2007-06-05 00:22:24 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-06-07 16:38:37 -0400 |
commit | 641bdcd56c8bb2110a31da846b2752b11a644050 (patch) | |
tree | 3bacb70bde63e20d2a7003bed4aad9020401be9c /drivers | |
parent | 7947b20ebae785ba25154aa1a9a00a98a22de75a (diff) |
[BNX2]: Add missing wait in bnx2_init_5709_context().
For correctness, we need to wait for the MEM_INIT bit to be cleared
in the BNX2_CTX_COMMAND register before proceeding.
[Added return -EBUSY when the MEM_INIT bit doesn't clear, suggested
by Jeff Garzik.]
Signed-off-by: Michael Chan <mchan@broadcom.com>
Acked-by: Jeff Garzik <jeff@garzik.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/bnx2.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 9789f05cbc99..9eba7a2635ad 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
@@ -1778,6 +1778,15 @@ bnx2_init_5709_context(struct bnx2 *bp) | |||
1778 | val = BNX2_CTX_COMMAND_ENABLED | BNX2_CTX_COMMAND_MEM_INIT | (1 << 12); | 1778 | val = BNX2_CTX_COMMAND_ENABLED | BNX2_CTX_COMMAND_MEM_INIT | (1 << 12); |
1779 | val |= (BCM_PAGE_BITS - 8) << 16; | 1779 | val |= (BCM_PAGE_BITS - 8) << 16; |
1780 | REG_WR(bp, BNX2_CTX_COMMAND, val); | 1780 | REG_WR(bp, BNX2_CTX_COMMAND, val); |
1781 | for (i = 0; i < 10; i++) { | ||
1782 | val = REG_RD(bp, BNX2_CTX_COMMAND); | ||
1783 | if (!(val & BNX2_CTX_COMMAND_MEM_INIT)) | ||
1784 | break; | ||
1785 | udelay(2); | ||
1786 | } | ||
1787 | if (val & BNX2_CTX_COMMAND_MEM_INIT) | ||
1788 | return -EBUSY; | ||
1789 | |||
1781 | for (i = 0; i < bp->ctx_pages; i++) { | 1790 | for (i = 0; i < bp->ctx_pages; i++) { |
1782 | int j; | 1791 | int j; |
1783 | 1792 | ||
@@ -3696,9 +3705,11 @@ bnx2_init_chip(struct bnx2 *bp) | |||
3696 | 3705 | ||
3697 | /* Initialize context mapping and zero out the quick contexts. The | 3706 | /* Initialize context mapping and zero out the quick contexts. The |
3698 | * context block must have already been enabled. */ | 3707 | * context block must have already been enabled. */ |
3699 | if (CHIP_NUM(bp) == CHIP_NUM_5709) | 3708 | if (CHIP_NUM(bp) == CHIP_NUM_5709) { |
3700 | bnx2_init_5709_context(bp); | 3709 | rc = bnx2_init_5709_context(bp); |
3701 | else | 3710 | if (rc) |
3711 | return rc; | ||
3712 | } else | ||
3702 | bnx2_init_context(bp); | 3713 | bnx2_init_context(bp); |
3703 | 3714 | ||
3704 | if ((rc = bnx2_init_cpus(bp)) != 0) | 3715 | if ((rc = bnx2_init_cpus(bp)) != 0) |