summaryrefslogtreecommitdiffstats
path: root/sys/dev/uart/uart_dev_ns8250.c
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2007-04-03 01:21:10 +0000
committermarcel <marcel@FreeBSD.org>2007-04-03 01:21:10 +0000
commitcd78e19f8570ba9c7ad556f67ad1ac60bbdb59ac (patch)
tree2c12043ab23fa84e4fb5a75f863be90e1757d46f /sys/dev/uart/uart_dev_ns8250.c
parent993cec31de8c550802ff6e570b2bcf3c032339f6 (diff)
downloadFreeBSD-src-cd78e19f8570ba9c7ad556f67ad1ac60bbdb59ac.zip
FreeBSD-src-cd78e19f8570ba9c7ad556f67ad1ac60bbdb59ac.tar.gz
Don't use a time-limiting loop that's defined in terms of the baudrate
in the putc() method. Likewise, in the getc() method, don't check for received characters with an interval defined in terms of the baudrate. In both cases it works equally well to implement a fixed delay. More importantly, it avoids calculating a delay that's roughly 1/10th the time it takes to send/receive a character. The calculation is costly and happens for every character sent or received, affecting low-level console or debug port performance significantly. Secondly, when the RCLK is not available or unreliable, the delays could disrupt normal operation. The fixed delay is 1/10th the time it takes to send a character at 230400 bps.
Diffstat (limited to 'sys/dev/uart/uart_dev_ns8250.c')
-rw-r--r--sys/dev/uart/uart_dev_ns8250.c20
1 files changed, 7 insertions, 13 deletions
diff --git a/sys/dev/uart/uart_dev_ns8250.c b/sys/dev/uart/uart_dev_ns8250.c
index 4e51417..abe141b 100644
--- a/sys/dev/uart/uart_dev_ns8250.c
+++ b/sys/dev/uart/uart_dev_ns8250.c
@@ -285,19 +285,16 @@ ns8250_term(struct uart_bas *bas)
static void
ns8250_putc(struct uart_bas *bas, int c)
{
- int delay, limit;
-
- /* 1/10th the time to transmit 1 character (estimate). */
- delay = ns8250_delay(bas);
+ int limit;
- limit = 20;
+ limit = 250000;
while ((uart_getreg(bas, REG_LSR) & LSR_THRE) == 0 && --limit)
- DELAY(delay);
+ DELAY(4);
uart_setreg(bas, REG_DATA, c);
uart_barrier(bas);
- limit = 40;
+ limit = 250000;
while ((uart_getreg(bas, REG_LSR) & LSR_TEMT) == 0 && --limit)
- DELAY(delay);
+ DELAY(4);
}
static int
@@ -310,16 +307,13 @@ ns8250_rxready(struct uart_bas *bas)
static int
ns8250_getc(struct uart_bas *bas, struct mtx *hwmtx)
{
- int c, delay;
+ int c;
uart_lock(hwmtx);
- /* 1/10th the time to transmit 1 character (estimate). */
- delay = ns8250_delay(bas);
-
while ((uart_getreg(bas, REG_LSR) & LSR_RXRDY) == 0) {
uart_unlock(hwmtx);
- DELAY(delay);
+ DELAY(4);
uart_lock(hwmtx);
}
OpenPOWER on IntegriCloud