Module Name:    src
Committed By:   pgoyette
Date:           Wed Jul 20 02:06:16 UTC 2016

Modified Files:
        src/sys/arch/acorn26/ioc [pgoyette-localcount]: arcpp.c
        src/sys/arch/acorn32/mainbus [pgoyette-localcount]: fd.c
        src/sys/arch/acorn32/podulebus [pgoyette-localcount]: asc.c
        src/sys/arch/alpha/pci [pgoyette-localcount]: mcpcia.c
        src/sys/arch/alpha/tc [pgoyette-localcount]: ioasic.c
        src/sys/arch/amiga/dev [pgoyette-localcount]: afsc.c ahsc.c atzsc.c
            bppcsc.c cbiiisc.c drsc.c fd.c gtsc.c mfc.c mgnsc.c wesc.c
        src/sys/arch/arc/jazz [pgoyette-localcount]: fd.c
        src/sys/arch/arm/amlogic [pgoyette-localcount]: amlogic_com.c
        src/sys/arch/arm/at91 [pgoyette-localcount]: at91dbgu.c at91usart.c

Log Message:
Redo previous.  Rather than separately extracting the device_t, we can
rely on sc->sc_dev when we need to call device_release().


To generate a diff of this commit:
cvs rdiff -u -r1.15.2.1 -r1.15.2.2 src/sys/arch/acorn26/ioc/arcpp.c
cvs rdiff -u -r1.58.2.1 -r1.58.2.2 src/sys/arch/acorn32/mainbus/fd.c
cvs rdiff -u -r1.20.4.1 -r1.20.4.2 src/sys/arch/acorn32/podulebus/asc.c
cvs rdiff -u -r1.29.28.1 -r1.29.28.2 src/sys/arch/alpha/pci/mcpcia.c
cvs rdiff -u -r1.46.10.1 -r1.46.10.2 src/sys/arch/alpha/tc/ioasic.c
cvs rdiff -u -r1.44.18.1 -r1.44.18.2 src/sys/arch/amiga/dev/afsc.c
cvs rdiff -u -r1.38.18.1 -r1.38.18.2 src/sys/arch/amiga/dev/ahsc.c
cvs rdiff -u -r1.43.18.1 -r1.43.18.2 src/sys/arch/amiga/dev/atzsc.c
cvs rdiff -u -r1.3.18.1 -r1.3.18.2 src/sys/arch/amiga/dev/bppcsc.c
cvs rdiff -u -r1.21.18.1 -r1.21.18.2 src/sys/arch/amiga/dev/cbiiisc.c
cvs rdiff -u -r1.33.10.1 -r1.33.10.2 src/sys/arch/amiga/dev/drsc.c
cvs rdiff -u -r1.96.2.1 -r1.96.2.2 src/sys/arch/amiga/dev/fd.c
cvs rdiff -u -r1.41.18.1 -r1.41.18.2 src/sys/arch/amiga/dev/gtsc.c
cvs rdiff -u -r1.57.8.1 -r1.57.8.2 src/sys/arch/amiga/dev/mfc.c
cvs rdiff -u -r1.46.18.1 -r1.46.18.2 src/sys/arch/amiga/dev/mgnsc.c
cvs rdiff -u -r1.40.18.1 -r1.40.18.2 src/sys/arch/amiga/dev/wesc.c
cvs rdiff -u -r1.47.2.1 -r1.47.2.2 src/sys/arch/arc/jazz/fd.c
cvs rdiff -u -r1.5.4.1 -r1.5.4.2 src/sys/arch/arm/amlogic/amlogic_com.c
cvs rdiff -u -r1.15.2.1 -r1.15.2.2 src/sys/arch/arm/at91/at91dbgu.c
cvs rdiff -u -r1.13.2.1 -r1.13.2.2 src/sys/arch/arm/at91/at91usart.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/arch/acorn26/ioc/arcpp.c
diff -u src/sys/arch/acorn26/ioc/arcpp.c:1.15.2.1 src/sys/arch/acorn26/ioc/arcpp.c:1.15.2.2
--- src/sys/arch/acorn26/ioc/arcpp.c:1.15.2.1	Tue Jul 19 06:26:57 2016
+++ src/sys/arch/acorn26/ioc/arcpp.c	Wed Jul 20 02:06:15 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: arcpp.c,v 1.15.2.1 2016/07/19 06:26:57 pgoyette Exp $ */
+/* $NetBSD: arcpp.c,v 1.15.2.2 2016/07/20 02:06:15 pgoyette Exp $ */
 
 /*-
  * Copyright (c) 2001 Ben Harris
@@ -52,7 +52,7 @@
 
 #include <sys/param.h>
 
-__KERNEL_RCSID(0, "$NetBSD: arcpp.c,v 1.15.2.1 2016/07/19 06:26:57 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: arcpp.c,v 1.15.2.2 2016/07/20 02:06:15 pgoyette Exp $");
 
 #include <sys/conf.h>
 #include <sys/device.h>
@@ -191,16 +191,10 @@ arcppopen(dev_t dev, int flag, int mode,
 	bus_space_tag_t iot;
 	bus_space_handle_t ioh;
 	int error, s;
-	device_t self;
 
-	self = device_lookup_acquire(&arcpp_cd, minor(dev));
-	if (self == NULL)
+	sc = device_lookup_private_acquire(&arcpp_cd, ARCPPUNIT(dev));
+	if (sc == NULL)
 		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		error = ENXIO;
-		goto out;
-	}
 
 #ifdef DIAGNOSTIC
 	if (sc->sc_state)
@@ -208,10 +202,8 @@ arcppopen(dev_t dev, int flag, int mode,
 		    sc->sc_state);
 #endif
 
-	if (sc->sc_state) {
-		error = EBUSY;
-		goto out;
-	}
+	if (sc->sc_state)
+		return EBUSY;
 
 	sc->sc_state = ARCPP_INIT;
 	sc->sc_flags = flags;
@@ -226,13 +218,14 @@ arcppopen(dev_t dev, int flag, int mode,
 	if (error == EWOULDBLOCK) {
 		sc->sc_state = 0;
 		splx(s);
-		error = EBUSY;
-		goto out;
+		device_release(sc->sc_dev);
+		return EBUSY;
 	}
 	if (error) {
 		sc->sc_state = 0;
 		splx(s);
-		goto out;
+		device_release(sc->sc_dev);
+		return error;
 	}
 
 	sc->sc_inbuf = malloc(ARCPP_BSIZE, M_DEVBUF, M_WAITOK);
@@ -243,10 +236,8 @@ arcppopen(dev_t dev, int flag, int mode,
 	arcppintr(sc);
 	splx(s);
 
+	device_release(sc->sc_dev);
 	return 0;
-
- out:	device_release(self);
-	return error;
 }
 
 /*
@@ -255,17 +246,9 @@ arcppopen(dev_t dev, int flag, int mode,
 int
 arcppclose(dev_t dev, int flag, int mode, struct lwp *l)
 {
-	device_t self;
-	struct arcpp_softc *sc;
+	struct arcpp_softc *sc =
+	    device_lookup_private_acquire(&arcpp_cd, ARCPPUNIT(dev));
 
-	self = device_lookup_acquire(&arcpp_cd, minor(dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(&arcpp_cd, ARCPPUNIT(dev));
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
 	if (sc->sc_count)
 		(void) arcpppushbytes(sc);
 
@@ -274,7 +257,7 @@ arcppclose(dev_t dev, int flag, int mode
 	sc->sc_state = 0;
 	free(sc->sc_inbuf, M_DEVBUF);
 
-	device_release(self);
+	device_release(sc->sc_dev);
 	return 0;
 }
 
@@ -301,19 +284,11 @@ arcpppushbytes(struct arcpp_softc *sc)
 int
 arcppwrite(dev_t dev, struct uio *uio, int flags)
 {
-	device_t self;
-	struct arcpp_softc *sc;
+	struct arcpp_softc *sc =
+	    device_lookup_private_acquire(&arcpp_cd, ARCPPUNIT(dev));
 	size_t n;
 	int error = 0;
 
-	self = device_lookup_acquire(&arcpp_cd, minor(dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(&arcpp_cd, ARCPPUNIT(dev));
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
 	while ((n = min(ARCPP_BSIZE, uio->uio_resid)) != 0) {
 		uiomove(sc->sc_cp = sc->sc_inbuf, n, uio);
 		sc->sc_count = n;
@@ -325,11 +300,11 @@ arcppwrite(dev_t dev, struct uio *uio, i
 			 */
 			uio->uio_resid += sc->sc_count;
 			sc->sc_count = 0;
-			device_release(self);
+			device_release(sc->sc_dev);
 			return error;
 		}
 	}
-	device_release(self);
+	device_release(sc->sc_dev);
 	return 0;
 }
 

Index: src/sys/arch/acorn32/mainbus/fd.c
diff -u src/sys/arch/acorn32/mainbus/fd.c:1.58.2.1 src/sys/arch/acorn32/mainbus/fd.c:1.58.2.2
--- src/sys/arch/acorn32/mainbus/fd.c:1.58.2.1	Tue Jul 19 06:26:57 2016
+++ src/sys/arch/acorn32/mainbus/fd.c	Wed Jul 20 02:06:15 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: fd.c,v 1.58.2.1 2016/07/19 06:26:57 pgoyette Exp $	*/
+/*	$NetBSD: fd.c,v 1.58.2.2 2016/07/20 02:06:15 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -82,7 +82,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fd.c,v 1.58.2.1 2016/07/19 06:26:57 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fd.c,v 1.58.2.2 2016/07/20 02:06:15 pgoyette Exp $");
 
 #include "opt_ddb.h"
 
@@ -567,20 +567,11 @@ fd_dev_to_type(struct fd_softc *fd, dev_
 void
 fdstrategy(struct buf *bp)
 {
-	device_t self;
-	struct fd_softc *fd
+	struct fd_softc *fd =
+	    device_lookup_private_acquire(&fd_cd,FDUNIT(bp->b_dev));
 	int sz;
  	int s;
 
-	self = device_lookup_acquire(&fd_cd, FDUNIT(bp->b_dev);
-	if (self == NULL)
-		return;
-	fd = device_private(self);
-	if (fd == NULL) {
-		bp->b_error = ENXIO;
-		return;
-	}
-
 	/* Valid unit, controller, and request? */
 	if (bp->b_blkno < 0 ||
 	    ((bp->b_bcount % FDC_BSIZE) != 0 &&
@@ -635,14 +626,14 @@ fdstrategy(struct buf *bp)
 	}
 #endif
 	splx(s);
-	device_release(self);
+	device_release(sc->sc_dev);
 	return;
 
 done:
 	/* Toss transfer; we're done early. */
 	bp->b_resid = bp->b_bcount;
 	biodone(bp);
-	device_release(self);
+	device_release(sc->sc_dev);
 }
 
 void
