Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 12 Apr 2012 18:46:48 +0000 (UTC)
From:      Peter Grehan <grehan@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r234194 - head/sys/dev/uart
Message-ID:  <201204121846.q3CIkm15041383@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: grehan
Date: Thu Apr 12 18:46:48 2012
New Revision: 234194
URL: http://svn.freebsd.org/changeset/base/234194

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

Modified:
  head/sys/dev/uart/uart_bus.h
  head/sys/dev/uart/uart_core.c
  head/sys/dev/uart/uart_if.m

Modified: head/sys/dev/uart/uart_bus.h
==============================================================================
--- head/sys/dev/uart/uart_bus.h	Thu Apr 12 18:06:30 2012	(r234193)
+++ head/sys/dev/uart/uart_bus.h	Thu Apr 12 18:46:48 2012	(r234194)
@@ -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. */

Modified: head/sys/dev/uart/uart_core.c
==============================================================================
--- head/sys/dev/uart/uart_core.c	Thu Apr 12 18:06:30 2012	(r234193)
+++ head/sys/dev/uart/uart_core.c	Thu Apr 12 18:46:48 2012	(r234194)
@@ -58,6 +58,12 @@ SLIST_HEAD(uart_devinfo_list, uart_devin
 
 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;

Modified: head/sys/dev/uart/uart_if.m
==============================================================================
--- head/sys/dev/uart/uart_if.m	Thu Apr 12 18:06:30 2012	(r234193)
+++ head/sys/dev/uart/uart_if.m	Thu Apr 12 18:46:48 2012	(r234194)
@@ -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>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201204121846.q3CIkm15041383>