svn commit: r259685 - in head/sys: arm/at91 dev/uart

Ganbold Tsagaankhuu ganbold at gmail.com
Sun Dec 22 09:28:24 UTC 2013


On Sun, Dec 22, 2013 at 12:23 AM, Warner Losh <imp at freebsd.org> wrote:

> 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
>


There is PR "kern/184919: uart infrastructure missing console grab / ungrab
hooks", maybe that one should be closed.

Ganbold




>
> 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-all mailing list