PERFORCE change 94248 for review

Marcel Moolenaar marcel at FreeBSD.org
Wed Mar 29 16:02:57 UTC 2006


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

Change 94248 by marcel at marcel_nfs on 2006/03/29 16:02:20

	Change the type of sc_hwmtx to a pointer to struct mtx. Add
	a new field to the softc (sc_hwmtx_s) that is a struct mtx.
	We operate on the pointer, which by default will point to
	the struct. This allows individual bus attachments to preset
	the mutex pointer to the mutex that we need to use. Have
	the SCC bus attachment do this.
	Use uart_[un]lock() instead of mtx_[un]lock_spin() to fully
	abstract the mutex type (spin or sleep).

Affected files ...

.. //depot/projects/uart/dev/uart/uart_bus.h#41 edit
.. //depot/projects/uart/dev/uart/uart_bus_scc.c#5 edit
.. //depot/projects/uart/dev/uart/uart_core.c#48 edit
.. //depot/projects/uart/dev/uart/uart_dev_ns8250.c#37 edit
.. //depot/projects/uart/dev/uart/uart_dev_sab82532.c#39 edit
.. //depot/projects/uart/dev/uart/uart_dev_z8530.c#27 edit

Differences ...

==== //depot/projects/uart/dev/uart/uart_bus.h#41 (text+ko) ====

@@ -81,7 +81,8 @@
 	struct uart_bas	sc_bas;
 	device_t	sc_dev;
 
-	struct mtx	sc_hwmtx;	/* Spinlock protecting hardware. */
+	struct mtx	sc_hwmtx_s;	/* Spinlock protecting hardware. */
+	struct mtx	*sc_hwmtx;
 
 	struct resource	*sc_rres;	/* Register resource. */
 	int		sc_rrid;

==== //depot/projects/uart/dev/uart/uart_bus_scc.c#5 (text+ko) ====

@@ -43,12 +43,13 @@
 #include <dev/uart/uart.h>
 #include <dev/uart/uart_bus.h>
 
+static int uart_scc_attach(device_t dev);
 static int uart_scc_probe(device_t dev);
 
 static device_method_t uart_scc_methods[] = {
 	/* Device interface */
 	DEVMETHOD(device_probe,		uart_scc_probe),
-	DEVMETHOD(device_attach,	uart_bus_attach),
+	DEVMETHOD(device_attach,	uart_scc_attach),
 	DEVMETHOD(device_detach,	uart_bus_detach),
 	/* Serdev interface */
 	DEVMETHOD(serdev_ihand,		uart_bus_ihand),
@@ -63,6 +64,22 @@
 };
 
 static int
