Module Name:    src
Committed By:   skrll
Date:           Sun May 20 07:54:40 UTC 2012

Modified Files:
        src/sys/arch/evbarm/dev: plcom.c plcomvar.h

Log Message:
Replace the simple_lock with a kmutex_t.  Update the locking to match
com(4) in the few places it didn't already.


To generate a diff of this commit:
cvs rdiff -u -r1.35 -r1.36 src/sys/arch/evbarm/dev/plcom.c
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/evbarm/dev/plcomvar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/evbarm/dev/plcom.c
diff -u src/sys/arch/evbarm/dev/plcom.c:1.35 src/sys/arch/evbarm/dev/plcom.c:1.36
--- src/sys/arch/evbarm/dev/plcom.c:1.35	Mon May 14 19:40:06 2012
+++ src/sys/arch/evbarm/dev/plcom.c	Sun May 20 07:54:40 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: plcom.c,v 1.35 2012/05/14 19:40:06 skrll Exp $	*/
+/*	$NetBSD: plcom.c,v 1.36 2012/05/20 07:54:40 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2001 ARM Ltd
@@ -94,7 +94,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: plcom.c,v 1.35 2012/05/14 19:40:06 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: plcom.c,v 1.36 2012/05/20 07:54:40 skrll Exp $");
 
 #include "opt_plcom.h"
 #include "opt_ddb.h"
@@ -248,9 +248,6 @@ void	plcom_kgdb_putc (void *, int);
 #define	BW	BUS_SPACE_BARRIER_WRITE
 #define PLCOM_BARRIER(t, h, f) bus_space_barrier((t), (h), 0, PLCOM_UART_SIZE, (f))
 
-#define PLCOM_LOCK(sc) simple_lock(&(sc)->sc_lock)
-#define PLCOM_UNLOCK(sc) simple_unlock(&(sc)->sc_lock)
-
 int
 plcomspeed(long speed, long frequency)
 {
@@ -331,22 +328,21 @@ plcomprobe1(bus_space_tag_t iot, bus_spa
 	return 1;
 }
 
+/*
+ * No locking in this routine; it is only called during attach,
+ * or with the port already locked.
+ */
 static void
 plcom_enable_debugport(struct plcom_softc *sc)
 {
-	int s;
 
 	/* Turn on line break interrupt, set carrier. */
-	s = splserial();
-	PLCOM_LOCK(sc);
 	sc->sc_cr = PL010_CR_RIE | PL010_CR_RTIE | PL01X_CR_UARTEN;
 	bus_space_write_1(sc->sc_iot, sc->sc_ioh, plcom_cr, sc->sc_cr);
 	SET(sc->sc_mcr, PL01X_MCR_DTR | PL01X_MCR_RTS);
 	/* XXX device_unit() abuse */
 	sc->sc_set_mcr(sc->sc_set_mcr_arg, device_unit(&sc->sc_dev),
 	    sc->sc_mcr);
-	PLCOM_UNLOCK(sc);
-	splx(s);
 }
 
 void
@@ -358,7 +354,7 @@ plcom_attach_subr(struct plcom_softc *sc
 	struct tty *tp;
 
 	callout_init(&sc->sc_diag_callout, 0);
-	simple_lock_init(&sc->sc_lock);
+	mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_HIGH);
 
 	/* Disable interrupts before configuring the device. */
 	sc->sc_cr = 0;
@@ -505,6 +501,9 @@ plcom_detach(struct device *self, int fl
 	rnd_detach_source(&sc->rnd_source);
 #endif
 
+	/* Destroy the lock. */
+	mutex_destroy(&sc->sc_lock);
+
 	return 0;
 }
 
