PERFORCE change 38200 for review

Sam Leffler sam at FreeBSD.org
Wed Sep 17 15:03:53 PDT 2003


http://perforce.freebsd.org/chv.cgi?CH=38200

Change 38200 by sam at sam_ebb on 2003/09/17 15:03:43

	IFC

Affected files ...

.. //depot/projects/netperf/sys/crypto/rijndael/rijndael-api-fst.c#2 integrate
.. //depot/projects/netperf/sys/dev/acpica/acpi_pci.c#3 integrate
.. //depot/projects/netperf/sys/dev/pci/pci.c#7 integrate
.. //depot/projects/netperf/sys/dev/pci/pci_private.h#3 integrate
.. //depot/projects/netperf/sys/dev/sio/sio.c#5 integrate
.. //depot/projects/netperf/sys/dev/sound/isa/uartsio.c#3 integrate
.. //depot/projects/netperf/sys/dev/uart/uart_bus.h#2 integrate
.. //depot/projects/netperf/sys/dev/uart/uart_core.c#2 integrate
.. //depot/projects/netperf/sys/dev/uart/uart_dev_i8251.c#2 integrate
.. //depot/projects/netperf/sys/dev/uart/uart_dev_ns8250.c#2 integrate
.. //depot/projects/netperf/sys/dev/uart/uart_dev_sab82532.c#2 integrate
.. //depot/projects/netperf/sys/dev/uart/uart_dev_z8530.c#2 integrate
.. //depot/projects/netperf/sys/dev/uart/uart_if.m#2 integrate
.. //depot/projects/netperf/sys/i386/acpica/acpi_machdep.c#4 integrate
.. //depot/projects/netperf/sys/isa/fd.c#4 integrate
.. //depot/projects/netperf/sys/modules/uart/Makefile#2 integrate
.. //depot/projects/netperf/sys/net/bridge.c#8 integrate
.. //depot/projects/netperf/sys/netinet/ip_dummynet.c#9 integrate
.. //depot/projects/netperf/sys/netinet/ip_fw2.c#8 integrate
.. //depot/projects/netperf/sys/netinet/raw_ip.c#6 integrate
.. //depot/projects/netperf/sys/pci/agp_intel.c#3 integrate
.. //depot/projects/netperf/sys/sys/param.h#5 integrate
.. //depot/projects/netperf/sys/vm/vm_object.c#5 integrate
.. //depot/projects/netperf/sys/vm/vm_pageout.c#5 integrate

Differences ...

==== //depot/projects/netperf/sys/crypto/rijndael/rijndael-api-fst.c#2 (text+ko) ====

@@ -16,7 +16,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/crypto/rijndael/rijndael-api-fst.c,v 1.5 2003/06/10 21:43:49 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/crypto/rijndael/rijndael-api-fst.c,v 1.6 2003/09/17 08:51:43 ume Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -225,7 +225,7 @@
 			outBuffer += 16;
 		}
 		padLen = 16 - (inputOctets - 16*numBlocks);
-		if (padLen > 0 && padLen <= 16)
+		if (padLen <= 0 || padLen > 16)
 			return BAD_CIPHER_STATE;
 		bcopy(input, block, 16 - padLen);
 		for (cp = block + 16 - padLen; cp < block + 16; cp++)

==== //depot/projects/netperf/sys/dev/acpica/acpi_pci.c#3 (text+ko) ====

@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_pci.c,v 1.5 2003/08/24 17:48:01 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_pci.c,v 1.6 2003/09/17 08:32:44 iwasaki Exp $");
 
 #include "opt_bus.h"
 
@@ -79,7 +79,7 @@
 	DEVMETHOD(device_attach,	acpi_pci_attach),
 	DEVMETHOD(device_shutdown,	bus_generic_shutdown),
 	DEVMETHOD(device_suspend,	bus_generic_suspend),
-	DEVMETHOD(device_resume,	bus_generic_resume),
+	DEVMETHOD(device_resume,	pci_resume),
 
 	/* Bus interface */
 	DEVMETHOD(bus_print_child,	pci_print_child),

==== //depot/projects/netperf/sys/dev/pci/pci.c#7 (text+ko) ====

@@ -25,7 +25,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/pci/pci.c,v 1.232 2003/09/14 19:30:00 scottl Exp $
+ * $FreeBSD: src/sys/dev/pci/pci.c,v 1.233 2003/09/17 08:32:44 iwasaki Exp $
  *
  */
 
@@ -89,7 +89,7 @@
 	DEVMETHOD(device_attach,	pci_attach),
 	DEVMETHOD(device_shutdown,	bus_generic_shutdown),
 	DEVMETHOD(device_suspend,	bus_generic_suspend),
-	DEVMETHOD(device_resume,	bus_generic_resume),
+	DEVMETHOD(device_resume,	pci_resume),
 
 	/* Bus interface */
 	DEVMETHOD(bus_print_child,	pci_print_child),
@@ -1509,3 +1509,35 @@
 
 	return (0);
 }
