summaryrefslogtreecommitdiffstats
path: root/sys/dev/bge/if_bge.c
diff options
context:
space:
mode:
authoryongari <yongari@FreeBSD.org>2012-10-10 04:38:29 +0000
committeryongari <yongari@FreeBSD.org>2012-10-10 04:38:29 +0000
commit85fe294b274058d67c9754e34941cd93675acc69 (patch)
tree4f65d48f03e2390972eee8100e2301cfbe1366d5 /sys/dev/bge/if_bge.c
parent558710fce12b8f87c85311190ff5c12f72982576 (diff)
downloadFreeBSD-src-85fe294b274058d67c9754e34941cd93675acc69.zip
FreeBSD-src-85fe294b274058d67c9754e34941cd93675acc69.tar.gz
Fix a long standing VCPU reset sequence bug on BCM5906.
The VCPU(Virtual CPU) of BCM5906 is used to provide a mechanism to control the bootcode execution and to pick up configuration data stored inside the EEPROM. The bootcode of BCM5906 will check the BGE_VCPU_STATUS_DRV_RESET bit to decide which booting procedure to choose. Data sheet indicates the VCPU of BCM5906 should set BGE_VCPU_STATUS_DRV_RESET bit *before* VCPU reset or global reset.
Diffstat (limited to 'sys/dev/bge/if_bge.c')
-rw-r--r--sys/dev/bge/if_bge.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/sys/dev/bge/if_bge.c b/sys/dev/bge/if_bge.c
index bfa0769..ce6ad21 100644
--- a/sys/dev/bge/if_bge.c
+++ b/sys/dev/bge/if_bge.c
@@ -3616,6 +3616,15 @@ bge_reset(struct bge_softc *sc)
}
}
+ if (sc->bge_asicrev == BGE_ASICREV_BCM5906) {
+ val = CSR_READ_4(sc, BGE_VCPU_STATUS);
+ CSR_WRITE_4(sc, BGE_VCPU_STATUS,
+ val | BGE_VCPU_STATUS_DRV_RESET);
+ val = CSR_READ_4(sc, BGE_VCPU_EXT_CTRL);
+ CSR_WRITE_4(sc, BGE_VCPU_EXT_CTRL,
+ val & ~BGE_VCPU_EXT_CTRL_HALT_CPU);
+ }
+
/*
* Set GPHY Power Down Override to leave GPHY
* powered up in D0 uninitialized.
@@ -3627,15 +3636,6 @@ bge_reset(struct bge_softc *sc)
/* Issue global reset */
write_op(sc, BGE_MISC_CFG, reset);
- if (sc->bge_asicrev == BGE_ASICREV_BCM5906) {
- val = CSR_READ_4(sc, BGE_VCPU_STATUS);
- CSR_WRITE_4(sc, BGE_VCPU_STATUS,
- val | BGE_VCPU_STATUS_DRV_RESET);
- val = CSR_READ_4(sc, BGE_VCPU_EXT_CTRL);
- CSR_WRITE_4(sc, BGE_VCPU_EXT_CTRL,
- val & ~BGE_VCPU_EXT_CTRL_HALT_CPU);
- }
-
DELAY(1000);
/* XXX: Broadcom Linux driver. */
OpenPOWER on IntegriCloud