@@ -794,56 +785,40 @@ out_fdc(bus_space_tag_t iot, bus_space_h
 int
 fdopen(dev_t dev, int flags, int mode, struct lwp *l)
 {
-	device_t self;
 	struct fd_softc *fd;
 	struct fd_type *type;
-	int error = 0;
 
-	self = device_lookup_acquire(&fd_cd, FDUNIT(dev));
-	if (self == NULL)
+	fd = device_lookup_private_acquire(&fd_cd, FDUNIT(dev));
+	if (fd == NULL)
 		return ENXIO;
-	fd = device_private(self);
-	if (fd == NULL) {
-		error = ENXIO;
-		goto out;
-	}
 	type = fd_dev_to_type(fd, dev);
 	if (type == NULL) {
-		error = ENXIO;
-		goto out;
+		device_release(fd->sc_dev);
+		return ENXIO;
 	}
 	if ((fd->sc_flags & FD_OPEN) != 0 &&
 	    memcmp(fd->sc_type, type, sizeof(*type))) {
-		error = EBUSY;
-		goto out;
+		device_release(fd->sc_dev);
+		return EBUSY;
 	}
 	fd->sc_type_copy = *type;
 	fd->sc_type = &fd->sc_type_copy;
 	fd->sc_cylin = -1;
 	fd->sc_flags |= FD_OPEN;
 
- out:
-	device_release(self);
-	return error;
+	device_release(fd->sc_dev);
+	return 0;
 }
 
 int
 fdclose(dev_t dev, int flags, int mode, struct lwp *l)
 {
-	device_t self;
-	struct fd_softc *fd;
+	struct fd_softc *fd =
+	    device_lookup_private_acquire(&fd_cd, FDUNIT(dev));
 
-	self = device_lookup_acquire(&fd_cd, FDUNIT(dev));
-	if (self == NULL)
-		return ENXIO;
-	fd = device_private(self);
-	if (fd == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
 	fd->sc_flags &= ~FD_OPEN;
 	fd->sc_opts &= ~(FDOPT_NORETRY|FDOPT_SILENT);
-	device_release(self);
+	device_release(fd->sc_dev);
 	return 0;
 }
 
@@ -1305,7 +1280,8 @@ fdcretry(struct fdc_softc *fdc)
 int
 fdioctl(dev_t dev, u_long cmd, void *addr, int flag, struct lwp *l)
 {
-	struct fd_softc *fd;
+	struct fd_softc *fd =
+	    device_lookup_private_acquire(&fd_cd, FDUNIT(dev));
 	struct fdformat_parms *form_parms;
 	struct fdformat_cmd *form_cmd;
 	struct ne7_fd_formb *fd_formb;
@@ -1315,14 +1291,7 @@ fdioctl(dev_t dev, u_long cmd, void *add
 	int il[FD_MAX_NSEC + 1];
 	register int i, j;
 
-	self = device_lookup_acquire(&fd_cd, FDUNIT(dev));
-	if (self == NULL)
-		return ENXIO;
-	fd = device_private(self);
-	if (fd == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
+	error = 0;
 	switch (cmd) {
 	case DIOCGDINFO:
 		memset(&buffer, 0, sizeof(buffer));
@@ -1335,26 +1304,24 @@ fdioctl(dev_t dev, u_long cmd, void *add
 			return EINVAL;
 
 		*(struct disklabel *)addr = buffer;
-		device_release(self);
-		return 0;
+		break;
 
 	case DIOCWLABEL:
 		if ((flag & FWRITE) == 0)
 			return EBADF;
 		/* XXX do something */
-		device_release(self);
-		return 0;
+		break;
 
 	case DIOCWDINFO:
 		if ((flag & FWRITE) == 0)
 			return EBADF;
 
 		error = setdisklabel(&buffer, (struct disklabel *)addr, 0, NULL);
-		if (error == 0)
-			error = writedisklabel(dev, fdstrategy, &buffer, NULL);
+		if (error)
+			break;
 
-		device_release(self);
-		return error;
+		error = writedisklabel(dev, fdstrategy, &buffer, NULL);
+		break;
 
 	case FDIOCGETFORMAT:
 		form_parms = (struct fdformat_parms *)addr;
@@ -1378,23 +1345,28 @@ fdioctl(dev_t dev, u_long cmd, void *add
 			form_parms->xfer_rate = 250 * 1024;
 			break;
 		default:
-			return EINVAL;
+			error = EINVAL;
 		}
-		device_release(self);
-		return 0;
+		break;
 
 	case FDIOCSETFORMAT:
-		if((flag & FWRITE) == 0)
-			return EBADF;	/* must be opened for writing */
+		if((flag & FWRITE) == 0) {
+			error = EBADF;	/* must be opened for writing */
+			break;
+		}
 		form_parms = (struct fdformat_parms *)addr;
-		if (form_parms->fdformat_version != FDFORMAT_VERSION)
-			return EINVAL;	/* wrong version of formatting prog */
+		if (form_parms->fdformat_version != FDFORMAT_VERSION) {
+			error = EINVAL;	/* wrong version of formatting prog */
+			break;
+		}
 
 		scratch = form_parms->nbps >> 7;
 		if ((form_parms->nbps & 0x7f) || ffs(scratch) == 0 ||
-		    scratch & ~(1 << (ffs(scratch)-1)))
+		    scratch & ~(1 << (ffs(scratch)-1))) {
 			/* not a power-of-two multiple of 128 */
-			return EINVAL;
+			error = EINVAL;
+			break;
+		}
 
 		switch (form_parms->xfer_rate) {
 		case 500 * 1024:
@@ -1407,17 +1379,22 @@ fdioctl(dev_t dev, u_long cmd, void *add
 			fd->sc_type->rate = FDC_250KBPS;
 			break;
 		default:
-			device_release(self);
-			return EINVAL;
+			error = EINVAL;
 		}
+		if (error)
+			break;
 
 		if (form_parms->nspt > FD_MAX_NSEC ||
 		    form_parms->fillbyte > 0xff ||
-		    form_parms->interleave > 0xff)
-			return EINVAL;
+		    form_parms->interleave > 0xff) {
+			error = EINVAL;
+			break;
+		}
 		fd->sc_type->sectrac = form_parms->nspt;
-		if (form_parms->ntrk != 2 && form_parms->ntrk != 1)
-			return EINVAL;
+		if (form_parms->ntrk != 2 && form_parms->ntrk != 1) {
+			error = EINVAL;
+			break;
+		}
 		fd->sc_type->heads = form_parms->ntrk;
 		fd->sc_type->seccyl = form_parms->nspt * form_parms->ntrk;
 		fd->sc_type->secsize = ffs(scratch)-1;
@@ -1428,29 +1405,30 @@ fdioctl(dev_t dev, u_long cmd, void *add
 		fd->sc_type->step = form_parms->stepspercyl;
 		fd->sc_type->fillbyte = form_parms->fillbyte;
 		fd->sc_type->interleave = form_parms->interleave;
-
-		device_release(self);
-		return 0;
+		break;
 
 	case FDIOCFORMAT_TRACK:
-		if((flag & FWRITE) == 0)
-			return EBADF;	/* must be opened for writing */
+		if((flag & FWRITE) == 0) {
+			error = EBADF;	/* must be opened for writing */
+			break;
+		}
 		form_cmd = (struct fdformat_cmd *)addr;
 		if (form_cmd->formatcmd_version != FDFORMAT_VERSION) {
-			device_release(self);
-			return EINVAL;	/* wrong version of formatting prog */
+			error = EINVAL;	/* wrong version of formatting prog */
+			break;
 		}
+
 		if (form_cmd->head >= fd->sc_type->heads ||
 		    form_cmd->cylinder >= fd->sc_type->cyls) {
-			device_release(self);
-			return EINVAL;
+			error = EINVAL;
+			break;
 		}
 
 		fd_formb = malloc(sizeof(struct ne7_fd_formb), 
 		    M_TEMP, M_NOWAIT);
 		if(fd_formb == 0) {
-			device_release(self);
-			return ENOMEM;
+			error = ENOMEM;
+			break;
 		}
 
 		fd_formb->head = form_cmd->head;
@@ -1477,54 +1455,38 @@ fdioctl(dev_t dev, u_long cmd, void *add
 
 		error = fdformat(dev, fd_formb, l);
 		free(fd_formb, M_TEMP);
-
-		device_release(self);
-		return error;
+		break;
 
 	case FDIOCGETOPTS:		/* get drive options */
 		*(int *)addr = fd->sc_opts;
-		device_release(self);
-		return 0;
+		break;
 
 	case FDIOCSETOPTS:		/* set drive options */
 		fd->sc_opts = *(int *)addr;
-		device_release(self);
-		return 0;
+		break;
 
 	default:
-		device_release(self);
-		return ENOTTY;
+		error = ENOTTY;
 	}
+	device_release(fd->sc_dev);
+	return error;
 
-#ifdef DIAGNOSTIC
-	panic("fdioctl: impossible");
-#endif
 }
 
 int
 fdformat(dev_t dev, struct ne7_fd_formb *finfo, struct lwp *l)
 {
 	int rv = 0;
-	device_t self;
-	struct fd_softc *fd;
+	struct fd_softc *fd =
+	    device_lookup_private_acquire(&fd_cd,FDUNIT(dev));
 	struct fd_type *type = fd->sc_type;
 	struct buf *bp;
 
-	self = device_lookup_acquire(&fd_cd, FDUNIT(dev));
-	if (self == NULL)
-		return ENXIO;
-	fd = device_private(self);
-	if (fd == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
-
 	/* set up a buffer header for fdstrategy() */
 	bp = getiobuf(NULL, false);
 	if(bp == 0) {
-		device_release(self);
+		device_release(fd->sc_dev);
 		return ENOBUFS;
-	}
 	bp->b_flags = B_PHYS | B_FORMAT;
 	bp->b_cflags |= BC_BUSY;
 	bp->b_proc = l->l_proc;
@@ -1565,7 +1527,7 @@ fdformat(dev_t dev, struct ne7_fd_formb 
 	} else if (bp->b_error != 0)
 		rv = bp->b_error;
 	putiobuf(bp);
-	device_release(self);
+	device_release(fd->sc_dev);
 	return rv;
 }
 

Index: src/sys/arch/acorn32/podulebus/asc.c
diff -u src/sys/arch/acorn32/podulebus/asc.c:1.20.4.1 src/sys/arch/acorn32/podulebus/asc.c:1.20.4.2
--- src/sys/arch/acorn32/podulebus/asc.c:1.20.4.1	Tue Jul 19 06:26:58 2016
+++ src/sys/arch/acorn32/podulebus/asc.c	Wed Jul 20 02:06:15 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: asc.c,v 1.20.4.1 2016/07/19 06:26:58 pgoyette Exp $	*/
+/*	$NetBSD: asc.c,v 1.20.4.2 2016/07/20 02:06:15 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 2001 Richard Earnshaw
@@ -98,7 +98,7 @@
 
 #include <sys/param.h>
 
-__KERNEL_RCSID(0, "$NetBSD: asc.c,v 1.20.4.1 2016/07/19 06:26:58 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: asc.c,v 1.20.4.2 2016/07/20 02:06:15 pgoyette Exp $");
 
 #include <sys/systm.h>
 #include <sys/kernel.h>
@@ -336,15 +336,14 @@ void
 asc_dump(void)
 {
 	int i;
-	device_t self;
 	struct asc_softc *sc;
 
 	for (i = 0; i < asc_cd.cd_ndevs; ++i) {
-		self = device_lookup_acquire(&asc_cd, i);
-		sc = device_private(self);
-		if (sc != NULL)
+		sc = device_lookup_private_acquire(&asc_cd, i);
+		if (sc != NULL) {
 			sbic_dump(&sc->sc_softc);
-		device_release(self);
+			device_release(sc->sc_dev);
+		}
 	}
 }
 

Index: src/sys/arch/alpha/pci/mcpcia.c
diff -u src/sys/arch/alpha/pci/mcpcia.c:1.29.28.1 src/sys/arch/alpha/pci/mcpcia.c:1.29.28.2
--- src/sys/arch/alpha/pci/mcpcia.c:1.29.28.1	Tue Jul 19 06:26:58 2016
+++ src/sys/arch/alpha/pci/mcpcia.c	Wed Jul 20 02:06:15 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: mcpcia.c,v 1.29.28.1 2016/07/19 06:26:58 pgoyette Exp $ */
+/* $NetBSD: mcpcia.c,v 1.29.28.2 2016/07/20 02:06:15 pgoyette Exp $ */
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: mcpcia.c,v 1.29.28.1 2016/07/19 06:26:58 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mcpcia.c,v 1.29.28.2 2016/07/20 02:06:15 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -303,7 +303,6 @@ die_heathen_dog(void *arg)
 void
 mcpcia_config_cleanup(void)
 {
-	device_t self;
 	volatile uint32_t ctl;
 	struct mcpcia_softc *mcp;
 	struct mcpcia_config *ccp;
@@ -314,16 +313,13 @@ mcpcia_config_cleanup(void)
 	 * Turn on Hard, Soft error interrupts. Maybe i2c too.
 	 */
 	for (i = 0; i < mcpcia_cd.cd_ndevs; i++) {
-		self = device_lookup_acquire(&mcpcia_cd, i);
-		if (self == NULL)
+		mcp = device_lookup_private_acquire(&mcpcia_cd, i);
+		if (mcp == NULL)
 			continue;
-		if ((mcp = device_private(self)) == NULL) {
-			device_release(self);
-			continue;
-		}
+		
 		ccp = mcp->mcpcia_cc;
 		if (ccp == NULL) {
-			device_release(self);
+			device_release(mcp->mcpcia_dev);
 			continue;
 		}
 		ctl = REGVAL(MCPCIA_INT_MASK0(ccp));
@@ -333,8 +329,6 @@ mcpcia_config_cleanup(void)
 
 		/* force stall while write completes */
 		ctl = REGVAL(MCPCIA_INT_MASK0(ccp));
-
-		device_release(self);
 	}
 #ifdef TEST_PROBE_DEATH
 	(void) timeout (die_heathen_dog, &mcpcia_console_configuration,

Index: src/sys/arch/alpha/tc/ioasic.c
diff -u src/sys/arch/alpha/tc/ioasic.c:1.46.10.1 src/sys/arch/alpha/tc/ioasic.c:1.46.10.2
--- src/sys/arch/alpha/tc/ioasic.c:1.46.10.1	Tue Jul 19 06:26:58 2016
+++ src/sys/arch/alpha/tc/ioasic.c	Wed Jul 20 02:06:15 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: ioasic.c,v 1.46.10.1 2016/07/19 06:26:58 pgoyette Exp $ */
+/* $NetBSD: ioasic.c,v 1.46.10.2 2016/07/20 02:06:15 pgoyette Exp $ */
 
 /*-
  * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: ioasic.c,v 1.46.10.1 2016/07/19 06:26:58 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ioasic.c,v 1.46.10.2 2016/07/20 02:06:15 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -215,19 +215,9 @@ void
 ioasic_intr_establish(device_t ioa, void *cookie, tc_intrlevel_t level,
 		int (*func)(void *), void *arg)
 {
-	device_t self;
-	struct ioasic_softc *sc;
+	struct ioasic_softc *sc = device_lookup_private_acquire(&ioasic_cd,0);
 	u_long dev, i, imsk;
 
-	self = device_lookup_acquire(&ioasic_cd, 0);
-	if (self == NULL)
-		return;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return;
-	}
-
 	dev = (u_long)cookie;
 #ifdef DIAGNOSTIC
 	/* XXX check cookie. */
@@ -249,26 +239,15 @@ ioasic_intr_establish(device_t ioa, void
 	imsk = bus_space_read_4(sc->sc_bst, sc->sc_bsh, IOASIC_IMSK);
 	imsk |= ioasic_devs[i].iad_intrbits;
 	bus_space_write_4(sc->sc_bst, sc->sc_bsh, IOASIC_IMSK, imsk);
-
-	device_release(self);
+	device_release(sc->sc_dev;
 }
 
 void
 ioasic_intr_disestablish(device_t ioa, void *cookie)
 {
-	device_t self;
-	struct ioasic_softc *sc;
+	struct ioasic_softc *sc = device_lookup_private_acquire(&ioasic_cd,0);
 	u_long dev, i, imsk;
 
-	self = device_lookup_acquire(&ioasic_cd, 0);
-	if (self == NULL)
-		return;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return;
-	}
-
 	dev = (u_long)cookie;
 #ifdef DIAGNOSTIC
 	/* XXX check cookie. */
@@ -290,8 +269,7 @@ ioasic_intr_disestablish(device_t ioa, v
 
 	ioasicintrs[dev].iai_func = ioasic_intrnull;
 	ioasicintrs[dev].iai_arg = (void *)dev;
-
-	device_release(self);
+	device_release(sc->sc_dev);
 }
 
 int

Index: src/sys/arch/amiga/dev/afsc.c
diff -u src/sys/arch/amiga/dev/afsc.c:1.44.18.1 src/sys/arch/amiga/dev/afsc.c:1.44.18.2
--- src/sys/arch/amiga/dev/afsc.c:1.44.18.1	Tue Jul 19 06:26:58 2016
+++ src/sys/arch/amiga/dev/afsc.c	Wed Jul 20 02:06:15 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: afsc.c,v 1.44.18.1 2016/07/19 06:26:58 pgoyette Exp $ */
+/*	$NetBSD: afsc.c,v 1.44.18.2 2016/07/20 02:06:15 pgoyette Exp $ */
 
 /*
  * Copyright (c) 1982, 1990 The Regents of the University of California.
@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: afsc.c,v 1.44.18.1 2016/07/19 06:26:58 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: afsc.c,v 1.44.18.2 2016/07/20 02:06:15 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -221,19 +221,15 @@ afsc_dmaintr(void *arg)
 void
 afsc_dump(void)
 {
-	device_t self;
 	extern struct cfdriver afsc_cd;
 	struct siop_softc *sc;
 	int i;
 
 	for (i = 0; i < afsc_cd.cd_ndevs; ++i) {
-		self = device_lookup_acquire(&afsc_cd, i);
-		if (self == NULL)
-			continue;
-		sc = device_private(self);
-		if (sc != NULL)
+		sc = device_lookup_private_acquire(&afsc_cd, i);
+		if (sc != NULL) {
 			siop_dump(sc);
-		device_release(self);
+			device_release(sc->sc_dev);
 	}
 }
 #endif

Index: src/sys/arch/amiga/dev/ahsc.c
diff -u src/sys/arch/amiga/dev/ahsc.c:1.38.18.1 src/sys/arch/amiga/dev/ahsc.c:1.38.18.2
--- src/sys/arch/amiga/dev/ahsc.c:1.38.18.1	Tue Jul 19 06:26:58 2016
+++ src/sys/arch/amiga/dev/ahsc.c	Wed Jul 20 02:06:15 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ahsc.c,v 1.38.18.1 2016/07/19 06:26:58 pgoyette Exp $ */
+/*	$NetBSD: ahsc.c,v 1.38.18.2 2016/07/20 02:06:15 pgoyette Exp $ */
 
 /*
  * Copyright (c) 1982, 1990 The Regents of the University of California.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ahsc.c,v 1.38.18.1 2016/07/19 06:26:58 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ahsc.c,v 1.38.18.2 2016/07/20 02:06:15 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -375,19 +375,16 @@ ahsc_dmanext(struct sbic_softc *dev)
 void
 ahsc_dump(void)
 {
-	device_t self;
 	extern struct cfdriver ahsc_cd;
 	struct sbic_softc *sc;
 	int i;
 
 	for (i = 0; i < ahsc_cd.cd_ndevs; ++i) {
-		self = device_lookup_acquire(&ahsc_cd, i);
-		if (self == NULL)
-			continue;
-		sc = device_private(self);
-		if (sc != NULL)
+		sc = device_lookup_private_acquire(&ahsc_cd, i);
+		if (sc != NULL) {
 			sbic_dump(sc);
-		device_release(self);
+			device_release(sc->sc_dev);
+		}
 	}
 }
 #endif

Index: src/sys/arch/amiga/dev/atzsc.c
diff -u src/sys/arch/amiga/dev/atzsc.c:1.43.18.1 src/sys/arch/amiga/dev/atzsc.c:1.43.18.2
--- src/sys/arch/amiga/dev/atzsc.c:1.43.18.1	Tue Jul 19 06:26:58 2016
+++ src/sys/arch/amiga/dev/atzsc.c	Wed Jul 20 02:06:15 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: atzsc.c,v 1.43.18.1 2016/07/19 06:26:58 pgoyette Exp $ */
+/*	$NetBSD: atzsc.c,v 1.43.18.2 2016/07/20 02:06:15 pgoyette Exp $ */
 
 /*
  * Copyright (c) 1982, 1990 The Regents of the University of California.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: atzsc.c,v 1.43.18.1 2016/07/19 06:26:58 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: atzsc.c,v 1.43.18.2 2016/07/20 02:06:15 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -383,19 +383,16 @@ atzsc_dmanext(struct sbic_softc *dev)
 void
 atzsc_dump(void)
 {
-	device_t self;
 	extern struct cfdriver atzsc_cd;
 	struct sbic_softc *sc;
 	int i;
 
 	for (i = 0; i < atzsc_cd.cd_ndevs; ++i) {
-		self = device_lookup_acquire(&atzsc_cd, i);
-		if (self == NULL)
-			continue;
-		sc = device_private(&atzsc_cd, i);
-		if (sc != NULL)
+		sc = device_lookup_private_acquire(&atzsc_cd, i);
+		if (sc != NULL) {
 			sbic_dump(sc);
-		device_release(self);
+			device_release(sc->sc_dev);
+		}
 	}
 }
 #endif

Index: src/sys/arch/amiga/dev/bppcsc.c
diff -u src/sys/arch/amiga/dev/bppcsc.c:1.3.18.1 src/sys/arch/amiga/dev/bppcsc.c:1.3.18.2
--- src/sys/arch/amiga/dev/bppcsc.c:1.3.18.1	Tue Jul 19 06:26:58 2016
+++ src/sys/arch/amiga/dev/bppcsc.c	Wed Jul 20 02:06:15 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: bppcsc.c,v 1.3.18.1 2016/07/19 06:26:58 pgoyette Exp $ */
+/*	$NetBSD: bppcsc.c,v 1.3.18.2 2016/07/20 02:06:15 pgoyette Exp $ */
 
 /*
  * Copyright (c) 1982, 1990 The Regents of the University of California.
@@ -59,7 +59,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bppcsc.c,v 1.3.18.1 2016/07/19 06:26:58 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bppcsc.c,v 1.3.18.2 2016/07/20 02:06:15 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -203,19 +203,16 @@ bppcsc_dmaintr(void *arg)
 void
 bppcsc_dump(void)
 {
-	device_t self;
 	extern struct cfdriver bppcsc_cd;
 	struct siop_softc *sc;
 	int i;
 
 	for (i = 0; i < bppcsc_cd.cd_ndevs; ++i) {
-		self = device_lookup_acquire(&bppcsc_cd, i);
-		if (self == NULL)
-			continue;
-		sc = device_private(self);
-		if (sc != NULL)
+		sc = device_lookup_private_acquire(&bppcsc_cd, i);
+		if (sc != NULL) {
 			siop_dump(sc);
-		device_release(self);
+			device_release(sc->sc_dev);
+		}
 	}
 }
 #endif

Index: src/sys/arch/amiga/dev/cbiiisc.c
diff -u src/sys/arch/amiga/dev/cbiiisc.c:1.21.18.1 src/sys/arch/amiga/dev/cbiiisc.c:1.21.18.2
--- src/sys/arch/amiga/dev/cbiiisc.c:1.21.18.1	Tue Jul 19 06:26:58 2016
+++ src/sys/arch/amiga/dev/cbiiisc.c	Wed Jul 20 02:06:15 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: cbiiisc.c,v 1.21.18.1 2016/07/19 06:26:58 pgoyette Exp $ */
+/*	$NetBSD: cbiiisc.c,v 1.21.18.2 2016/07/20 02:06:15 pgoyette Exp $ */
 
 /*
  * Copyright (c) 1982, 1990 The Regents of the University of California.
@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cbiiisc.c,v 1.21.18.1 2016/07/19 06:26:58 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cbiiisc.c,v 1.21.18.2 2016/07/20 02:06:15 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -199,19 +199,16 @@ cbiiisc_dmaintr(void *arg)
 void
 cbiiisc_dump(void)
 {
-	device_t self;
 	extern struct cfdriver cbiiisc_cd;
 	struct siop_softc *sc;
 	int i;
 
 	for (i = 0; i < cbiiisc_cd.cd_ndevs; ++i) {
-		self = device_lookup_acquire(&cbiiisc_cd, i);
-		if (self == NULL)
-			continue;
-		sc = device_private(&cbiiisc_cd, i);
-		if (sc != NULL)
+		sc = device_lookup_private_acquire(&cbiiisc_cd, i);
+		if (sc != NULL) {
 			siopng_dump(sc);
-		device_release(self);
+			device_release(sc->sc_dev);
+		}
 	}
 }
 #endif

Index: src/sys/arch/amiga/dev/drsc.c
diff -u src/sys/arch/amiga/dev/drsc.c:1.33.10.1 src/sys/arch/amiga/dev/drsc.c:1.33.10.2
--- src/sys/arch/amiga/dev/drsc.c:1.33.10.1	Tue Jul 19 06:26:58 2016
+++ src/sys/arch/amiga/dev/drsc.c	Wed Jul 20 02:06:15 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: drsc.c,v 1.33.10.1 2016/07/19 06:26:58 pgoyette Exp $ */
+/*	$NetBSD: drsc.c,v 1.33.10.2 2016/07/20 02:06:15 pgoyette Exp $ */
 
 /*
  * Copyright (c) 1996 Ignatios Souvatzis
@@ -59,7 +59,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drsc.c,v 1.33.10.1 2016/07/19 06:26:58 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drsc.c,v 1.33.10.2 2016/07/20 02:06:15 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -231,19 +231,16 @@ drsc_handler(void)
 void
 drsc_dump(void)
 {
-	device_t self;
 	extern struct cfdriver drsc_cd;
 	struct siop_softc *sc;
 	int i;
 
 	for (i = 0; i < drsc_cd.cd_ndevs; ++i) {
-		self = device_lookup_acquire(&drsc_cd, i);
-		if (self == NULL)
-			continue;
-		sc = device_private(self);
-		if (sc != NULL)
+		sc = device_lookup_private_acquire(&drsc_cd, i);
+		if (sc != NULL) {
 			siop_dump(sc);
-		device_release(self);
+			device_release(sc->sc_dev);
+		}
 	}
 }
 #endif

Index: src/sys/arch/amiga/dev/fd.c
diff -u src/sys/arch/amiga/dev/fd.c:1.96.2.1 src/sys/arch/amiga/dev/fd.c:1.96.2.2
--- src/sys/arch/amiga/dev/fd.c:1.96.2.1	Tue Jul 19 06:26:58 2016
+++ src/sys/arch/amiga/dev/fd.c	Wed Jul 20 02:06:15 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: fd.c,v 1.96.2.1 2016/07/19 06:26:58 pgoyette Exp $ */
+/*	$NetBSD: fd.c,v 1.96.2.2 2016/07/20 02:06:15 pgoyette Exp $ */
 
 /*
  * Copyright (c) 1994 Christian E. Hopps
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fd.c,v 1.96.2.1 2016/07/19 06:26:58 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fd.c,v 1.96.2.2 2016/07/20 02:06:15 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -470,7 +470,6 @@ fdattach(device_t parent, device_t self,
 int
 fdopen(dev_t dev, int flags, int devtype, struct lwp *l)
 {
-	device_t self;
 	struct fd_softc *sc;
 	int wasopen, fwork, error, s;
 
@@ -479,15 +478,12 @@ fdopen(dev_t dev, int flags, int devtype
 	if (FDPART(dev) >= FDMAXPARTS)
 		return(ENXIO);
 
-	self = device_lookup_acquire(&fd_cd, FDUNIT(dev));
-	if (self == NULL)
-		return ENXIO;
-	if ((sc = device_private(self)) == NULL) {
-		device_release(self);
+	if ((sc = getsoftc(fd_cd, FDUNIT(dev))) == NULL) {
+		device_release(sc->sc_dev);
 		return(ENXIO);
 	}
 	if (sc->flags & FDF_NOTRACK0) {
-		device_release(self);
+		device_release(sc->sc_dev)
 		return(ENXIO);
 	}
 	if (sc->cachep == NULL)
@@ -546,8 +542,7 @@ done:
 	 */
 	if (error && wasopen == 0)
 		sc->openpart = -1;
-
-	device_release(self);
+	device_release(sc->sc_dev);
 	return(error);
 }
 
@@ -555,21 +550,13 @@ done:
 int
 fdclose(dev_t dev, int flags, int devtype, struct lwp *l)
 {
-	device_t self;
 	struct fd_softc *sc;
 	int s;
 
 #ifdef FDDEBUG
 	printf("fdclose()\n");
 #endif
-	self = device_lookup_acquire(&fd_cd, FDUNIT(dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
+	sc = getsoftc(fd_cd, FDUNIT(dev));
 	s = splbio();
 	if (sc->flags & FDF_MOTORON) {
 		sc->flags |= FDF_WMOTOROFF;
@@ -579,83 +566,78 @@ fdclose(dev_t dev, int flags, int devtyp
 	}
 	sc->openpart = -1;
 	splx(s);
-
-	device_release(self);
+	device_release(sc->sc_dev);
 	return(0);
 }
 
 int
 fdioctl(dev_t dev, u_long cmd, void *addr, int flag, struct lwp *l)
 {
-	device_t self;
 	struct fd_softc *sc;
 	int error, wlab;
 
-	self = device_lookup_acquire(&fd_cd, FDUNIT(dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
+	sc = getsoftc(fd_cd, FDUNIT(dev));
+
 	if ((sc->flags & FDF_HAVELABEL) == 0) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return(EBADF);
 	}
 	error = disk_ioctl(&sc->dkdev, dev, cmd, addr, flag, l);
 	if (error != EPASSTHROUGH) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return error;
 	}
+	error = 0;
 	switch (cmd) {
 	case DIOCSBAD:
-		device_release(self);
-		return(EINVAL);
+		error = EINVAL;
+		break;
 	case DIOCSRETRIES:
 		if (*(int *)addr < 0)
-			return(EINVAL);
-		sc->retries = *(int *)addr;
-		device_release(self);
-		return(0);
+			error = EINVAL;
+		else
+			sc->retries = *(int *)addr;
+		break;
 	case DIOCSSTEP:
-		if (*(int *)addr < FDSTEPDELAY)
-			return(EINVAL);
-		sc->dkdev.dk_label->d_trkseek = sc->stepdelay = *(int *)addr;
-		device_release(self);
-		return(0);
+		if (*(int *)addr < FDSTEPDELAY) {
+			error = EINVAL;
+		else
+			sc->dkdev.dk_label->d_trkseek = sc->stepdelay =
+			    *(int *)addr;
+		break;
 	case DIOCSDINFO:
 		if ((flag & FWRITE) == 0)
-			return(EBADF);
-		error = fdsetdisklabel(sc, (struct disklabel *)addr);
-		device_release(self);
-		return error;
+			error = EBADF;
+		else
+			error = fdsetdisklabel(sc, (struct disklabel *)addr);
+		break;
 	case DIOCWDINFO:
 		if ((flag & FWRITE) == 0)
-			return(EBADF);
-		if ((error = fdsetdisklabel(sc, (struct disklabel *)addr)) != 0)
-			return(error);
-		wlab = sc->wlabel;
-		sc->wlabel = 1;
-		error = fdputdisklabel(sc, dev);
-		sc->wlabel = wlab;
-		device_release(self);
-		return(error);
+			error = EBADF;
+		else {
+			error = fdsetdisklabel(sc, (struct disklabel *)addr));
+			if (error == 0) {
+				wlab = sc->wlabel;
+				sc->wlabel = 1;
+				error = fdputdisklabel(sc, dev);
+				sc->wlabel = wlab;
+			}
+		}
+		break;
 	case DIOCWLABEL:
 		if ((flag & FWRITE) == 0)
-			return(EBADF);
-		sc->wlabel = *(int *)addr;
-		device_release(self);
-		device_release(self);
-		return(0);
+			error = EBADF;
+		else
+			sc->wlabel = *(int *)addr;
+		break;
 	case DIOCGDEFLABEL:
 		fdgetdefaultlabel(sc, (struct disklabel *)addr, FDPART(dev));
-		device_release(self);
-		return(0);
+		break;
 	default:
-		device_release(self);
-		return(ENOTTY);
+		error = ENOTTY;
 	}
+	device_release(sc->sc_dev);
+	return error;
 }
 
 int
@@ -698,20 +680,11 @@ fdidxintr(void)
 void
 fdstrategy(struct buf *bp)
 {
-	device_t self;
 	struct fd_softc *sc;
 	int unit, s;
 
 	unit = FDUNIT(bp->b_dev);
-
-	self = device_lookup_acquire(&fd_cd, unit);
-	if (self == NULL)
-		return;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return;
-	}
+	sc = getsoftc(fd_cd, unit);
 
 #ifdef FDDEBUG
 	printf("fdstrategy: %p\n", bp);
@@ -742,12 +715,12 @@ fdstrategy(struct buf *bp)
 	bufq_put(sc->bufq, bp);
 	fdstart(sc);
 	splx(s);
-	device_release(self);
+	device_release(sc->sc_dev);
 	return;
 done:
 	bp->b_resid = bp->b_bcount;
 	biodone(bp);
-	device_release(self);
+	device_release(sc->sc_dev);
 }
 
 /*
@@ -1648,7 +1621,6 @@ nobuf:
 void
 fdfindwork(int unit)
 {
-	device_t self;
 	struct fd_softc *ssc, *sc;
 	int i, last;
 
@@ -1674,13 +1646,9 @@ fdfindwork(int unit)
 			i = -1;
 			continue;
 		}
-		self = device_lookup_acquire(&fd_cd, i);
-		if (self == NULL)
-			continue;
-		if ((sc = device_private(self)) == NULL) {
-			device_release(self);
+		if ((sc = device_lookup_private_acquire(&fd_cd, i)) == NULL)
 			continue;
-		}
+
 		/*
 		 * if unit has requested to be turned off
 		 * and it has no buf's queued do it now
@@ -1700,7 +1668,7 @@ fdfindwork(int unit)
 			 * flushing, quit
 			 */
 			if (fdc_indma) {
-				device_release(self);
+				device_release(sc->sc_dev);
 				return;
 			}
 		}
@@ -1710,11 +1678,13 @@ fdfindwork(int unit)
 		 */
 		if (ssc == NULL && bufq_peek(sc->bufq) != NULL)
 			ssc = sc;
+		else
+			device_release(sc->sc_dev);
 	}
-	if (ssc)
+	if (ssc) {
 		fdstart(ssc);
-
-	device_release(self);
+		device_release(ssc->sc_dev);
+	}
 }
 
 /*
@@ -1723,15 +1693,10 @@ fdfindwork(int unit)
 void
 fdminphys(struct buf *bp)
 {
-	device_t self;
 	struct fd_softc *sc;
 	int sec, toff, tsz;
 
-	self = device_lookup_acquire(&fd_cd, FDUNIT(bp->b_dev));
-	if (self == NULL)
-		panic("fdminphys: no device_t");
-	sc = device_private(self);
-	if (sc == NULL)
+	if ((sc = getsoftc(fd_cd, FDUNIT(bp->b_dev))) == NULL)
 		panic("fdminphys: couldn't get softc");
 
 	sec = bp->b_blkno % sc->nsectors;
@@ -1746,7 +1711,7 @@ fdminphys(struct buf *bp)
 	printf(" after %ld\n", bp->b_bcount);
 #endif
 	minphys(bp);
-	device_release(self);
+	device_release(sc->sc_dev);
 }
 
 /*

Index: src/sys/arch/amiga/dev/gtsc.c
diff -u src/sys/arch/amiga/dev/gtsc.c:1.41.18.1 src/sys/arch/amiga/dev/gtsc.c:1.41.18.2
--- src/sys/arch/amiga/dev/gtsc.c:1.41.18.1	Tue Jul 19 06:26:58 2016
+++ src/sys/arch/amiga/dev/gtsc.c	Wed Jul 20 02:06:15 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: gtsc.c,v 1.41.18.1 2016/07/19 06:26:58 pgoyette Exp $ */
+/*	$NetBSD: gtsc.c,v 1.41.18.2 2016/07/20 02:06:15 pgoyette Exp $ */
 
 /*
  * Copyright (c) 1982, 1990 The Regents of the University of California.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gtsc.c,v 1.41.18.1 2016/07/19 06:26:58 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gtsc.c,v 1.41.18.2 2016/07/20 02:06:15 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -401,19 +401,16 @@ gtsc_dmanext(struct sbic_softc *dev)
 void
 gtsc_dump(void)
 {
-	device_t self;
 	extern struct cfdriver gtsc_cd;
 	struct sbic_softc *sc;
 	int i;
 
 	for (i = 0; i < gtsc_cd.cd_ndevs; ++i) {
-		self = device_lookup_acquire(&gtsc_cd, i);
-		if (self == NULL)
-			continue;
-		sc = device_private(self);
-		if (sc != NULL)
+		sc = device_lookup_private_acquire(&gtsc_cd, i);
+		if (sc != NULL) {
 			sbic_dump(sc);
-		device_release(self);
+			device_release(sc->sc_dev);
+		}
 	}
 }
 #endif

Index: src/sys/arch/amiga/dev/mfc.c
diff -u src/sys/arch/amiga/dev/mfc.c:1.57.8.1 src/sys/arch/amiga/dev/mfc.c:1.57.8.2
--- src/sys/arch/amiga/dev/mfc.c:1.57.8.1	Tue Jul 19 06:26:58 2016
+++ src/sys/arch/amiga/dev/mfc.c	Wed Jul 20 02:06:15 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: mfc.c,v 1.57.8.1 2016/07/19 06:26:58 pgoyette Exp $ */
+/*	$NetBSD: mfc.c,v 1.57.8.2 2016/07/20 02:06:15 pgoyette Exp $ */
 
 /*
  * Copyright (c) 1982, 1990 The Regents of the University of California.
@@ -55,7 +55,7 @@
 #include "opt_kgdb.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mfc.c,v 1.57.8.1 2016/07/19 06:26:58 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mfc.c,v 1.57.8.2 2016/07/20 02:06:15 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -487,7 +487,6 @@ mfcprint(void *aux, const char *pnp)
 int
 mfcsopen(dev_t dev, int flag, int mode, struct lwp *l)
 {
-	device_t self;
 	struct tty *tp;
 	struct mfcs_softc *sc;
 	int unit, error;
@@ -495,15 +494,11 @@ mfcsopen(dev_t dev, int flag, int mode, 
 	error = 0;
 	unit = dev & 0x1f;
 
-	self = device_lookup_acquire(&mfcs_cd, unit);
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL || (mfcs_active & (1 << unit)) == 0) {
-		device_release(self);
+	sc = device_lookup_private_acquire(&mfcs_cd, unit);
+	if ((mfcs_active & (1 << unit)) == 0) {
+		device_release(sc->sc_dev);
 		return (ENXIO);
 	}
-
 	if (sc->sc_tty)
 		tp = sc->sc_tty;
 	else {
@@ -517,10 +512,9 @@ mfcsopen(dev_t dev, int flag, int mode, 
 	tp->t_hwiflow = mfcshwiflow;
 
 	if (kauth_authorize_device_tty(l->l_cred, KAUTH_DEVICE_TTY_OPEN, tp)) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (EBUSY);
 	}
-
 	mutex_spin_enter(&tty_lock);
 	if ((tp->t_state & TS_ISOPEN) == 0 && tp->t_wopen == 0) {
 		ttychars(tp);
@@ -569,6 +563,7 @@ mfcsopen(dev_t dev, int flag, int mode, 
 		tp->t_wopen--;
 		if (error) {
 			mutex_spin_exit(&tty_lock);
+			device_release(sc->sc_dev);
 			return(error);
 		}
 	}
@@ -584,8 +579,7 @@ done:
 	 */
 	tp->t_dev = dev;
 	mutex_spin_exit(&tty_lock);
-
-	device_release(self);
+	device_release(sc->sc_dev);
 	return tp->t_linesw->l_open(dev, tp);
 }
 
@@ -593,24 +587,14 @@ done:
 int
 mfcsclose(dev_t dev, int flag, int mode, struct lwp *l)
 {
-	device_t self;
 	struct tty *tp;
 	int unit;
-	struct mfcs_softc *sc;
-	struct mfc_softc *scc;
+	struct mfcs_softc *sc =
+		device_lookup_private_acquire(&mfcs_cd, dev & 31);
+	struct mfc_softc *scc= sc->sc_mfc;
 
 	unit = dev & 31;
 
-	self = device_lookup_acquire(&mfcs_cd, unit);
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
-	scc = sc->sc_mfc;
-
 	tp = sc->sc_tty;
 	tp->t_linesw->l_close(tp, flag);
 	sc->sc_duart->ch_cr = 0x70;			/* stop break */
@@ -639,136 +623,101 @@ mfcsclose(dev_t dev, int flag, int mode,
 		sc->sc_tty = (struct tty *) NULL;
 	}
 #endif
-	device_release(self);
+	device_release(sc->sc_dev);
 	return (0);
 }
 
 int
 mfcsread(dev_t dev, struct uio *uio, int flag)
 {
-	device_t self;
-	struct mfcs_softc *sc;
-	struct tty *tp;
-	int val;
+	int error;
+	struct mfcs_softc *sc =
+	    device_lookup_private_acquire(&mfcs_cd, dev & 31);
+	struct tty *tp = sc->sc_tty;
 
-	self = device_lookup_acquire(&mfcs_cd, dev & 31);
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
-	tp = sc->sc_tty;
 	if (tp == NULL) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return(ENXIO);
 	}
-	val = tp->t_linesw->l_read(tp, uio, flag);
-	device_release(self);
-	return val;
+	error = tp->t_linesw->l_read(tp, uio, flag);
+
+	device_release(sc->sc_dev);
+	return error;
 }
 
 int
 mfcswrite(dev_t dev, struct uio *uio, int flag)
 {
-	struct mfcs_softc *sc;
-	struct tty *tp;= sc->sc_tty;
+	int error;
+	struct mfcs_softc *sc =
+	    device_lookup_private_acquire(&mfcs_cd, dev & 31);
+	struct tty *tp = sc->sc_tty;
 
-	self = device_lookup_acquire(&mfcs_cd, dev & 31);
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
-	tp = sc->sc_tty;
 	if (tp == NULL) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return(ENXIO);
 	}
-	val = tp->t_linesw->l_write(tp, uio, flag);
-	device_release(self);
-	return val;
+	error = tp->t_linesw->l_write(tp, uio, flag);
+
+	device_release(sc->sc_dev);
+	return error;
 }
 
 int
 mfcspoll(dev_t dev, int events, struct lwp *l)
 {
-	struct mfcs_softc *sc;
-	struct tty *tp;= sc->sc_tty;
+	int error;
+	struct mfcs_softc *sc =
+	    device_lookup_private_acquire(&mfcs_cd, dev & 31);
+	struct tty *tp = sc->sc_tty;
 
-	self = device_lookup_acquire(&mfcs_cd, dev & 31);
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
-	tp = sc->sc_tty;
 	if (tp == NULL) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return(ENXIO);
 	}
-	val = tp->t_linesw->l_poll(tp, uio, flag);
-	device_release(self);
-	return val;
+	error = ((*tp->t_linesw->l_poll)(tp, events, l));
+
+	device_release(sc->sc_dev);
+	return error;
 }
 
 struct tty *
 mfcstty(dev_t dev)
 {
-	device_t self;
+	struct mfcs_softc *sc =
+	    device_lookup_private_acquire(&mfcs_cd, dev & 31);
 	struct tty *tty;
-	struct mfcs_softc *sc;
 
-	self = device_lookup_acquire(&mfcs_cd, dev & 31);
-	if (self == NULL)
-		return NULL;
-	sc = device_private(self);
-	if (sc != NULL)
-		tty = sc->sc_tty;
-
-	device_free(self);
+	tty = sc->sc_tty;
+	device_release(sc->sc_dev);
 	return tty;
 }
 
 int
 mfcsioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
 {
-	device_t self;
 	register struct tty *tp;
 	register int error;
-	struct mfcs_softc *sc;
+	struct mfcs_softc *sc =
+	    device_lookup_private_acquire(&mfcs_cd, dev & 31);
 
-	self = device_lookup_acquire(&mfcs_cd, dev & 31);
-	if (self == NULL)
-		return ENXIO;
-	sc = = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
 	tp = sc->sc_tty;
 	if (!tp) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return ENXIO;
 	}
 
 	error = tp->t_linesw->l_ioctl(tp, cmd, data, flag, l);
 	if (error != EPASSTHROUGH) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return(error);
 	}
-
 	error = ttioctl(tp, cmd, data, flag, l);
 	if (error != EPASSTHROUGH) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return(error);
 	}
-
+	error = 0;
 	switch (cmd) {
 	case TIOCSBRK:
 		sc->sc_duart->ch_cr = 0x60;		/* start break */
@@ -807,43 +756,33 @@ mfcsioctl(dev_t dev, u_long cmd, void *d
 	case TIOCSFLAGS:
 		error = kauth_authorize_device_tty(l->l_cred,
 		    KAUTH_DEVICE_TTY_PRIVSET, tp);
-		if (error != 0) {
-			device_release(self);
-			return(EPERM);
+		if (error != 0)
+			error = EPERM;
+		else {
+			sc->swflags = *(int *)data;
+                	sc->swflags &= /* only allow valid flags */
+                  	(TIOCFLAG_SOFTCAR | TIOCFLAG_CLOCAL | TIOCFLAG_CRTSCTS);
+			/* XXXX need to change duart parameters? */
 		}
-
-		sc->swflags = *(int *)data;
-                sc->swflags &= /* only allow valid flags */
-                  (TIOCFLAG_SOFTCAR | TIOCFLAG_CLOCAL | TIOCFLAG_CRTSCTS);
-		/* XXXX need to change duart parameters? */
 		break;
 	default:
-		return(EPASSTHROUGH);
+		error = EPASSTHROUGH;
 	}
 
-	device_release(self);
-	return(0);
+	device_release(sc->sc_dev);
+	return error;
 }
 
 int
 mfcsparam(struct tty *tp, struct termios *t)
 {
-	device_t self;
 	int cflag, unit, ospeed;
-	struct mfcs_softc *sc;
-	struct mfc_softc *scc;
+	struct mfcs_softc *sc =
+	    device_lookup_private_acquire(&mfcs_cd, tp->t_dev & 31);
+	struct mfc_softc *scc= sc->sc_mfc;
 
 	cflag = t->c_cflag;
 	unit = tp->t_dev & 31;
-	self = device_lookup_acquire(&mfscd_cd, unit);
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
-	scc = = sc->sc_mfc;
 	if (sc->flags & CT_USED) {
 		--scc->ct_usecnt;
 		sc->flags &= ~CT_USED;
@@ -870,7 +809,7 @@ mfcsparam(struct tty *tp, struct termios
 	}
 	/* XXXX 68681 duart could handle split speeds */
 	if (ospeed < 0 || (t->c_ispeed && t->c_ispeed != t->c_ospeed)) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return(EINVAL);
 	}
 
@@ -902,53 +841,35 @@ mfcsparam(struct tty *tp, struct termios
 		(void)mfcsmctl(tp->t_dev, TIOCM_DTR | TIOCM_RTS, DMSET);
 		sc->sc_duart->ch_csr = ospeed;
 	}
-	device_release(self);
+	device_release(sc->sc_dev);
 	return(0);
 }
 
 int
 mfcshwiflow(struct tty *tp, int flag)
 {
-	device_t self;
-	struct mfcs_softc *sc;
+	struct mfcs_softc *sc =
+	    device_lookup_private_acquire(&mfcs_cd, tp->t_dev & 31);
 	int unit = tp->t_dev & 1;
 
-	self = device_lookup_acquire(&mfcs_cd, tp->t_dev & 31);
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
         if (flag)
 		sc->sc_regs->du_btrst = 1 << unit;
 	else
 		sc->sc_regs->du_btst = 1 << unit;
-
-	device_release(self);
+	device_release(sc->sc_dev);
         return 1;
 }
 
 void
 mfcsstart(struct tty *tp)
 {
-	device_t self;
 	int cc, s, unit;
-	struct mfcs_softc *sc;
-	struct mfc_softc *scc;
+	struct mfcs_softc *sc =
+	    device_lookup_private_acquire(&mfcs_cd, tp->t_dev & 31);
+	struct mfc_softc *scc= sc->sc_mfc;
 
-	self = device_lookup_acquire(&mfcs_cd, tp->t_dev & 31);
-	if (self == NULL)
-		return;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return;
-	}
-	scc = sc->sc_mfc;
 	if ((tp->t_state & TS_ISOPEN) == 0) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return;
 	}
 
@@ -993,7 +914,7 @@ mfcsstart(struct tty *tp)
 	}
 out:
 	splx(s);
-	device_release(self);
+	device_release(sc->sc_dev);
 }
 
 /*
@@ -1016,19 +937,10 @@ mfcsstop(struct tty *tp, int flag)
 int
 mfcsmctl(dev_t dev, int bits, int how)
 {
-	device_t self;
 	int unit, s;
 	u_char ub = 0;
-	struct mfcs_softc *sc;
-
-	self = device_lookup_acquire(&mfcs_cd, dev & 31);
-	if (self == NULL)
-		return 0;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return 0;
-	}
+	struct mfcs_softc *sc =
+	    device_lookup_private_acquire(&mfcs_cd, dev & 31);
 
 	unit = dev & 1;
 
@@ -1080,7 +992,7 @@ mfcsmctl(dev_t dev, int bits, int how)
 	if (sc->sc_regs->pad26 & (1 << unit))
 		bits |= TIOCM_RI;
 
-	device_release(self);
+	device_release(sc->sc_dev);
 	return(bits);
 }
 
@@ -1091,7 +1003,6 @@ mfcsmctl(dev_t dev, int bits, int how)
 int
 mfcintr(void *arg)
 {
-	device_t self;
 	struct mfc_softc *scc = arg;
 	struct mfcs_softc *sc;
 	struct mfc_regs *regs;
@@ -1105,9 +1016,7 @@ mfcintr(void *arg)
 		return (0);
 	unit = device_unit(scc->sc_dev) * 2;
 	if (istat & 0x02) {		/* channel A receive interrupt */
