Module Name:    src
Committed By:   jakllsch
Date:           Thu May 26 02:29:23 UTC 2011

Modified Files:
        src/sys/dev/ic: atppc.c atppcvar.h
        src/sys/dev/isa: atppc_isa.c

Log Message:
Convert ltsleep() in atppc(4) to modern interfaces.

Reviewed by rmind@.


To generate a diff of this commit:
cvs rdiff -u -r1.28 -r1.29 src/sys/dev/ic/atppc.c
cvs rdiff -u -r1.11 -r1.12 src/sys/dev/ic/atppcvar.h
cvs rdiff -u -r1.14 -r1.15 src/sys/dev/isa/atppc_isa.c

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

Modified files:

Index: src/sys/dev/ic/atppc.c
diff -u src/sys/dev/ic/atppc.c:1.28 src/sys/dev/ic/atppc.c:1.29
--- src/sys/dev/ic/atppc.c:1.28	Tue Dec 16 22:35:30 2008
+++ src/sys/dev/ic/atppc.c	Thu May 26 02:29:23 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: atppc.c,v 1.28 2008/12/16 22:35:30 christos Exp $ */
+/* $NetBSD: atppc.c,v 1.29 2011/05/26 02:29:23 jakllsch Exp $ */
 
 /*
  * Copyright (c) 2001 Alcove - Nicolas Souchu
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: atppc.c,v 1.28 2008/12/16 22:35:30 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: atppc.c,v 1.29 2011/05/26 02:29:23 jakllsch Exp $");
 
 #include "opt_atppc.h"
 
@@ -131,7 +131,7 @@
 /* Miscellaneous */
 static int atppc_poll_str(const struct atppc_softc * const, const u_int8_t,
 	const u_int8_t);
-static int atppc_wait_interrupt(struct atppc_softc * const, const void *,
+static int atppc_wait_interrupt(struct atppc_softc * const, kcondvar_t *,
 	const u_int8_t);
 
 
@@ -148,7 +148,9 @@
 	struct parport_adapter sc_parport_adapter;
 	char buf[64];
 
-	ATPPC_LOCK_INIT(lsc);
+	mutex_init(&lsc->sc_lock, MUTEX_DEFAULT, IPL_TTY);
+	cv_init(&lsc->sc_out_cv, "atppcout");
+	cv_init(&lsc->sc_in_cv, "atppcin");
 
 	/* Probe and set up chipset */
 	if (atppc_detect_chipset(lsc) != 0) {
@@ -181,11 +183,6 @@
 			device_xname(lsc->sc_dev)));
 	}
 
-#if defined (MULTIPROCESSOR) || defined (LOCKDEBUG)
-	/* Initialize lock structure */
-	simple_lock_init(&(lsc->sc_lock));
-#endif
-
 	/* Set up parport_adapter structure */
 
 	/* Set capabilites */
@@ -616,6 +613,8 @@
 	int claim = 1;
 	enum { NONE, READER, WRITER } wake_up = NONE;
 
+	mutex_enter(&atppc->sc_lock);
+
 	/* Record registers' status */
 	atppc->sc_str_intr = atppc_r_str(atppc);
 	atppc->sc_ctr_intr = atppc_r_ctr(atppc);
@@ -706,11 +705,11 @@
 			break;
 
 		case READER:
-			wakeup(atppc->sc_inb);
+			cv_broadcast(&atppc->sc_in_cv);
 			break;
 
 		case WRITER:
-			wakeup(atppc->sc_outb);
+			cv_broadcast(&atppc->sc_out_cv);
 			break;
 		}
 	}
@@ -724,6 +723,8 @@
 		}
 	}
 
+	mutex_exit(&atppc->sc_lock);
+
 	return claim;
 }
 
@@ -736,18 +737,15 @@
 atppc_check_epp_timeout(device_t dev)
 {
 	struct atppc_softc *atppc = device_private(dev);
-	int s;
 	int error;
 
-	s = splatppc();
-	ATPPC_LOCK(atppc);
+	mutex_enter(&atppc->sc_lock);
 
 	atppc_reset_epp_timeout(dev);
 	error = !(atppc_r_str(atppc) & TIMEOUT);
 	atppc_barrier_r(atppc);
 
-	ATPPC_UNLOCK(atppc);
-	splx(s);
+	mutex_exit(&atppc->sc_lock);
 
 	return (error);
 }
