diff options
author | ache <ache@FreeBSD.org> | 1995-06-28 17:58:14 +0000 |
---|---|---|
committer | ache <ache@FreeBSD.org> | 1995-06-28 17:58:14 +0000 |
commit | 6b90340edba96eb6b139fc853617c8e7cbb10e3c (patch) | |
tree | 1cd6a1bdc49b82335efe2594208e450776deb1a8 /sys/dev | |
parent | 2faa2338ab23cd434fc1088983c5bb56930235f1 (diff) | |
download | FreeBSD-src-6b90340edba96eb6b139fc853617c8e7cbb10e3c.zip FreeBSD-src-6b90340edba96eb6b139fc853617c8e7cbb10e3c.tar.gz |
Fight with hanging modems continued:
return EIO after t_timeout expired instead infinite looping in "siotx"
in comparam, consuming CPU time.
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/sio/sio.c | 9 |
1 files changed, 8 insertions, 1 deletions
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(); |