svn commit: r259748 - releng/10.0/sys/arm/at91

Warner Losh imp at FreeBSD.org
Sun Dec 22 22:31:40 UTC 2013


Author: imp
Date: Sun Dec 22 22:31:39 2013
New Revision: 259748
URL: http://svnweb.freebsd.org/changeset/base/259748

Log:
  Direct commit: not relevant to other branches.
  
  Fix mountroot> prompt eating most of the characters by not enabling
  RXRDY interrupts in the attach routine. Instead, defer this until the
  first interrupt we see after the device is opened. Given the console
  use case, we're guaranteed to get a TXRDY interrupt before any reads
  are posted due to boot messages, which makes this work.
  
  The real fix is to use cngrab/cnungrab function pointers to disable
  RXRDY interrupts while grabbed. However, that touches the MI uart
  code, so was disallowed for 10.0 due to the lateness of the hour this
  fix was proposed. It works for mountroot, the most common atmel kernel
  prompt use cases, but wouldn't work for GELI since it prompts later in
  the boot process.
  
  Approved by:	re@ (gjb@)

Modified:
  releng/10.0/sys/arm/at91/uart_dev_at91usart.c

Modified: releng/10.0/sys/arm/at91/uart_dev_at91usart.c
==============================================================================
--- releng/10.0/sys/arm/at91/uart_dev_at91usart.c	Sun Dec 22 22:24:17 2013	(r259747)
+++ releng/10.0/sys/arm/at91/uart_dev_at91usart.c	Sun Dec 22 22:31:39 2013	(r259748)
@@ -72,6 +72,7 @@ struct at91_usart_softc {
 	uint32_t flags;
 #define	HAS_TIMEOUT		0x1
 #define	USE_RTS0_WORKAROUND	0x2
+#define	NEEDS_RXRDY		0x4
 	bus_dma_tag_t rx_tag;
 	struct at91_usart_rx ping_pong[2];
 	struct at91_usart_rx *ping;
@@ -490,7 +491,13 @@ at91_usart_bus_attach(struct uart_softc 
 		WR4(&sc->sc_bas, USART_IER, USART_CSR_TIMEOUT |
 		    USART_CSR_RXBUFF | USART_CSR_ENDRX);
 	} else {
-		WR4(&sc->sc_bas, USART_IER, USART_CSR_RXRDY);
+		/*
+		 * Defer turning on the RXRDY bit until we're opened. This is to make the
+		 * mountroot prompt work before we've opened the console. This is a workaround
+		 * for not being able to change the UART interface for the 10.0 release.
+		 */
+		atsc->flags |= NEEDS_RXRDY;
+		/* WR4(&sc->sc_bas, USART_IER, USART_CSR_RXRDY); */
 	}
 	WR4(&sc->sc_bas, USART_IER, USART_CSR_RXBRK | USART_DCE_CHANGE_BITS);
 
@@ -612,6 +619,12 @@ at91_usart_bus_ipend(struct uart_softc *
 	uart_lock(sc->sc_hwmtx);
 	csr = RD4(&sc->sc_bas, USART_CSR);
 
+	/* Kludge -- Enable the RXRDY we deferred in attach */
+	if (sc->sc_opened && (atsc->flags & NEEDS_RXRDY)) {
+		WR4(&sc->sc_bas, USART_IER, USART_CSR_RXRDY);
+		atsc->flags &= ~NEEDS_RXRDY;
+	}
+	
 	if (csr & USART_CSR_OVRE) {
 		WR4(&sc->sc_bas, USART_CR, USART_CR_RSTSTA);
 		ipend |= SER_INT_OVERRUN;


More information about the svn-src-all mailing list