From owner-svn-src-all@FreeBSD.ORG Sun Dec 22 09:28:24 2013 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 082A78AE; Sun, 22 Dec 2013 09:28:24 +0000 (UTC) Received: from mail-ie0-x230.google.com (mail-ie0-x230.google.com [IPv6:2607:f8b0:4001:c03::230]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id AA4C91E78; Sun, 22 Dec 2013 09:28:23 +0000 (UTC) Received: by mail-ie0-f176.google.com with SMTP id at1so4757425iec.7 for ; Sun, 22 Dec 2013 01:28:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=itRTe3CRN/X2DrHBi/V9Q+Oh7TqElJQ7nzB9Kd4EV14=; b=BL9i2d/dhH96WOjJpndKmwTKtET5MML+76Nk1fJvu9aR3Jd8FSrOZawRfRd+XhnFLt MrV9HuJUQ50CRg7XbZqro80JPYm7HxDhC2suzQFHpRB30OE6f3Zr/o91k4nuaUi5GoA5 wBuj+9YXqAo1PU4Notr3Ig+GnBZV2nimPdcI7NUxFNf9p6i0yDMIZo0Izp0mPAy6u+6d W2SLhZ6UP8iZUgE42SWpvQLgoxzctkJBAQn0yx51Drqws9Nbp79Iw3ZVeTUfbLxoAfZC 2z8WENDeWPInbhkOCN4QX+tJOhkhHTmtwo/rxIu4nJTjNQ2nofiPGauCprsi00asU2w+ wbVg== MIME-Version: 1.0 X-Received: by 10.42.226.66 with SMTP id iv2mr12450874icb.11.1387704503047; Sun, 22 Dec 2013 01:28:23 -0800 (PST) Received: by 10.64.18.14 with HTTP; Sun, 22 Dec 2013 01:28:22 -0800 (PST) In-Reply-To: <201312211623.rBLGNVaq008807@svn.freebsd.org> References: <201312211623.rBLGNVaq008807@svn.freebsd.org> Date: Sun, 22 Dec 2013 17:28:22 +0800 Message-ID: Subject: Re: svn commit: r259685 - in head/sys: arm/at91 dev/uart From: Ganbold Tsagaankhuu To: Warner Losh Content-Type: text/plain; charset=ISO-8859-1 X-Content-Filtered-By: Mailman/MimeDel 2.1.17 Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 22 Dec 2013 09:28:24 -0000 On Sun, Dec 22, 2013 at 12:23 AM, Warner Losh 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 >