+
+int
+pci_resume(device_t dev)
+{
+	int			numdevs;
+	int			i;
+	device_t		*children;
+	device_t		child;
+	struct pci_devinfo	*dinfo;
+	pcicfgregs		*cfg;
+
+	device_get_children(dev, &children, &numdevs);
+
+	for (i = 0; i < numdevs; i++) {
+		child = children[i];
+
+		dinfo = device_get_ivars(child);
+		cfg = &dinfo->cfg;
+		if (cfg->intpin > 0 && PCI_INTERRUPT_VALID(cfg->intline)) {
+			cfg->intline = PCI_ASSIGN_INTERRUPT(dev, child);
+			if (PCI_INTERRUPT_VALID(cfg->intline)) {
+				pci_write_config(child, PCIR_INTLINE,
+				    cfg->intline, 1);
+			}
+		}
+	}
+
+	free(children, M_TEMP);
+
+	return (bus_generic_resume(dev));
+}
+

==== //depot/projects/netperf/sys/dev/pci/pci_private.h#3 (text+ko) ====

@@ -25,7 +25,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/pci/pci_private.h,v 1.10 2003/08/22 03:11:53 imp Exp $
+ * $FreeBSD: src/sys/dev/pci/pci_private.h,v 1.11 2003/09/17 08:32:44 iwasaki Exp $
  *
  */
 
@@ -73,4 +73,5 @@
 int		pci_child_pnpinfo_str_method(device_t cbdev, device_t child,
 		    char *buf, size_t buflen);
 int		pci_assign_interrupt_method(device_t dev, device_t child);
+int		pci_resume(device_t dev);
 #endif /* _PCI_PRIVATE_H_ */

==== //depot/projects/netperf/sys/dev/sio/sio.c#5 (text+ko) ====

@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/sio/sio.c,v 1.405 2003/09/15 13:49:18 bde Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/sio/sio.c,v 1.408 2003/09/17 17:26:00 bde Exp $");
 
 #include "opt_comconsole.h"
 #include "opt_compat.h"
@@ -113,21 +113,20 @@
 #define	COM_ISMULTIPORT(flags)	(0)
 #endif /* COM_MULTIPORT */
 
+#define	COM_C_IIR_TXRDYBUG	0x80000
 #define	COM_CONSOLE(flags)	((flags) & 0x10)
+#define	COM_DEBUGGER(flags)	((flags) & 0x80)
+#define	COM_FIFOSIZE(flags)	(((flags) & 0xff000000) >> 24)
 #define	COM_FORCECONSOLE(flags)	((flags) & 0x20)
+#define	COM_IIR_TXRDYBUG(flags)	((flags) & COM_C_IIR_TXRDYBUG)
 #define	COM_LLCONSOLE(flags)	((flags) & 0x40)
-#define	COM_DEBUGGER(flags)	((flags) & 0x80)
 #define	COM_LOSESOUTINTS(flags)	((flags) & 0x08)
-#define	COM_NOFIFO(flags)		((flags) & 0x02)
+#define	COM_NOFIFO(flags)	((flags) & 0x02)
+#define	COM_NOPROBE(flags)	((flags) & 0x40000)
+#define	COM_NOSCR(flags)	((flags) & 0x100000)
 #define	COM_PPSCTS(flags)	((flags) & 0x10000)
-#define COM_ST16650A(flags)	((flags) & 0x20000)
-#define COM_C_NOPROBE		(0x40000)
-#define COM_NOPROBE(flags)	((flags) & COM_C_NOPROBE)
-#define COM_C_IIR_TXRDYBUG	(0x80000)
-#define COM_IIR_TXRDYBUG(flags)	((flags) & COM_C_IIR_TXRDYBUG)
-#define COM_NOSCR(flags)	((flags) & 0x100000)
+#define	COM_ST16650A(flags)	((flags) & 0x20000)
 #define	COM_TI16754(flags)	((flags) & 0x200000)
-#define	COM_FIFOSIZE(flags)	(((flags) & 0xff000000) >> 24)
 
 #define	sio_getreg(com, off) \
 	(bus_space_read_1((com)->bst, (com)->bsh, (off)))
@@ -196,7 +195,6 @@
 	u_char	extra_state;	/* more flag bits, separate for order trick */
 	u_char	fifo_image;	/* copy of value written to FIFO */
 	bool_t	hasfifo;	/* nonzero for 16550 UARTs */
-	bool_t	st16650a;	/* Is a Startech 16650A or RTS/CTS compat */
 	bool_t	loses_outints;	/* nonzero if device loses output interrupts */
 	u_char	mcr_image;	/* copy of value written to MCR */
 #ifdef COM_MULTIPORT
@@ -206,6 +204,7 @@
 	bool_t  gone;		/* hardware disappeared */
 	bool_t	poll;		/* nonzero if polling is required */
 	bool_t	poll_output;	/* nonzero if polling for output is required */
