From 6b90340edba96eb6b139fc853617c8e7cbb10e3c Mon Sep 17 00:00:00 2001 From: ache Date: Wed, 28 Jun 1995 17:58:14 +0000 Subject: Fight with hanging modems continued: return EIO after t_timeout expired instead infinite looping in "siotx" in comparam, consuming CPU time. --- sys/dev/sio/sio.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'sys/dev') diff --git a/sys/dev/sio/sio.c b/sys/dev/sio/sio.c index 50719aa..558f115 100644 --- a/sys/dev/sio/sio.c +++ b/sys/dev/sio/sio.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * from: @(#)com.c 7.5 (Berkeley) 5/16/91 - * $Id: sio.c,v 1.99 1995/05/30 08:03:06 rgrimes Exp $ + * $Id: sio.c,v 1.100 1995/06/25 04:51:01 bde Exp $ */ #include "sio.h" @@ -1651,6 +1651,7 @@ comparam(tp, t) Port_t iobase; int s; int unit; + int txtimeout; /* do historical conversions */ if (t->c_ispeed == 0) @@ -1720,11 +1721,17 @@ comparam(tp, t) disable_intr(); retry: com->state &= ~CS_TTGO; + txtimeout = tp->t_timeout; enable_intr(); while ((inb(com->line_status_port) & (LSR_TSRE | LSR_TXRDY)) != (LSR_TSRE | LSR_TXRDY)) { error = ttysleep(tp, TSA_OCOMPLETE(tp), TTIPRI | PCATCH, "siotx", hz / 100); + if ( txtimeout != 0 + && (!error || error == EAGAIN) + && (txtimeout -= hz / 100) <= 0 + ) + error = EIO; if (error != 0 && error != EAGAIN) { if (!(tp->t_state & TS_TTSTOP)) { disable_intr(); -- cgit v1.1