aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom/tg3.c
diff options
context:
space:
mode:
authorNithin Sujir <nsujir@broadcom.com>2013-05-21 08:57:32 -0400
committerDavid S. Miller <davem@davemloft.net>2013-05-22 17:51:11 -0400
commitfb03a43f5fb42000dcc62d91138c1c24fca609b0 (patch)
tree025c606b5f33c3570ed847e3d6ac14707b1b92b9 /drivers/net/ethernet/broadcom/tg3.c
parent3ccfc1b1d2fa78f8ece83646027982916fcc794b (diff)
tg3: Ensure boot code has completed initialization before accessing hardware
After resetting the device, the driver waits for a signature to be updated to know that firmware has completed initialization. However, the call to tg3_poll_fw() is being done too late and we're writing to the GRC_MODE register before it has completely initialized, causing contention with firmware. This logic has existed since day one but is causing PCIE link to go down randomly at startup on one platform once every few hundred reboots. Move the tg3_poll_fw() up to before we write to the GRC_MODE register after reset. Signed-off-by: Nithin Nayak Sujir <nsujir@broadcom.com> Signed-off-by: Michael Chan <mchan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom/tg3.c')
-rw-r--r--drivers/net/ethernet/broadcom/tg3.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
index e285d7645651..158a7c90db7c 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -8911,6 +8911,10 @@ static int tg3_chip_reset(struct tg3 *tp)
8911 tg3_halt_cpu(tp, RX_CPU_BASE); 8911 tg3_halt_cpu(tp, RX_CPU_BASE);
8912 } 8912 }
8913 8913
8914 err = tg3_poll_fw(tp);
8915 if (err)
8916 return err;
8917
8914 tw32(GRC_MODE, tp->grc_mode); 8918 tw32(GRC_MODE, tp->grc_mode);
8915 8919
8916 if (tg3_chip_rev_id(tp) == CHIPREV_ID_5705_A0) { 8920 if (tg3_chip_rev_id(tp) == CHIPREV_ID_5705_A0) {
@@ -8941,10 +8945,6 @@ static int tg3_chip_reset(struct tg3 *tp)
8941 8945
8942 tg3_ape_unlock(tp, TG3_APE_LOCK_GRC); 8946 tg3_ape_unlock(tp, TG3_APE_LOCK_GRC);
8943 8947
8944 err = tg3_poll_fw(tp);
8945 if (err)
8946 return err;
8947
8948 tg3_mdio_start(tp); 8948 tg3_mdio_start(tp);
8949 8949
8950 if (tg3_flag(tp, PCI_EXPRESS) && 8950 if (tg3_flag(tp, PCI_EXPRESS) &&