+	bool_t	st16650a;	/* nonzero if Startech 16650A compatible */
 	int	unit;		/* unit	number */
 	int	dtr_wait;	/* time to hold DTR down on close (* 1/hz) */
 	u_int	tx_fifo_size;
@@ -450,7 +449,7 @@
 		device_printf(dev, "NULL com in siounload\n");
 		return (0);
 	}
-	com->gone = 1;
+	com->gone = TRUE;
 	for (i = 0 ; i < 6; i++)
 		destroy_dev(com->devs[i]);
 	if (com->irqres) {
@@ -1023,7 +1022,6 @@
 	}
 	sio_setreg(com, com_fifo, FIFO_ENABLE | FIFO_RX_HIGH);
 	DELAY(100);
-	com->st16650a = 0;
 	switch (inb(com->int_id_port) & IIR_FIFO_MASK) {
 	case FIFO_RX_LOW:
 		printf(" 16450");
@@ -1037,40 +1035,40 @@
 	case FIFO_RX_HIGH:
 		if (COM_NOFIFO(flags)) {
 			printf(" 16550A fifo disabled");
-		} else {
-			com->hasfifo = TRUE;
-			if (COM_ST16650A(flags)) {
-				com->st16650a = 1;
-				com->tx_fifo_size = 32;
-				printf(" ST16650A");
-			} else if (COM_TI16754(flags)) {
-				com->tx_fifo_size = 64;
-				printf(" TI16754");
-			} else {
-				com->tx_fifo_size = COM_FIFOSIZE(flags);
-				printf(" 16550A");
-			}
+			break;
+		}
+		com->hasfifo = TRUE;
+		if (COM_ST16650A(flags)) {
+			printf(" ST16650A");
+			com->st16650a = TRUE;
+			com->tx_fifo_size = 32;
+			break;
+		}
+		if (COM_TI16754(flags)) {
+			printf(" TI16754");
+			com->tx_fifo_size = 64;
+			break;
 		}
+		printf(" 16550A");
 #ifdef COM_ESP
 		for (espp = likely_esp_ports; *espp != 0; espp++)
 			if (espattach(com, *espp)) {
 				com->tx_fifo_size = 1024;
 				break;
 			}
+		if (com->esp != NULL)
+			break;
 #endif
-		if (!com->st16650a && !COM_TI16754(flags)) {
-			if (!com->tx_fifo_size)
-				com->tx_fifo_size = 16;
-			else
-				printf(" lookalike with %d bytes FIFO",
-				    com->tx_fifo_size);
-		}
-
+		com->tx_fifo_size = COM_FIFOSIZE(flags);
+		if (com->tx_fifo_size == 0)
+			com->tx_fifo_size = 16;
+		else
+			printf(" lookalike with %u bytes FIFO",
+			       com->tx_fifo_size);
 		break;
 	}
-	
 #ifdef COM_ESP
-	if (com->esp) {
+	if (com->esp != NULL) {
 		/*
 		 * Set 16550 compatibility mode.
 		 * We don't use the ESP_MODE_SCALE bit to increase the
@@ -2205,6 +2203,7 @@
 	u_int		divisor;
 	u_char		dlbh;
 	u_char		dlbl;
+	u_char		efr_flowbits;
 	int		s;
 	int		unit;
 
@@ -2309,18 +2308,13 @@
 			sio_setreg(com, com_dlbh, dlbh);
 	}
 
-	sio_setreg(com, com_cfcr, com->cfcr_image = cfcr);
-
 	if (!(tp->t_state & TS_TTSTOP))
 		com->state |= CS_TTGO;
+	efr_flowbits = 0;
 
 	if (cflag & CRTS_IFLOW) {
-		if (com->st16650a) {
-			sio_setreg(com, com_cfcr, 0xbf);
-			sio_setreg(com, com_fifo,
-				   sio_getreg(com, com_fifo) | 0x40);
-		}
 		com->state |= CS_RTS_IFLOW;
+		efr_flowbits |= EFR_AUTORTS;
 		/*
 		 * If CS_RTS_IFLOW just changed from off to on, the change
 		 * needs to be propagated to MCR_RTS.  This isn't urgent,
@@ -2334,14 +2328,8 @@
 		 * on here, since comstart() won't do it later.
 		 */
 		outb(com->modem_ctl_port, com->mcr_image |= MCR_RTS);
-		if (com->st16650a) {
-			sio_setreg(com, com_cfcr, 0xbf);
-			sio_setreg(com, com_fifo,
-				   sio_getreg(com, com_fifo) & ~0x40);
-		}
 	}
 
-
 	/*
 	 * Set up state to handle output flow control.
 	 * XXX - worth handling MDMBUF (DCD) flow control at the lowest level?
@@ -2351,22 +2339,18 @@
 	com->state &= ~CS_CTS_OFLOW;
 	if (cflag & CCTS_OFLOW) {
 		com->state |= CS_CTS_OFLOW;
+		efr_flowbits |= EFR_AUTOCTS;
 		if (!(com->last_modem_status & MSR_CTS))
 			com->state &= ~CS_ODEVREADY;
-		if (com->st16650a) {
-			sio_setreg(com, com_cfcr, 0xbf);
-			sio_setreg(com, com_fifo,
-				   sio_getreg(com, com_fifo) | 0x80);
-		}
-	} else {
-		if (com->st16650a) {
-			sio_setreg(com, com_cfcr, 0xbf);
-			sio_setreg(com, com_fifo,
-				   sio_getreg(com, com_fifo) & ~0x80);
-		}
 	}
 
-	sio_setreg(com, com_cfcr, com->cfcr_image);
+	if (com->st16650a) {
+		sio_setreg(com, com_lcr, LCR_EFR_ENABLE);
+		sio_setreg(com, com_efr,
+			   (sio_getreg(com, com_efr)
+			    & ~(EFR_AUTOCTS | EFR_AUTORTS)) | efr_flowbits);
+	}
+	sio_setreg(com, com_cfcr, com->cfcr_image = cfcr);
 
 	/* XXX shouldn't call functions while intrs are disabled. */
 	disc_optim(tp, t, com);
@@ -3173,7 +3157,6 @@
 	return (c);
 }
 