@@ -783,10 +781,8 @@
 {
 	struct atppc_softc *atppc = device_private(dev);
 	int error = 0;
-	int s;
 
-	s = splatppc();
-	ATPPC_LOCK(atppc);
+	mutex_enter(&atppc->sc_lock);
 
 	*cnt = 0;
 
@@ -835,8 +831,7 @@
 	if (!(error))
 		error = atppc->sc_inerr;
 
-	ATPPC_UNLOCK(atppc);
-	splx(s);
+	mutex_exit(&atppc->sc_lock);
 
 	return (error);
 }
@@ -847,12 +842,10 @@
 {
 	struct atppc_softc * const atppc = device_private(dev);
 	int error = 0;
-	int s;
 
 	*cnt = 0;
 
-	s = splatppc();
-	ATPPC_LOCK(atppc);
+	mutex_enter(&atppc->sc_lock);
 
 	/* Set up line buffer */
 	atppc->sc_outb = atppc->sc_outbstart = buf;
@@ -896,8 +889,7 @@
 	if (!(error))
 		error = atppc->sc_outerr;
 
-	ATPPC_UNLOCK(atppc);
-	splx(s);
+	mutex_exit(&atppc->sc_lock);
 
 	return (error);
 }
@@ -919,11 +911,9 @@
 	struct atppc_softc *atppc = device_private(dev);
 	u_int8_t ecr;
 	u_int8_t chipset_mode;
-	int s;
 	int rval = 0;
 
-	s = splatppc();
-	ATPPC_LOCK(atppc);
+	mutex_enter(&atppc->sc_lock);
 
 	/* If ECP capable, configure ecr register */
 	if (atppc->sc_has & ATPPC_HAS_ECP) {
@@ -1040,8 +1030,7 @@
 	}
 
 end:
-	ATPPC_UNLOCK(atppc);
-	splx(s);
+	mutex_exit(&atppc->sc_lock);
 
 	return rval;
 }
@@ -1052,10 +1041,8 @@
 {
 	struct atppc_softc *atppc = device_private(dev);
 	int mode;
-	int s;
 
-	s = splatppc();
-	ATPPC_LOCK(atppc);
+	mutex_enter(&atppc->sc_lock);
 
 	/* The chipset can only be in one mode at a time logically */
 	switch (atppc->sc_mode) {
@@ -1089,8 +1076,7 @@
 		break;
 	}
 
-	ATPPC_UNLOCK(atppc);
-	splx(s);
+	mutex_exit(&atppc->sc_lock);
 
 	return mode;
 }
