svn commit: r365480 - in stable: 11/sys/dev/uart 12/sys/dev/uart

John Baldwin jhb at FreeBSD.org
Tue Sep 8 22:50:26 UTC 2020


Author: jhb
Date: Tue Sep  8 22:50:24 2020
New Revision: 365480
URL: https://svnweb.freebsd.org/changeset/base/365480

Log:
  MFC 359900: Export a sysctl count of RX FIFO overrun events.
  
  uart(4) backends currently detect RX FIFO overrun errors and report
  them to the uart(4) core layer.  They are then reported to the generic
  TTY layer which promptly ignores them.  As a result, there is
  currently no good way to determine if a uart is experiencing RX FIFO
  overruns.  One could add a generic per-tty counter, but there did not
  appear to be a good way to export those.  Instead, add a sysctl under
  the uart(4) sysctl tree to export the count of overruns.

Modified:
  stable/11/sys/dev/uart/uart_bus.h
  stable/11/sys/dev/uart/uart_core.c
Directory Properties:
  stable/11/   (props changed)

Changes in other areas also in this revision:
Modified:
  stable/12/sys/dev/uart/uart_bus.h
  stable/12/sys/dev/uart/uart_core.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/11/sys/dev/uart/uart_bus.h
==============================================================================
--- stable/11/sys/dev/uart/uart_bus.h	Tue Sep  8 22:42:41 2020	(r365479)
+++ stable/11/sys/dev/uart/uart_bus.h	Tue Sep  8 22:50:24 2020	(r365480)
@@ -108,6 +108,7 @@ struct uart_softc {
 	int		sc_rxput;
 	int		sc_rxget;
 	int		sc_rxfifosz;	/* Size of RX FIFO. */
+	int		sc_rxoverruns;
 
 	/* Transmitter data. */
 	uint8_t		*sc_txbuf;

Modified: stable/11/sys/dev/uart/uart_core.c
==============================================================================
--- stable/11/sys/dev/uart/uart_core.c	Tue Sep  8 22:42:41 2020	(r365479)
+++ stable/11/sys/dev/uart/uart_core.c	Tue Sep  8 22:50:24 2020	(r365480)
@@ -327,6 +327,7 @@ uart_intr_overrun(void *arg)
 			sc->sc_rxbuf[sc->sc_rxput] = UART_STAT_OVERRUN;
 		uart_sched_softih(sc, SER_INT_RXREADY);
 	}
+	sc->sc_rxoverruns++;
 	UART_FLUSH(sc, UART_FLUSH_RECEIVER);
 	return (0);
 }
@@ -735,6 +736,12 @@ uart_bus_attach(device_t dev)
 
 	if (sc->sc_sysdev != NULL)
 		sc->sc_sysdev->hwmtx = sc->sc_hwmtx;
+
+	if (sc->sc_rxfifosz > 1)
+		SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
+		    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO,
+		    "rx_overruns", CTLFLAG_RD, &sc->sc_rxoverruns, 0,
+		    "Receive overruns");
 
 	return (0);
 


More information about the svn-src-all mailing list