-
 static int
 siocngetc(struct consdev *cd)
 {

==== //depot/projects/netperf/sys/dev/sound/isa/uartsio.c#3 (text+ko) ====

@@ -42,11 +42,11 @@
  * This handles io against /dev/midi, the midi {in, out}put event queues
  * and the event/message transmittion to/from a serial port interface.
  *
- * $FreeBSD: src/sys/dev/sound/isa/uartsio.c,v 1.14 2003/09/16 11:04:22 bde Exp $
+ * $FreeBSD: src/sys/dev/sound/isa/uartsio.c,v 1.15 2003/09/17 01:09:10 bde Exp $
  *
  */
 
-#include <dev/sio/sioreg.h>
+#include <dev/ic/ns16550.h>
 #include <dev/sound/midi/midi.h>
 
 /* XXX What about a PCI uart? */

==== //depot/projects/netperf/sys/dev/uart/uart_bus.h#2 (text+ko) ====

@@ -23,7 +23,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/uart/uart_bus.h,v 1.2 2003/09/11 23:06:42 marcel Exp $
+ * $FreeBSD: src/sys/dev/uart/uart_bus.h,v 1.3 2003/09/17 01:41:21 marcel Exp $
  */
 
 #ifndef _DEV_UART_BUS_H_
@@ -113,6 +113,8 @@
 	struct uart_bas	sc_bas;
 	device_t	sc_dev;
 
+	struct mtx	sc_hwmtx;	/* Spinlock protecting hardware. */
+
 	struct resource	*sc_rres;	/* Register resource. */
 	int		sc_rrid;
 	int		sc_rtype;	/* SYS_RES_{IOPORT|MEMORY}. */

==== //depot/projects/netperf/sys/dev/uart/uart_core.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/uart/uart_core.c,v 1.2 2003/09/11 23:06:42 marcel Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/uart/uart_core.c,v 1.4 2003/09/17 03:11:32 marcel Exp $");
 
 #ifndef KLD_MODULE
 #include "opt_comconsole.h"
@@ -200,17 +200,21 @@
 	if (sc->sc_leaving)
 		return;
 
-	ipend = UART_IPEND(sc);
-	if (ipend & UART_IPEND_OVERRUN)
-		uart_intr_overrun(sc);
-	if (ipend & UART_IPEND_BREAK)
-		uart_intr_break(sc);
-	if (ipend & UART_IPEND_RXREADY)
-		uart_intr_rxready(sc);
-	if (ipend & UART_IPEND_SIGCHG)
-		uart_intr_sigchg(sc);
-	if (ipend & UART_IPEND_TXIDLE)
-		uart_intr_txidle(sc);
+	do {
+		ipend = UART_IPEND(sc);
+		if (ipend == 0)
+			break;
+		if (ipend & UART_IPEND_OVERRUN)
+			uart_intr_overrun(sc);
+		if (ipend & UART_IPEND_BREAK)
+			uart_intr_break(sc);
+		if (ipend & UART_IPEND_RXREADY)
+			uart_intr_rxready(sc);
+		if (ipend & UART_IPEND_SIGCHG)
+			uart_intr_sigchg(sc);
+		if (ipend & UART_IPEND_TXIDLE)
+			uart_intr_txidle(sc);
+	} while (1);
 
 	if (sc->sc_opened && sc->sc_ttypend != 0)
 		swi_sched(sc->sc_softih, 0);
@@ -309,6 +313,8 @@
 	 */
 	sc->sc_leaving = 1;
 
+	mtx_init(&sc->sc_hwmtx, "uart_hwmtx", NULL, MTX_SPIN);
+
 	/*
 	 * Re-allocate. We expect that the softc contains the information
 	 * collected by uart_bus_probe() intact.

==== //depot/projects/netperf/sys/dev/uart/uart_dev_i8251.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_i8251.c,v 1.1 2003/09/07 04:59:15 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_i8251.c,v 1.3 2003/09/17 03:11:32 marcel Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -427,15 +427,19 @@
 {
 	struct i8251_softc *i8251 = (struct i8251_softc*)sc;
 	struct uart_bas *bas;
+	int error;
 
 	bas = &sc->sc_bas;
+	mtx_lock_spin(&sc->sc_hwmtx);
 	if (sc->sc_hasfifo) {
 		i8251_flush(bas, what);
 		uart_setreg(bas, REG_FCR, i8251->fcr);
 		uart_barrier(bas);
-		return (0);
-	}
-	return (i8251_drain(bas, what));
+		error = 0;
+	} else
+		error = i8251_drain(bas, what);
+	mtx_unlock_spin(&sc->sc_hwmtx);
+	return (error);
 }
 
 static int
@@ -447,7 +451,9 @@
 	do {
 		old = sc->sc_hwsig;
 		sig = old;
+		mtx_lock_spin(&sc->sc_hwmtx);
 		msr = uart_getreg(&sc->sc_bas, REG_MSR);
+		mtx_unlock_spin(&sc->sc_hwmtx);
 		SIGCHG(msr & MSR_DSR, sig, UART_SIG_DSR, UART_SIG_DDSR);
 		SIGCHG(msr & MSR_CTS, sig, UART_SIG_CTS, UART_SIG_DCTS);
 		SIGCHG(msr & MSR_DCD, sig, UART_SIG_DCD, UART_SIG_DDCD);
@@ -461,9 +467,12 @@
 i8251_bus_ioctl(struct uart_softc *sc, int request, intptr_t data)
 {
 	struct uart_bas *bas;
+	int error;
 	uint8_t lcr;
 
 	bas = &sc->sc_bas;
+	error = 0;
+	mtx_lock_spin(&sc->sc_hwmtx);
 	switch (request) {
 	case UART_IOCTL_BREAK:
 		lcr = uart_getreg(bas, REG_LCR);
@@ -475,9 +484,11 @@
 		uart_barrier(bas);
 		break;
 	default:
-		return (EINVAL);
+		error = EINVAL;
+		break;
 	}
-	return (0);
+	mtx_unlock_spin(&sc->sc_hwmtx);
+	return (error);
 }
 
 static int
@@ -488,13 +499,16 @@
 	uint8_t iir, lsr;
 
 	bas = &sc->sc_bas;
+	mtx_lock_spin(&sc->sc_hwmtx);
 	iir = uart_getreg(bas, REG_IIR);
-	if (iir & IIR_NOPEND)
+	if (iir & IIR_NOPEND) {
+		mtx_unlock_spin(&sc->sc_hwmtx);
 		return (0);
-
+	}
 	ipend = 0;
 	if (iir & IIR_RXRDY) {
 		lsr = uart_getreg(bas, REG_LSR);
+		mtx_unlock_spin(&sc->sc_hwmtx);
 		if (lsr & LSR_OE)
 			ipend |= UART_IPEND_OVERRUN;
 		if (lsr & LSR_BI)
@@ -502,12 +516,12 @@
 		if (lsr & LSR_RXRDY)
 			ipend |= UART_IPEND_RXREADY;
 	} else {
+		mtx_unlock_spin(&sc->sc_hwmtx);
 		if (iir & IIR_TXRDY)
 			ipend |= UART_IPEND_TXIDLE;
 		else
 			ipend |= UART_IPEND_SIGCHG;
 	}
-
 	return ((sc->sc_leaving) ? 0 : ipend);
 }
 
@@ -516,9 +530,13 @@
     int stopbits, int parity)
 {
 	struct uart_bas *bas;
+	int error;
 
 	bas = &sc->sc_bas;
-	return (i8251_param(bas, baudrate, databits, stopbits, parity));
+	mtx_lock_spin(&sc->sc_hwmtx);
+	error = i8251_param(bas, baudrate, databits, stopbits, parity);
+	mtx_unlock_spin(&sc->sc_hwmtx);
+	return (error);
 }
 
 static int
@@ -661,17 +679,28 @@
 	uint8_t lsr;
 
 	bas = &sc->sc_bas;
-	while (!uart_rx_full(sc)) {
-		lsr = uart_getreg(bas, REG_LSR);
-		if ((lsr & LSR_RXRDY) == 0)
+	mtx_lock_spin(&sc->sc_hwmtx);
+	lsr = uart_getreg(bas, REG_LSR);
+	while (lsr & LSR_RXRDY) {
+		if (uart_rx_full(sc)) {
+			sc->sc_rxbuf[sc->sc_rxput] = UART_STAT_OVERRUN;
 			break;
+		}
 		xc = uart_getreg(bas, REG_DATA);
 		if (lsr & LSR_FE)
 			xc |= UART_STAT_FRAMERR;
 		if (lsr & LSR_PE)
 			xc |= UART_STAT_PARERR;
 		uart_rx_put(sc, xc);
+		lsr = uart_getreg(bas, REG_LSR);
+	}
+	/* Discard everything left in the Rx FIFO. */
+	while (lsr & LSR_RXRDY) {
+		(void)uart_getreg(bas, REG_DATA);
+		uart_barrier(bas);
+		lsr = uart_getreg(bas, REG_LSR);
 	}
+	mtx_unlock_spin(&sc->sc_hwmtx);
  	return (0);
 }
 