@@ -1102,11 +1088,9 @@
 {
 	struct atppc_softc *atppc = device_private(dev);
 	int i;
-	int s;
 	u_int8_t r;
 
-	s = splatppc();
-	ATPPC_LOCK(atppc);
+	mutex_enter(&atppc->sc_lock);
 
 	/*
 	 * Only wait for FIFO to empty if mode is chipset is ECP-capable AND
@@ -1134,8 +1118,7 @@
 		device_xname(dev)));
 
 end:
-	ATPPC_UNLOCK(atppc);
-	splx(s);
+	mutex_exit(&atppc->sc_lock);
 
 	return;
 }
@@ -1149,15 +1132,13 @@
 	char cc, *p;
 	int i, iter, len;
 	int error;
-	int s;
 	register int reg;
 	register unsigned char mask;
 	register int accum = 0;
 	register char *ptr = NULL;
 	struct ppbus_microseq *stack = NULL;
 
-	s = splatppc();
-	ATPPC_LOCK(atppc);
+	mutex_enter(&atppc->sc_lock);
 
 /* microsequence registers are equivalent to PC-like port registers */
 
@@ -1318,8 +1299,7 @@
 			 */
 			if ((error = mi->arg[0].f(mi->arg[1].p,
 				atppc->sc_ptr))) {
-				ATPPC_UNLOCK(atppc);
-				splx(s);
+				mutex_exit(&atppc->sc_lock);
 				return (error);
 			}
 			mi++;
@@ -1373,8 +1353,7 @@
 			/* update pc for atppc level of execution */
 			*p_msq = mi;
 
-			ATPPC_UNLOCK(atppc);
-			splx(s);
+			mutex_exit(&atppc->sc_lock);
 			return (0);
 			break;
 
@@ -1397,10 +1376,8 @@
 {
 	struct atppc_softc *atppc = device_private(dev);
 	u_int8_t val = 0;
-	int s;
 
-	s = splatppc();
-	ATPPC_LOCK(atppc);
+	mutex_enter(&atppc->sc_lock);
 
 	switch (iop) {
 	case PPBUS_OUTSB_EPP:
@@ -1477,8 +1454,7 @@
 
 	atppc_barrier(atppc);
 
-	ATPPC_UNLOCK(atppc);
-	splx(s);
+	mutex_exit(&atppc->sc_lock);
 
 	return val;
 }
@@ -1489,10 +1465,8 @@
 {
 	struct atppc_softc *atppc = device_private(dev);
 	int rval = 0;
-	int s;
 
-	s = splatppc();
-	ATPPC_LOCK(atppc);
+	mutex_enter(&atppc->sc_lock);
 
 	switch(index) {
 	case PPBUS_IVAR_EPP_PROTO:
@@ -1515,8 +1489,7 @@
 		rval = ENODEV;
 	}
 
-	ATPPC_UNLOCK(atppc);
-	splx(s);
+	mutex_exit(&atppc->sc_lock);
 
 	return rval;
 }
@@ -1527,10 +1500,8 @@
 {
 	struct atppc_softc *atppc = device_private(dev);
 	int rval = 0;
-	int s;
 
-	s = splatppc();
-	ATPPC_LOCK(atppc);
+	mutex_enter(&atppc->sc_lock);
 
 	switch(index) {
 	case PPBUS_IVAR_EPP_PROTO:
@@ -1562,8 +1533,7 @@
 		rval = ENODEV;
 	}
 
-	ATPPC_UNLOCK(atppc);
-	splx(s);
+	mutex_exit(&atppc->sc_lock);
 
 	return rval;
 }
@@ -1575,10 +1545,6 @@
 	struct atppc_softc *atppc = device_private(dev);
 	struct atppc_handler_node *callback;
 	int rval = 0;
-	int s;
-
-	s = splatppc();
-	ATPPC_LOCK(atppc);
 
 	if (handler == NULL) {
 		ATPPC_DPRINTF(("%s(%s): attempt to register NULL handler.\n",
@@ -1590,16 +1556,15 @@
 		if (callback) {
 			callback->func = handler;
 			callback->arg = arg;
+			mutex_enter(&atppc->sc_lock);
 			SLIST_INSERT_HEAD(&(atppc->sc_handler_listhead),
 				callback, entries);
+			mutex_exit(&atppc->sc_lock);
 		} else {
 			rval = ENOMEM;
 		}
 	}
 
-	ATPPC_UNLOCK(atppc);
-	splx(s);
-
 	return rval;
 }
 
@@ -1610,10 +1575,8 @@
 	struct atppc_softc *atppc = device_private(dev);
 	struct atppc_handler_node *callback;
 	int rval = EINVAL;
-	int s;
 
-	s = splatppc();
-	ATPPC_LOCK(atppc);
+	mutex_enter(&atppc->sc_lock);
 
 	if (SLIST_EMPTY(&(atppc->sc_handler_listhead)))
 		panic("%s(%s): attempt to remove handler from empty list.\n",
@@ -1624,14 +1587,16 @@
 		if (callback->func == handler) {
 			SLIST_REMOVE(&(atppc->sc_handler_listhead), callback,
 				atppc_handler_node, entries);
-			free(callback, M_DEVBUF);
 			rval = 0;
 			break;
 		}
 	}
 
-	ATPPC_UNLOCK(atppc);
-	splx(s);
+	mutex_exit(&atppc->sc_lock);
+
+	if (rval == 0) {
+		free(callback, M_DEVBUF);
+	}
 
 	return rval;
 }
@@ -1702,7 +1667,7 @@
 			/* Event 11 - wait ack from peripherial */
 			if (atppc->sc_use & ATPPC_USE_INTR)
 				atppc->sc_inerr = atppc_wait_interrupt(atppc,
-					atppc->sc_inb, ATPPC_IRQ_nACK);
+					&atppc->sc_in_cv, ATPPC_IRQ_nACK);
 			else
 				atppc->sc_inerr = atppc_poll_str(atppc, PTRCLK,
 					PTRCLK);
@@ -1773,7 +1738,7 @@
 		/* Event 11 - peripheral ack */
 		if (atppc->sc_use & ATPPC_USE_INTR)
 			atppc->sc_inerr = atppc_wait_interrupt(atppc,
-				atppc->sc_inb, ATPPC_IRQ_nACK);
+				&atppc->sc_in_cv, ATPPC_IRQ_nACK);
 		else
 			atppc->sc_inerr = atppc_poll_str(atppc, PTRCLK, PTRCLK);
 		if (atppc->sc_inerr)
