diff options
author | cognet <cognet@FreeBSD.org> | 2006-07-20 21:03:43 +0000 |
---|---|---|
committer | cognet <cognet@FreeBSD.org> | 2006-07-20 21:03:43 +0000 |
commit | 83a16c40491c60c386bdea2ef302f1c8a866b651 (patch) | |
tree | 37e0f76c158ead5d5a34ae9f1508eaf0341bf5b7 /sys/arm/at91 | |
parent | 70fe8b72794c098354c508524bb2659d1e34b35f (diff) | |
download | FreeBSD-src-83a16c40491c60c386bdea2ef302f1c8a866b651.zip FreeBSD-src-83a16c40491c60c386bdea2ef302f1c8a866b651.tar.gz |
Fix ALT_BREAK_TO_DEBUGGER on the AT91 :
The core uart code expects the receive method to actually puts the
characters read into its buffers. For AT91, it's done in the ipend routine,
so also check if we have the alternate break sequence here.
MFC after: 3 days
Diffstat (limited to 'sys/arm/at91')
-rw-r--r-- | sys/arm/at91/uart_dev_at91usart.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/sys/arm/at91/uart_dev_at91usart.c b/sys/arm/at91/uart_dev_at91usart.c index 2eb3a7a..eedcaaa 100644 --- a/sys/arm/at91/uart_dev_at91usart.c +++ b/sys/arm/at91/uart_dev_at91usart.c @@ -28,6 +28,8 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); +#include "opt_comconsole.h" + #include <sys/param.h> #include <sys/systm.h> #include <sys/bus.h> @@ -492,6 +494,19 @@ at91_usart_bus_param(struct uart_softc *sc, int baudrate, int databits, return (at91_usart_param(&sc->sc_bas, baudrate, databits, stopbits, parity)); } + +static __inline void +at91_rx_put(struct uart_softc *sc, int key) +{ +#if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) + if (sc->sc_sysdev != NULL && sc->sc_sysdev->type == UART_DEV_CONSOLE) { + if (kdb_alt_break(key, &sc->sc_altbrk)) + kdb_enter("Break sequence to console"); + } +#endif + uart_rx_put(sc, key); +} + static int at91_usart_bus_ipend(struct uart_softc *sc) { @@ -534,9 +549,9 @@ at91_usart_bus_ipend(struct uart_softc *sc) bus_dmamap_sync(atsc->dmatag, atsc->pong->map, BUS_DMASYNC_POSTREAD); for (i = 0; i < sc->sc_rxfifosz; i++) - uart_rx_put(sc, atsc->ping->buffer[i]); + at91_rx_put(sc, atsc->ping->buffer[i]); for (i = 0; i < sc->sc_rxfifosz; i++) - uart_rx_put(sc, atsc->pong->buffer[i]); + at91_rx_put(sc, atsc->pong->buffer[i]); uart_rx_put(sc, UART_STAT_OVERRUN); csr &= ~(USART_CSR_ENDRX | USART_CSR_TIMEOUT); WR4(&sc->sc_bas, PDC_RPR, atsc->ping->pa); @@ -554,7 +569,7 @@ at91_usart_bus_ipend(struct uart_softc *sc) bus_dmamap_sync(atsc->dmatag, atsc->ping->map, BUS_DMASYNC_POSTREAD); for (i = 0; i < sc->sc_rxfifosz; i++) - uart_rx_put(sc, atsc->ping->buffer[i]); + at91_rx_put(sc, atsc->ping->buffer[i]); p = atsc->ping; atsc->ping = atsc->pong; atsc->pong = p; @@ -574,7 +589,7 @@ at91_usart_bus_ipend(struct uart_softc *sc) BUS_DMASYNC_POSTREAD); len = sc->sc_rxfifosz - RD4(&sc->sc_bas, PDC_RCR); for (i = 0; i < len; i++) - uart_rx_put(sc, atsc->ping->buffer[i]); + at91_rx_put(sc, atsc->ping->buffer[i]); WR4(&sc->sc_bas, PDC_RPR, atsc->ping->pa); WR4(&sc->sc_bas, PDC_RCR, sc->sc_rxfifosz); WR4(&sc->sc_bas, USART_CR, USART_CR_STTTO); @@ -584,7 +599,7 @@ at91_usart_bus_ipend(struct uart_softc *sc) if (!(atsc->flags & HAS_TIMEOUT) && (csr & USART_CSR_RXRDY)) { // We have another charater in a device that doesn't support // timeouts, so we do it one character at a time. - uart_rx_put(sc, RD4(&sc->sc_bas, USART_RHR) & 0xff); + at91_rx_put(sc, RD4(&sc->sc_bas, USART_RHR) & 0xff); ipend |= SER_INT_RXREADY; } |