diff options
author | imp <imp@FreeBSD.org> | 2008-12-05 04:43:25 +0000 |
---|---|---|
committer | imp <imp@FreeBSD.org> | 2008-12-05 04:43:25 +0000 |
commit | a81037f424a0cfd844d241604429f6f0ce7cff72 (patch) | |
tree | 165bf93aee15217a5e0ccdc070f42ef9591ffa56 /sys | |
parent | 886616b21131ba2533dd307fdd8459de46be616b (diff) | |
download | FreeBSD-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.c | 13 |
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) { |