@@ -1876,7 +1841,7 @@
 				atppc_barrier_w(atppc);
 				/* Wait for FIFO to fill */
 				atppc->sc_inerr = atppc_wait_interrupt(atppc,
-					atppc->sc_inb, ATPPC_IRQ_FIFO);
+					&atppc->sc_in_cv, ATPPC_IRQ_FIFO);
 				if (atppc->sc_inerr)
 					break;
 			} else {
@@ -1938,7 +1903,7 @@
 	atppc_barrier_w(atppc);
 
 	/* Wait for DMA completion */
-	atppc->sc_inerr = atppc_wait_interrupt(atppc, atppc->sc_inb,
+	atppc->sc_inerr = atppc_wait_interrupt(atppc, &atppc->sc_in_cv,
 		ATPPC_IRQ_DMA);
 	if (atppc->sc_inerr)
 		return;
@@ -2036,7 +2001,7 @@
 		timecount = 0;
 		if (atppc->sc_use & ATPPC_USE_INTR) {
 			atppc->sc_outerr = atppc_wait_interrupt(atppc,
-				atppc->sc_outb, ATPPC_IRQ_nACK);
+				&atppc->sc_out_cv, ATPPC_IRQ_nACK);
 			if (atppc->sc_outerr)
 				return;
 		} else {
@@ -2165,8 +2130,8 @@
 		atppc_barrier_w(atppc);
 
 		/* Wait for DMA completion */
-		atppc->sc_outerr = atppc_wait_interrupt(atppc, atppc->sc_outb,
-			ATPPC_IRQ_DMA);
+		atppc->sc_outerr = atppc_wait_interrupt(atppc,
+			&atppc->sc_out_cv, ATPPC_IRQ_DMA);
 		if (atppc->sc_outerr) {
 			atppc_fifo_write_error(atppc, worklen);
 			return;
@@ -2199,7 +2164,7 @@
 			atppc_barrier_w(atppc);
 
 			atppc->sc_outerr = atppc_wait_interrupt(atppc,
-				atppc->sc_outb, ATPPC_IRQ_FIFO);
+				&atppc->sc_out_cv, ATPPC_IRQ_FIFO);
 			if (atppc->sc_outerr) {
 				atppc_fifo_write_error(atppc, worklen);
 				return;
@@ -2266,7 +2231,7 @@
 				atppc_barrier_w(atppc);
 
 				atppc->sc_outerr = atppc_wait_interrupt(atppc,
-					atppc->sc_outb, ATPPC_IRQ_FIFO);
+					&atppc->sc_out_cv, ATPPC_IRQ_FIFO);
 				if (atppc->sc_outerr) {
 					atppc_fifo_write_error(atppc, worklen);
 					return;
@@ -2388,7 +2353,7 @@
 
 /* Wait for interrupt for MAXBUSYWAIT: returns 0 if acknowledge received. */
 static int
-atppc_wait_interrupt(struct atppc_softc * const atppc, const void *where,
+atppc_wait_interrupt(struct atppc_softc * const atppc, kcondvar_t *cv,
 	const u_int8_t irqstat)
 {
 	int error = EIO;
@@ -2396,8 +2361,7 @@
 	atppc->sc_irqstat &= ~irqstat;
 
 	/* Wait for interrupt for MAXBUSYWAIT */
-	error = ltsleep(where, PPBUSPRI | PCATCH, __func__, MAXBUSYWAIT,
-		ATPPC_SC_LOCK(atppc));
+	error = cv_timedwait_sig(cv, &atppc->sc_lock, MAXBUSYWAIT);
 
 	if (!(error) && (atppc->sc_irqstat & irqstat)) {
 		atppc->sc_irqstat &= ~irqstat;

Index: src/sys/dev/ic/atppcvar.h
diff -u src/sys/dev/ic/atppcvar.h:1.11 src/sys/dev/ic/atppcvar.h:1.12
--- src/sys/dev/ic/atppcvar.h:1.11	Thu May  1 12:06:28 2008
+++ src/sys/dev/ic/atppcvar.h	Thu May 26 02:29:23 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: atppcvar.h,v 1.11 2008/05/01 12:06:28 cegger Exp $ */
+/* $NetBSD: atppcvar.h,v 1.12 2011/05/26 02:29:23 jakllsch Exp $ */
 
 /*-
  * Copyright (c) 2001 Alcove - Nicolas Souchu
@@ -36,7 +36,8 @@
 #include <machine/types.h>
 #include <sys/device.h>
 #include <sys/callout.h>
-#include <sys/simplelock.h>
+#include <sys/mutex.h>
+#include <sys/condvar.h>
 
 #include <dev/ppbus/ppbus_conf.h>
 
@@ -44,13 +45,9 @@
 /* Maximum time to wait for device response */
 #define MAXBUSYWAIT	(5 * (hz))
 
-/* Poll interval when wating for device to become ready */
+/* Poll interval when waiting for device to become ready */
 #define ATPPC_POLL	((hz)/10)
 
-/* Interrupt priority level for atppc device */
-#define IPL_ATPPC	IPL_TTY
-#define splatppc        spltty
-
 
 /* Diagnostic and verbose printing macros */
 
@@ -78,21 +75,6 @@
 #define ATPPC_FLAG_DISABLE_INTR	0x01
 #define ATPPC_FLAG_DISABLE_DMA	0x02
 
-
-/* Locking for atppc device */
-#if defined(MULTIPROCESSOR) || defined (LOCKDEBUG)
-#include <sys/lock.h>
-#define ATPPC_SC_LOCK(sc) (&((sc)->sc_lock))
-#define ATPPC_LOCK_INIT(sc) simple_lock_init(ATPPC_SC_LOCK((sc)))
-#define ATPPC_LOCK(sc) simple_lock(ATPPC_SC_LOCK((sc)))
-#define ATPPC_UNLOCK(sc) simple_unlock(ATPPC_SC_LOCK((sc)))
-#else /* !(MULTIPROCESSOR) && !(LOCKDEBUG) */
-#define ATPPC_LOCK_INIT(sc)
-#define ATPPC_LOCK(sc)
-#define ATPPC_UNLOCK(sc)
-#define ATPPC_SC_LOCK(sc) NULL
-#endif /* MULTIPROCESSOR || LOCKDEBUG */
-
 /* Single softintr callback entry */
 struct atppc_handler_node {
 	void (*func)(void *);
@@ -105,10 +87,9 @@
 	/* Generic device attributes */
 	device_t sc_dev;
 
-#if defined(MULTIPROCESSOR) || defined(LOCKDEBUG)
-	/* Simple lock */
-	struct simplelock sc_lock;
-#endif
+	kmutex_t sc_lock;
+	kcondvar_t sc_out_cv;
+	kcondvar_t sc_in_cv;
 
 	/* Machine independent bus infrastructure */
 	bus_space_tag_t sc_iot;

Index: src/sys/dev/isa/atppc_isa.c
diff -u src/sys/dev/isa/atppc_isa.c:1.14 src/sys/dev/isa/atppc_isa.c:1.15
--- src/sys/dev/isa/atppc_isa.c:1.14	Wed Apr 16 09:39:01 2008
+++ src/sys/dev/isa/atppc_isa.c	Thu May 26 02:29:23 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: atppc_isa.c,v 1.14 2008/04/16 09:39:01 cegger Exp $ */
+/* $NetBSD: atppc_isa.c,v 1.15 2011/05/26 02:29:23 jakllsch Exp $ */
 
 /*-
  * Copyright (c) 2001 Alcove - Nicolas Souchu
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: atppc_isa.c,v 1.14 2008/04/16 09:39:01 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: atppc_isa.c,v 1.15 2011/05/26 02:29:23 jakllsch Exp $");
 
 #include "opt_atppc.h"
 
@@ -166,7 +166,7 @@
 	if (sc->sc_irq > 0) {
 		/* Establish interrupt handler. */
 		lsc->sc_ieh = isa_intr_establish(sc->sc_ic, sc->sc_irq,
-			IST_EDGE, IPL_ATPPC, atppcintr, lsc->sc_dev);
+			IST_EDGE, IPL_TTY, atppcintr, lsc->sc_dev);
 
 		lsc->sc_has |= ATPPC_HAS_INTR;
 	}

Reply via email to