aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/si
diff options
context:
space:
mode:
authorPeter Wemm <peter@FreeBSD.org>1996-07-26 13:47:38 +0000
committerPeter Wemm <peter@FreeBSD.org>1996-07-26 13:47:38 +0000
commit446fe15067f6a2f1c54b9c8612e02d729126949b (patch)
treebb02c50bf5eba2d6a6f4849e08c48c9334c4f1a0 /sys/dev/si
parent1cc933d27526112f99bf09679ae8a2b81e6863e2 (diff)
downloadsrc-446fe15067f6a2f1c54b9c8612e02d729126949b.tar.gz
src-446fe15067f6a2f1c54b9c8612e02d729126949b.zip
Apply a bandaid to a problem elsewhere in the driver, when the process is
blocked in a write() while waiting for the output to drain, sleep only for tp->t_timeout, not forever. This only seems to happen when there is either a modem lockup holding the hardware flow control down, or due to some problem in the driver with processes attempting to write after the modem has hung up (eg: elm, tf).
Notes
Notes: svn path=/head/; revision=17290
Diffstat (limited to 'sys/dev/si')
-rw-r--r--sys/dev/si/si.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/sys/dev/si/si.c b/sys/dev/si/si.c
index 71dcd53e55b6..650864f1eec0 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.46 1996/06/21 21:35:01 peter Exp $
+ * $Id: si.c,v 1.47 1996/06/30 04:56:05 peter Exp $
*/
#ifndef lint
@@ -1059,8 +1059,11 @@ siwrite(dev, uio, flag)
pp->sp_state |= SS_WAITWRITE;
DPRINT((pp, DBG_WRITE, "in siwrite, wait for SS_BLOCKWRITE to clear\n"));
if (error = ttysleep(tp, (caddr_t)pp, TTOPRI|PCATCH,
- "siwrite", 0))
+ "siwrite", tp->t_timeout)) {
+ if (error == ETIMEDOUT)
+ error = EIO;
goto out;
+ }
}
error = (*linesw[tp->t_line].l_write)(tp, uio, flag);