Commit fb03a43f authored by Nithin Sujir's avatar Nithin Sujir Committed by David S. Miller

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: default avatarNithin Nayak Sujir <nsujir@broadcom.com>
Signed-off-by: default avatarMichael Chan <mchan@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3ccfc1b1
...@@ -8911,6 +8911,10 @@ static int tg3_chip_reset(struct tg3 *tp) ...@@ -8911,6 +8911,10 @@ static int tg3_chip_reset(struct tg3 *tp)
tg3_halt_cpu(tp, RX_CPU_BASE); tg3_halt_cpu(tp, RX_CPU_BASE);
} }
err = tg3_poll_fw(tp);
if (err)
return err;
tw32(GRC_MODE, tp->grc_mode); tw32(GRC_MODE, tp->grc_mode);
if (tg3_chip_rev_id(tp) == CHIPREV_ID_5705_A0) { if (tg3_chip_rev_id(tp) == CHIPREV_ID_5705_A0) {
...@@ -8941,10 +8945,6 @@ static int tg3_chip_reset(struct tg3 *tp) ...@@ -8941,10 +8945,6 @@ static int tg3_chip_reset(struct tg3 *tp)
tg3_ape_unlock(tp, TG3_APE_LOCK_GRC); tg3_ape_unlock(tp, TG3_APE_LOCK_GRC);
err = tg3_poll_fw(tp);
if (err)
return err;
tg3_mdio_start(tp); tg3_mdio_start(tp);
if (tg3_flag(tp, PCI_EXPRESS) && if (tg3_flag(tp, PCI_EXPRESS) &&
......
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