Complete polled-mode operation by using a callout if the device will be

used in polled-mode. The callout invokes uart_intr, which rearms the timeout.
Implemented for bhyve, but generically useful for e.g. embedded bringup
when the interrupt controller hasn't been setup, or if it's not deemed
worthy to wire an interrupt line from a serial port.

Submitted by:	neel
Reviewed by:	marcel
Obtained from:	NetApp
MFC after:	3 weeks
This commit is contained in:
grehan 2012-04-12 18:46:48 +00:00
parent 4a73b11710
commit 476cf9ae6e
3 changed files with 16 additions and 1 deletions

@ -87,6 +87,7 @@ struct uart_softc {
struct resource *sc_ires; /* Interrupt resource. */
void *sc_icookie;
int sc_irid;
struct callout sc_timer;
int sc_callout:1; /* This UART is opened for callout. */
int sc_fastintr:1; /* This UART uses fast interrupts. */

@ -58,6 +58,12 @@ SLIST_HEAD(uart_devinfo_list, uart_devinfo) uart_sysdevs =
static MALLOC_DEFINE(M_UART, "UART", "UART driver");
#ifndef UART_POLL_FREQ
#define UART_POLL_FREQ 50
#endif
static int uart_poll_freq = UART_POLL_FREQ;
TUNABLE_INT("debug.uart_poll_freq", &uart_poll_freq);
void
uart_add_sysdev(struct uart_devinfo *di)
{
@ -257,6 +263,12 @@ uart_intr(void *arg)
if (ipend & SER_INT_TXIDLE)
uart_intr_txidle(sc);
}
if (sc->sc_polled) {
callout_reset(&sc->sc_timer, hz / uart_poll_freq,
(timeout_t *)uart_intr, sc);
}
return((flag)?FILTER_HANDLED:FILTER_STRAY);
}
@ -440,8 +452,9 @@ uart_bus_attach(device_t dev)
}
}
if (sc->sc_ires == NULL) {
/* XXX no interrupt resource. Force polled mode. */
/* No interrupt resource. Force polled mode. */
sc->sc_polled = 1;
callout_init(&sc->sc_timer, 1);
}
sc->sc_rxbufsz = 384;

@ -26,6 +26,7 @@
# $FreeBSD$
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/bus.h>