summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2008-12-05 04:43:25 +0000
committerimp <imp@FreeBSD.org>2008-12-05 04:43:25 +0000
commita81037f424a0cfd844d241604429f6f0ce7cff72 (patch)
tree165bf93aee15217a5e0ccdc070f42ef9591ffa56 /sys
parent886616b21131ba2533dd307fdd8459de46be616b (diff)
downloadFreeBSD-src-a81037f424a0cfd844d241604429f6f0ce7cff72.zip
FreeBSD-src-a81037f424a0cfd844d241604429f6f0ce7cff72.tar.gz
Implement a method described in NetBSD PR 36652 for coping with the
BAD VCC bit.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/pccbb/pccbb.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/sys/dev/pccbb/pccbb.c b/sys/dev/pccbb/pccbb.c
index 8703ab8..5cec8f4 100644
--- a/sys/dev/pccbb/pccbb.c
+++ b/sys/dev/pccbb/pccbb.c
@@ -837,7 +837,18 @@ cbb_power(device_t brdev, int volts)
}
if (status & CBB_STATE_BAD_VCC_REQ) {
device_printf(sc->dev, "Bad Vcc requested\n");
- /* XXX Do we want to do something to mitigate things here? */
+ /*
+ * Turn off the power, and try again. Retrigger other
+ * active interrupts via force register. From NetBSD
+ * PR 36652, coded by me to description there.
+ */
+ sock_ctrl &= ~CBB_SOCKET_CTRL_VCCMASK;
+ sock_ctrl &= ~CBB_SOCKET_CTRL_VPPMASK;
+ cbb_set(sc, CBB_SOCKET_CONTROL, sock_ctrl);
+ status &= ~CBB_STATE_BAD_VCC_REQ;
+ status &= ~CBB_STATE_DATA_LOST;
+ status |= CBB_FORCE_CV_TEST;
+ cbb_set(sc, CBB_SOCKET_FORCE, status);
goto done;
}
if (sc->chipset == CB_TOPIC97) {
OpenPOWER on IntegriCloud