diff options
| author | Warner Losh <imp@FreeBSD.org> | 2008-12-05 04:43:25 +0000 |
|---|---|---|
| committer | Warner Losh <imp@FreeBSD.org> | 2008-12-05 04:43:25 +0000 |
| commit | 414f7ec8bd7c55f3193d7cbebb7d8bdbfc52bdd2 (patch) | |
| tree | 165bf93aee15217a5e0ccdc070f42ef9591ffa56 /sys/dev/pccbb | |
| parent | 9036240993b3c7d76e2403a71780c46f964ec0d0 (diff) | |
Notes
Diffstat (limited to 'sys/dev/pccbb')
| -rw-r--r-- | sys/dev/pccbb/pccbb.c | 13 |
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) { |