-		self = device_lookup_acquire(&mfcs_cd, unit);
-		KASSERT(self != NULL);
-		sc = device_private(self);
+		sc = device_lookup_private_acquire(&mfcs_cd, unit);
 		while (1) {
 			c = regs->du_sra << 8;
 			if ((c & 0x0100) == 0)
@@ -1126,12 +1035,10 @@ mfcintr(void *arg)
 			if (c & 0x1000)
 				regs->du_cra = 0x40;
 		}
-		device_release(self);
+		device_release(sc->sc_dev);
 	}
 	if (istat & 0x20) {		/* channel B receive interrupt */
-		self = device_lookup_acquire(&mfcs_cd, unit);
-		KASSERT(self != NULL);
-		sc = device_private(self);
+		sc = device_lookup_private_acquire(&mfcs_cd, unit + 1);
 		while (1) {
 			c = regs->du_srb << 8;
 			if ((c & 0x0100) == 0)
@@ -1150,12 +1057,10 @@ mfcintr(void *arg)
 			if (c & 0x1000)
 				regs->du_crb = 0x40;
 		}
-		device_release(self);
+		device_release(sc->sc_dev);
 	}
 	if (istat & 0x01) {		/* channel A transmit interrupt */
-		self = device_lookup_acquire(&mfcs_cd, unit);
-		KASSERT(self != NULL);
-		sc = device_private(self);
+		sc = device_lookup_private_acquire(&mfcs_cd, unit);
 		tp = sc->sc_tty;
 		if (sc->ptr == sc->end) {
 			tp->t_state &= ~(TS_BUSY | TS_FLUSH);
@@ -1165,12 +1070,10 @@ mfcintr(void *arg)
 		}
 		else
 			regs->du_tba = *sc->ptr++;
-		device_release(self);
+		device_release(sc->sc_dev);
 	}
 	if (istat & 0x10) {		/* channel B transmit interrupt */
-		self = device_lookup_acquire(&mfcs_cd, unit);
-		KASSERT(self != NULL);
-		sc = device_private(self);
+		sc = device_lookup_private_acquire(&mfcs_cd, unit + 1);
 		tp = sc->sc_tty;
 		if (sc->ptr == sc->end) {
 			tp->t_state &= ~(TS_BUSY | TS_FLUSH);
@@ -1180,7 +1083,7 @@ mfcintr(void *arg)
 		}
 		else
 			regs->du_tbb = *sc->ptr++;
-		device_release(self);
+		device_release(sc->sc_dev);
 	}
 	if (istat & 0x80) {		/* input port change interrupt */
 		c = regs->du_ipcr;
@@ -1192,16 +1095,11 @@ mfcintr(void *arg)
 void
 mfcsxintr(int unit)
 {
-	device_t self;
 	int s1, s2, ovfl;
-	struct mfcs_softc *sc;
+	struct mfcs_softc *sc =
+	    device_lookup_private_acquire(&mfcs_cd, unit);
 	struct tty *tp = sc->sc_tty;
 
-	self = device_lookup_acquire(&mfcs_cd, unit);
-	if (self == NULL)
-		return;
-	sc = device_private(self);
-
 	/*
 	 * Make sure we're not interrupted by another
 	 * vbl, but allow level6 ints
@@ -1237,23 +1135,17 @@ mfcsxintr(int unit)
 		sc->sc_regs->du_btst = 1 << unit;	/* XXXX */
 	}
 	splx(s1);
-	device_release(self);
+	device_release(sc->sc_dev);
 }
 
 void
 mfcseint(int unit, int stat)
 {
-	device_t self;
-	struct mfcs_softc *sc;
+	struct mfcs_softc *sc = device_lookup_private_acquire(&mfcs_cd, unit);
 	struct tty *tp;
 	u_char ch;
 	int c;
 
-	self = device_lookup_acquire(&mfcs_cd, unit);
-	if (self == NULL)
-		return;
-	sc = device_private(self);
-
 	tp = sc->sc_tty;
 	ch = stat & 0xff;
 	c = ch;
@@ -1268,7 +1160,7 @@ mfcseint(int unit, int stat)
 		if (kgdb_dev == makedev(maj, unit) && c == FRAME_END)
 			kgdb_connect(0);	/* trap into kgdb */
 #endif
-		device_release(self);
+		device_release(sc->sc_dev);
 		return;
 	}
 
