Module Name:    src
Committed By:   tsutsui
Date:           Sun Dec  6 02:04:10 UTC 2015

Modified Files:
        src/sys/arch/dreamcast/dev/maple: maple.c maplevar.h

Log Message:
Convert tsleep(9)/wakeup(9) pairs to condvar(9) with mutex(9).

Briefly tested with mkbd(4).


To generate a diff of this commit:
cvs rdiff -u -r1.51 -r1.52 src/sys/arch/dreamcast/dev/maple/maple.c
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/dreamcast/dev/maple/maplevar.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/dreamcast/dev/maple/maple.c
diff -u src/sys/arch/dreamcast/dev/maple/maple.c:1.51 src/sys/arch/dreamcast/dev/maple/maple.c:1.52
--- src/sys/arch/dreamcast/dev/maple/maple.c:1.51	Fri Jul 25 08:10:32 2014
+++ src/sys/arch/dreamcast/dev/maple/maple.c	Sun Dec  6 02:04:10 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: maple.c,v 1.51 2014/07/25 08:10:32 dholland Exp $	*/
+/*	$NetBSD: maple.c,v 1.52 2015/12/06 02:04:10 tsutsui Exp $	*/
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: maple.c,v 1.51 2014/07/25 08:10:32 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: maple.c,v 1.52 2015/12/06 02:04:10 tsutsui Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -76,6 +76,8 @@ __KERNEL_RCSID(0, "$NetBSD: maple.c,v 1.
 #include <sys/systm.h>
 #include <sys/conf.h>
 #include <sys/bus.h>
+#include <sys/mutex.h>
+#include <sys/condvar.h>
 
 #include <uvm/uvm.h>
 
@@ -247,6 +249,11 @@ mapleattach(device_t parent, device_t se
 	maple_polling = 1;
 	maple_scanbus(sc);
 
+	mutex_init(&sc->sc_dma_lock, MUTEX_DEFAULT, IPL_MAPLE);
+	cv_init(&sc->sc_dma_cv, device_xname(self));
+	mutex_init(&sc->sc_event_lock, MUTEX_DEFAULT, IPL_SOFTCLOCK);
+	cv_init(&sc->sc_event_cv, device_xname(self));
+
 	callout_init(&sc->maple_callout_ch, 0);
 
 	sc->sc_intrhand = sysasic_intr_establish(SYSASIC_EVENT_MAPLE_DMADONE,
@@ -835,13 +842,12 @@ maple_command(device_t dev, struct maple
 {
 	struct maple_softc *sc = device_private(dev);
 	struct maple_func *fn;
-	int s;
 
 	KASSERT(func >= 0 && func < 32);
 	KASSERT(command);
 	KASSERT((flags & ~MAPLE_FLAG_CMD_PERIODIC_TIMING) == 0);
 
-	s = splsoftclock();
+	mutex_enter(&sc->sc_event_lock);
 
 	fn = &u->u_func[func];
 #if 1 /*def DIAGNOSTIC*/
@@ -860,9 +866,9 @@ maple_command(device_t dev, struct maple
 	} else {
 		fn->f_cmdstat = MAPLE_CMDSTAT_ASYNC;
 		TAILQ_INSERT_TAIL(&sc->sc_acmdq, fn, f_cmdq);
-		wakeup(&sc->sc_event);	/* wake for async event */
+		cv_broadcast(&sc->sc_event_cv);	/* wake for async event */
 	}
-	splx(s);
+	mutex_exit(&sc->sc_event_lock);
 }
 
 static void
@@ -1422,7 +1428,6 @@ maple_event_thread(void *arg)
 {
 	struct maple_softc *sc = arg;
 	unsigned cnt = 1;	/* timing counter */
-	int s;
 #if defined(MAPLE_DEBUG) && MAPLE_DEBUG > 1
 	int noreq = 0;
 #endif
@@ -1485,19 +1490,19 @@ maple_event_thread(void *arg)
 			/*
 			 * start DMA
 			 */
-			s = splmaple();
+			mutex_enter(&sc->sc_dma_lock);
 			maple_start(sc);
 
 			/*
 			 * wait until DMA done
 			 */
-			if (tsleep(&sc->sc_dmadone, PWAIT, "mdma", hz)
+			if (cv_timedwait(&sc->sc_dma_cv, &sc->sc_dma_lock, hz)
 			    == EWOULDBLOCK) {
 				/* was DDB active? */
 				printf("%s: timed out\n",
 				    device_xname(sc->sc_dev));
 			}
-			splx(s);
+			mutex_exit(&sc->sc_dma_lock);
 
 			/*
 			 * call handlers
@@ -1522,17 +1527,17 @@ maple_event_thread(void *arg)
 		/*
 		 * wait for an event
 		 */
-		s = splsoftclock();
+		mutex_enter(&sc->sc_event_lock);
 		if (TAILQ_EMPTY(&sc->sc_acmdq) && sc->sc_event == 0 &&
 		    TAILQ_EMPTY(&sc->sc_periodicdeferq)) {
-			if (tsleep(&sc->sc_event, PWAIT, "mslp", hz)
-			    == EWOULDBLOCK) {
+			if (cv_timedwait(&sc->sc_event_cv, &sc->sc_event_lock,
+			    hz) == EWOULDBLOCK) {
 				printf("%s: event timed out\n",
 				    device_xname(sc->sc_dev));
 			}
 
 		}
-		splx(s);
+		mutex_exit(&sc->sc_event_lock);
 
 	}
 
@@ -1547,7 +1552,9 @@ maple_intr(void *arg)
 {
 	struct maple_softc *sc = arg;
 
-	wakeup(&sc->sc_dmadone);
+	mutex_enter(&sc->sc_dma_lock);
+	cv_broadcast(&sc->sc_dma_cv);
+	mutex_exit(&sc->sc_dma_lock);
 
 	return 1;
 }
@@ -1557,8 +1564,10 @@ maple_callout(void *ctx)
 {
 	struct maple_softc *sc = ctx;
 
+	mutex_enter(&sc->sc_event_lock);
 	sc->sc_event = 1;	/* mark as periodic event */
-	wakeup(&sc->sc_event);
+	cv_broadcast(&sc->sc_event_cv);
+	mutex_exit(&sc->sc_event_lock);
 }
 
 /*

Index: src/sys/arch/dreamcast/dev/maple/maplevar.h
diff -u src/sys/arch/dreamcast/dev/maple/maplevar.h:1.14 src/sys/arch/dreamcast/dev/maple/maplevar.h:1.15
--- src/sys/arch/dreamcast/dev/maple/maplevar.h:1.14	Sat Oct 27 17:17:45 2012
+++ src/sys/arch/dreamcast/dev/maple/maplevar.h	Sun Dec  6 02:04:10 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: maplevar.h,v 1.14 2012/10/27 17:17:45 chs Exp $	*/
+/*	$NetBSD: maplevar.h,v 1.15 2015/12/06 02:04:10 tsutsui Exp $	*/
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -184,9 +184,13 @@ struct maple_softc {
 	uint32_t sc_txbuf_phys;	/* 29-bit physical address */
 
 	void	*sc_intrhand;
-	int	sc_dmadone;		/* wchan */
 
-	int	sc_event;		/* periodic event is active / wchan */
+	kmutex_t sc_dma_lock;
+	kcondvar_t sc_dma_cv;
+
+	int	sc_event;	/* periodic event is active */
+	kmutex_t sc_event_lock;
+	kcondvar_t sc_event_cv;
 
 	SIMPLEQ_HEAD(maple_dmaq_head, maple_unit) sc_dmaq, sc_retryq;
 	TAILQ_HEAD(maple_unitq_head, maple_unit) sc_probeq, sc_pingq;

Reply via email to