summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorbde <bde@FreeBSD.org>1997-02-01 16:04:16 +0000
committerbde <bde@FreeBSD.org>1997-02-01 16:04:16 +0000
commitae22a22184972581580a0a4c754d2eb05ca0d1a3 (patch)
tree0d3f41352023e51833df7384f209fc0f32f16b70 /sys
parent003c2e40f945367b2fa9a955bddb1e938e607cea (diff)
downloadFreeBSD-src-ae22a22184972581580a0a4c754d2eb05ca0d1a3.zip
FreeBSD-src-ae22a22184972581580a0a4c754d2eb05ca0d1a3.tar.gz
Fixed the SMC fifo bug fix. sioopen() hung while input was streaming in
with <= 100 usec between each character arrival time. This didn't happen until rev.1.75 of clock.c because DELAY(100) used to delay for closer to 80 usec than 100 usec, and the minimum time between character arrivals is 87.8 usec at the maximum supported speed of 115200 bps 8N1. Clear DCD timestamp flag on close (the input timestamp flag is already cleared).
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/sio/sio.c18
-rw-r--r--sys/i386/isa/sio.c18
-rw-r--r--sys/isa/sio.c18
3 files changed, 45 insertions, 9 deletions
diff --git a/sys/dev/sio/sio.c b/sys/dev/sio/sio.c
index 1f09168..a9de446 100644
--- a/sys/dev/sio/sio.c
+++ b/sys/dev/sio/sio.c
@@ -1078,11 +1078,22 @@ open_top:
outb(iobase + com_fifo,
FIFO_RCV_RST | FIFO_XMT_RST
| com->fifo_image);
- DELAY(100);
+ /*
+ * XXX the delays are for superstitious
+ * historical reasons. It must be less than
+ * the character time at the maximum
+ * supported speed (87 usec at 115200 bps
+ * 8N1). Otherwise we might loop endlessly
+ * if data is streaming in. We used to use
+ * delays of 100. That usually worked
+ * because DELAY(100) used to usually delay
+ * for about 85 usec instead of 100.
+ */
+ DELAY(50);
if (!(inb(com->line_status_port) & LSR_RXRDY))
break;
outb(iobase + com_fifo, 0);
- DELAY(100);
+ DELAY(50);
(void) inb(com->data_port);
}
}
@@ -1188,7 +1199,8 @@ comhardclose(com)
s = spltty();
com->poll = FALSE;
com->poll_output = FALSE;
- com->do_timestamp = 0;
+ com->do_timestamp = FALSE;
+ com->do_dcd_timestamp = FALSE;
outb(iobase + com_cfcr, com->cfcr_image &= ~CFCR_SBREAK);
{
outb(iobase + com_ier, 0);
diff --git a/sys/i386/isa/sio.c b/sys/i386/isa/sio.c
index 1f09168..a9de446 100644
--- a/sys/i386/isa/sio.c
+++ b/sys/i386/isa/sio.c
@@ -1078,11 +1078,22 @@ open_top:
outb(iobase + com_fifo,
FIFO_RCV_RST | FIFO_XMT_RST
| com->fifo_image);
- DELAY(100);
+ /*
+ * XXX the delays are for superstitious
+ * historical reasons. It must be less than
+ * the character time at the maximum
+ * supported speed (87 usec at 115200 bps
+ * 8N1). Otherwise we might loop endlessly
+ * if data is streaming in. We used to use
+ * delays of 100. That usually worked
+ * because DELAY(100) used to usually delay
+ * for about 85 usec instead of 100.
+ */
+ DELAY(50);
if (!(inb(com->line_status_port) & LSR_RXRDY))
break;
outb(iobase + com_fifo, 0);
- DELAY(100);
+ DELAY(50);
(void) inb(com->data_port);
}
}
@@ -1188,7 +1199,8 @@ comhardclose(com)
s = spltty();
com->poll = FALSE;
com->poll_output = FALSE;
- com->do_timestamp = 0;
+ com->do_timestamp = FALSE;
+ com->do_dcd_timestamp = FALSE;
outb(iobase + com_cfcr, com->cfcr_image &= ~CFCR_SBREAK);
{
outb(iobase + com_ier, 0);
diff --git a/sys/isa/sio.c b/sys/isa/sio.c
index 1f09168..a9de446 100644
--- a/sys/isa/sio.c
+++ b/sys/isa/sio.c
@@ -1078,11 +1078,22 @@ open_top:
outb(iobase + com_fifo,
FIFO_RCV_RST | FIFO_XMT_RST
| com->fifo_image);
- DELAY(100);
+ /*
+ * XXX the delays are for superstitious
+ * historical reasons. It must be less than
+ * the character time at the maximum
+ * supported speed (87 usec at 115200 bps
+ * 8N1). Otherwise we might loop endlessly
+ * if data is streaming in. We used to use
+ * delays of 100. That usually worked
+ * because DELAY(100) used to usually delay
+ * for about 85 usec instead of 100.
+ */
+ DELAY(50);
if (!(inb(com->line_status_port) & LSR_RXRDY))
break;
outb(iobase + com_fifo, 0);
- DELAY(100);
+ DELAY(50);
(void) inb(com->data_port);
}
}
@@ -1188,7 +1199,8 @@ comhardclose(com)
s = spltty();
com->poll = FALSE;
com->poll_output = FALSE;
- com->do_timestamp = 0;
+ com->do_timestamp = FALSE;
+ com->do_dcd_timestamp = FALSE;
outb(iobase + com_cfcr, com->cfcr_image &= ~CFCR_SBREAK);
{
outb(iobase + com_ier, 0);
OpenPOWER on IntegriCloud