summaryrefslogtreecommitdiff
path: root/sys/dev/pccbb
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2008-12-05 04:43:25 +0000
committerWarner Losh <imp@FreeBSD.org>2008-12-05 04:43:25 +0000
commit414f7ec8bd7c55f3193d7cbebb7d8bdbfc52bdd2 (patch)
tree165bf93aee15217a5e0ccdc070f42ef9591ffa56 /sys/dev/pccbb
parent9036240993b3c7d76e2403a71780c46f964ec0d0 (diff)
Notes
Diffstat (limited to 'sys/dev/pccbb')
-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 8703ab8b655e..5cec8f4de2e1 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) {