@@ -526,10 +525,7 @@ void
 plcom_shutdown(struct plcom_softc *sc)
 {
 	struct tty *tp = sc->sc_tty;
-	int s;
-
-	s = splserial();
-	PLCOM_LOCK(sc);	
+	mutex_spin_enter(&sc->sc_lock);
 
 	/* If we were asserting flow control, then deassert it. */
 	SET(sc->sc_rx_flags, RX_IBUF_BLOCKED);
@@ -551,12 +547,10 @@ plcom_shutdown(struct plcom_softc *sc)
 	 */
 	if (ISSET(tp->t_cflag, HUPCL)) {
 		plcom_modem(sc, 0);
-		PLCOM_UNLOCK(sc);
-		splx(s);
-		/* XXX tsleep will only timeout */
-		(void) tsleep(sc, TTIPRI, ttclos, hz);
-		s = splserial();
-		PLCOM_LOCK(sc);	
+		mutex_spin_exit(&sc->sc_lock);
+		/* XXX will only timeout */
+		(void) kpause(ttclos, false, hz, NULL);
+		mutex_spin_enter(&sc->sc_lock);
 	}
 
 	/* Turn off interrupts. */
@@ -567,6 +561,7 @@ plcom_shutdown(struct plcom_softc *sc)
 		sc->sc_cr = 0;
 	bus_space_write_1(sc->sc_iot, sc->sc_ioh, plcom_cr, sc->sc_cr);
 
+	mutex_spin_exit(&sc->sc_lock);
 	if (sc->disable) {
 #ifdef DIAGNOSTIC
 		if (!sc->enabled)
@@ -575,8 +570,6 @@ plcom_shutdown(struct plcom_softc *sc)
 		(*sc->disable)(sc);
 		sc->enabled = 0;
 	}
-	PLCOM_UNLOCK(sc);
-	splx(s);
 }
 
 int
