diff options
author | sos <sos@FreeBSD.org> | 1996-11-04 21:01:08 +0000 |
---|---|---|
committer | sos <sos@FreeBSD.org> | 1996-11-04 21:01:08 +0000 |
commit | 906c219b3e640f375cc10236fd211115b65aa41d (patch) | |
tree | f7a1b98e42e72ef0106980d8c384ef39397fb2ba | |
parent | 3db564dce907070d645a977c0358a77139f6362f (diff) | |
download | FreeBSD-src-906c219b3e640f375cc10236fd211115b65aa41d.zip FreeBSD-src-906c219b3e640f375cc10236fd211115b65aa41d.tar.gz |
Fix the hanging keyboard problem under Xaccel. Apprently we are loosing
an interrupt somewhere. The solution here is to check for keyboard
input each time the screen update timer ticks. Not pretty, but works.
-rw-r--r-- | sys/dev/syscons/syscons.c | 73 | ||||
-rw-r--r-- | sys/i386/isa/syscons.c | 73 | ||||
-rw-r--r-- | sys/isa/syscons.c | 73 |
3 files changed, 132 insertions, 87 deletions
diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c index c1579c7..e38ec37 100644 --- a/sys/dev/syscons/syscons.c +++ b/sys/dev/syscons/syscons.c @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: syscons.c,v 1.181 1996/10/23 07:29:43 pst Exp $ + * $Id: syscons.c,v 1.182 1996/10/26 20:16:58 sos Exp $ */ #include "sc.h" @@ -572,35 +572,40 @@ scintr(int unit) mark_all(cur_console); } - c = scgetc(SCGETC_NONBLOCK); + /* + * Loop while there is still input to get from the keyboard. + * I don't think this is nessesary, and it doesn't fix + * the Xaccel-2.1 keyboard hang, but it can't hurt. XXX + */ + while ((c = scgetc(SCGETC_NONBLOCK)) != NOKEY) { - cur_tty = VIRTUAL_TTY(get_scr_num()); - if (!(cur_tty->t_state & TS_ISOPEN)) - if (!((cur_tty = CONSOLE_TTY)->t_state & TS_ISOPEN)) - return; + cur_tty = VIRTUAL_TTY(get_scr_num()); + if (!(cur_tty->t_state & TS_ISOPEN)) + if (!((cur_tty = CONSOLE_TTY)->t_state & TS_ISOPEN)) + return; - switch (c & 0xff00) { - case 0x0000: /* normal key */ - (*linesw[cur_tty->t_line].l_rint)(c & 0xFF, cur_tty); + switch (c & 0xff00) { + case 0x0000: /* normal key */ + (*linesw[cur_tty->t_line].l_rint)(c & 0xFF, cur_tty); + break; + case FKEY: /* function key, return string */ + if (cp = get_fstr((u_int)c, (u_int *)&len)) { + while (len-- > 0) + (*linesw[cur_tty->t_line].l_rint)(*cp++ & 0xFF, cur_tty); + } break; - case NOKEY: /* nothing there */ - return; - case FKEY: /* function key, return string */ - if (cp = get_fstr((u_int)c, (u_int *)&len)) { - while (len-- > 0) - (*linesw[cur_tty->t_line].l_rint)(*cp++ & 0xFF, cur_tty); + case MKEY: /* meta is active, prepend ESC */ + (*linesw[cur_tty->t_line].l_rint)(0x1b, cur_tty); + (*linesw[cur_tty->t_line].l_rint)(c & 0xFF, cur_tty); + break; + case BKEY: /* backtab fixed sequence (esc [ Z) */ + (*linesw[cur_tty->t_line].l_rint)(0x1b, cur_tty); + (*linesw[cur_tty->t_line].l_rint)('[', cur_tty); + (*linesw[cur_tty->t_line].l_rint)('Z', cur_tty); + break; } - break; - case MKEY: /* meta is active, prepend ESC */ - (*linesw[cur_tty->t_line].l_rint)(0x1b, cur_tty); - (*linesw[cur_tty->t_line].l_rint)(c & 0xFF, cur_tty); - break; - case BKEY: /* backtab fixed sequence (esc [ Z) */ - (*linesw[cur_tty->t_line].l_rint)(0x1b, cur_tty); - (*linesw[cur_tty->t_line].l_rint)('[', cur_tty); - (*linesw[cur_tty->t_line].l_rint)('Z', cur_tty); - break; } + if (cur_console->status & MOUSE_ENABLED) { cur_console->status &= ~MOUSE_VISIBLE; remove_mouse_image(cur_console); @@ -1442,6 +1447,16 @@ scrn_timer() scr_stat *scp = cur_console; int s = spltty(); + /* + * With release 2.1 of the Xaccel server, the keyboard is left + * hanging pretty often. Apparently the interrupt from the + * keyboard is lost, and I don't know why (yet). + * This Ugly hack calls scintr if input is ready and + * conveniently hides the problem. XXX + */ + if (inb(KB_STAT) & KB_BUF_FULL) + scintr(0); + /* should we just return ? */ if ((scp->status&UNKNOWN_MODE) || blink_in_progress || switch_in_progress) { timeout((timeout_func_t)scrn_timer, 0, hz/10); @@ -2462,10 +2477,11 @@ scgetc(u_int flags) static u_int chr = 0; next_code: - kbd_wait(); - /* first see if there is something in the keyboard port */ - if (inb(KB_STAT) & KB_BUF_FULL) + /* check if there is anything in the keyboard buffer */ + if (inb(KB_STAT) & KB_BUF_FULL) { + DELAY(25); scancode = inb(KB_DATA); + } else if (flags & SCGETC_NONBLOCK) return(NOKEY); else @@ -2830,7 +2846,6 @@ next_code: console[0]->smode.mode == VT_AUTO) switch_scr(cur_console, 0); Debugger("manual escape to debugger"); - return(NOKEY); #else printf("No debugger in kernel\n"); #endif diff --git a/sys/i386/isa/syscons.c b/sys/i386/isa/syscons.c index c1579c7..e38ec37 100644 --- a/sys/i386/isa/syscons.c +++ b/sys/i386/isa/syscons.c @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: syscons.c,v 1.181 1996/10/23 07:29:43 pst Exp $ + * $Id: syscons.c,v 1.182 1996/10/26 20:16:58 sos Exp $ */ #include "sc.h" @@ -572,35 +572,40 @@ scintr(int unit) mark_all(cur_console); } - c = scgetc(SCGETC_NONBLOCK); + /* + * Loop while there is still input to get from the keyboard. + * I don't think this is nessesary, and it doesn't fix + * the Xaccel-2.1 keyboard hang, but it can't hurt. XXX + */ + while ((c = scgetc(SCGETC_NONBLOCK)) != NOKEY) { - cur_tty = VIRTUAL_TTY(get_scr_num()); - if (!(cur_tty->t_state & TS_ISOPEN)) - if (!((cur_tty = CONSOLE_TTY)->t_state & TS_ISOPEN)) - return; + cur_tty = VIRTUAL_TTY(get_scr_num()); + if (!(cur_tty->t_state & TS_ISOPEN)) + if (!((cur_tty = CONSOLE_TTY)->t_state & TS_ISOPEN)) + return; - switch (c & 0xff00) { - case 0x0000: /* normal key */ - (*linesw[cur_tty->t_line].l_rint)(c & 0xFF, cur_tty); + switch (c & 0xff00) { + case 0x0000: /* normal key */ + (*linesw[cur_tty->t_line].l_rint)(c & 0xFF, cur_tty); + break; + case FKEY: /* function key, return string */ + if (cp = get_fstr((u_int)c, (u_int *)&len)) { + while (len-- > 0) + (*linesw[cur_tty->t_line].l_rint)(*cp++ & 0xFF, cur_tty); + } break; - case NOKEY: /* nothing there */ - return; - case FKEY: /* function key, return string */ - if (cp = get_fstr((u_int)c, (u_int *)&len)) { - while (len-- > 0) - (*linesw[cur_tty->t_line].l_rint)(*cp++ & 0xFF, cur_tty); + case MKEY: /* meta is active, prepend ESC */ + (*linesw[cur_tty->t_line].l_rint)(0x1b, cur_tty); + (*linesw[cur_tty->t_line].l_rint)(c & 0xFF, cur_tty); + break; + case BKEY: /* backtab fixed sequence (esc [ Z) */ + (*linesw[cur_tty->t_line].l_rint)(0x1b, cur_tty); + (*linesw[cur_tty->t_line].l_rint)('[', cur_tty); + (*linesw[cur_tty->t_line].l_rint)('Z', cur_tty); + break; } - break; - case MKEY: /* meta is active, prepend ESC */ - (*linesw[cur_tty->t_line].l_rint)(0x1b, cur_tty); - (*linesw[cur_tty->t_line].l_rint)(c & 0xFF, cur_tty); - break; - case BKEY: /* backtab fixed sequence (esc [ Z) */ - (*linesw[cur_tty->t_line].l_rint)(0x1b, cur_tty); - (*linesw[cur_tty->t_line].l_rint)('[', cur_tty); - (*linesw[cur_tty->t_line].l_rint)('Z', cur_tty); - break; } + if (cur_console->status & MOUSE_ENABLED) { cur_console->status &= ~MOUSE_VISIBLE; remove_mouse_image(cur_console); @@ -1442,6 +1447,16 @@ scrn_timer() scr_stat *scp = cur_console; int s = spltty(); + /* + * With release 2.1 of the Xaccel server, the keyboard is left + * hanging pretty often. Apparently the interrupt from the + * keyboard is lost, and I don't know why (yet). + * This Ugly hack calls scintr if input is ready and + * conveniently hides the problem. XXX + */ + if (inb(KB_STAT) & KB_BUF_FULL) + scintr(0); + /* should we just return ? */ if ((scp->status&UNKNOWN_MODE) || blink_in_progress || switch_in_progress) { timeout((timeout_func_t)scrn_timer, 0, hz/10); @@ -2462,10 +2477,11 @@ scgetc(u_int flags) static u_int chr = 0; next_code: - kbd_wait(); - /* first see if there is something in the keyboard port */ - if (inb(KB_STAT) & KB_BUF_FULL) + /* check if there is anything in the keyboard buffer */ + if (inb(KB_STAT) & KB_BUF_FULL) { + DELAY(25); scancode = inb(KB_DATA); + } else if (flags & SCGETC_NONBLOCK) return(NOKEY); else @@ -2830,7 +2846,6 @@ next_code: console[0]->smode.mode == VT_AUTO) switch_scr(cur_console, 0); Debugger("manual escape to debugger"); - return(NOKEY); #else printf("No debugger in kernel\n"); #endif diff --git a/sys/isa/syscons.c b/sys/isa/syscons.c index c1579c7..e38ec37 100644 --- a/sys/isa/syscons.c +++ b/sys/isa/syscons.c @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: syscons.c,v 1.181 1996/10/23 07:29:43 pst Exp $ + * $Id: syscons.c,v 1.182 1996/10/26 20:16:58 sos Exp $ */ #include "sc.h" @@ -572,35 +572,40 @@ scintr(int unit) mark_all(cur_console); } - c = scgetc(SCGETC_NONBLOCK); + /* + * Loop while there is still input to get from the keyboard. + * I don't think this is nessesary, and it doesn't fix + * the Xaccel-2.1 keyboard hang, but it can't hurt. XXX + */ + while ((c = scgetc(SCGETC_NONBLOCK)) != NOKEY) { - cur_tty = VIRTUAL_TTY(get_scr_num()); - if (!(cur_tty->t_state & TS_ISOPEN)) - if (!((cur_tty = CONSOLE_TTY)->t_state & TS_ISOPEN)) - return; + cur_tty = VIRTUAL_TTY(get_scr_num()); + if (!(cur_tty->t_state & TS_ISOPEN)) + if (!((cur_tty = CONSOLE_TTY)->t_state & TS_ISOPEN)) + return; - switch (c & 0xff00) { - case 0x0000: /* normal key */ - (*linesw[cur_tty->t_line].l_rint)(c & 0xFF, cur_tty); + switch (c & 0xff00) { + case 0x0000: /* normal key */ + (*linesw[cur_tty->t_line].l_rint)(c & 0xFF, cur_tty); + break; + case FKEY: /* function key, return string */ + if (cp = get_fstr((u_int)c, (u_int *)&len)) { + while (len-- > 0) + (*linesw[cur_tty->t_line].l_rint)(*cp++ & 0xFF, cur_tty); + } break; - case NOKEY: /* nothing there */ - return; - case FKEY: /* function key, return string */ - if (cp = get_fstr((u_int)c, (u_int *)&len)) { - while (len-- > 0) - (*linesw[cur_tty->t_line].l_rint)(*cp++ & 0xFF, cur_tty); + case MKEY: /* meta is active, prepend ESC */ + (*linesw[cur_tty->t_line].l_rint)(0x1b, cur_tty); + (*linesw[cur_tty->t_line].l_rint)(c & 0xFF, cur_tty); + break; + case BKEY: /* backtab fixed sequence (esc [ Z) */ + (*linesw[cur_tty->t_line].l_rint)(0x1b, cur_tty); + (*linesw[cur_tty->t_line].l_rint)('[', cur_tty); + (*linesw[cur_tty->t_line].l_rint)('Z', cur_tty); + break; } - break; - case MKEY: /* meta is active, prepend ESC */ - (*linesw[cur_tty->t_line].l_rint)(0x1b, cur_tty); - (*linesw[cur_tty->t_line].l_rint)(c & 0xFF, cur_tty); - break; - case BKEY: /* backtab fixed sequence (esc [ Z) */ - (*linesw[cur_tty->t_line].l_rint)(0x1b, cur_tty); - (*linesw[cur_tty->t_line].l_rint)('[', cur_tty); - (*linesw[cur_tty->t_line].l_rint)('Z', cur_tty); - break; } + if (cur_console->status & MOUSE_ENABLED) { cur_console->status &= ~MOUSE_VISIBLE; remove_mouse_image(cur_console); @@ -1442,6 +1447,16 @@ scrn_timer() scr_stat *scp = cur_console; int s = spltty(); + /* + * With release 2.1 of the Xaccel server, the keyboard is left + * hanging pretty often. Apparently the interrupt from the + * keyboard is lost, and I don't know why (yet). + * This Ugly hack calls scintr if input is ready and + * conveniently hides the problem. XXX + */ + if (inb(KB_STAT) & KB_BUF_FULL) + scintr(0); + /* should we just return ? */ if ((scp->status&UNKNOWN_MODE) || blink_in_progress || switch_in_progress) { timeout((timeout_func_t)scrn_timer, 0, hz/10); @@ -2462,10 +2477,11 @@ scgetc(u_int flags) static u_int chr = 0; next_code: - kbd_wait(); - /* first see if there is something in the keyboard port */ - if (inb(KB_STAT) & KB_BUF_FULL) + /* check if there is anything in the keyboard buffer */ + if (inb(KB_STAT) & KB_BUF_FULL) { + DELAY(25); scancode = inb(KB_DATA); + } else if (flags & SCGETC_NONBLOCK) return(NOKEY); else @@ -2830,7 +2846,6 @@ next_code: console[0]->smode.mode == VT_AUTO) switch_scr(cur_console, 0); Debugger("manual escape to debugger"); - return(NOKEY); #else printf("No debugger in kernel\n"); #endif |