@@ -1285,8 +1177,7 @@ mfcseint(int unit, int stat)
 		    device_xname(device_lookup_private(&mfcs_cd, unit)));
 
 	tp->t_linesw->l_rint(c, tp);
-
-	device_release(self);
+	device_release(sc->sc_dev);
 }
 
 /*
@@ -1298,29 +1189,19 @@ mfcseint(int unit, int stat)
 void
 mfcsmint(int unit)
 {
-	device_t self;
 	struct tty *tp;
-	struct mfcs_softc *sc;
+	struct mfcs_softc *sc = device_lookup_private_acquire(&mfcs_cd, unit);
 	u_char stat, last, istat;
 
-	self = device_lookup_acquire(&mfcs_cd, unit);
-	if (self == NULL)
-		return;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return;
-	}
 	tp = sc->sc_tty;
 	if (!tp) {
-		device_release(self);
+		device_release(sc->sc-dev);
 		return;
 	}
-
 	if ((tp->t_state & TS_ISOPEN) == 0 && tp->t_wopen == 0) {
 		sc->rptr = sc->wptr = sc->inbuf;
 		sc->incnt = 0;
-		device_release(self);
+		device_release(sc->sc_dev);
 		return;
 	}
 	/*
@@ -1345,7 +1226,7 @@ mfcsmint(int unit)
 			sc->sc_regs->du_btrst = 0x0a << (unit & 1);
 		}
 	}
-	device_release(self);
+	device_release(sc->sc_dev);
 }
 
 void

Index: src/sys/arch/amiga/dev/mgnsc.c
diff -u src/sys/arch/amiga/dev/mgnsc.c:1.46.18.1 src/sys/arch/amiga/dev/mgnsc.c:1.46.18.2
--- src/sys/arch/amiga/dev/mgnsc.c:1.46.18.1	Tue Jul 19 06:26:58 2016
+++ src/sys/arch/amiga/dev/mgnsc.c	Wed Jul 20 02:06:15 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: mgnsc.c,v 1.46.18.1 2016/07/19 06:26:58 pgoyette Exp $ */
+/*	$NetBSD: mgnsc.c,v 1.46.18.2 2016/07/20 02:06:15 pgoyette Exp $ */
 
 /*
  * Copyright (c) 1982, 1990 The Regents of the University of California.
@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mgnsc.c,v 1.46.18.1 2016/07/19 06:26:58 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mgnsc.c,v 1.46.18.2 2016/07/20 02:06:15 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -207,19 +207,16 @@ mgnsc_dmaintr(void *arg)
 void
 mgnsc_dump(void)
 {
-	device_t self;
 	extern struct cfdriver mgnsc_cd;
 	struct siop_softc *sc;
 	int i;
 
 	for (i = 0; i < mgnsc_cd.cd_ndevs; ++i) {
-		self = device_lookup_acquire(&mgnsc_cd, i);
-		if (self == NULL)
-			continue;
-		sc = device_private(self);
-		if (sc != NULL)
+		sc = device_lookup_private_acquire(&mgnsc_cd, i);
+		if (sc != NULL) {
 			siop_dump(sc);
-		device_release(self);
+			device_release(sc->sc_dev);
+		}
 	}
 }
 #endif

Index: src/sys/arch/amiga/dev/wesc.c
diff -u src/sys/arch/amiga/dev/wesc.c:1.40.18.1 src/sys/arch/amiga/dev/wesc.c:1.40.18.2
--- src/sys/arch/amiga/dev/wesc.c:1.40.18.1	Tue Jul 19 06:26:58 2016
+++ src/sys/arch/amiga/dev/wesc.c	Wed Jul 20 02:06:15 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: wesc.c,v 1.40.18.1 2016/07/19 06:26:58 pgoyette Exp $ */
+/*	$NetBSD: wesc.c,v 1.40.18.2 2016/07/20 02:06:15 pgoyette Exp $ */
 
 /*
  * Copyright (c) 1982, 1990 The Regents of the University of California.
@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wesc.c,v 1.40.18.1 2016/07/19 06:26:58 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wesc.c,v 1.40.18.2 2016/07/20 02:06:15 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -191,19 +191,16 @@ wesc_dmaintr(void *arg)
 void
 wesc_dump(void)
 {
-	device_t self;
 	extern struct cfdriver wesc_cd;
 	struct siop_softc *sc;
 	int i;
 
 	for (i = 0; i < wesc_cd.cd_ndevs; ++i) {
-		self = device_lookup_acquire(&wesc_cd, i);
-		if (self == NULL)
-			continue;
-		sc = device_private(self);
-		if (sc != NULL)
+		sc = device_lookup_private_acquire(&wesc_cd, i);
+		if (sc != NULL) {
 			siop_dump(sc);
-		device_release(self);
+			device_release(sc->sc_dev);
+		}
 	}
 }
 #endif

Index: src/sys/arch/arc/jazz/fd.c
diff -u src/sys/arch/arc/jazz/fd.c:1.47.2.1 src/sys/arch/arc/jazz/fd.c:1.47.2.2
--- src/sys/arch/arc/jazz/fd.c:1.47.2.1	Tue Jul 19 06:26:58 2016
+++ src/sys/arch/arc/jazz/fd.c	Wed Jul 20 02:06:15 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: fd.c,v 1.47.2.1 2016/07/19 06:26:58 pgoyette Exp $	*/
+/*	$NetBSD: fd.c,v 1.47.2.2 2016/07/20 02:06:15 pgoyette Exp $	*/
 /*	$OpenBSD: fd.c,v 1.6 1998/10/03 21:18:57 millert Exp $	*/
 /*	NetBSD: fd.c,v 1.78 1995/07/04 07:23:09 mycroft Exp 	*/
 
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fd.c,v 1.47.2.1 2016/07/19 06:26:58 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fd.c,v 1.47.2.2 2016/07/20 02:06:15 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -432,12 +432,11 @@ fd_dev_to_type(struct fd_softc *fd, dev_
 void
 fdstrategy(struct buf *bp)
 {
-	device_t self;
-	struct fd_softc *fd;
+	struct fd_softc *fd =
+	    device_lookup_private_acquire(&fd_cd, FDUNIT(bp->b_dev));
 	int sz;
 	int s;
 
-	self = device_lookup_acquire(&fd_cd, FDUNIT(bp->b_dev));
 	/* Valid unit, controller, and request? */
 	if (bp->b_blkno < 0 ||
 	    (bp->b_bcount % FDC_BSIZE) != 0) {
@@ -493,14 +492,13 @@ fdstrategy(struct buf *bp)
 	}
 #endif
 	splx(s);
-	device_release(self);
+	device_release(fd->sc_dev);
 	return;
 
  done:
 	/* Toss transfer; we're done early. */
 	bp->b_resid = bp->b_bcount;
 	biodone(bp);
-	device_release(self);
 }
 
 void
@@ -652,28 +650,22 @@ out_fdc(bus_space_tag_t iot, bus_space_h
 int
 fdopen(dev_t dev, int flags, int mode, struct lwp *l)
 {
-	device_t self;
 	struct fd_softc *fd;
 	const struct fd_type *type;
 
-	self = device_lookup_acquire(&fd_cd, FDUNIT(dev));
-	if (self == NULL)
-		return ENXIO;
-	fd = device_private(self);
-	if (fd == NULL) {
-		device_release(self);
+	fd = device_lookup_private_acquire(&fd_cd, FDUNIT(dev));
+	if (fd == NULL)
 		return ENXIO;
-	}
 
 	type = fd_dev_to_type(fd, dev);
 	if (type == NULL) {
-		device_release(self);
+		device_release(fd->sc_dev);
 		return ENXIO;
 	}
 
 	if ((fd->sc_flags & FD_OPEN) != 0 &&
 	    memcmp(fd->sc_type, type, sizeof(*type))) {
-		device_release(self);
+		device_release(fd->sc_dev);
 		return EBUSY;
 	}
 
@@ -682,28 +674,18 @@ fdopen(dev_t dev, int flags, int mode, s
 	fd->sc_cylin = -1;
 	fd->sc_flags |= FD_OPEN;
 
-	device_release(self);
+	device_release(fd->sc_dev);
 	return 0;
 }
 
 int
 fdclose(dev_t dev, int flags, int mode, struct lwp *l)
 {
-	device_t self;
-	struct fd_softc *fd;
-
-	self = device_lookup_acquire(&fd_cd, FDUNIT(dev));
-	if (self == NULL)
-		return ENXIO;
-	fd = device_private(self);
-	if (fd == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
+	struct fd_softc *fd =
+	    device_lookup_private_acquire(&fd_cd, FDUNIT(dev));
 
 	fd->sc_flags &= ~FD_OPEN;
-
-	device_release(self);
+	device_release(fd->sc_dev);
 	return 0;
 }
 
@@ -1105,19 +1087,12 @@ fdcretry(struct fdc_softc *fdc)
 int
 fdioctl(dev_t dev, u_long cmd, void *addr, int flag, struct lwp *l)
 {
-	device_t self;
-	struct fd_softc *fd;
+	struct fd_softc *fd =
+	    device_lookup_private_acquire(&fd_cd, FDUNIT(dev));
 	struct disklabel buffer;
 	int error;
 
-	self = device_lookup_acquire(&fd_cd, FDUNIT(dev));
-	if (self == NULL)
-		return ENXIO;
-	fd = device_private(self);
-	if (fd == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
+	error = 0;
 	switch (cmd) {
 	case DIOCGDINFO:
 		memset(&buffer, 0, sizeof(buffer));
@@ -1130,15 +1105,13 @@ fdioctl(dev_t dev, u_long cmd, void *add
 			return EINVAL;
 
 		*(struct disklabel *)addr = buffer;
-		device_release(self);
-		return 0;
+		break;
 
 	case DIOCWLABEL:
 		if ((flag & FWRITE) == 0)
 			return EBADF;
 		/* XXX do something */
-		device_release(self);
-		return 0;
+		break;
 
 	case DIOCWDINFO:
 		if ((flag & FWRITE) == 0)
@@ -1146,19 +1119,18 @@ fdioctl(dev_t dev, u_long cmd, void *add
 
 		error = setdisklabel(&buffer, (struct disklabel *)addr,
 		    0, NULL);
-		if (error == 0))
-			error = writedisklabel(dev, fdstrategy, &buffer, NULL);
-		device_release(self);
-		return error;
+		if (error)
+			break;
+
+		error = writedisklabel(dev, fdstrategy, &buffer, NULL);
+		break;
 
 	default:
-		device_release(self);
-		return ENOTTY;
+		error = ENOTTY;
 	}
 
-#ifdef DIAGNOSTIC
-	panic("%s: impossible", __func__);
-#endif
+	device_release(fd->sc_dev;
+	return error;
 }
 
 /*

Index: src/sys/arch/arm/amlogic/amlogic_com.c
diff -u src/sys/arch/arm/amlogic/amlogic_com.c:1.5.4.1 src/sys/arch/arm/amlogic/amlogic_com.c:1.5.4.2
--- src/sys/arch/arm/amlogic/amlogic_com.c:1.5.4.1	Tue Jul 19 06:26:58 2016
+++ src/sys/arch/arm/amlogic/amlogic_com.c	Wed Jul 20 02:06:16 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: amlogic_com.c,v 1.5.4.1 2016/07/19 06:26:58 pgoyette Exp $ */
+/* $NetBSD: amlogic_com.c,v 1.5.4.2 2016/07/20 02:06:16 pgoyette Exp $ */
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -33,7 +33,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: amlogic_com.c,v 1.5.4.1 2016/07/19 06:26:58 pgoyette Exp $");
+__KERNEL_RCSID(1, "$NetBSD: amlogic_com.c,v 1.5.4.2 2016/07/20 02:06:16 pgoyette Exp $");
 
 #define cn_trap()			\
 	do {				\
@@ -284,23 +284,16 @@ amlogic_com_is_console(bus_addr_t iobase
 static int
 amlogic_com_open(dev_t dev, int flag, int mode, lwp_t *l)
 {
-	device_t self;
-	struct amlogic_com_softc *sc;
+	int error = 0;
+	struct amlogic_com_softc *sc =
+	    device_lookup_private_acquire(&amlogiccom_cd, minor(dev));
 	struct tty *tp = sc->sc_tty;
-	int val;
 
 	if (kauth_authorize_device_tty(l->l_cred,
 	    KAUTH_DEVICE_TTY_OPEN, tp) != 0) {
+		device_release(sc->sc_dev);
 		return EBUSY;
 	}
-	self = device_lookup_acquire(&amlogiccom_cd, minor(dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
 
 	if ((tp->t_state & TS_ISOPEN) == 0 && tp->t_wopen == 0) {
 		tp->t_dev = dev;
@@ -314,150 +307,90 @@ amlogic_com_open(dev_t dev, int flag, in
 	}
 	tp->t_state |= TS_CARR_ON;
 
-	val = tp->t_linesw->l_open(dev, tp);
-
-	device_release(self);
-	return val;
+	error = tp->t_linesw->l_open(dev, tp);
+	device_release(sc->sc_dev);
+	return error;
 }
 
 static int
 amlogic_com_close(dev_t dev, int flag, int mode, lwp_t *l)
 {
-	device_t self;
-	struct amlogic_com_softc *sc;
+	struct amlogic_com_softc *sc =
+	    device_lookup_private_acquire(&amlogiccom_cd, minor(dev));
 	struct tty *tp = sc->sc_tty;
 
-	self = device_lookup_acquire(&amlogiccom_cd, minor(dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
 	tp->t_linesw->l_close(tp, flag);
 	ttyclose(tp);
 
-	device_release(self);
+	device_release(sc->sc_dev);
 	return 0;
 }
 
 static int
 amlogic_com_read(dev_t dev, struct uio *uio, int flag)
 {
-	device_t self;
-	struct amlogic_com_softc *sc;
-	struct tty *tp;
-	int val;
-
-	self = device_lookup_acquire(&amlogiccom_cd, minor(dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
-
-	tp = sc->sc_tty;
-	val = tp->t_linesw->l_read(tp, uio, flag);
+	int error;
+	struct amlogic_com_softc *sc =
+	    device_lookup_private_acquire(&amlogiccom_cd, minor(dev));
+	struct tty *tp = sc->sc_tty;
 
-	device_release(self);
-	return val;
+	error = tp->t_linesw->l_read(tp, uio, flag);
+	device_release(sc->sc_dev);
+	return error;
 }
 
 static int
 amlogic_com_write(dev_t dev, struct uio *uio, int flag)
 {
-	device_t self;
-	struct amlogic_com_softc *sc;
-	struct tty *tp;
-	int val;
-
-	self = device_lookup_acquire(&amlogiccom_cd, minor(dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
-
-	tp = sc->sc_tty;
-	val = tp->t_linesw->l_write(tp, uio, flag);
+	int error;
+	struct amlogic_com_softc *sc =
+	    device_lookup_private_acquire(&amlogiccom_cd, minor(dev));
+	struct tty *tp = sc->sc_tty;
 
-	device_release(self);
-	return val;
+	error = tp->t_linesw->l_write(tp, uio, flag);
+	device_release(sc->sc_dev);
+	return error;
 }
 
 static int
 amlogic_com_poll(dev_t dev, int events, lwp_t *l)
 {
-	device_t self;
-	struct amlogic_com_softc *sc;
-	struct tty *tp;
-	int val;
-
-	self = device_lookup_acquire(&amlogiccom_cd, minor(dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
+	int error;
+	struct amlogic_com_softc *sc =
+	    device_lookup_private_acquire(&amlogiccom_cd, minor(dev));
+	struct tty *tp = sc->sc_tty;
 
-	tp = sc->sc_tty;
-	val = tp->t_linesw->l_poll(tp, events, l);
+	error = tp->t_linesw->l_poll(tp, events, l);
 
-	device_release(self);
-	return val;
+	device_release(sc->sc_dev);
+	return error;
 }
 
 static int
 amlogic_com_ioctl(dev_t dev, u_long cmd, void *data, int flag, lwp_t *l)
 {
-	device_t self;
-	struct amlogic_com_softc *sc;
-	struct tty *tp;
+	struct amlogic_com_softc *sc =
+	    device_lookup_private_acquire(&amlogiccom_cd, minor(dev));
+	struct tty *tp = sc->sc_tty;
 	int error;
 
-	self = device_lookup_acquire(&amlogiccom_cd, minor(dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
-
-	tp = sc->sc_tty;
 	error = tp->t_linesw->l_ioctl(tp, cmd, data, flag, l);
-	if (error != EPASSTHROUGH) {
-		device_release(self);
-		return error;
-	}
-	error = ttioctl(tp, cmd, data, flag, l);
+	if (error == EPASSTHROUGH)
+		error = ttioctl(tp, cmd, data, flag, l);
 
-	device_release(self);
+	device_release(sc->sc_dev);
 	return error;
 }
 
 static struct tty *
 amlogic_com_tty(dev_t dev)
 {
-	device_t self;
-	struct amlogic_com_softc *sc;
 	struct tty *tty;
+	struct amlogic_com_softc *sc =
+	    device_lookup_private_acquire(&amlogiccom_cd, minor(dev));
 
-	self = device_lookup_acquire(&amlogiccom_cd, minor(dev));
-	if (self == NULL)
-		return NULL;
-
-	sc = device_private(self);
 	tty = sc->sc_tty;
-
-	device_release(self);
+	device_release(sc->sc_dev);
 	return tty;
 }
 

Index: src/sys/arch/arm/at91/at91dbgu.c
diff -u src/sys/arch/arm/at91/at91dbgu.c:1.15.2.1 src/sys/arch/arm/at91/at91dbgu.c:1.15.2.2
--- src/sys/arch/arm/at91/at91dbgu.c:1.15.2.1	Tue Jul 19 06:26:58 2016
+++ src/sys/arch/arm/at91/at91dbgu.c	Wed Jul 20 02:06:16 2016
@@ -1,5 +1,5 @@
-/*	$Id: at91dbgu.c,v 1.15.2.1 2016/07/19 06:26:58 pgoyette Exp $	*/
-/*	$NetBSD: at91dbgu.c,v 1.15.2.1 2016/07/19 06:26:58 pgoyette Exp $ */
+/*	$Id: at91dbgu.c,v 1.15.2.2 2016/07/20 02:06:16 pgoyette Exp $	*/
+/*	$NetBSD: at91dbgu.c,v 1.15.2.2 2016/07/20 02:06:16 pgoyette Exp $ */
 
 /*
  *
@@ -83,7 +83,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: at91dbgu.c,v 1.15.2.1 2016/07/19 06:26:58 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: at91dbgu.c,v 1.15.2.2 2016/07/20 02:06:16 pgoyette Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -303,26 +303,17 @@ at91dbgu_attach(device_t parent, device_
 static int
 at91dbgu_param(struct tty *tp, struct termios *t)
 {
-	device_t self;
-	struct at91dbgu_softc *sc
+	struct at91dbgu_softc *sc = device_lookup_private_acquire(
+					&at91dbgu_cd, COMUNIT(tp->t_dev));
 	int s;
 
-	self = device_lookup_acquire(&at91dbgu_cd, COMUNIT(tp->t_dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
-
 	if (COM_ISALIVE(sc) == 0) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (EIO);
 	}
 
 	if (t->c_ispeed && t->c_ispeed != t->c_ospeed) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (EINVAL);
 	}
 
@@ -343,7 +334,7 @@ at91dbgu_param(struct tty *tp, struct te
 	 */
 	if (tp->t_ospeed == t->c_ospeed &&
 	    tp->t_cflag == t->c_cflag) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (0);
 	}
 
@@ -377,7 +368,7 @@ at91dbgu_param(struct tty *tp, struct te
 		}
 	}
 
-	device_release(self);
+	device_release(sc->sc_dev);
 	return (0);
 }
 
@@ -410,20 +401,12 @@ at91dbgu_filltx(struct at91dbgu_softc *s
 static void
 at91dbgu_start(struct tty *tp)
 {
-	device_t self;
-	struct at91dbgu_softc *sc
+	struct at91dbgu_softc *sc = device_lookup_private_acquire(
+					&at91dbgu_cd, COMUNIT(tp->t_dev));
 	int s;
 
-	self = device_lookup_acquire(&at91dbgu_cd, COMUNIT(tp->t_dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
 	if (COM_ISALIVE(sc) == 0) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return;
 	}
 
@@ -460,7 +443,7 @@ at91dbgu_start(struct tty *tp)
 
 out:
 	splx(s);
-	device_release(self);
+	device_release(sc->sc_dev);
 	return;
 }
 
@@ -499,24 +482,19 @@ at91dbgu_shutdown(struct at91dbgu_softc 
 int
 at91dbgu_open(dev_t dev, int flag, int mode, struct lwp *l)
 {
-	device_t self;
 	struct at91dbgu_softc *sc;
 	struct tty *tp;
 	int s, s2;
 	int error;
 
-	self = device_lookup_acquire(&at91dbgu_cd, COMUNIT(dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL || !ISSET(sc->sc_hwflags, COM_HW_DEV_OK) ||
-	    sc->sc_rbuf == NULL) {
-		device_release(self);
+	sc = device_lookup_private_acquire(&at91dbgu_cd, COMUNIT(dev));
+	if (!ISSET(sc->sc_hwflags, COM_HW_DEV_OK) || sc->sc_rbuf == NULL) {
+		device_release(sc->sc_dev);
 		return (ENXIO);
 	}
 
 	if (!device_is_active(sc->sc_dev)) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (ENXIO);
 	}
 
@@ -525,7 +503,7 @@ at91dbgu_open(dev_t dev, int flag, int m
 	 * If this is the kgdb port, no other use is permitted.
 	 */
 	if (ISSET(sc->sc_hwflags, COM_HW_KGDB)) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (EBUSY);
 	}
 #endif
@@ -533,7 +511,7 @@ at91dbgu_open(dev_t dev, int flag, int m
 	tp = sc->sc_tty;
 
 	if (kauth_authorize_device_tty(l->l_cred, KAUTH_DEVICE_TTY_OPEN, tp)) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (EBUSY);
 	}
 
@@ -555,6 +533,7 @@ at91dbgu_open(dev_t dev, int flag, int m
 				splx(s);
 				printf("%s: device enable failed\n",
 				       device_xname(sc->sc_dev));
+				device_release(sc->sc_dev);
 				return (EIO);
 			}
 			sc->enabled = 1;
@@ -632,7 +611,7 @@ at91dbgu_open(dev_t dev, int flag, int m
 	if (error)
 		goto bad;
 
-	device_release(self);
+	device_release(sc->sc_dev);
 	return (0);
 
 bad:
@@ -644,29 +623,20 @@ bad:
 		at91dbgu_shutdown(sc);
 	}
 
-	device_release(self);
+	device_release(sc->sc_dev);
 	return (error);
 }
 
 int
 at91dbgu_close(dev_t dev, int flag, int mode, struct lwp *l)
 {
-	device_t self;
-	struct at91dbgu_softc *sc;
+	struct at91dbgu_softc *sc = device_lookup_private_acquire(
+					&at91dbgu_cd, COMUNIT(dev));
 	struct tty *tp = sc->sc_tty;
 
-	self = device_lookup_acquire(&at91dbgu_cd, COMUNIT(dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
-
 	/* XXX This is for cons.c. */
 	if (!ISSET(tp->t_state, TS_ISOPEN)) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (0);
 	}
 
@@ -674,7 +644,7 @@ at91dbgu_close(dev_t dev, int flag, int 
 	ttyclose(tp);
 
 	if (COM_ISALIVE(sc) == 0) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (0);
 	}
 
@@ -687,149 +657,98 @@ at91dbgu_close(dev_t dev, int flag, int 
 		at91dbgu_shutdown(sc);
 	}
 
-	device_release(self);
+	device_release(sc->sc_dev);
 	return (0);
 }
 
 int
 at91dbgu_read(dev_t dev, struct uio *uio, int flag)
 {
-	device_t self;
-	struct at91dbgu_softc *sc;
-	struct tty *tp;
-	int val;
-
-	self = device_lookup_acquire(&at91dbgu_cd, COMUNIT(dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
-	if (COM_ISALIVE(sc) == 0) {
-		device_release(self);
-		return (EIO);
- 	}
+	int error;
+	struct at91dbgu_softc *sc = device_lookup_private_acquire(
+					&at91dbgu_cd, COMUNIT(dev));
+	struct tty *tp = sc->sc_tty;
 
-	tp = sc->sc_tty;
-	val = ((*tp->t_linesw->l_read)(tp, uio, flag));
+	if (COM_ISALIVE(sc) == 0)
+		error = EIO;
+	else 
+		error = (*tp->t_linesw->l_read)(tp, uio, flag);
 
-	device_release(self);
-	return val;
+	device_release(sc->sc_dev);
+	return error;
 }
 
 int
 at91dbgu_write(dev_t dev, struct uio *uio, int flag)
 {
-	struct at91dbgu_softc *sc;
-	struct tty *tp;
-	int val;
-
-	self = device_lookup_acquire(&at91dbgu_cd, COMUNIT(dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
-	if (COM_ISALIVE(sc) == 0) {
-		device_release(self);
-		return (EIO);
- 	}
+	int error;
+	struct at91dbgu_softc *sc = device_lookup_private_acquire(
+					&at91dbgu_cd, COMUNIT(dev));
+	struct tty *tp = sc->sc_tty;
 
-	tp = sc->sc_tty;
-	val = ((*tp->t_linesw->l_write)(tp, uio, flag));
+	if (COM_ISALIVE(sc) == 0)
+		error = EIO;
+	else
+		error = (*tp->t_linesw->l_write)(tp, uio, flag);
 
-	device_release(self);
-	return val;
+	device_release(sc->sc_dev);
+	return error;
 }
 
 int
 at91dbgu_poll(dev_t dev, int events, struct lwp *l)
 {
-	struct at91dbgu_softc *sc;
-	struct tty *tp;
-
-	self = device_lookup_acquire(&at91dbgu_cd, COMUNIT(dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
-	if (COM_ISALIVE(sc) == 0) {
-		device_release(self);
-		return (EIO);
- 	}
+	int error;
+	struct at91dbgu_softc *sc = device_lookup_private_acquire(
+					&at91dbgu_cd, COMUNIT(dev));
+	struct tty *tp = sc->sc_tty;
 
-	tp = sc->sc_tty;
-	val = ((*tp->t_linesw->l_poll)(tp, events, l));
+	if (COM_ISALIVE(sc) == 0)
+		error = EIO;
+	else
+		error = (*tp->t_linesw->l_poll)(tp, events, l);
 
-	device_release(self);
-	return val;
+	device_release(sc->sc_dev);
+	return error;
 }
 
 struct tty *
 at91dbgu_tty(dev_t dev)
 {
-	device_t self;
-	struct at91dbgu_softc *sc;
+	struct at91dbgu_softc *sc = device_lookup_private_acquire(
+					&at91dbgu_cd, COMUNIT(dev));
 	struct tty *tp;
 
-	self = device_lookup_acquire(&at91dbgu_cd, COMUNIT(dev));
-	if (self == NULL)
-		return NULL;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return NULL;
-	}
 	tp = sc->sc_tty;
 
-	device_release(self);
+	device_release(sc->sc_dev);
 	return (tp);
 }
 
 int
 at91dbgu_ioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
 {
-	device_t self;
-	struct at91dbgu_softc *sc;
-	struct tty *tp;
+	struct at91dbgu_softc *sc = device_lookup_private_acquire(
+					&at91dbgu_cd, COMUNIT(dev));
+	struct tty *tp = sc->sc_tty;
 	int error;
 	int s;
 
-	self = device_lookup_acquire(&at91dbgu_cd, COMUNIT(dev));
-	if (self == NULL)
-		return NULL;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return NULL;
-	}
 	if (COM_ISALIVE(sc) == 0) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (EIO);
 	}
 
-	tp = sc->sc_tty;
 	error = (*tp->t_linesw->l_ioctl)(tp, cmd, data, flag, l);
-	if (error != EPASSTHROUGH) {
-		device_release(self);
-		return (error);
-	}
+	if (error == EPASSTHROUGH)
+		error = ttioctl(tp, cmd, data, flag, l);
 
-	error = ttioctl(tp, cmd, data, flag, l);
 	if (error != EPASSTHROUGH) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (error);
 	}
 
 	error = 0;
-
 	s = splserial();
 
 	switch (cmd) {
@@ -860,7 +779,7 @@ at91dbgu_ioctl(dev_t dev, u_long cmd, vo
 
 	splx(s);
 
-	device_release(self);
+	device_release(sc->sc_dev);
 	return (error);
 }
 
@@ -870,18 +789,10 @@ at91dbgu_ioctl(dev_t dev, u_long cmd, vo
 void
 at91dbgu_stop(struct tty *tp, int flag)
 {
-	device_t self;
-	struct at91dbgu_softc *sc;
+	struct at91dbgu_softc *sc = device_lookup_private_acquire(
+					&at91dbgu_cd, COMUNIT(tp->t_dev));
 	int s;
 
-	self = device_lookup_private(&at91dbgu_cd, COMUNIT(tp->t_dev));
-	if (self == NULL)
-		return;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return;
-	}
 	s = splserial();
 	if (ISSET(tp->t_state, TS_BUSY)) {
 		/* Stop transmitting at the next chunk. */
@@ -890,7 +801,7 @@ at91dbgu_stop(struct tty *tp, int flag)
 			SET(tp->t_state, TS_FLUSH);
 	}
 	splx(s);
-	device_release(self);
+	device_release(sc->sc_dev);
 }
 
 #if 0

Index: src/sys/arch/arm/at91/at91usart.c
diff -u src/sys/arch/arm/at91/at91usart.c:1.13.2.1 src/sys/arch/arm/at91/at91usart.c:1.13.2.2
--- src/sys/arch/arm/at91/at91usart.c:1.13.2.1	Tue Jul 19 06:26:58 2016
+++ src/sys/arch/arm/at91/at91usart.c	Wed Jul 20 02:06:16 2016
@@ -1,5 +1,5 @@
-/*	$Id: at91usart.c,v 1.13.2.1 2016/07/19 06:26:58 pgoyette Exp $	*/
-/*	$NetBSD: at91usart.c,v 1.13.2.1 2016/07/19 06:26:58 pgoyette Exp $ */
+/*	$Id: at91usart.c,v 1.13.2.2 2016/07/20 02:06:16 pgoyette Exp $	*/
+/*	$NetBSD: at91usart.c,v 1.13.2.2 2016/07/20 02:06:16 pgoyette Exp $ */
 
 /*
  * Copyright (c) 2007 Embedtronics Oy. All rights reserved.
@@ -77,7 +77,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: at91usart.c,v 1.13.2.1 2016/07/19 06:26:58 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: at91usart.c,v 1.13.2.2 2016/07/20 02:06:16 pgoyette Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -328,25 +328,17 @@ at91usart_attach_subr(struct at91usart_s
 static int
 at91usart_param(struct tty *tp, struct termios *t)
 {
-	device_t self;
-	struct at91usart_softc *sc;
+	struct at91usart_softc *sc = device_lookup_private_acquire(
+					&at91usart_cd, COMUNIT(tp->t_dev));
 	int s;
 
-	self = device_lookup_acquire(&at91usart_cd, COMUNIT(tp->t_dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
 	if (COM_ISALIVE(sc) == 0) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (EIO);
 	}
 
 	if (t->c_ispeed && t->c_ispeed != t->c_ospeed) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (EINVAL);
 	}
 
@@ -367,7 +359,7 @@ at91usart_param(struct tty *tp, struct t
 	 */
 	if (tp->t_ospeed == t->c_ospeed &&
 	    tp->t_cflag == t->c_cflag) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (0);
 	}
 
@@ -398,7 +390,7 @@ at91usart_param(struct tty *tp, struct t
 	if (sc->hwflow)
 		(*sc->hwflow)(sc, t->c_cflag);
 
-	device_release(self);
+	device_release(sc->sc_dev);
 	return (0);
 }
 
@@ -492,21 +484,13 @@ at91usart_filltx(struct at91usart_softc 
 static void
 at91usart_start(struct tty *tp)
 {
-	device_t self;
-	struct at91usart_softc *sc;
+	struct at91usart_softc *sc = device_lookup_private_acquire(
+					&at91usart_cd, COMUNIT(tp->t_dev));
 	int s;
 
-	self = device_lookup_acquire(&at91usart_cd, COMUNIT(tp->t_dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
 	if (COM_ISALIVE(sc) == 0) {
 		DPRINTFN(5, ("%s: %s / COM_ISALIVE == 0\n", device_xname(sc->sc_dev), __FUNCTION__));
-		device_release(self);
+		device_release(sc->sc_dev);
 		return;
 	}
 
@@ -541,7 +525,7 @@ at91usart_start(struct tty *tp)
 out:
 	splx(s);
 
-	device_release(self);
+	device_release(sc->sc_dev);
 	return;
 }
 
@@ -586,23 +570,19 @@ at91usart_shutdown(struct at91usart_soft
 int
 at91usart_open(dev_t dev, int flag, int mode, struct lwp *l)
 {
-	device_t self;
 	struct at91usart_softc *sc;
 	struct tty *tp;
 	int s;
 	int error;
 
-	self = device_lookup_acquire(&at91usart_cd, COMUNIT(dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
+	sc = device_lookup_private_acquire(&at91usart_cd, COMUNIT(dev));
 	if (sc == NULL || !ISSET(sc->sc_hwflags, COM_HW_DEV_OK)) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (ENXIO);
 	}
 
 	if (!device_is_active(sc->sc_dev)) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (ENXIO);
 	}
 
@@ -611,7 +591,7 @@ at91usart_open(dev_t dev, int flag, int 
 	 * If this is the kgdb port, no other use is permitted.
 	 */
 	if (ISSET(sc->sc_hwflags, COM_HW_KGDB)) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (EBUSY);
 	}
 #endif
@@ -619,7 +599,7 @@ at91usart_open(dev_t dev, int flag, int 
 	tp = sc->sc_tty;
 
 	if (kauth_authorize_device_tty(l->l_cred, KAUTH_DEVICE_TTY_OPEN, tp)) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (EBUSY);
 	}
 
@@ -638,7 +618,6 @@ at91usart_open(dev_t dev, int flag, int 
 				splx(s);
 				printf("%s: device enable failed\n",
 				       device_xname(sc->sc_dev));
-				device_release(self);
 				return (EIO);
 			}
 			sc->enabled = 1;
@@ -710,7 +689,7 @@ at91usart_open(dev_t dev, int flag, int 
 	if (error)
 		goto bad;
 
-	device_release(self);
+	device_release(sc->sc_dev);
 	return (0);
 
 bad:
@@ -722,37 +701,28 @@ bad:
 		at91usart_shutdown(sc);
 	}
 
-	device_release(self);
+	device_release(sc->sc_dev);
 	return (error);
 }
 
 int
 at91usart_close(dev_t dev, int flag, int mode, struct lwp *l)
 {
-	device_t self;
-	struct at91usart_softc *sc;
-	struct tty *tp;
+	struct at91usart_softc *sc = device_lookup_private_acquire(
+					&at91usart_cd, COMUNIT(dev));
+	struct tty *tp = sc->sc_tty;
 
-	self = device_lookup_acquire(&at91usart_cd, COMUNIT(dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
 	/* XXX This is for cons.c. */
 	if (!ISSET(tp->t_state, TS_ISOPEN)) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (0);
 	}
 
-	tp = sc->sc_tty;
 	(*tp->t_linesw->l_close)(tp, flag);
 	ttyclose(tp);
 
 	if (COM_ISALIVE(sc) == 0) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (0);
 	}
 
@@ -765,147 +735,96 @@ at91usart_close(dev_t dev, int flag, int
 		at91usart_shutdown(sc);
 	}
 
-	device_release(self);
+	device_release(sc->sc_dev);
 	return (0);
 }
 
 int
 at91usart_read(dev_t dev, struct uio *uio, int flag)
 {
-	device_t self;
-	struct at91usart_softc *sc;
-	struct tty *tp;
-	int val;
+	int error;
+	struct at91usart_softc *sc = device_lookup_private_acquire(
+					&at91usart_cd, COMUNIT(dev));
+	struct tty *tp = sc->sc_tty;
 
-	self = device_lookup_private(&at91usart_cd, COMUNIT(dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
 	if (COM_ISALIVE(sc) == 0) {
-		device_release(self);
-		return (EIO);
-	}
- 
-	tp = sc->sc_tty;
-	val = ((*tp->t_linesw->l_read)(tp, uio, flag));
+		error = EIO;
+	else
+		error =(*tp->t_linesw->l_read)(tp, uio, flag);
 
-	device_release(self);
-	return val;
+	device_release(sc->sc_dev);
+	return error;
 }
 
 int
 at91usart_write(dev_t dev, struct uio *uio, int flag)
 {
-	device_t self;
-	struct at91usart_softc *sc;
-	struct tty *tp;
-	int val;
+	int error;
+	struct at91usart_softc *sc = device_lookup_private_acquire(
+					&at91usart_cd, COMUNIT(dev));
+	struct tty *tp = sc->sc_tty;
 
-	self = device_lookup_acquire(&at91usart_cd, COMUNIT(dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
-	if (COM_ISALIVE(sc) == 0) {
-		device_release(self);
-		return (EIO);
-	}
- 
-	tp = sc->sc_tty;
-	val = ((*tp->t_linesw->l_write)(tp, uio, flag));
+	if (COM_ISALIVE(sc) == 0)
+		error = EIO;
+	else
+		error = (*tp->t_linesw->l_write)(tp, uio, flag);
 
-	device_release(self);
-	return val;
+	device_release(sc->sc_dev);
+	return error;
 }
 
 int
 at91usart_poll(dev_t dev, int events, struct lwp *l)
 {
-	device_t self;
-	struct at91usart_softc *sc;
-	struct tty *tp;
-	int val;
+	int error;
+	struct at91usart_softc *sc = device_lookup_private_acquire(
+					&at91usart_cd, COMUNIT(dev));
+	struct tty *tp = sc->sc_tty;
 
-	self = device_lookup_acquire(&at91usart_cd, COMUNIT(dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
-	if (COM_ISALIVE(sc) == 0) {
-		device_release(self);
-		return (EIO);
-	}
- 
-	tp = sc->sc_tty;
-	val = ((*tp->t_linesw->l_poll)(tp, events, l));
+	if (COM_ISALIVE(sc) == 0)
+		error = EIO;
+	else
+		error = (*tp->t_linesw->l_poll)(tp, events, l);
 
-	device_release(self);
-	return val;
+	device_release(sc->sc_dev);
+	return error;
 }
 
 struct tty *
 at91usart_tty(dev_t dev)
 {
-	device_t self;
-	struct at91usart_softc *sc;
+	struct at91usart_softc *sc = device_lookup_private_acquire(
+					&at91usart_cd, COMUNIT(dev));
 	struct tty *tp;
 
-	self = device_lookup_acquire(&at91usart_cd, COMUNIT(dev));
-	if (self == NULL)
-		return NULL;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return NULL;
-	}
 	tp = sc->sc_tty;
 
-	device_release(self);
+	device_release(sc->sc_dev);
 	return (tp);
 }
 
 int
 at91usart_ioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
 {
-	struct at91usart_softc *sc;
-	struct tty *tp;
+	struct at91usart_softc *sc = device_lookup_private_acquire(
+					&at91usart_cd, COMUNIT(dev));
+	struct tty *tp = sc->sc_tty;
 	int error;
 	int s;
 
-	self = device_lookup_acquire(&at91usart_cd, COMUNIT(dev));
-	if (self == NULL)
-		return ENXIO;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return ENXIO;
-	}
 	if (COM_ISALIVE(sc) == 0) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (EIO);
 	}
 
-	tp = sc->sc_tty;
 	error = (*tp->t_linesw->l_ioctl)(tp, cmd, data, flag, l);
+	if (error == EPASSTHROUGH)
+		error = ttioctl(tp, cmd, data, flag, l);
 	if (error != EPASSTHROUGH) {
-		device_release(self);
-		return (error);
-	}
-	error = ttioctl(tp, cmd, data, flag, l);
-	if (error != EPASSTHROUGH) {
-		device_release(self);
+		device_release(sc->sc_dev);
 		return (error);
 	}
+
 	error = 0;
 
 	s = spltty();
@@ -938,7 +857,7 @@ at91usart_ioctl(dev_t dev, u_long cmd, v
 
 	splx(s);
 
-	device_release(self);
+	device_release(sc->sc_dev);
 	return (error);
 }
 
@@ -948,18 +867,9 @@ at91usart_ioctl(dev_t dev, u_long cmd, v
 void
 at91usart_stop(struct tty *tp, int flag)
 {
-	device_t self;
-	struct at91usart_softc *sc;
-	int s;
+	struct at91usart_softc *sc = device_lookup_private_acquire(
+					&at91usart_cd, COMUNIT(tp->t_dev));
 
-	self = device_lookup_acquire(&at91usart_cd, COMUNIT(tp->t_dev));
-	if (self == NULL)
-		return;
-	sc = device_private(self);
-	if (sc == NULL) {
-		device_release(self);
-		return;
-	}
 	s = spltty();
 	if (ISSET(tp->t_state, TS_BUSY)) {
 		/* Stop transmitting at the next chunk. */
@@ -968,7 +878,7 @@ at91usart_stop(struct tty *tp, int flag)
 			SET(tp->t_state, TS_FLUSH);
 	}
 	splx(s);
-	device_release(self);
+	device_release(sc->sc_dev);
 }
 
 #if 0

Reply via email to