@@ -695,6 +724,7 @@
 			    UART_SIG_DRTS);
 		}
 	} while (!atomic_cmpset_32(&sc->sc_hwsig, old, new));
+	mtx_lock_spin(&sc->sc_hwmtx);
 	i8251->mcr &= ~(MCR_DTR|MCR_RTS);
 	if (new & UART_SIG_DTR)
 		i8251->mcr |= MCR_DTR;
@@ -702,6 +732,7 @@
 		i8251->mcr |= MCR_RTS;
 	uart_setreg(bas, REG_MCR, i8251->mcr);
 	uart_barrier(bas);
+	mtx_unlock_spin(&sc->sc_hwmtx);
 	return (0);
 }
 
@@ -713,6 +744,7 @@
 	int i;
 
 	bas = &sc->sc_bas;
+	mtx_lock_spin(&sc->sc_hwmtx);
 	while ((uart_getreg(bas, REG_LSR) & LSR_THRE) == 0)
 		;
 	uart_setreg(bas, REG_IER, i8251->ier | IER_ETXRDY);
@@ -722,5 +754,6 @@
 		uart_barrier(bas);
 	}
 	sc->sc_txbusy = 1;
+	mtx_unlock_spin(&sc->sc_hwmtx);
 	return (0);
 }

==== //depot/projects/netperf/sys/dev/uart/uart_dev_ns8250.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_ns8250.c,v 1.3 2003/09/13 06:25:04 marcel Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_ns8250.c,v 1.5 2003/09/17 03:11:32 marcel Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -427,15 +427,19 @@
 {
 	struct ns8250_softc *ns8250 = (struct ns8250_softc*)sc;
 	struct uart_bas *bas;
+	int error;
 
 	bas = &sc->sc_bas;
+	mtx_lock_spin(&sc->sc_hwmtx);
 	if (sc->sc_hasfifo) {
 		ns8250_flush(bas, what);
 		uart_setreg(bas, REG_FCR, ns8250->fcr);
 		uart_barrier(bas);
-		return (0);
-	}
-	return (ns8250_drain(bas, what));
+		error = 0;
+	} else
+		error = ns8250_drain(bas, what);
+	mtx_unlock_spin(&sc->sc_hwmtx);
+	return (error);
 }
 
 static int
