Date: Wed, 17 Sep 2003 15:03:50 -0700 (PDT) From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 38200 for review Message-ID: <200309172203.h8HM3oAA033420@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=38200 Change 38200 by sam@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) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200309172203.h8HM3oAA033420>
