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