+uart_scc_attach(device_t dev)
+{
+	device_t parent;
+	struct uart_softc *sc;
+	uintptr_t mtx;
+
+	parent = device_get_parent(dev);
+	sc = device_get_softc(dev);
+
+	if (BUS_READ_IVAR(parent, dev, SCC_IVAR_HWMTX, &mtx))
+		return (ENXIO);
+	sc->sc_hwmtx = (struct mtx *)(void *)mtx;
+	return (uart_bus_attach(dev));
+}
+
+static int
 uart_scc_probe(device_t dev)
 {
 	device_t parent;

==== //depot/projects/uart/dev/uart/uart_core.c#48 (text+ko) ====

@@ -368,7 +368,9 @@
 	 */
 	sc->sc_leaving = 1;
 
-	mtx_init(&sc->sc_hwmtx, "uart_hwmtx", NULL, MTX_SPIN);
+	mtx_init(&sc->sc_hwmtx_s, "uart_hwmtx", NULL, MTX_SPIN);
+	if (sc->sc_hwmtx == NULL)
+		sc->sc_hwmtx = &sc->sc_hwmtx_s;
 
 	/*
 	 * Re-allocate. We expect that the softc contains the information
@@ -377,7 +379,7 @@
 	sc->sc_rres = bus_alloc_resource(dev, sc->sc_rtype, &sc->sc_rrid,
 	    0, ~0, sc->sc_class->uc_range, RF_ACTIVE);
 	if (sc->sc_rres == NULL) {
-		mtx_destroy(&sc->sc_hwmtx);
+		mtx_destroy(&sc->sc_hwmtx_s);
 		return (ENXIO);
 	}
 	sc->sc_bas.bsh = rman_get_bushandle(sc->sc_rres);
@@ -481,7 +483,7 @@
 		goto fail;
 
 	if (sc->sc_sysdev != NULL)
-		sc->sc_sysdev->hwmtx = &sc->sc_hwmtx;
+		sc->sc_sysdev->hwmtx = sc->sc_hwmtx;
 
 	sc->sc_leaving = 0;
 	uart_intr(sc);
@@ -498,7 +500,7 @@
 	}
 	bus_release_resource(dev, sc->sc_rtype, sc->sc_rrid, sc->sc_rres);
 
-	mtx_destroy(&sc->sc_hwmtx);
+	mtx_destroy(&sc->sc_hwmtx_s);
 
 	return (error);
 }
@@ -532,7 +534,7 @@
 	}
 	bus_release_resource(dev, sc->sc_rtype, sc->sc_rrid, sc->sc_rres);
 
-	mtx_destroy(&sc->sc_hwmtx);
+	mtx_destroy(&sc->sc_hwmtx_s);
 
 	if (sc->sc_class->size > sizeof(*sc)) {
 		device_set_softc(dev, NULL);

==== //depot/projects/uart/dev/uart/uart_dev_ns8250.c#37 (text+ko) ====

@@ -432,7 +432,7 @@
 	int error;
 
 	bas = &sc->sc_bas;
-	mtx_lock_spin(&sc->sc_hwmtx);
+	uart_lock(sc->sc_hwmtx);
 	if (sc->sc_hasfifo) {
 		ns8250_flush(bas, what);
 		uart_setreg(bas, REG_FCR, ns8250->fcr);
@@ -440,7 +440,7 @@
 		error = 0;
 	} else
 		error = ns8250_drain(bas, what);
-	mtx_unlock_spin(&sc->sc_hwmtx);
+	uart_unlock(sc->sc_hwmtx);
 	return (error);
 }
 
@@ -453,9 +453,9 @@
 	do {
 		old = sc->sc_hwsig;
 		sig = old;
-		mtx_lock_spin(&sc->sc_hwmtx);
+		uart_lock(sc->sc_hwmtx);
 		msr = uart_getreg(&sc->sc_bas, REG_MSR);
-		mtx_unlock_spin(&sc->sc_hwmtx);
+		uart_unlock(sc->sc_hwmtx);
 		SIGCHG(msr & MSR_DSR, sig, SER_DSR, SER_DDSR);
 		SIGCHG(msr & MSR_CTS, sig, SER_CTS, SER_DCTS);
 		SIGCHG(msr & MSR_DCD, sig, SER_DCD, SER_DDCD);
@@ -474,7 +474,7 @@
 
 	bas = &sc->sc_bas;
 	error = 0;
-	mtx_lock_spin(&sc->sc_hwmtx);
+	uart_lock(sc->sc_hwmtx);
 	switch (request) {
 	case UART_IOCTL_BREAK:
 		lcr = uart_getreg(bas, REG_LCR);
@@ -533,7 +533,7 @@
 		error = EINVAL;
 		break;
 	}
-	mtx_unlock_spin(&sc->sc_hwmtx);
+	uart_unlock(sc->sc_hwmtx);
 	return (error);
 }
 
@@ -545,16 +545,16 @@
 	uint8_t iir, lsr;
 
 	bas = &sc->sc_bas;
-	mtx_lock_spin(&sc->sc_hwmtx);
+	uart_lock(sc->sc_hwmtx);
 	iir = uart_getreg(bas, REG_IIR);
 	if (iir & IIR_NOPEND) {
-		mtx_unlock_spin(&sc->sc_hwmtx);
+		uart_unlock(sc->sc_hwmtx);
 		return (0);
 	}
 	ipend = 0;
 	if (iir & IIR_RXRDY) {
 		lsr = uart_getreg(bas, REG_LSR);
-		mtx_unlock_spin(&sc->sc_hwmtx);
+		uart_unlock(sc->sc_hwmtx);
 		if (lsr & LSR_OE)
 			ipend |= SER_INT_OVERRUN;
 		if (lsr & LSR_BI)
@@ -562,7 +562,7 @@
 		if (lsr & LSR_RXRDY)
 			ipend |= SER_INT_RXREADY;
 	} else {
-		mtx_unlock_spin(&sc->sc_hwmtx);
+		uart_unlock(sc->sc_hwmtx);
 		if (iir & IIR_TXRDY)
 			ipend |= SER_INT_TXIDLE;
 		else
@@ -579,9 +579,9 @@
 	int error;
 
 	bas = &sc->sc_bas;
-	mtx_lock_spin(&sc->sc_hwmtx);
+	uart_lock(sc->sc_hwmtx);
 	error = ns8250_param(bas, baudrate, databits, stopbits, parity);
-	mtx_unlock_spin(&sc->sc_hwmtx);
+	uart_unlock(sc->sc_hwmtx);
 	return (error);
 }
 
@@ -740,7 +740,7 @@
 	uint8_t lsr;
 
 	bas = &sc->sc_bas;
-	mtx_lock_spin(&sc->sc_hwmtx);
+	uart_lock(sc->sc_hwmtx);
 	lsr = uart_getreg(bas, REG_LSR);
 	while (lsr & LSR_RXRDY) {
 		if (uart_rx_full(sc)) {
@@ -761,7 +761,7 @@
 		uart_barrier(bas);
 		lsr = uart_getreg(bas, REG_LSR);
 	}
-	mtx_unlock_spin(&sc->sc_hwmtx);
+	uart_unlock(sc->sc_hwmtx);
  	return (0);
 }
 
@@ -785,7 +785,7 @@
 			    SER_DRTS);
 		}
 	} while (!atomic_cmpset_32(&sc->sc_hwsig, old, new));
-	mtx_lock_spin(&sc->sc_hwmtx);
+	uart_lock(sc->sc_hwmtx);
 	ns8250->mcr &= ~(MCR_DTR|MCR_RTS);
 	if (new & SER_DTR)
 		ns8250->mcr |= MCR_DTR;
@@ -793,7 +793,7 @@
 		ns8250->mcr |= MCR_RTS;
 	uart_setreg(bas, REG_MCR, ns8250->mcr);
 	uart_barrier(bas);
-	mtx_unlock_spin(&sc->sc_hwmtx);
+	uart_unlock(sc->sc_hwmtx);
 	return (0);
 }
 
@@ -805,7 +805,7 @@
 	int i;
 
 	bas = &sc->sc_bas;
-	mtx_lock_spin(&sc->sc_hwmtx);
+	uart_lock(sc->sc_hwmtx);
 	while ((uart_getreg(bas, REG_LSR) & LSR_THRE) == 0)
 		;
 	uart_setreg(bas, REG_IER, ns8250->ier | IER_ETXRDY);
@@ -815,6 +815,6 @@
 		uart_barrier(bas);
 	}
 	sc->sc_txbusy = 1;
-	mtx_unlock_spin(&sc->sc_hwmtx);
+	uart_unlock(sc->sc_hwmtx);
 	return (0);
 }

==== //depot/projects/uart/dev/uart/uart_dev_sab82532.c#39 (text+ko) ====

@@ -437,9 +437,9 @@
 sab82532_bus_flush(struct uart_softc *sc, int what)
 {
 
-	mtx_lock_spin(&sc->sc_hwmtx);
+	uart_lock(sc->sc_hwmtx);
 	sab82532_flush(&sc->sc_bas, what);
-	mtx_unlock_spin(&sc->sc_hwmtx);
+	uart_unlock(sc->sc_hwmtx);
 	return (0);
 }
 
@@ -454,7 +454,7 @@
 	do {
 		old = sc->sc_hwsig;
 		sig = old;
-		mtx_lock_spin(&sc->sc_hwmtx);
+		uart_lock(sc->sc_hwmtx);
 		star = uart_getreg(bas, SAB_STAR);
 		SIGCHG(star & SAB_STAR_CTS, sig, SER_CTS, SER_DCTS);
 		vstr = uart_getreg(bas, SAB_VSTR);
@@ -469,7 +469,7 @@
 			break;
 		}
 		SIGCHG(pvr, sig, SER_DSR, SER_DDSR);
-		mtx_unlock_spin(&sc->sc_hwmtx);
+		uart_unlock(sc->sc_hwmtx);
 		new = sig & ~SER_MASK_DELTA;
 	} while (!atomic_cmpset_32(&sc->sc_hwsig, old, new));
 	return (sig);
@@ -484,7 +484,7 @@
 
 	bas = &sc->sc_bas;
 	error = 0;
-	mtx_lock_spin(&sc->sc_hwmtx);
+	uart_lock(sc->sc_hwmtx);
 	switch (request) {
 	case UART_IOCTL_BREAK:
 		dafo = uart_getreg(bas, SAB_DAFO);
@@ -520,7 +520,7 @@
 		error = EINVAL;
 		break;
 	}
-	mtx_unlock_spin(&sc->sc_hwmtx);
+	uart_unlock(sc->sc_hwmtx);
 	return (error);
 }
 
@@ -532,7 +532,7 @@
 	uint8_t isr0, isr1;
 
 	bas = &sc->sc_bas;
-	mtx_lock_spin(&sc->sc_hwmtx);
+	uart_lock(sc->sc_hwmtx);
 	isr0 = uart_getreg(bas, SAB_ISR0);
 	isr1 = uart_getreg(bas, SAB_ISR1);
 	uart_barrier(bas);
@@ -542,7 +542,7 @@
 		uart_setreg(bas, SAB_CMDR, SAB_CMDR_RFRD);
 		uart_barrier(bas);
 	}
-	mtx_unlock_spin(&sc->sc_hwmtx);
+	uart_unlock(sc->sc_hwmtx);
 
 	ipend = 0;
 	if (isr1 & SAB_ISR1_BRKT)
@@ -567,9 +567,9 @@
 	int error;
 
 	bas = &sc->sc_bas;
-	mtx_lock_spin(&sc->sc_hwmtx);
+	uart_lock(sc->sc_hwmtx);
 	error = sab82532_param(bas, baudrate, databits, stopbits, parity);
-	mtx_unlock_spin(&sc->sc_hwmtx);
+	uart_unlock(sc->sc_hwmtx);
 	return (error);
 }
 
@@ -617,7 +617,7 @@
 	uint8_t s;
 
 	bas = &sc->sc_bas;
-	mtx_lock_spin(&sc->sc_hwmtx);
+	uart_lock(sc->sc_hwmtx);
 	if (uart_getreg(bas, SAB_STAR) & SAB_STAR_RFNE) {
 		rbcl = uart_getreg(bas, SAB_RBCL) & 31;
 		if (rbcl == 0)
@@ -641,7 +641,7 @@
 		;
 	uart_setreg(bas, SAB_CMDR, SAB_CMDR_RMC);
 	uart_barrier(bas);
-	mtx_unlock_spin(&sc->sc_hwmtx);
+	uart_unlock(sc->sc_hwmtx);
 	return (0);
 }
 
@@ -666,7 +666,7 @@
 		}
 	} while (!atomic_cmpset_32(&sc->sc_hwsig, old, new));
 
-	mtx_lock_spin(&sc->sc_hwmtx);
+	uart_lock(sc->sc_hwmtx);
 	/* Set DTR pin. */
 	pvr = uart_getreg(bas, SAB_PVR);
 	switch (bas->chan) {
@@ -693,7 +693,7 @@
 		mode |= SAB_MODE_FRTS;
 	uart_setreg(bas, SAB_MODE, mode);
 	uart_barrier(bas);
-	mtx_unlock_spin(&sc->sc_hwmtx);
+	uart_unlock(sc->sc_hwmtx);
 	return (0);
 }
 
@@ -704,7 +704,7 @@
 	int i;
 
 	bas = &sc->sc_bas;
-	mtx_lock_spin(&sc->sc_hwmtx);
+	uart_lock(sc->sc_hwmtx);
 	while (!(uart_getreg(bas, SAB_STAR) & SAB_STAR_XFW))
 		;
 	for (i = 0; i < sc->sc_txdatasz; i++)
@@ -714,6 +714,6 @@
 		;
 	uart_setreg(bas, SAB_CMDR, SAB_CMDR_XF);
 	sc->sc_txbusy = 1;
-	mtx_unlock_spin(&sc->sc_hwmtx);
+	uart_unlock(sc->sc_hwmtx);
 	return (0);
 }