@@ -447,7 +451,9 @@
 	do {
 		old = sc->sc_hwsig;
 		sig = old;
+		mtx_lock_spin(&sc->sc_hwmtx);
 		msr = uart_getreg(&sc->sc_bas, REG_MSR);
+		mtx_unlock_spin(&sc->sc_hwmtx);
 		SIGCHG(msr & MSR_DSR, sig, UART_SIG_DSR, UART_SIG_DDSR);
 		SIGCHG(msr & MSR_CTS, sig, UART_SIG_CTS, UART_SIG_DCTS);
 		SIGCHG(msr & MSR_DCD, sig, UART_SIG_DCD, UART_SIG_DDCD);
@@ -461,9 +467,12 @@
 ns8250_bus_ioctl(struct uart_softc *sc, int request, intptr_t data)
 {
 	struct uart_bas *bas;
+	int error;
 	uint8_t efr, lcr;
 
 	bas = &sc->sc_bas;
+	error = 0;
+	mtx_lock_spin(&sc->sc_hwmtx);
 	switch (request) {
 	case UART_IOCTL_BREAK:
 		lcr = uart_getreg(bas, REG_LCR);
@@ -505,9 +514,11 @@
 		uart_barrier(bas);
 		break;
 	default:
-		return (EINVAL);
+		error = EINVAL;
+		break;
 	}
-	return (0);
+	mtx_unlock_spin(&sc->sc_hwmtx);
+	return (error);
 }
 
 static int
@@ -518,13 +529,16 @@
 	uint8_t iir, lsr;
 
 	bas = &sc->sc_bas;
+	mtx_lock_spin(&sc->sc_hwmtx);
 	iir = uart_getreg(bas, REG_IIR);
-	if (iir & IIR_NOPEND)
+	if (iir & IIR_NOPEND) {
+		mtx_unlock_spin(&sc->sc_hwmtx);
 		return (0);
-
+	}
 	ipend = 0;
 	if (iir & IIR_RXRDY) {
 		lsr = uart_getreg(bas, REG_LSR);
+		mtx_unlock_spin(&sc->sc_hwmtx);
 		if (lsr & LSR_OE)
 			ipend |= UART_IPEND_OVERRUN;
 		if (lsr & LSR_BI)
@@ -532,12 +546,12 @@
 		if (lsr & LSR_RXRDY)
 			ipend |= UART_IPEND_RXREADY;
 	} else {
+		mtx_unlock_spin(&sc->sc_hwmtx);
 		if (iir & IIR_TXRDY)
 			ipend |= UART_IPEND_TXIDLE;
 		else
 			ipend |= UART_IPEND_SIGCHG;
 	}
-
 	return ((sc->sc_leaving) ? 0 : ipend);
 }
 
