summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1996-05-05 17:35:19 +0000
committerpeter <peter@FreeBSD.org>1996-05-05 17:35:19 +0000
commit535c447feae73d7f12f66ce75a0f8037b1a56d8f (patch)
tree36004e0ce832bfe93e23df91eb9c6c564dc9aa76
parent9785128d44ffe2d45a73db37a7fbcf2ae751baa6 (diff)
downloadFreeBSD-src-535c447feae73d7f12f66ce75a0f8037b1a56d8f.zip
FreeBSD-src-535c447feae73d7f12f66ce75a0f8037b1a56d8f.tar.gz
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.
-rw-r--r--sys/dev/si/si.c19
-rw-r--r--sys/i386/isa/si.c19
2 files changed, 30 insertions, 8 deletions
diff --git a/sys/dev/si/si.c b/sys/dev/si/si.c
index e60a087..a607fdd 100644
--- a/sys/dev/si/si.c
+++ b/sys/dev/si/si.c
@@ -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
@@ -1891,16 +1891,27 @@ siintr(int unit)
}
/*
- * Process read characters if not skipped above
+ * If the tty input buffers are blocked, stop emptying
+ * the incoming buffers and let the auto flow control
+ * assert..
*/
- c = ccbp->hi_rxipos - ccbp->hi_rxopos;
- if (c == 0) {
+ if (tp->t_state & TS_TBLOCK) {
goto end_rx;
}
+ /*
+ * Process read characters if not skipped above
+ */
op = ccbp->hi_rxopos;
ip = ccbp->hi_rxipos;
+ c = ip - op;
+ if (c == 0) {
+ goto end_rx;
+ }
+
n = c & 0xff;
+ if (n > 250)
+ n = 250;
DPRINT((pp, DBG_INTR, "n = %d, op = %d, ip = %d\n",
n, op, ip));
diff --git a/sys/i386/isa/si.c b/sys/i386/isa/si.c
index e60a087..a607fdd 100644
--- a/sys/i386/isa/si.c
+++ b/sys/i386/isa/si.c
@@ -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
@@ -1891,16 +1891,27 @@ siintr(int unit)
}
/*
- * Process read characters if not skipped above
+ * If the tty input buffers are blocked, stop emptying
+ * the incoming buffers and let the auto flow control
+ * assert..
*/
- c = ccbp->hi_rxipos - ccbp->hi_rxopos;
- if (c == 0) {
+ if (tp->t_state & TS_TBLOCK) {
goto end_rx;
}
+ /*
+ * Process read characters if not skipped above
+ */
op = ccbp->hi_rxopos;
ip = ccbp->hi_rxipos;
+ c = ip - op;
+ if (c == 0) {
+ goto end_rx;
+ }
+
n = c & 0xff;
+ if (n > 250)
+ n = 250;
DPRINT((pp, DBG_INTR, "n = %d, op = %d, ip = %d\n",
n, op, ip));
OpenPOWER on IntegriCloud