From 35777a2a79dec37cdacb86cac0e87e23465e2d7d Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Tue, 3 Apr 2007 01:21:10 +0000 Subject: [PATCH] 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. --- sys/dev/uart/uart_dev_ns8250.c | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/sys/dev/uart/uart_dev_ns8250.c b/sys/dev/uart/uart_dev_ns8250.c index 4e5141796d2..abe141b705a 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; + int limit; - /* 1/10th the time to transmit 1 character (estimate). */ - delay = ns8250_delay(bas); - - 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); }