@@ -584,7 +577,7 @@ plcomopen(dev_t dev, int flag, int mode,
 {
 	struct plcom_softc *sc;
 	struct tty *tp;
-	int s, s2;
+	int s;
 	int error;
 
 	sc = device_lookup_private(&plcom_cd, PLCOMUNIT(dev));
@@ -618,20 +611,18 @@ plcomopen(dev_t dev, int flag, int mode,
 
 		tp->t_dev = dev;
 
-		s2 = splserial();
-		PLCOM_LOCK(sc);
-
 		if (sc->enable) {
 			if ((*sc->enable)(sc)) {
-				PLCOM_UNLOCK(sc);
-				splx(s2);
 				splx(s);
 				printf("%s: device enable failed\n",
 				       sc->sc_dev.dv_xname);
 				return EIO;
 			}
+			mutex_spin_enter(&sc->sc_lock);
 			sc->enabled = 1;
 			plcom_config(sc);
+		} else {
+			mutex_spin_enter(&sc->sc_lock);
 		}
 
 		/* Turn on interrupts. */
@@ -649,8 +640,7 @@ plcomopen(dev_t dev, int flag, int mode,
 		sc->ppsparam.mode = 0;
 		mutex_spin_exit(&timecounter_lock);
 
-		PLCOM_UNLOCK(sc);
-		splx(s2);
+		mutex_spin_enter(&sc->sc_lock);
 
 		/*
 		 * Initialize the termios status to the defaults.  Add in the
@@ -679,8 +669,7 @@ plcomopen(dev_t dev, int flag, int mode,
 		ttychars(tp);
 		ttsetwater(tp);
 
-		s2 = splserial();
-		PLCOM_LOCK(sc);
+		mutex_spin_enter(&sc->sc_lock);
 
 		/*
 		 * Turn on DTR.  We must always do this, even if carrier is not
@@ -703,8 +692,7 @@ plcomopen(dev_t dev, int flag, int mode,
 			plcomstatus(sc, "plcomopen  ");
 #endif
 
-		PLCOM_UNLOCK(sc);
-		splx(s2);
+		mutex_spin_exit(&sc->sc_lock);
 	}
 	
 	splx(s);
@@ -816,7 +804,6 @@ plcomioctl(dev_t dev, u_long cmd, void *
 		device_lookup_private(&plcom_cd, PLCOMUNIT(dev));
 	struct tty *tp = sc->sc_tty;
 	int error;
-	int s;
 
 	if (PLCOM_ISALIVE(sc) == 0)
 		return EIO;
@@ -831,9 +818,7 @@ plcomioctl(dev_t dev, u_long cmd, void *
 
 	error = 0;
 
-	s = splserial();
-	PLCOM_LOCK(sc);	
-
+	mutex_spin_enter(&sc->sc_lock);
 	switch (cmd) {
 	case TIOCSBRK:
 		plcom_break(sc, 1);
@@ -984,8 +969,7 @@ plcomioctl(dev_t dev, u_long cmd, void *
 		break;
 	}
 
-	PLCOM_UNLOCK(sc);
-	splx(s);
+	mutex_spin_exit(&sc->sc_lock);
 
 #ifdef PLCOM_DEBUG
 	if (plcom_debug)
@@ -1145,7 +1129,6 @@ plcomparam(struct tty *tp, struct termio
 		device_lookup_private(&plcom_cd, PLCOMUNIT(tp->t_dev));
 	int ospeed;
 	u_char lcr;
-	int s;
 
 	if (PLCOM_ISALIVE(sc) == 0)
 		return EIO;
@@ -1179,8 +1162,7 @@ plcomparam(struct tty *tp, struct termio
 
 	lcr = ISSET(sc->sc_lcr, PL01X_LCR_BRK) | cflag2lcr(t->c_cflag);
 
-	s = splserial();
-	PLCOM_LOCK(sc);	
+	mutex_spin_enter(&sc->sc_lock);
 
 	sc->sc_lcr = lcr;
 
@@ -1276,8 +1258,7 @@ plcomparam(struct tty *tp, struct termio
 		sc->sc_r_lowat = plcom_rbuf_lowat;
 	}
 
-	PLCOM_UNLOCK(sc);
-	splx(s);
+	mutex_spin_exit(&sc->sc_lock);
 
 	/*
 	 * Update the tty layer's idea of the carrier bit, in case we changed
@@ -1357,7 +1338,6 @@ plcomhwiflow(struct tty *tp, int block)
 {
 	struct plcom_softc *sc =
 		device_lookup_private(&plcom_cd, PLCOMUNIT(tp->t_dev));
-	int s;
 
 	if (PLCOM_ISALIVE(sc) == 0)
 		return 0;
@@ -1365,8 +1345,7 @@ plcomhwiflow(struct tty *tp, int block)
 	if (sc->sc_mcr_rts == 0)
 		return 0;
 
-	s = splserial();
-	PLCOM_LOCK(sc);
+	mutex_spin_enter(&sc->sc_lock);
 	
 	if (block) {
 		if (!ISSET(sc->sc_rx_flags, RX_TTY_BLOCKED)) {
@@ -1384,8 +1363,7 @@ plcomhwiflow(struct tty *tp, int block)
 		}
 	}
 
-	PLCOM_UNLOCK(sc);
-	splx(s);
+	mutex_spin_exit(&sc->sc_lock);
 	return 1;
 }
 	
@@ -1440,8 +1418,7 @@ plcomstart(struct tty *tp)
 		tba = tp->t_outq.c_cf;
 		tbc = ndqb(&tp->t_outq, 0);
 
-		(void)splserial();
-		PLCOM_LOCK(sc);
+		mutex_spin_enter(&sc->sc_lock);
 
 		sc->sc_tba = tba;
 		sc->sc_tbc = tbc;
@@ -1467,7 +1444,7 @@ plcomstart(struct tty *tp)
 		sc->sc_tbc -= n;
 		sc->sc_tba += n;
 	}
-	PLCOM_UNLOCK(sc);
+	mutex_spin_exit(&sc->sc_lock);
 out:
 	splx(s);
 	return;
@@ -1481,10 +1458,8 @@ plcomstop(struct tty *tp, int flag)
 {
 	struct plcom_softc *sc =
 		device_lookup_private(&plcom_cd, PLCOMUNIT(tp->t_dev));
-	int s;
 
-	s = splserial();
-	PLCOM_LOCK(sc);
+	mutex_spin_enter(&sc->sc_lock);
 	if (ISSET(tp->t_state, TS_BUSY)) {
 		/* Stop transmitting at the next chunk. */
 		sc->sc_tbc = 0;
@@ -1492,8 +1467,7 @@ plcomstop(struct tty *tp, int flag)
 		if (!ISSET(tp->t_state, TS_TTSTOP))
 			SET(tp->t_state, TS_FLUSH);
 	}
-	PLCOM_UNLOCK(sc);	
-	splx(s);
+	mutex_spin_exit(&sc->sc_lock);
 }
 
 void
@@ -1501,17 +1475,14 @@ plcomdiag(void *arg)
 {
 	struct plcom_softc *sc = arg;
 	int overflows, floods;
-	int s;
 
-	s = splserial();
-	PLCOM_LOCK(sc);
+	mutex_spin_enter(&sc->sc_lock);
 	overflows = sc->sc_overflows;
 	sc->sc_overflows = 0;
 	floods = sc->sc_floods;
 	sc->sc_floods = 0;
 	sc->sc_errors = 0;
-	PLCOM_UNLOCK(sc);
-	splx(s);
+	mutex_spin_exit(&sc->sc_lock);
 
 	log(LOG_WARNING, "%s: %d silo overflow%s, %d ibuf flood%s\n",
 	    sc->sc_dev.dv_xname,
@@ -1527,7 +1498,6 @@ plcom_rxsoft(struct plcom_softc *sc, str
 	u_int cc, scc;
 	u_char rsr;
 	int code;
-	int s;
 
 	end = sc->sc_ebuf;
 	get = sc->sc_rbget;
@@ -1591,24 +1561,21 @@ plcom_rxsoft(struct plcom_softc *sc, str
 
 	if (cc != scc) {
 		sc->sc_rbget = get;
-		s = splserial();
-		PLCOM_LOCK(sc);
-		
+		mutex_spin_enter(&sc->sc_lock);
+
 		cc = sc->sc_rbavail += scc - cc;
 		/* Buffers should be ok again, release possible block. */
 		if (cc >= sc->sc_r_lowat) {
 			if (ISSET(sc->sc_rx_flags, RX_IBUF_OVERFLOWED)) {
 				CLR(sc->sc_rx_flags, RX_IBUF_OVERFLOWED);
 				SET(sc->sc_cr, PL010_CR_RIE | PL010_CR_RTIE);
-				bus_space_write_1(sc->sc_iot, sc->sc_ioh, plcom_cr, sc->sc_cr);
 			}
 			if (ISSET(sc->sc_rx_flags, RX_IBUF_BLOCKED)) {
 				CLR(sc->sc_rx_flags, RX_IBUF_BLOCKED);
 				plcom_hwiflow(sc);
 			}
 		}
-		PLCOM_UNLOCK(sc);
-		splx(s);
+		mutex_spin_exit(&sc->sc_lock);
 	}
 }
 
@@ -1628,15 +1595,12 @@ integrate void
 plcom_stsoft(struct plcom_softc *sc, struct tty *tp)
 {
 	u_char msr, delta;
-	int s;
 
-	s = splserial();
-	PLCOM_LOCK(sc);
+	mutex_spin_enter(&sc->sc_lock);
 	msr = sc->sc_msr;
 	delta = sc->sc_msr_delta;
 	sc->sc_msr_delta = 0;
-	PLCOM_UNLOCK(sc);	
-	splx(s);
+	mutex_spin_exit(&sc->sc_lock);
 
 	if (ISSET(delta, sc->sc_msr_dcd)) {
 		/*
@@ -1701,10 +1665,10 @@ plcomintr(void *arg)
 	if (PLCOM_ISALIVE(sc) == 0)
 		return 0;
 
-	PLCOM_LOCK(sc);
+	mutex_spin_enter(&sc->sc_lock);
 	iir = bus_space_read_1(iot, ioh, plcom_iir);
 	if (! ISSET(iir, PL010_IIR_IMASK)) {
-		PLCOM_UNLOCK(sc);
+		mutex_spin_exit(&sc->sc_lock);
 		return 0;
 	}
 
@@ -1930,7 +1894,7 @@ plcomintr(void *arg)
 	} while (ISSET((iir = bus_space_read_1(iot, ioh, plcom_iir)),
 	    PL010_IIR_IMASK));
 
-	PLCOM_UNLOCK(sc);
+	mutex_spin_exit(&sc->sc_lock);
 
 	/* Wake up the poller. */
 	softint_schedule(sc->sc_si);

Index: src/sys/arch/evbarm/dev/plcomvar.h
diff -u src/sys/arch/evbarm/dev/plcomvar.h:1.8 src/sys/arch/evbarm/dev/plcomvar.h:1.9
--- src/sys/arch/evbarm/dev/plcomvar.h:1.8	Thu Feb  2 19:42:59 2012
+++ src/sys/arch/evbarm/dev/plcomvar.h	Sun May 20 07:54:40 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: plcomvar.h,v 1.8 2012/02/02 19:42:59 tls Exp $	*/
+/*	$NetBSD: plcomvar.h,v 1.9 2012/05/20 07:54:40 skrll Exp $	*/
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
@@ -136,7 +136,7 @@ struct plcom_softc {
 #ifdef RND_COM
 	krndsource_t  rnd_source;
 #endif
-	struct simplelock	sc_lock;
+	kmutex_t		sc_lock;
 };
 
 int  plcomprobe1	(bus_space_tag_t, bus_space_handle_t);

Reply via email to