==== //depot/projects/uart/dev/uart/uart_dev_z8530.c#27 (text+ko) ====

@@ -348,9 +348,9 @@
 	do {
 		old = sc->sc_hwsig;
 		sig = old;
-		mtx_lock_spin(&sc->sc_hwmtx);
+		uart_lock(sc->sc_hwmtx);
 		bes = uart_getmreg(&sc->sc_bas, RR_BES);
-		mtx_unlock_spin(&sc->sc_hwmtx);
+		uart_unlock(sc->sc_hwmtx);
 		SIGCHG(bes & BES_CTS, sig, SER_CTS, SER_DCTS);
 		SIGCHG(bes & BES_DCD, sig, SER_DCD, SER_DDCD);
 		SIGCHG(bes & BES_SYNC, sig, SER_DSR, SER_DDSR);
@@ -368,7 +368,7 @@
 
 	bas = &sc->sc_bas;
 	error = 0;
-	mtx_lock_spin(&sc->sc_hwmtx);
+	uart_lock(sc->sc_hwmtx);
 	switch (request) {
 	case UART_IOCTL_BREAK:
 		if (data)
@@ -382,7 +382,7 @@
 		error = EINVAL;
 		break;
 	}
-	mtx_unlock_spin(&sc->sc_hwmtx);
+	uart_unlock(sc->sc_hwmtx);
 	return (error);
 }
 