@@ -546,9 +560,13 @@
     int stopbits, int parity)
 {
 	struct uart_bas *bas;
+	int error;
 
 	bas = &sc->sc_bas;
-	return (ns8250_param(bas, baudrate, databits, stopbits, parity));
+	mtx_lock_spin(&sc->sc_hwmtx);
+	error = ns8250_param(bas, baudrate, databits, stopbits, parity);
+	mtx_unlock_spin(&sc->sc_hwmtx);
+	return (error);
 }
 
 static int
@@ -697,17 +715,28 @@
 	uint8_t lsr;
 
 	bas = &sc->sc_bas;
-	while (!uart_rx_full(sc)) {
-		lsr = uart_getreg(bas, REG_LSR);
-		if ((lsr & LSR_RXRDY) == 0)
+	mtx_lock_spin(&sc->sc_hwmtx);
+	lsr = uart_getreg(bas, REG_LSR);
+	while (lsr & LSR_RXRDY) {
+		if (uart_rx_full(sc)) {
+			sc->sc_rxbuf[sc->sc_rxput] = UART_STAT_OVERRUN;
 			break;
+		}
 		xc = uart_getreg(bas, REG_DATA);
 		if (lsr & LSR_FE)
 			xc |= UART_STAT_FRAMERR;
 		if (lsr & LSR_PE)
 			xc |= UART_STAT_PARERR;
 		uart_rx_put(sc, xc);
+		lsr = uart_getreg(bas, REG_LSR);
+	}
+	/* Discard everything left in the Rx FIFO. */
+	while (lsr & LSR_RXRDY) {
+		(void)uart_getreg(bas, REG_DATA);
+		uart_barrier(bas);
+		lsr = uart_getreg(bas, REG_LSR);
 	}
+	mtx_unlock_spin(&sc->sc_hwmtx);
  	return (0);
 }
 
@@ -731,6 +760,7 @@
 			    UART_SIG_DRTS);
 		}
 	} while (!atomic_cmpset_32(&sc->sc_hwsig, old, new));
+	mtx_lock_spin(&sc->sc_hwmtx);
 	ns8250->mcr &= ~(MCR_DTR|MCR_RTS);
 	if (new & UART_SIG_DTR)
 		ns8250->mcr |= MCR_DTR;
@@ -738,6 +768,7 @@
 		ns8250->mcr |= MCR_RTS;
 	uart_setreg(bas, REG_MCR, ns8250->mcr);
 	uart_barrier(bas);
+	mtx_unlock_spin(&sc->sc_hwmtx);
 	return (0);
 }
 
@@ -749,6 +780,7 @@
 	int i;
 
 	bas = &sc->sc_bas;
+	mtx_lock_spin(&sc->sc_hwmtx);
 	while ((uart_getreg(bas, REG_LSR) & LSR_THRE) == 0)
 		;
 	uart_setreg(bas, REG_IER, ns8250->ier | IER_ETXRDY);
@@ -758,5 +790,6 @@
 		uart_barrier(bas);
 	}
 	sc->sc_txbusy = 1;
+	mtx_unlock_spin(&sc->sc_hwmtx);
 	return (0);
 }

==== //depot/projects/netperf/sys/dev/uart/uart_dev_sab82532.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_sab82532.c,v 1.2 2003/09/07 21:51:03 marcel Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_sab82532.c,v 1.3 2003/09/17 01:41:21 marcel Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -425,7 +425,9 @@
 sab82532_bus_flush(struct uart_softc *sc, int what)
 {
 
+	mtx_lock_spin(&sc->sc_hwmtx);
 	sab82532_flush(&sc->sc_bas, what);
+	mtx_unlock_spin(&sc->sc_hwmtx);
 	return (0);
 }
 
@@ -440,6 +442,7 @@
 	do {
 		old = sc->sc_hwsig;
 		sig = old;
+		mtx_lock_spin(&sc->sc_hwmtx);
 		star = uart_getreg(bas, SAB_STAR);
 		SIGCHG(star & SAB_STAR_CTS, sig, UART_SIG_CTS, UART_SIG_DCTS);
 		vstr = uart_getreg(bas, SAB_VSTR);
@@ -447,6 +450,7 @@
 		pvr = uart_getreg(bas, SAB_PVR);
 		pvr &= (IS_CHANNEL_A(bas)) ? SAB_PVR_DSR_A : SAB_PVR_DSR_B;
 		SIGCHG(~pvr, sig, UART_SIG_DSR, UART_SIG_DDSR);
+		mtx_unlock_spin(&sc->sc_hwmtx);
 		new = sig & ~UART_SIGMASK_DELTA;
 	} while (!atomic_cmpset_32(&sc->sc_hwsig, old, new));
 	return (sig);
