diff options
author | Michael Chan <mchan@broadcom.com> | 2005-12-14 00:08:21 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2005-12-14 00:08:21 -0500 |
commit | 381291b7d3e17ac966498312dc571dcca1b93efc (patch) | |
tree | 619ab88cbec0112674f72b3a8c6b3aae1bacd69a | |
parent | 65ab592dc5b34caebabfe1340e7c18f52a785079 (diff) |
[TG3]: Fix nvram arbitration bugs.
The nvram arbitration rules were not strictly followed in a few places
and this could lead to reading corrupted values from the nvram.
Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/tg3.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 47bd4a394420..dabc39befd3c 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -8533,6 +8533,7 @@ static void __devinit tg3_nvram_init(struct tg3 *tp) | |||
8533 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) { | 8533 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) { |
8534 | tp->tg3_flags |= TG3_FLAG_NVRAM; | 8534 | tp->tg3_flags |= TG3_FLAG_NVRAM; |
8535 | 8535 | ||
8536 | tg3_nvram_lock(tp); | ||
8536 | tg3_enable_nvram_access(tp); | 8537 | tg3_enable_nvram_access(tp); |
8537 | 8538 | ||
8538 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752) | 8539 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752) |
@@ -8543,6 +8544,7 @@ static void __devinit tg3_nvram_init(struct tg3 *tp) | |||
8543 | tg3_get_nvram_size(tp); | 8544 | tg3_get_nvram_size(tp); |
8544 | 8545 | ||
8545 | tg3_disable_nvram_access(tp); | 8546 | tg3_disable_nvram_access(tp); |
8547 | tg3_nvram_unlock(tp); | ||
8546 | 8548 | ||
8547 | } else { | 8549 | } else { |
8548 | tp->tg3_flags &= ~(TG3_FLAG_NVRAM | TG3_FLAG_NVRAM_BUFFERED); | 8550 | tp->tg3_flags &= ~(TG3_FLAG_NVRAM | TG3_FLAG_NVRAM_BUFFERED); |
@@ -8640,10 +8642,10 @@ static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val) | |||
8640 | if (ret == 0) | 8642 | if (ret == 0) |
8641 | *val = swab32(tr32(NVRAM_RDDATA)); | 8643 | *val = swab32(tr32(NVRAM_RDDATA)); |
8642 | 8644 | ||
8643 | tg3_nvram_unlock(tp); | ||
8644 | |||
8645 | tg3_disable_nvram_access(tp); | 8645 | tg3_disable_nvram_access(tp); |
8646 | 8646 | ||
8647 | tg3_nvram_unlock(tp); | ||
8648 | |||
8647 | return ret; | 8649 | return ret; |
8648 | } | 8650 | } |
8649 | 8651 | ||
@@ -8728,6 +8730,10 @@ static int tg3_nvram_write_block_unbuffered(struct tg3 *tp, u32 offset, u32 len, | |||
8728 | 8730 | ||
8729 | offset = offset + (pagesize - page_off); | 8731 | offset = offset + (pagesize - page_off); |
8730 | 8732 | ||
8733 | /* Nvram lock released by tg3_nvram_read() above, | ||
8734 | * so need to get it again. | ||
8735 | */ | ||
8736 | tg3_nvram_lock(tp); | ||
8731 | tg3_enable_nvram_access(tp); | 8737 | tg3_enable_nvram_access(tp); |
8732 | 8738 | ||
8733 | /* | 8739 | /* |