@@ -398,7 +398,7 @@
 	bas = &sc->sc_bas;
 	ipend = 0;
 
-	mtx_lock_spin(&sc->sc_hwmtx);
+	uart_lock(sc->sc_hwmtx);
 	switch (bas->chan) {
 	case 1:
 		ip = uart_getmreg(bas, RR_IP);
@@ -454,7 +454,7 @@
 		uart_barrier(bas);
 	}
 
-	mtx_unlock_spin(&sc->sc_hwmtx);
+	uart_unlock(sc->sc_hwmtx);
 
 	return (ipend);
 }
@@ -466,10 +466,10 @@
 	struct z8530_softc *z8530 = (struct z8530_softc*)sc;
 	int error;
 
-	mtx_lock_spin(&sc->sc_hwmtx);
+	uart_lock(sc->sc_hwmtx);
 	error = z8530_param(&sc->sc_bas, baudrate, databits, stopbits, parity,
 	    &z8530->tpc);
-	mtx_unlock_spin(&sc->sc_hwmtx);
+	uart_unlock(sc->sc_hwmtx);
 	return (error);
 }
 
@@ -499,7 +499,7 @@
 	uint8_t bes, src;
 
 	bas = &sc->sc_bas;
-	mtx_lock_spin(&sc->sc_hwmtx);
+	uart_lock(sc->sc_hwmtx);
 	bes = uart_getmreg(bas, RR_BES);
 	while (bes & BES_RXA) {
 		if (uart_rx_full(sc)) {
@@ -533,7 +533,7 @@
 		}
 		bes = uart_getmreg(bas, RR_BES);
 	}