@@ -457,8 +461,11 @@
 {
 	struct uart_bas *bas;
 	uint8_t dafo, mode;
+	int error;
 
 	bas = &sc->sc_bas;
+	error = 0;
+	mtx_lock_spin(&sc->sc_hwmtx);
 	switch (request) {
 	case UART_IOCTL_BREAK:
 		dafo = uart_getreg(bas, SAB_DAFO);
@@ -491,9 +498,11 @@
 		uart_barrier(bas);
 		break;
 	default:
-		return (EINVAL);
+		error = EINVAL;
+		break;
 	}
-	return (0);
+	mtx_unlock_spin(&sc->sc_hwmtx);
+	return (error);
 }
 
 static int
@@ -504,16 +513,17 @@
 	uint8_t isr0, isr1;
 
 	bas = &sc->sc_bas;
+	mtx_lock_spin(&sc->sc_hwmtx);
 	isr0 = uart_getreg(bas, SAB_ISR0);
 	isr1 = uart_getreg(bas, SAB_ISR1);
 	uart_barrier(bas);
-
 	if (isr0 & SAB_ISR0_TIME) {
 		while (uart_getreg(bas, SAB_STAR) & SAB_STAR_CEC)
 			;
 		uart_setreg(bas, SAB_CMDR, SAB_CMDR_RFRD);
 		uart_barrier(bas);
 	}
+	mtx_unlock_spin(&sc->sc_hwmtx);
 
 	ipend = 0;
 	if (isr1 & SAB_ISR1_BRKT)
@@ -535,9 +545,13 @@
     int stopbits, int parity)
 {
 	struct uart_bas *bas;
+	int error;
 
 	bas = &sc->sc_bas;
-	return (sab82532_param(bas, baudrate, databits, stopbits, parity));
+	mtx_lock_spin(&sc->sc_hwmtx);
+	error = sab82532_param(bas, baudrate, databits, stopbits, parity);
+	mtx_unlock_spin(&sc->sc_hwmtx);
+	return (error);
 }
 
 static int
@@ -584,6 +598,7 @@
 	uint8_t s;
 
 	bas = &sc->sc_bas;
+	mtx_lock_spin(&sc->sc_hwmtx);
 	if (uart_getreg(bas, SAB_STAR) & SAB_STAR_RFNE) {
 		rbcl = uart_getreg(bas, SAB_RBCL) & 31;
 		if (rbcl == 0)
@@ -607,6 +622,7 @@
 		;
 	uart_setreg(bas, SAB_CMDR, SAB_CMDR_RMC);
 	uart_barrier(bas);
+	mtx_unlock_spin(&sc->sc_hwmtx);
 	return (0);
 }
 
@@ -631,6 +647,7 @@
 		}
 	} while (!atomic_cmpset_32(&sc->sc_hwsig, old, new));
 
+	mtx_lock_spin(&sc->sc_hwmtx);
 	/* Set DTR pin. */
 	pvr = uart_getreg(bas, SAB_PVR);
 	if (new & UART_SIG_DTR)
@@ -647,6 +664,7 @@
 		mode |= SAB_MODE_FRTS;
 	uart_setreg(bas, SAB_MODE, mode);
 	uart_barrier(bas);
+	mtx_unlock_spin(&sc->sc_hwmtx);
 	return (0);
 }
 
@@ -657,6 +675,7 @@
 	int i;
 
 	bas = &sc->sc_bas;
+	mtx_lock_spin(&sc->sc_hwmtx);
 	while (!(uart_getreg(bas, SAB_STAR) & SAB_STAR_XFW))
 		;
 	for (i = 0; i < sc->sc_txdatasz; i++)
@@ -666,5 +685,6 @@
 		;
 	uart_setreg(bas, SAB_CMDR, SAB_CMDR_XF);
 	sc->sc_txbusy = 1;
+	mtx_unlock_spin(&sc->sc_hwmtx);
 	return (0);
 }

==== //depot/projects/netperf/sys/dev/uart/uart_dev_z8530.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_z8530.c,v 1.2 2003/09/07 21:51:03 marcel Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_z8530.c,v 1.4 2003/09/17 03:11:32 marcel Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -334,15 +334,15 @@
 static int
 z8530_bus_getsig(struct uart_softc *sc)
 {
-	struct uart_bas *bas;
 	uint32_t new, old, sig;
 	uint8_t bes;
 
-	bas = &sc->sc_bas;
 	do {
 		old = sc->sc_hwsig;
 		sig = old;
-		bes = uart_getmreg(bas, RR_BES);
+		mtx_lock_spin(&sc->sc_hwmtx);

>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list