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:
parent
12530a6f0d
commit
87bc074d95
@ -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));
|
||||
|
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user