Change the logic of the interrupt/poll loop. It no longer loops until

it empties all of the 256 byte incoming fifo, as it can spend more time
processing one port than intended, especially if data is streaming in
at 115.2K.  The port fifo will be emptied and dumped into the tty system
and left until next time.  I've been running this for quite some time on
one of my systems here.
Also, if the tty layer is blocked or full it lets the hardware assert the
flow control rather than loosing the data.
This commit is contained in:
peter 1996-05-05 17:35:19 +00:00
parent 12530a6f0d
commit 87bc074d95
2 changed files with 30 additions and 8 deletions

View File

@ -30,7 +30,7 @@
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL THE AUTHORS BE LIABLE.
*
* $Id: si.c,v 1.37 1996/03/28 14:28:51 scrappy Exp $
* $Id: si.c,v 1.38 1996/05/05 17:09:04 peter Exp $
*/
#ifndef lint
@ -1890,17 +1890,28 @@ siintr(int unit)
goto end_rx;
}
/*
* If the tty input buffers are blocked, stop emptying
* the incoming buffers and let the auto flow control
* assert..
*/
if (tp->t_state & TS_TBLOCK) {
goto end_rx;
}
/*
* Process read characters if not skipped above
*/
c = ccbp->hi_rxipos - ccbp->hi_rxopos;
op = ccbp->hi_rxopos;
ip = ccbp->hi_rxipos;
c = ip - op;
if (c == 0) {
goto end_rx;
}
op = ccbp->hi_rxopos;
ip = ccbp->hi_rxipos;
n = c & 0xff;
if (n > 250)
n = 250;
DPRINT((pp, DBG_INTR, "n = %d, op = %d, ip = %d\n",
n, op, ip));

View File

@ -30,7 +30,7 @@
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL THE AUTHORS BE LIABLE.
*
* $Id: si.c,v 1.37 1996/03/28 14:28:51 scrappy Exp $
* $Id: si.c,v 1.38 1996/05/05 17:09:04 peter Exp $
*/
#ifndef lint
@ -1890,17 +1890,28 @@ siintr(int unit)
goto end_rx;
}
/*
* If the tty input buffers are blocked, stop emptying
* the incoming buffers and let the auto flow control
* assert..
*/
if (tp->t_state & TS_TBLOCK) {
goto end_rx;
}
/*
* Process read characters if not skipped above
*/
c = ccbp->hi_rxipos - ccbp->hi_rxopos;
op = ccbp->hi_rxopos;
ip = ccbp->hi_rxipos;
c = ip - op;
if (c == 0) {
goto end_rx;
}
op = ccbp->hi_rxopos;
ip = ccbp->hi_rxipos;
n = c & 0xff;
if (n > 250)
n = 250;
DPRINT((pp, DBG_INTR, "n = %d, op = %d, ip = %d\n",
n, op, ip));