-	mtx_unlock_spin(&sc->sc_hwmtx);
+	uart_unlock(sc->sc_hwmtx);
 	return (0);
 }
 
@@ -558,7 +558,7 @@
 		}
 	} while (!atomic_cmpset_32(&sc->sc_hwsig, old, new));
 
-	mtx_lock_spin(&sc->sc_hwmtx);
+	uart_lock(sc->sc_hwmtx);
 	if (new & SER_DTR)
 		z8530->tpc |= TPC_DTR;
 	else
@@ -569,7 +569,7 @@
 		z8530->tpc &= ~TPC_RTS;
 	uart_setmreg(bas, WR_TPC, z8530->tpc);
 	uart_barrier(bas);
-	mtx_unlock_spin(&sc->sc_hwmtx);
+	uart_unlock(sc->sc_hwmtx);
 	return (0);
 }
 
@@ -580,13 +580,13 @@
 	struct uart_bas *bas;
 
 	bas = &sc->sc_bas;
-	mtx_lock_spin(&sc->sc_hwmtx);
+	uart_lock(sc->sc_hwmtx);
 	while (!(uart_getmreg(bas, RR_BES) & BES_TXE))
 		;
 	uart_setreg(bas, REG_DATA, sc->sc_txbuf[0]);
 	uart_barrier(bas);
 	sc->sc_txbusy = 1;
 	z8530->txidle = 1;	/* Report SER_INT_TXIDLE again. */
-	mtx_unlock_spin(&sc->sc_hwmtx);
+	uart_unlock(sc->sc_hwmtx);
 	return (0);
 }


More information about the p4-projects mailing list