summaryrefslogtreecommitdiffstats
path: root/sys/dev/uart
diff options
context:
space:
mode:
authorsam <sam@FreeBSD.org>2008-03-12 19:09:20 +0000
committersam <sam@FreeBSD.org>2008-03-12 19:09:20 +0000
commit078a480e832ff2e17316580432aefc4fc0fb9fe5 (patch)
tree08dd20b0dcf8327aa908c2984f679f7911e00bd6 /sys/dev/uart
parent096789c286d69935923cf7878105b3163cb91512 (diff)
downloadFreeBSD-src-078a480e832ff2e17316580432aefc4fc0fb9fe5.zip
FreeBSD-src-078a480e832ff2e17316580432aefc4fc0fb9fe5.tar.gz
add device hints to control the rx FIFO interrupt level on 16550A parts
PR: kern/121421 Submitted by: UEMURA Tetsuya Reviewed by: marcel MFC after: 2 weeks
Diffstat (limited to 'sys/dev/uart')
-rw-r--r--sys/dev/uart/uart.h4
-rw-r--r--sys/dev/uart/uart_dev_ns8250.c15
2 files changed, 18 insertions, 1 deletions
diff --git a/sys/dev/uart/uart.h b/sys/dev/uart/uart.h
index bcb8cd8..ed980eb 100644
--- a/sys/dev/uart/uart.h
+++ b/sys/dev/uart/uart.h
@@ -74,6 +74,10 @@ extern struct uart_class uart_z8530_class __attribute__((weak));
*/
#define UART_FLAGS_CONSOLE(f) ((f) & 0x10)
#define UART_FLAGS_DBGPORT(f) ((f) & 0x80)
+#define UART_FLAGS_FCR_RX_LOW(f) ((f) & 0x100)
+#define UART_FLAGS_FCR_RX_MEDL(f) ((f) & 0x200)
+#define UART_FLAGS_FCR_RX_MEDH(f) ((f) & 0x400)
+#define UART_FLAGS_FCR_RX_HIGH(f) ((f) & 0x800)
/*
* Data parity values (magical numbers related to ns8250).
diff --git a/sys/dev/uart/uart_dev_ns8250.c b/sys/dev/uart/uart_dev_ns8250.c
index abe141b..d2a3dcf 100644
--- a/sys/dev/uart/uart_dev_ns8250.c
+++ b/sys/dev/uart/uart_dev_ns8250.c
@@ -382,11 +382,24 @@ ns8250_bus_attach(struct uart_softc *sc)
{
struct ns8250_softc *ns8250 = (struct ns8250_softc*)sc;
struct uart_bas *bas;
+ unsigned int ivar;
bas = &sc->sc_bas;
ns8250->mcr = uart_getreg(bas, REG_MCR);
- ns8250->fcr = FCR_ENABLE | FCR_RX_MEDH;
+ ns8250->fcr = FCR_ENABLE;
+ if (!resource_int_value("uart", device_get_unit(sc->sc_dev), "flags",
+ &ivar)) {
+ if (UART_FLAGS_FCR_RX_LOW(ivar))
+ ns8250->fcr |= FCR_RX_LOW;
+ else if (UART_FLAGS_FCR_RX_MEDL(ivar))
+ ns8250->fcr |= FCR_RX_MEDL;
+ else if (UART_FLAGS_FCR_RX_HIGH(ivar))
+ ns8250->fcr |= FCR_RX_HIGH;
+ else
+ ns8250->fcr |= FCR_RX_MEDH;
+ } else
+ ns8250->fcr |= FCR_RX_MEDH;
uart_setreg(bas, REG_FCR, ns8250->fcr);
uart_barrier(bas);
ns8250_bus_flush(sc, UART_FLUSH_RECEIVER|UART_FLUSH_TRANSMITTER);
OpenPOWER on IntegriCloud