svn commit: r259685 - in head/sys: arm/at91 dev/uart
Warner Losh
imp at FreeBSD.org
Sat Dec 21 16:23:32 UTC 2013
Author: imp
Date: Sat Dec 21 16:23:31 2013
New Revision: 259685
URL: http://svnweb.freebsd.org/changeset/base/259685
Log:
Plumb the cn_grab and cn_ungrab routines down into the uart
clients. Mask RX interrupts while grabbed on the atmel serial
driver. This UART interrupts every character. When interrupts are
enabled at the mountroot> prompt, this means the ISR eats the
characters. Rather than try to create a cooperative buffering system
for the low level kernel console, instead just mask out the ISR. For
NS8250 and decsendents this isn't needed, since interrupts only happen
after 14 or more characters (depending on the fifo settings). Plumb
such that these are optional so there's no change in behavior for all
the other UART clients. ddb worked on this platform because all
interrupts were disabled while it was running, so this problem wasn't
noticed. The mountroot> issue has been around for a very very long
time.
MFC after: 3 days
Modified:
head/sys/arm/at91/uart_dev_at91usart.c
head/sys/dev/uart/uart_cpu.h
head/sys/dev/uart/uart_tty.c
Modified: head/sys/arm/at91/uart_dev_at91usart.c
==============================================================================
--- head/sys/arm/at91/uart_dev_at91usart.c Sat Dec 21 15:40:36 2013 (r259684)
+++ head/sys/arm/at91/uart_dev_at91usart.c Sat Dec 21 16:23:31 2013 (r259685)
@@ -219,6 +219,20 @@ at91_usart_param(struct uart_bas *bas, i
return (0);
}
+static void
+at91_usart_grab(struct uart_bas *bas)
+{
+
+ WR4(bas, USART_IDR, USART_CSR_RXRDY);
+}
+
+static void
+at91_usart_ungrab(struct uart_bas *bas)
+{
+
+ WR4(bas, USART_IER, USART_CSR_RXRDY);
+}
+
static struct uart_ops at91_usart_ops = {
.probe = at91_usart_probe,
.init = at91_usart_init,
@@ -226,6 +240,8 @@ static struct uart_ops at91_usart_ops =
.putc = at91_usart_putc,
.rxready = at91_usart_rxready,
.getc = at91_usart_getc,
+ .grab = at91_usart_grab,
+ .ungrab = at91_usart_ungrab,
};
static int
Modified: head/sys/dev/uart/uart_cpu.h
==============================================================================
--- head/sys/dev/uart/uart_cpu.h Sat Dec 21 15:40:36 2013 (r259684)
+++ head/sys/dev/uart/uart_cpu.h Sat Dec 21 16:23:31 2013 (r259685)
@@ -43,6 +43,8 @@ struct uart_ops {
void (*putc)(struct uart_bas *, int);
int (*rxready)(struct uart_bas *);
int (*getc)(struct uart_bas *, struct mtx *);
+ void (*grab)(struct uart_bas *);
+ void (*ungrab)(struct uart_bas *);
};
extern bus_space_tag_t uart_bus_space_io;
@@ -135,6 +137,27 @@ uart_putc(struct uart_devinfo *di, int c
uart_unlock(di->hwmtx);
}
+static __inline void
+uart_grab(struct uart_devinfo *di)
+{
+
+ uart_lock(di->hwmtx);
+ if (di->ops->grab)
+ di->ops->grab(&di->bas);
+ uart_unlock(di->hwmtx);
+}
+
+static __inline void
+uart_ungrab(struct uart_devinfo *di)
+{
+
+ uart_lock(di->hwmtx);
+ if (di->ops->ungrab)
+ di->ops->ungrab(&di->bas);
+ uart_unlock(di->hwmtx);
+}
+
+
static __inline int
uart_rxready(struct uart_devinfo *di)
{
Modified: head/sys/dev/uart/uart_tty.c
==============================================================================
--- head/sys/dev/uart/uart_tty.c Sat Dec 21 15:40:36 2013 (r259684)
+++ head/sys/dev/uart/uart_tty.c Sat Dec 21 16:23:31 2013 (r259685)
@@ -112,11 +112,15 @@ uart_cnterm(struct consdev *cp)
static void
uart_cngrab(struct consdev *cp)
{
+
+ uart_grab(cp->cn_arg);
}
static void
uart_cnungrab(struct consdev *cp)
{
+
+ uart_ungrab(cp->cn_arg);
}
static void
More information about the svn-src-head
mailing list