summaryrefslogtreecommitdiffstats
path: root/sys/dev/uart
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/uart')
-rw-r--r--sys/dev/uart/uart_bus_fdt.c19
-rw-r--r--sys/dev/uart/uart_cpu_amd64.c4
-rw-r--r--sys/dev/uart/uart_cpu_i386.c4
-rw-r--r--sys/dev/uart/uart_cpu_pc98.c4
-rw-r--r--sys/dev/uart/uart_tty.c15
5 files changed, 27 insertions, 19 deletions
diff --git a/sys/dev/uart/uart_bus_fdt.c b/sys/dev/uart/uart_bus_fdt.c
index 27809ce..f8204b1 100644
--- a/sys/dev/uart/uart_bus_fdt.c
+++ b/sys/dev/uart/uart_bus_fdt.c
@@ -140,6 +140,15 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
u_long start, size;
int err;
+ uart_bus_space_mem = fdtbus_bs_tag;
+ uart_bus_space_io = NULL;
+
+ /* Allow overriding the FDT uning the environment. */
+ class = &uart_ns8250_class;
+ err = uart_getenv(devtype, di, class);
+ if (!err)
+ return (0);
+
if (devtype != UART_DEV_CONSOLE)
return (ENXIO);
@@ -183,18 +192,12 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
di->databits = 8;
di->stopbits = 1;
di->parity = UART_PARITY_NONE;
- di->bas.bst = fdtbus_bs_tag;
+ di->bas.bst = uart_bus_space_mem;
err = fdt_regsize(node, &start, &size);
if (err)
return (ENXIO);
start += fdt_immr_va;
- uart_bus_space_mem = fdtbus_bs_tag;
- uart_bus_space_io = NULL;
-
- if (bus_space_map(di->bas.bst, start, size, 0, &di->bas.bsh) != 0)
- return (ENXIO);
-
- return (0);
+ return (bus_space_map(di->bas.bst, start, size, 0, &di->bas.bsh));
}
diff --git a/sys/dev/uart/uart_cpu_amd64.c b/sys/dev/uart/uart_cpu_amd64.c
index 3624f79..ce9cf7d 100644
--- a/sys/dev/uart/uart_cpu_amd64.c
+++ b/sys/dev/uart/uart_cpu_amd64.c
@@ -36,8 +36,8 @@ __FBSDID("$FreeBSD$");
#include <dev/uart/uart.h>
#include <dev/uart/uart_cpu.h>
-bus_space_tag_t uart_bus_space_io = AMD64_BUS_SPACE_IO;
-bus_space_tag_t uart_bus_space_mem = AMD64_BUS_SPACE_MEM;
+bus_space_tag_t uart_bus_space_io = X86_BUS_SPACE_IO;
+bus_space_tag_t uart_bus_space_mem = X86_BUS_SPACE_MEM;
int
uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
diff --git a/sys/dev/uart/uart_cpu_i386.c b/sys/dev/uart/uart_cpu_i386.c
index 0d0f0f7..ce9cf7d 100644
--- a/sys/dev/uart/uart_cpu_i386.c
+++ b/sys/dev/uart/uart_cpu_i386.c
@@ -36,8 +36,8 @@ __FBSDID("$FreeBSD$");
#include <dev/uart/uart.h>
#include <dev/uart/uart_cpu.h>
-bus_space_tag_t uart_bus_space_io = I386_BUS_SPACE_IO;
-bus_space_tag_t uart_bus_space_mem = I386_BUS_SPACE_MEM;
+bus_space_tag_t uart_bus_space_io = X86_BUS_SPACE_IO;
+bus_space_tag_t uart_bus_space_mem = X86_BUS_SPACE_MEM;
int
uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
diff --git a/sys/dev/uart/uart_cpu_pc98.c b/sys/dev/uart/uart_cpu_pc98.c
index fc50fa5..c211b3d 100644
--- a/sys/dev/uart/uart_cpu_pc98.c
+++ b/sys/dev/uart/uart_cpu_pc98.c
@@ -37,8 +37,8 @@ __FBSDID("$FreeBSD$");
#include <dev/uart/uart.h>
#include <dev/uart/uart_cpu.h>
-bus_space_tag_t uart_bus_space_io = I386_BUS_SPACE_IO;
-bus_space_tag_t uart_bus_space_mem = I386_BUS_SPACE_MEM;
+bus_space_tag_t uart_bus_space_io = X86_BUS_SPACE_IO;
+bus_space_tag_t uart_bus_space_mem = X86_BUS_SPACE_MEM;
static struct {
u_long iobase;
diff --git a/sys/dev/uart/uart_tty.c b/sys/dev/uart/uart_tty.c
index f306af5..2170108 100644
--- a/sys/dev/uart/uart_tty.c
+++ b/sys/dev/uart/uart_tty.c
@@ -168,6 +168,14 @@ uart_tty_outwakeup(struct tty *tp)
if (sc->sc_txbusy)
return;
+ /*
+ * Respect RTS/CTS (output) flow control if enabled and not already
+ * handled by hardware.
+ */
+ if ((tp->t_termios.c_cflag & CCTS_OFLOW) && !sc->sc_hwoflow &&
+ !(sc->sc_hwsig & SER_CTS))
+ return;
+
sc->sc_txdatasz = ttydisc_getc(tp, sc->sc_txbuf, sc->sc_txfifosz);
if (sc->sc_txdatasz != 0)
UART_TRANSMIT(sc);
@@ -315,11 +323,8 @@ uart_tty_intr(void *arg)
sig = pend & SER_INT_SIGMASK;
if (sig & SER_DDCD)
ttydisc_modem(tp, sig & SER_DCD);
- if ((sig & SER_DCTS) && (tp->t_termios.c_cflag & CCTS_OFLOW) &&
- !sc->sc_hwoflow) {
- if (sig & SER_CTS)
- uart_tty_outwakeup(tp);
- }
+ if (sig & SER_DCTS)
+ uart_tty_outwakeup(tp);
}
if (pend & SER_INT_TXIDLE)
OpenPOWER on IntegriCloud