CVS commit: src/sys/dev/pad

2021-06-14 Thread Taylor R Campbell
Module Name:src
Committed By:   riastradh
Date:   Mon Jun 14 18:44:53 UTC 2021

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
pad(4): Explain what's wrong with using device pointers like this.

...and why the kernel lock is not enough.


To generate a diff of this commit:
cvs rdiff -u -r1.74 -r1.75 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.74 src/sys/dev/pad/pad.c:1.75
--- src/sys/dev/pad/pad.c:1.74	Mon Jun 14 18:44:45 2021
+++ src/sys/dev/pad/pad.c	Mon Jun 14 18:44:53 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.74 2021/06/14 18:44:45 riastradh Exp $ */
+/* $NetBSD: pad.c,v 1.75 2021/06/14 18:44:53 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.74 2021/06/14 18:44:45 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.75 2021/06/14 18:44:53 riastradh Exp $");
 
 #include 
 #include 
@@ -386,6 +386,36 @@ pad_close(struct pad_softc *sc)
 	device_t self = sc->sc_dev;
 	cfdata_t cf = device_cfdata(self);
 
+	/*
+	 * XXX This is not quite enough to prevent racing with drvctl
+	 * detach.  What can happen:
+	 *
+	 *	cpu0cpu1
+	 *
+	 *	pad_close
+	 *	take kernel lock
+	 *	sc->sc_open = 0
+	 *	drop kernel lock
+	 *	wait for config_misc_lock
+	 *	drvctl detach
+	 *	take kernel lock
+	 *	drop kernel lock
+	 *	wait for config_misc_lock
+	 *	retake kernel lock
+	 *	drop config_misc_lock
+	 *	take config_misc_lock
+	 *	wait for kernel lock
+	 *	pad_detach (sc_open=0 already)
+	 *	free device
+	 *	drop kernel lock
+	 *	use device after free
+	 *
+	 * We need a way to grab a reference to the device so it won't
+	 * be freed until we're done -- it's OK if we config_detach
+	 * twice as long as it's idempotent, but not OK if the first
+	 * config_detach frees the struct device before the second one
+	 * has finished handling it.
+	 */
 	KERNEL_LOCK(1, NULL);
 	KASSERT(sc->sc_open);
 	sc->sc_open = 0;



CVS commit: src/sys/dev/pad

2021-06-14 Thread Taylor R Campbell
Module Name:src
Committed By:   riastradh
Date:   Mon Jun 14 18:44:45 UTC 2021

Modified Files:
src/sys/dev/pad: pad.c padvar.h

Log Message:
pad(4): Omit unused sc_blksize.


To generate a diff of this commit:
cvs rdiff -u -r1.73 -r1.74 src/sys/dev/pad/pad.c
cvs rdiff -u -r1.15 -r1.16 src/sys/dev/pad/padvar.h

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

Modified files:

Index: src/sys/dev/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.73 src/sys/dev/pad/pad.c:1.74
--- src/sys/dev/pad/pad.c:1.73	Mon Jun 14 18:44:37 2021
+++ src/sys/dev/pad/pad.c	Mon Jun 14 18:44:45 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.73 2021/06/14 18:44:37 riastradh Exp $ */
+/* $NetBSD: pad.c,v 1.74 2021/06/14 18:44:45 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.73 2021/06/14 18:44:37 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.74 2021/06/14 18:44:45 riastradh Exp $");
 
 #include 
 #include 
@@ -533,7 +533,6 @@ pad_start_output(void *opaque, void *blo
 
 	sc->sc_intr = intr;
 	sc->sc_intrarg = intrarg;
-	sc->sc_blksize = blksize;
 
 	DPRINTF("%s: blksize=%d\n", __func__, blksize);
 	err = pad_add_block(sc, block, blksize);

Index: src/sys/dev/pad/padvar.h
diff -u src/sys/dev/pad/padvar.h:1.15 src/sys/dev/pad/padvar.h:1.16
--- src/sys/dev/pad/padvar.h:1.15	Mon Jun 14 10:14:46 2021
+++ src/sys/dev/pad/padvar.h	Mon Jun 14 18:44:45 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: padvar.h,v 1.15 2021/06/14 10:14:46 riastradh Exp $ */
+/* $NetBSD: padvar.h,v 1.16 2021/06/14 18:44:45 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -49,7 +49,6 @@ struct pad_softc {
 	callout_t	sc_pcallout;
 
 	device_t	sc_audiodev;
-	int		sc_blksize;
 
 #define PAD_BUFSIZE	65536
 	uint8_t		sc_audiobuf[PAD_BUFSIZE];



CVS commit: src/sys/dev/pad

2021-06-14 Thread Taylor R Campbell
Module Name:src
Committed By:   riastradh
Date:   Mon Jun 14 18:44:37 UTC 2021

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
pad(4): Refactor for clarity, and fix locking bugs.

- Don't touch sc_buflen outside sc_intr_lock.

- Omit needless broadcast in pad_halt_output -- nothing wakes on the
  new condition (sc_buflen == 0), so this can't make a difference
  except possibly in buggy code.

- Sprinkle KASSERTs.


To generate a diff of this commit:
cvs rdiff -u -r1.72 -r1.73 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.72 src/sys/dev/pad/pad.c:1.73
--- src/sys/dev/pad/pad.c:1.72	Mon Jun 14 10:21:21 2021
+++ src/sys/dev/pad/pad.c	Mon Jun 14 18:44:37 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.72 2021/06/14 10:21:21 riastradh Exp $ */
+/* $NetBSD: pad.c,v 1.73 2021/06/14 18:44:37 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.72 2021/06/14 10:21:21 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.73 2021/06/14 18:44:37 riastradh Exp $");
 
 #include 
 #include 
@@ -271,6 +271,8 @@ pad_childdet(device_t self, device_t chi
 {
 	struct pad_softc *sc = device_private(self);
 
+	KASSERT(KERNEL_LOCKED_P());
+
 	if (child == sc->sc_audiodev)
 		sc->sc_audiodev = NULL;
 }
@@ -280,7 +282,11 @@ pad_add_block(struct pad_softc *sc, uint
 {
 	int l;
 
-	if (sc->sc_buflen + blksize > PAD_BUFSIZE)
+	KASSERT(blksize >= 0);
+	KASSERT(mutex_owned(>sc_intr_lock));
+
+	if (blksize > PAD_BUFSIZE ||
+	sc->sc_buflen > PAD_BUFSIZE - (unsigned)blksize)
 		return ENOBUFS;
 
 	if (sc->sc_wpos + blksize <= PAD_BUFSIZE)
@@ -296,16 +302,27 @@ pad_add_block(struct pad_softc *sc, uint
 		sc->sc_wpos -= PAD_BUFSIZE;
 
 	sc->sc_buflen += blksize;
+	cv_broadcast(>sc_condvar);
 
 	return 0;
 }
 
 static int
-pad_get_block(struct pad_softc *sc, pad_block_t *pb, int blksize)
+pad_get_block(struct pad_softc *sc, pad_block_t *pb, int maxblksize)
 {
-	int l;
+	int l, blksize, error;
 
-	KASSERT(pb != NULL);
+	KASSERT(maxblksize > 0);
+	KASSERT(mutex_owned(>sc_intr_lock));
+
+	while (sc->sc_buflen == 0) {
+		DPRINTF("%s: wait\n", __func__);
+		error = cv_wait_sig(>sc_condvar, >sc_intr_lock);
+		DPRINTF("%s: wake up %d\n", __func__, err);
+		if (error)
+			return error;
+	}
+	blksize = uimin(maxblksize, sc->sc_buflen);
 
 	pb->pb_ptr = (sc->sc_audiobuf + sc->sc_rpos);
 	if (sc->sc_rpos + blksize < PAD_BUFSIZE) {
@@ -453,35 +470,21 @@ pad_read(struct pad_softc *sc, off_t *of
 int ioflag)
 {
 	pad_block_t pb;
-	int len;
 	int err;
 
 	err = 0;
 	DPRINTF("%s: resid=%zu\n", __func__, uio->uio_resid);
-	while (uio->uio_resid > 0 && !err) {
+	while (uio->uio_resid > 0) {
 		mutex_enter(>sc_intr_lock);
-		if (sc->sc_buflen == 0) {
-			DPRINTF("%s: wait\n", __func__);
-			err = cv_wait_sig(>sc_condvar, >sc_intr_lock);
-			DPRINTF("%s: wake up %d\n", __func__, err);
-			mutex_exit(>sc_intr_lock);
-			if (err) {
-if (err == ERESTART)
-	err = EINTR;
-break;
-			}
-			if (sc->sc_buflen == 0)
-break;
-			continue;
-		}
-
-		len = uimin(uio->uio_resid, sc->sc_buflen);
-		err = pad_get_block(sc, , len);
+		err = pad_get_block(sc, , uio->uio_resid);
 		mutex_exit(>sc_intr_lock);
 		if (err)
 			break;
+
 		DPRINTF("%s: move %d\n", __func__, pb.pb_len);
-		uiomove(pb.pb_ptr, pb.pb_len, uio);
+		err = uiomove(pb.pb_ptr, pb.pb_len, uio);
+		if (err)
+			break;
 	}
 
 	return err;
@@ -534,7 +537,6 @@ pad_start_output(void *opaque, void *blo
 
 	DPRINTF("%s: blksize=%d\n", __func__, blksize);
 	err = pad_add_block(sc, block, blksize);
-	cv_broadcast(>sc_condvar);
 
 	ms = blksize * 1000 / PADCHAN / (PADPREC / NBBY) / PADFREQ;
 	DPRINTF("%s: callout ms=%d\n", __func__, ms);
@@ -557,7 +559,6 @@ pad_halt_output(void *opaque)
 	sc->sc_intrarg = NULL;
 	sc->sc_buflen = 0;
 	sc->sc_rpos = sc->sc_wpos = 0;
-	cv_broadcast(>sc_condvar);
 
 	return 0;
 }



CVS commit: src/sys/dev/pad

2021-06-14 Thread Taylor R Campbell
Module Name:src
Committed By:   riastradh
Date:   Mon Jun 14 10:21:21 UTC 2021

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
pad(4): Destroy the callout when done.

Should not be possible for it to be pending or firing at this point,
because we have detached the audio(4) child and so it should have
halted output.


To generate a diff of this commit:
cvs rdiff -u -r1.71 -r1.72 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.71 src/sys/dev/pad/pad.c:1.72
--- src/sys/dev/pad/pad.c:1.71	Mon Jun 14 10:14:58 2021
+++ src/sys/dev/pad/pad.c	Mon Jun 14 10:21:21 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.71 2021/06/14 10:14:58 riastradh Exp $ */
+/* $NetBSD: pad.c,v 1.72 2021/06/14 10:21:21 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.71 2021/06/14 10:14:58 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.72 2021/06/14 10:21:21 riastradh Exp $");
 
 #include 
 #include 
@@ -258,6 +258,7 @@ pad_detach(device_t self, int flags)
 
 	pmf_device_deregister(sc->sc_dev);
 
+	callout_destroy(>sc_pcallout);
 	mutex_destroy(>sc_lock);
 	mutex_destroy(>sc_intr_lock);
 	cv_destroy(>sc_condvar);



CVS commit: src/sys/dev/pad

2021-06-14 Thread Taylor R Campbell
Module Name:src
Committed By:   riastradh
Date:   Mon Jun 14 10:14:58 UTC 2021

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
pad(4): Make this exclusively a cloning device.

padN numbering never corresponded with audioM numbering except by
accident, so the non-cloning device never worked reliably for
scripting.  This simplifies the logic substantially.

While here, fix drvctl detach race.


To generate a diff of this commit:
cvs rdiff -u -r1.70 -r1.71 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.70 src/sys/dev/pad/pad.c:1.71
--- src/sys/dev/pad/pad.c:1.70	Mon Jun 14 10:14:46 2021
+++ src/sys/dev/pad/pad.c	Mon Jun 14 10:14:58 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.70 2021/06/14 10:14:46 riastradh Exp $ */
+/* $NetBSD: pad.c,v 1.71 2021/06/14 10:14:58 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.70 2021/06/14 10:14:46 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.71 2021/06/14 10:14:58 riastradh Exp $");
 
 #include 
 #include 
@@ -54,6 +54,8 @@ __KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.70
 
 #include 
 
+#include "ioconf.h"
+
 /* #define PAD_DEBUG */
 #ifdef PAD_DEBUG
 #define DPRINTF(fmt...)	printf(fmt)
@@ -61,17 +63,10 @@ __KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.70
 #define DPRINTF(fmt...) /**/
 #endif
 
-#define MAXDEVS		128
-#define PADCLONER	254
-#define PADUNIT(x)	minor(x)
-
 #define PADFREQ		44100
 #define PADCHAN		2
 #define PADPREC		16
 
-extern struct cfdriver pad_cd;
-kmutex_t padconfig;
-
 typedef struct pad_block {
 	uint8_t		*pb_ptr;
 	int		pb_len;
@@ -107,7 +102,7 @@ static void	pad_get_locks(void *, kmutex
 static void	pad_done_output(void *);
 static void	pad_swvol_codec(audio_filter_arg_t *);
 
-static int	pad_close(struct pad_softc *);
+static void	pad_close(struct pad_softc *);
 static int	pad_read(struct pad_softc *, off_t *, struct uio *,
 		kauth_cred_t, int);
 
@@ -155,14 +150,12 @@ extern void	padattach(int);
 static int	pad_add_block(struct pad_softc *, uint8_t *, int);
 static int	pad_get_block(struct pad_softc *, pad_block_t *, int);
 
-dev_type_open(cdev_pad_open);
-dev_type_close(cdev_pad_close);
-dev_type_read(cdev_pad_read);
+static dev_type_open(pad_open);
 
 const struct cdevsw pad_cdevsw = {
-	.d_open		= cdev_pad_open,
-	.d_close	= cdev_pad_close,
-	.d_read		= cdev_pad_read,
+	.d_open		= pad_open,
+	.d_close	= noclose,
+	.d_read		= noread,
 	.d_write	= nowrite,
 	.d_ioctl	= noioctl,
 	.d_stop		= nostop,
@@ -204,9 +197,6 @@ padattach(int n)
 		config_cfdriver_detach(_cd);
 		return;
 	}
-	mutex_init(, MUTEX_DEFAULT, IPL_NONE);
-
-	return;
 }
 
 static int
@@ -221,6 +211,8 @@ pad_attach(device_t parent, device_t sel
 {
 	struct pad_softc *sc = device_private(self);
 
+	KASSERT(KERNEL_LOCKED_P());
+
 	aprint_normal_dev(self, "outputs: 44100Hz, 16-bit, stereo\n");
 
 	sc->sc_dev = self;
@@ -239,6 +231,8 @@ pad_attach(device_t parent, device_t sel
 	if (!pmf_device_register(sc->sc_dev, NULL, NULL))
 		aprint_error_dev(sc->sc_dev,
 		"couldn't establish power handler\n");
+
+	sc->sc_open = 1;
 }
 
 static int
@@ -248,6 +242,12 @@ pad_detach(device_t self, int flags)
 	int cmaj, mn;
 	int error;
 
+	KASSERT(KERNEL_LOCKED_P());
+
+	/* Prevent detach without going through close -- e.g., drvctl.  */
+	if (sc->sc_open)
+		return EBUSY;
+
 	error = config_detach_children(self, flags);
 	if (error)
 		return error;
@@ -320,85 +320,61 @@ pad_get_block(struct pad_softc *sc, pad_
 	return 0;
 }
 
-int
-cdev_pad_open(dev_t dev, int flags, int fmt, struct lwp *l)
+static int
+pad_open(dev_t dev, int flags, int fmt, struct lwp *l)
 {
-	struct pad_softc *sc;
-	struct file *fp;
-	device_t paddev;
-	cfdata_t cf;
-	int error, fd, i;
-
-	error = 0;
-
-	mutex_enter();
-	if (PADUNIT(dev) == PADCLONER) {
-		for (i = 0; i < MAXDEVS; i++) {
-			if (device_lookup(_cd, i) == NULL)
-break;
-		}
-		if (i == MAXDEVS)
-			goto bad;
-	} else {
-		if (PADUNIT(dev) >= MAXDEVS)
-			goto bad;
-		i = PADUNIT(dev);
-	}
+	struct file *fp = NULL;
+	device_t self;
+	struct pad_softc *sc = NULL;
+	cfdata_t cf = NULL;
+	int error, fd;
+
+	error = fd_allocfile(, );
+	if (error)
+		goto out;
 
-	cf = kmem_alloc(sizeof(struct cfdata), KM_SLEEP);
+	cf = kmem_alloc(sizeof(*cf), KM_SLEEP);
 	cf->cf_name = pad_cd.cd_name;
 	cf->cf_atname = pad_cd.cd_name;
-	cf->cf_unit = i;
+	cf->cf_unit = 0;
 	cf->cf_fstate = FSTATE_STAR;
 
-	bool existing = false;
-	paddev = device_lookup(_cd, minor(dev));
-	if (paddev == NULL)
-		paddev = config_attach_pseudo(cf);
-	else
-		existing = true;
-	if (paddev == NULL)
-		goto bad;
-
-	sc = device_private(paddev);
-	if (sc == NULL)
-		goto bad;
-
-	if (sc->sc_open == 1) {
-		mutex_exit();
-		return EBUSY;
-	}
-
-	if (PADUNIT(dev) == PADCLONER) {
-		error = fd_allocfile(, );
-		if 

CVS commit: src/sys/dev/pad

2021-06-14 Thread Taylor R Campbell
Module Name:src
Committed By:   riastradh
Date:   Mon Jun 14 10:14:46 UTC 2021

Modified Files:
src/sys/dev/pad: pad.c padvar.h

Log Message:
pad(4): Sort includes.  Add missing includes to padvar.h.


To generate a diff of this commit:
cvs rdiff -u -r1.69 -r1.70 src/sys/dev/pad/pad.c
cvs rdiff -u -r1.14 -r1.15 src/sys/dev/pad/padvar.h

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

Modified files:

Index: src/sys/dev/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.69 src/sys/dev/pad/pad.c:1.70
--- src/sys/dev/pad/pad.c:1.69	Mon Jun 14 10:14:01 2021
+++ src/sys/dev/pad/pad.c	Mon Jun 14 10:14:46 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.69 2021/06/14 10:14:01 riastradh Exp $ */
+/* $NetBSD: pad.c,v 1.70 2021/06/14 10:14:46 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,26 +27,27 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.69 2021/06/14 10:14:01 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.70 2021/06/14 10:14:46 riastradh Exp $");
 
-#include 
 #include 
-#include 
+#include 
+
+#include 
 #include 
+#include 
+#include 
+#include 
 #include 
 #include 
-#include 
 #include 
-#include 
 #include 
-#include 
+#include 
+#include 
 #include 
 #include 
-#include 
 #include 
 #include 
-#include 
-#include 
+#include 
 
 #include 
 #include 

Index: src/sys/dev/pad/padvar.h
diff -u src/sys/dev/pad/padvar.h:1.14 src/sys/dev/pad/padvar.h:1.15
--- src/sys/dev/pad/padvar.h:1.14	Mon Jun 14 10:14:01 2021
+++ src/sys/dev/pad/padvar.h	Mon Jun 14 10:14:46 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: padvar.h,v 1.14 2021/06/14 10:14:01 riastradh Exp $ */
+/* $NetBSD: padvar.h,v 1.15 2021/06/14 10:14:46 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -29,6 +29,13 @@
 #ifndef _SYS_DEV_PAD_PADVAR_H
 #define _SYS_DEV_PAD_PADVAR_H
 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+
 struct pad_softc {
 	device_t	sc_dev;
 



CVS commit: src/sys/dev/pad

2021-06-14 Thread Taylor R Campbell
Module Name:src
Committed By:   riastradh
Date:   Mon Jun 14 10:14:01 UTC 2021

Modified Files:
src/sys/dev/pad: pad.c padvar.h

Log Message:
pad(4): Fix some locking.

- No need for sc_cond_lock.
- Issue cv_broadcast under the correct lock.
- Use callout_halt, not haphazard callout_stop.
- IPL_SOFTCLOCK for a mutex taken from a callout.


To generate a diff of this commit:
cvs rdiff -u -r1.68 -r1.69 src/sys/dev/pad/pad.c
cvs rdiff -u -r1.13 -r1.14 src/sys/dev/pad/padvar.h

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

Modified files:

Index: src/sys/dev/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.68 src/sys/dev/pad/pad.c:1.69
--- src/sys/dev/pad/pad.c:1.68	Mon Jun 14 00:21:09 2021
+++ src/sys/dev/pad/pad.c	Mon Jun 14 10:14:01 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.68 2021/06/14 00:21:09 riastradh Exp $ */
+/* $NetBSD: pad.c,v 1.69 2021/06/14 10:14:01 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.68 2021/06/14 00:21:09 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.69 2021/06/14 10:14:01 riastradh Exp $");
 
 #include 
 #include 
@@ -223,13 +223,12 @@ pad_attach(device_t parent, device_t sel
 	aprint_normal_dev(self, "outputs: 44100Hz, 16-bit, stereo\n");
 
 	sc->sc_dev = self;
-	sc->sc_dying = false;
 
 	cv_init(>sc_condvar, device_xname(sc->sc_dev));
-	mutex_init(>sc_cond_lock, MUTEX_DEFAULT, IPL_NONE);
 	mutex_init(>sc_lock, MUTEX_DEFAULT, IPL_NONE);
-	mutex_init(>sc_intr_lock, MUTEX_DEFAULT, IPL_NONE);
-	callout_init(>sc_pcallout, 0/*XXX?*/);
+	mutex_init(>sc_intr_lock, MUTEX_DEFAULT, IPL_SOFTCLOCK);
+	callout_init(>sc_pcallout, CALLOUT_MPSAFE);
+	callout_setfunc(>sc_pcallout, pad_done_output, sc);
 
 	sc->sc_swvol = 255;
 	sc->sc_buflen = 0;
@@ -258,7 +257,6 @@ pad_detach(device_t self, int flags)
 
 	pmf_device_deregister(sc->sc_dev);
 
-	mutex_destroy(>sc_cond_lock);
 	mutex_destroy(>sc_lock);
 	mutex_destroy(>sc_intr_lock);
 	cv_destroy(>sc_condvar);
@@ -514,12 +512,12 @@ pad_read(struct pad_softc *sc, off_t *of
 	err = 0;
 	DPRINTF("%s: resid=%zu\n", __func__, uio->uio_resid);
 	while (uio->uio_resid > 0 && !err) {
-		mutex_enter(>sc_cond_lock);
+		mutex_enter(>sc_intr_lock);
 		if (sc->sc_buflen == 0) {
 			DPRINTF("%s: wait\n", __func__);
-			err = cv_wait_sig(>sc_condvar, >sc_cond_lock);
+			err = cv_wait_sig(>sc_condvar, >sc_intr_lock);
 			DPRINTF("%s: wake up %d\n", __func__, err);
-			mutex_exit(>sc_cond_lock);
+			mutex_exit(>sc_intr_lock);
 			if (err) {
 if (err == ERESTART)
 	err = EINTR;
@@ -532,7 +530,7 @@ pad_read(struct pad_softc *sc, off_t *of
 
 		len = uimin(uio->uio_resid, sc->sc_buflen);
 		err = pad_get_block(sc, , len);
-		mutex_exit(>sc_cond_lock);
+		mutex_exit(>sc_intr_lock);
 		if (err)
 			break;
 		DPRINTF("%s: move %d\n", __func__, pb.pb_len);
@@ -562,9 +560,7 @@ pad_set_format(void *opaque, int setmode
 const audio_params_t *play, const audio_params_t *rec,
 audio_filter_reg_t *pfil, audio_filter_reg_t *rfil)
 {
-	struct pad_softc *sc;
-
-	sc = (struct pad_softc *)opaque;
+	struct pad_softc *sc = opaque;
 
 	KASSERT(mutex_owned(>sc_lock));
 
@@ -579,12 +575,10 @@ static int
 pad_start_output(void *opaque, void *block, int blksize,
 void (*intr)(void *), void *intrarg)
 {
-	struct pad_softc *sc;
+	struct pad_softc *sc = opaque;
 	int err;
 	int ms;
 
-	sc = (struct pad_softc *)opaque;
-
 	KASSERT(mutex_owned(>sc_intr_lock));
 
 	sc->sc_intr = intr;
@@ -592,14 +586,12 @@ pad_start_output(void *opaque, void *blo
 	sc->sc_blksize = blksize;
 
 	DPRINTF("%s: blksize=%d\n", __func__, blksize);
-	mutex_enter(>sc_cond_lock);
 	err = pad_add_block(sc, block, blksize);
-	mutex_exit(>sc_cond_lock);
 	cv_broadcast(>sc_condvar);
 
 	ms = blksize * 1000 / PADCHAN / (PADPREC / NBBY) / PADFREQ;
 	DPRINTF("%s: callout ms=%d\n", __func__, ms);
-	callout_reset(>sc_pcallout, mstohz(ms), pad_done_output, sc);
+	callout_schedule(>sc_pcallout, mstohz(ms));
 
 	return err;
 }
@@ -607,19 +599,18 @@ pad_start_output(void *opaque, void *blo
 static int
 pad_halt_output(void *opaque)
 {
-	struct pad_softc *sc;
-
-	sc = (struct pad_softc *)opaque;
+	struct pad_softc *sc = opaque;
 
 	DPRINTF("%s\n", __func__);
 	KASSERT(mutex_owned(>sc_intr_lock));
 
-	cv_broadcast(>sc_condvar);
-	callout_stop(>sc_pcallout);
+	callout_halt(>sc_pcallout, >sc_intr_lock);
+
 	sc->sc_intr = NULL;
 	sc->sc_intrarg = NULL;
 	sc->sc_buflen = 0;
 	sc->sc_rpos = sc->sc_wpos = 0;
+	cv_broadcast(>sc_condvar);
 
 	return 0;
 }
@@ -627,11 +618,9 @@ pad_halt_output(void *opaque)
 static void
 pad_done_output(void *arg)
 {
-	struct pad_softc *sc;
+	struct pad_softc *sc = arg;
 
 	DPRINTF("%s\n", __func__);
-	sc = (struct pad_softc *)arg;
-	callout_stop(>sc_pcallout);
 
 	mutex_enter(>sc_intr_lock);
 	(*sc->sc_intr)(sc->sc_intrarg);
@@ -652,9 +641,7 @@ pad_getdev(void *opaque, struct audio_de
 static int
 

CVS commit: src/sys/dev/pad

2021-06-13 Thread Taylor R Campbell
Module Name:src
Committed By:   riastradh
Date:   Mon Jun 14 00:21:09 UTC 2021

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
pad(4): Some incomplete tidying.

- Put pseudo-device softc setup/teardown back in pad_attach/detach,
  not in the cdev/fops operations which are about file descriptors.
- Remove unnecessary sc_dying flag.
- Omit needless config_deactivate(sc->sc_audiodev); the only effect
  of this is already done by config_detach anyway, which is done in
  the same context.
- Issue config_detach_children and free softc stuff in the right
  order.
- Omit needless `if (sc == NULL) return ENXIO'.

Survives eight parallel t_mixerctl tests many times over on an
8-thread/4-core machine.

XXX TODO:
- Remove padconfig; it is not appropriate to hold a mutex over
  sleeping allocation or autoconf config_attach operations.  This
  should be done another way.
- Fix agreement of sc_condvar with locks: is it sc_cond_lock or
  sc_intr_lock?  Can't be both; unclear why both exist.
- Determine whether both cdev and fops are really needed -- it is
  confusing to have two types of paths into all this logic, and it
  seems to me only one of them should be necessary.


To generate a diff of this commit:
cvs rdiff -u -r1.67 -r1.68 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.67 src/sys/dev/pad/pad.c:1.68
--- src/sys/dev/pad/pad.c:1.67	Sun Jun 13 23:09:22 2021
+++ src/sys/dev/pad/pad.c	Mon Jun 14 00:21:09 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.67 2021/06/13 23:09:22 riastradh Exp $ */
+/* $NetBSD: pad.c,v 1.68 2021/06/14 00:21:09 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.67 2021/06/13 23:09:22 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.68 2021/06/14 00:21:09 riastradh Exp $");
 
 #include 
 #include 
@@ -218,21 +218,50 @@ pad_match(device_t parent, cfdata_t data
 static void
 pad_attach(device_t parent, device_t self, void *opaque)
 {
+	struct pad_softc *sc = device_private(self);
 
 	aprint_normal_dev(self, "outputs: 44100Hz, 16-bit, stereo\n");
+
+	sc->sc_dev = self;
+	sc->sc_dying = false;
+
+	cv_init(>sc_condvar, device_xname(sc->sc_dev));
+	mutex_init(>sc_cond_lock, MUTEX_DEFAULT, IPL_NONE);
+	mutex_init(>sc_lock, MUTEX_DEFAULT, IPL_NONE);
+	mutex_init(>sc_intr_lock, MUTEX_DEFAULT, IPL_NONE);
+	callout_init(>sc_pcallout, 0/*XXX?*/);
+
+	sc->sc_swvol = 255;
+	sc->sc_buflen = 0;
+	sc->sc_rpos = sc->sc_wpos = 0;
+	sc->sc_audiodev = audio_attach_mi(_hw_if, sc, sc->sc_dev);
+
+	if (!pmf_device_register(sc->sc_dev, NULL, NULL))
+		aprint_error_dev(sc->sc_dev,
+		"couldn't establish power handler\n");
 }
 
 static int
 pad_detach(device_t self, int flags)
 {
-	struct pad_softc *sc;
+	struct pad_softc *sc = device_private(self);
 	int cmaj, mn;
+	int error;
+
+	error = config_detach_children(self, flags);
+	if (error)
+		return error;
 
-	sc = device_private(self);
 	cmaj = cdevsw_lookup_major(_cdevsw);
 	mn = device_unit(sc->sc_dev);
-	if (!sc->sc_dying)
-		vdevgone(cmaj, mn, mn, VCHR);
+	vdevgone(cmaj, mn, mn, VCHR);
+
+	pmf_device_deregister(sc->sc_dev);
+
+	mutex_destroy(>sc_cond_lock);
+	mutex_destroy(>sc_lock);
+	mutex_destroy(>sc_intr_lock);
+	cv_destroy(>sc_condvar);
 
 	return 0;
 }
@@ -242,7 +271,8 @@ pad_childdet(device_t self, device_t chi
 {
 	struct pad_softc *sc = device_private(self);
 
-	sc->sc_audiodev = NULL;
+	if (child == sc->sc_audiodev)
+		sc->sc_audiodev = NULL;
 }
 
 static int
@@ -340,40 +370,17 @@ cdev_pad_open(dev_t dev, int flags, int 
 		return EBUSY;
 	}
 
-	sc->sc_dev = paddev;
-	sc->sc_dying = false;
-
 	if (PADUNIT(dev) == PADCLONER) {
 		error = fd_allocfile(, );
 		if (error) {
 			if (existing == false)
-config_detach(sc->sc_dev, 0);
+config_detach(paddev, 0);
 			mutex_exit();
 			return error;
 		}
-	}
-
-	cv_init(>sc_condvar, device_xname(sc->sc_dev));
-	mutex_init(>sc_cond_lock, MUTEX_DEFAULT, IPL_NONE);
-	mutex_init(>sc_lock, MUTEX_DEFAULT, IPL_NONE);
-	mutex_init(>sc_intr_lock, MUTEX_DEFAULT, IPL_NONE);
-	callout_init(>sc_pcallout, 0/*XXX?*/);
-
-	sc->sc_swvol = 255;
-	sc->sc_buflen = 0;
-	sc->sc_rpos = sc->sc_wpos = 0;
-	KERNEL_LOCK(1, NULL);
-	sc->sc_audiodev = audio_attach_mi(_hw_if, sc, sc->sc_dev);
-	KERNEL_UNLOCK_ONE(NULL);
-
-	if (!pmf_device_register(sc->sc_dev, NULL, NULL))
-		aprint_error_dev(sc->sc_dev,
-		"couldn't establish power handler\n");
-
-	if (PADUNIT(dev) == PADCLONER) {
 		error = fd_clone(fp, fd, flags, _fileops, sc);
 		KASSERT(error == EMOVEFD);
-	}	
+	}
 	sc->sc_open = 1;
 	mutex_exit();
 
@@ -386,65 +393,42 @@ bad:
 static int
 pad_close(struct pad_softc *sc)
 {
-	int rc;
-
-	if (sc == NULL)
-		return ENXIO;
-
-	mutex_enter();
-	config_deactivate(sc->sc_audiodev);
-	
-	/* Start draining existing accessors of the device. */
-	if 

CVS commit: src/sys/dev/pad

2021-06-13 Thread Taylor R Campbell
Module Name:src
Committed By:   riastradh
Date:   Sun Jun 13 23:09:23 UTC 2021

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
pad(4): Take kernel lock around autoconf stuff.

This is not really enough -- the padconfig locking logic violates
rules about sleeping while holding locks, might be deadlocky, and may
also be racy.  But, it'll serve to make progress.


To generate a diff of this commit:
cvs rdiff -u -r1.66 -r1.67 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.66 src/sys/dev/pad/pad.c:1.67
--- src/sys/dev/pad/pad.c:1.66	Tue Jun  8 09:09:28 2021
+++ src/sys/dev/pad/pad.c	Sun Jun 13 23:09:22 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.66 2021/06/08 09:09:28 nia Exp $ */
+/* $NetBSD: pad.c,v 1.67 2021/06/13 23:09:22 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.66 2021/06/08 09:09:28 nia Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.67 2021/06/13 23:09:22 riastradh Exp $");
 
 #include 
 #include 
@@ -362,7 +362,9 @@ cdev_pad_open(dev_t dev, int flags, int 
 	sc->sc_swvol = 255;
 	sc->sc_buflen = 0;
 	sc->sc_rpos = sc->sc_wpos = 0;
+	KERNEL_LOCK(1, NULL);
 	sc->sc_audiodev = audio_attach_mi(_hw_if, sc, sc->sc_dev);
+	KERNEL_UNLOCK_ONE(NULL);
 
 	if (!pmf_device_register(sc->sc_dev, NULL, NULL))
 		aprint_error_dev(sc->sc_dev,



CVS commit: src/sys/dev/pad

2021-06-08 Thread Nia Alarie
Module Name:src
Committed By:   nia
Date:   Tue Jun  8 09:09:29 UTC 2021

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
pad(4): run the callout if the buffer is saturated instead of returning

reverts to the same behavior as in -8 and -9. prevents immediate failures
and device timeouts if there's a slight delay in the buffer being
consumed.

this is reproducible with the example in the man page that uses
ffmpeg to record the output of audioplay:

$ ffmpeg -f s16le -ar 44100 -ac 2 -i /dev/pad0 output.wav
$ audioplay -d /dev/audio1 input.wav

if output.wav already exists, ffmpeg will prompt for confirmation
to overwrite as soon as audioplay starts, causing a noticable delay,
followed by a write failure that causes audioplay to immediately
exit.


To generate a diff of this commit:
cvs rdiff -u -r1.65 -r1.66 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.65 src/sys/dev/pad/pad.c:1.66
--- src/sys/dev/pad/pad.c:1.65	Sun Feb 23 04:02:46 2020
+++ src/sys/dev/pad/pad.c	Tue Jun  8 09:09:28 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.65 2020/02/23 04:02:46 isaki Exp $ */
+/* $NetBSD: pad.c,v 1.66 2021/06/08 09:09:28 nia Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.65 2020/02/23 04:02:46 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.66 2021/06/08 09:09:28 nia Exp $");
 
 #include 
 #include 
@@ -622,14 +622,12 @@ pad_start_output(void *opaque, void *blo
 	err = pad_add_block(sc, block, blksize);
 	mutex_exit(>sc_cond_lock);
 	cv_broadcast(>sc_condvar);
-	if (err)
-		return err;
 
 	ms = blksize * 1000 / PADCHAN / (PADPREC / NBBY) / PADFREQ;
 	DPRINTF("%s: callout ms=%d\n", __func__, ms);
 	callout_reset(>sc_pcallout, mstohz(ms), pad_done_output, sc);
 
-	return 0;
+	return err;
 }
 
 static int



CVS commit: src/sys/dev/pad

2018-09-25 Thread Takeshi Nakayama
Module Name:src
Committed By:   nakayama
Date:   Tue Sep 25 06:55:23 UTC 2018

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
pad(4) mixer has only 1 channel, so return EINVAL in the case other than 1.

This fixes the following strange output of mixerctl(1):

outputs.master=255,0
inputs.dac=255,0


To generate a diff of this commit:
cvs rdiff -u -r1.57 -r1.58 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.57 src/sys/dev/pad/pad.c:1.58
--- src/sys/dev/pad/pad.c:1.57	Tue Sep 25 06:53:49 2018
+++ src/sys/dev/pad/pad.c	Tue Sep 25 06:55:23 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.57 2018/09/25 06:53:49 nakayama Exp $ */
+/* $NetBSD: pad.c,v 1.58 2018/09/25 06:55:23 nakayama Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.57 2018/09/25 06:53:49 nakayama Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.58 2018/09/25 06:55:23 nakayama Exp $");
 
 #include 
 #include 
@@ -781,6 +781,8 @@ pad_set_port(void *opaque, mixer_ctrl_t 
 	switch (mc->dev) {
 	case PAD_OUTPUT_MASTER_VOLUME:
 	case PAD_INPUT_DAC_VOLUME:
+		if (mc->un.value.num_channels != 1)
+			return EINVAL;
 		sc->sc_swvol = mc->un.value.level[AUDIO_MIXER_LEVEL_MONO];
 		return 0;
 	}
@@ -800,6 +802,8 @@ pad_get_port(void *opaque, mixer_ctrl_t 
 	switch (mc->dev) {
 	case PAD_OUTPUT_MASTER_VOLUME:
 	case PAD_INPUT_DAC_VOLUME:
+		if (mc->un.value.num_channels != 1)
+			return EINVAL;
 		mc->un.value.level[AUDIO_MIXER_LEVEL_MONO] = sc->sc_swvol;
 		return 0;
 	}



CVS commit: src/sys/dev/pad

2018-09-25 Thread Takeshi Nakayama
Module Name:src
Committed By:   nakayama
Date:   Tue Sep 25 06:53:49 UTC 2018

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
Revert to rev.1.53.
I accidentally committed the netbsd-8 branch file in rev.1.54.


To generate a diff of this commit:
cvs rdiff -u -r1.56 -r1.57 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.56 src/sys/dev/pad/pad.c:1.57
--- src/sys/dev/pad/pad.c:1.56	Sun Sep 23 23:34:45 2018
+++ src/sys/dev/pad/pad.c	Tue Sep 25 06:53:49 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.56 2018/09/23 23:34:45 kre Exp $ */
+/* $NetBSD: pad.c,v 1.57 2018/09/25 06:53:49 nakayama Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,18 +27,23 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.56 2018/09/23 23:34:45 kre Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.57 2018/09/25 06:53:49 nakayama Exp $");
 
 #include 
 #include 
 #include 
 #include 
+#include 
+#include 
+#include 
+#include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -52,9 +57,17 @@ __KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.56
 
 #include 
 
+#define MAXDEVS		128
+#define PADCLONER	254
 #define PADUNIT(x)	minor(x)
 
+#define PADFREQ		44100
+#define PADCHAN		2
+#define PADPREC		16
+#define PADENC		AUDIO_ENCODING_SLINEAR_LE
+
 extern struct cfdriver pad_cd;
+kmutex_t padconfig;
 
 typedef struct pad_block {
 	uint8_t		*pb_ptr;
@@ -99,7 +112,18 @@ static stream_filter_t *pad_swvol_filter
 const audio_params_t *, const audio_params_t *);
 static void	pad_swvol_dtor(stream_filter_t *);
 
-static bool	pad_is_attached;	/* Do we have an audio* child? */
+static int pad_close(struct pad_softc *);
+static int pad_read(struct pad_softc *, off_t *, struct uio *, kauth_cred_t, int);
+
+static int fops_pad_close(struct file *);
+static int fops_pad_read(struct file *, off_t *, struct uio *, kauth_cred_t, int);
+static int pad_write(struct file *, off_t *, struct uio *, kauth_cred_t, int);
+static int pad_ioctl(struct file *, u_long, void *);
+static int pad_kqfilter(struct file *, struct knote *);
+static int pad_poll(struct file *, int);
+static int pad_stat(struct file *, struct stat *);
+static int pad_mmap(struct file *, off_t *, size_t, int, int *, int *,
+			   struct uvm_object **, int *);
 
 static const struct audio_hw_if pad_hw_if = {
 	.open = pad_audio_open,
@@ -120,8 +144,8 @@ static const struct audio_hw_if pad_hw_i
 
 #define PAD_NFORMATS	1
 static const struct audio_format pad_formats[PAD_NFORMATS] = {
-	{ NULL, AUMODE_PLAY|AUMODE_RECORD, AUDIO_ENCODING_SLINEAR_LE, 16, 16,
-	  2, AUFMT_STEREO, 1, { 44100 } },
+	{ NULL, AUMODE_PLAY|AUMODE_RECORD, PADENC, PADPREC, PADPREC,
+	  PADCHAN, AUFMT_STEREO, 1, { PADFREQ } },
 };
 
 extern void	padattach(int);
@@ -130,13 +154,13 @@ static int	pad_add_block(pad_softc_t *, 
 static int	pad_get_block(pad_softc_t *, pad_block_t *, int);
 
 dev_type_open(pad_open);
-dev_type_close(pad_close);
-dev_type_read(pad_read);
+dev_type_close(cdev_pad_close);
+dev_type_read(cdev_pad_read);
 
 const struct cdevsw pad_cdevsw = {
 	.d_open = pad_open,
-	.d_close = pad_close,
-	.d_read = pad_read,
+	.d_close = cdev_pad_close,
+	.d_read = cdev_pad_read,
 	.d_write = nowrite,
 	.d_ioctl = noioctl,
 	.d_stop = nostop,
@@ -148,34 +172,36 @@ const struct cdevsw pad_cdevsw = {
 	.d_flag = D_OTHER | D_MPSAFE,
 };
 
+const struct fileops pad_fileops = {
+	.fo_name = "pad",
+	.fo_read = fops_pad_read,
+	.fo_write = pad_write,
+	.fo_ioctl = pad_ioctl,
+	.fo_fcntl = fnullop_fcntl,
+	.fo_stat = pad_stat,
+	.fo_poll = pad_poll,
+	.fo_close = fops_pad_close,
+	.fo_mmap = pad_mmap,
+	.fo_kqfilter = pad_kqfilter,
+	.fo_restart = fnullop_restart
+};
+
 CFATTACH_DECL2_NEW(pad, sizeof(pad_softc_t), pad_match, pad_attach, pad_detach,
 NULL, NULL, pad_childdet);
 
 void
 padattach(int n)
 {
-	int i, err;
-	cfdata_t cf;
+	int error;
 
-	aprint_debug("pad: requested %d units\n", n);
-
-	err = config_cfattach_attach(pad_cd.cd_name, _ca);
-	if (err) {
+	error = config_cfattach_attach(pad_cd.cd_name, _ca);
+	if (error) {
 		aprint_error("%s: couldn't register cfattach: %d\n",
-		pad_cd.cd_name, err);
+		pad_cd.cd_name, error);
 		config_cfdriver_detach(_cd);
 		return;
 	}
-
-	for (i = 0; i < n; i++) {
-		cf = kmem_alloc(sizeof(struct cfdata), KM_SLEEP);
-		cf->cf_name = pad_cd.cd_name;
-		cf->cf_atname = pad_cd.cd_name;
-		cf->cf_unit = i;
-		cf->cf_fstate = FSTATE_STAR;
-
-		(void)config_attach_pseudo(cf);
-	}
+	mutex_init(, MUTEX_DEFAULT, IPL_NONE);
 
 	return;
 }
@@ -218,7 +244,7 @@ pad_get_block(pad_softc_t *sc, pad_block
 	KASSERT(mutex_owned(>sc_lock));
 	KASSERT(pb != NULL);
 
-	if (sc->sc_buflen < blksize)
+	if (sc->sc_buflen < (uint)blksize)
 		return ERESTART;
 
 	pb->pb_ptr = (sc->sc_audiobuf + sc->sc_rpos);
@@ -253,51 +279,149 @@ 

CVS commit: src/sys/dev/pad

2018-09-23 Thread Robert Elz
Module Name:src
Committed By:   kre
Date:   Sun Sep 23 23:34:45 UTC 2018

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
Since we need an int paramater, and uio_resid is size_t cast it to int
to avoid warnings from the ever friendly compiler... (check that size if
in range was already made).


To generate a diff of this commit:
cvs rdiff -u -r1.55 -r1.56 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.55 src/sys/dev/pad/pad.c:1.56
--- src/sys/dev/pad/pad.c:1.55	Sun Sep 23 23:30:51 2018
+++ src/sys/dev/pad/pad.c	Sun Sep 23 23:34:45 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.55 2018/09/23 23:30:51 kre Exp $ */
+/* $NetBSD: pad.c,v 1.56 2018/09/23 23:34:45 kre Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.55 2018/09/23 23:30:51 kre Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.56 2018/09/23 23:34:45 kre Exp $");
 
 #include 
 #include 
@@ -387,8 +387,8 @@ pad_read(dev_t dev, struct uio *uio, int
 		if (sc->sc_bytes_count >= BYTESTOSLEEP)
 			sc->sc_bytes_count -= BYTESTOSLEEP;
 
-		err = pad_get_block(sc, ,
-		uio->uio_residuio_resid : PAD_BLKSIZE);
+		err = pad_get_block(sc, , uio->uio_resid < PAD_BLKSIZE ?
+(int)uio->uio_resid : PAD_BLKSIZE);
 		if (!err) {
 			getmicrotime(>sc_last);
 			sc->sc_bytes_count += pb.pb_len;



CVS commit: src/sys/dev/pad

2018-09-23 Thread Robert Elz
Module Name:src
Committed By:   kre
Date:   Sun Sep 23 23:30:51 UTC 2018

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
Open code min() so we don't need to find its prototype ...


To generate a diff of this commit:
cvs rdiff -u -r1.54 -r1.55 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.54 src/sys/dev/pad/pad.c:1.55
--- src/sys/dev/pad/pad.c:1.54	Sun Sep 23 21:18:30 2018
+++ src/sys/dev/pad/pad.c	Sun Sep 23 23:30:51 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.54 2018/09/23 21:18:30 nakayama Exp $ */
+/* $NetBSD: pad.c,v 1.55 2018/09/23 23:30:51 kre Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.54 2018/09/23 21:18:30 nakayama Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.55 2018/09/23 23:30:51 kre Exp $");
 
 #include 
 #include 
@@ -387,7 +387,8 @@ pad_read(dev_t dev, struct uio *uio, int
 		if (sc->sc_bytes_count >= BYTESTOSLEEP)
 			sc->sc_bytes_count -= BYTESTOSLEEP;
 
-		err = pad_get_block(sc, , min(uio->uio_resid, PAD_BLKSIZE));
+		err = pad_get_block(sc, ,
+		uio->uio_residuio_resid : PAD_BLKSIZE);
 		if (!err) {
 			getmicrotime(>sc_last);
 			sc->sc_bytes_count += pb.pb_len;



CVS commit: src/sys/dev/pad

2018-09-23 Thread Takeshi Nakayama
Module Name:src
Committed By:   nakayama
Date:   Sun Sep 23 21:18:30 UTC 2018

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
pad(4) mixer has only 1 channel, so return EINVAL in the case other than 1.

This fixes the following strange output of mixerctl(1):

outputs.master=255,0
inputs.dac=255,0


To generate a diff of this commit:
cvs rdiff -u -r1.53 -r1.54 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.53 src/sys/dev/pad/pad.c:1.54
--- src/sys/dev/pad/pad.c:1.53	Mon Sep  3 16:29:32 2018
+++ src/sys/dev/pad/pad.c	Sun Sep 23 21:18:30 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.53 2018/09/03 16:29:32 riastradh Exp $ */
+/* $NetBSD: pad.c,v 1.54 2018/09/23 21:18:30 nakayama Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,23 +27,18 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.53 2018/09/03 16:29:32 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.54 2018/09/23 21:18:30 nakayama Exp $");
 
 #include 
 #include 
 #include 
 #include 
-#include 
-#include 
-#include 
-#include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -57,17 +52,9 @@ __KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.53
 
 #include 
 
-#define MAXDEVS		128
-#define PADCLONER	254
 #define PADUNIT(x)	minor(x)
 
-#define PADFREQ		44100
-#define PADCHAN		2
-#define PADPREC		16
-#define PADENC		AUDIO_ENCODING_SLINEAR_LE
-
 extern struct cfdriver pad_cd;
-kmutex_t padconfig;
 
 typedef struct pad_block {
 	uint8_t		*pb_ptr;
@@ -112,18 +99,7 @@ static stream_filter_t *pad_swvol_filter
 const audio_params_t *, const audio_params_t *);
 static void	pad_swvol_dtor(stream_filter_t *);
 
-static int pad_close(struct pad_softc *);
-static int pad_read(struct pad_softc *, off_t *, struct uio *, kauth_cred_t, int);
-
-static int fops_pad_close(struct file *);
-static int fops_pad_read(struct file *, off_t *, struct uio *, kauth_cred_t, int);
-static int pad_write(struct file *, off_t *, struct uio *, kauth_cred_t, int);
-static int pad_ioctl(struct file *, u_long, void *);
-static int pad_kqfilter(struct file *, struct knote *);
-static int pad_poll(struct file *, int);
-static int pad_stat(struct file *, struct stat *);
-static int pad_mmap(struct file *, off_t *, size_t, int, int *, int *,
-			   struct uvm_object **, int *);
+static bool	pad_is_attached;	/* Do we have an audio* child? */
 
 static const struct audio_hw_if pad_hw_if = {
 	.open = pad_audio_open,
@@ -144,8 +120,8 @@ static const struct audio_hw_if pad_hw_i
 
 #define PAD_NFORMATS	1
 static const struct audio_format pad_formats[PAD_NFORMATS] = {
-	{ NULL, AUMODE_PLAY|AUMODE_RECORD, PADENC, PADPREC, PADPREC,
-	  PADCHAN, AUFMT_STEREO, 1, { PADFREQ } },
+	{ NULL, AUMODE_PLAY|AUMODE_RECORD, AUDIO_ENCODING_SLINEAR_LE, 16, 16,
+	  2, AUFMT_STEREO, 1, { 44100 } },
 };
 
 extern void	padattach(int);
@@ -154,13 +130,13 @@ static int	pad_add_block(pad_softc_t *, 
 static int	pad_get_block(pad_softc_t *, pad_block_t *, int);
 
 dev_type_open(pad_open);
-dev_type_close(cdev_pad_close);
-dev_type_read(cdev_pad_read);
+dev_type_close(pad_close);
+dev_type_read(pad_read);
 
 const struct cdevsw pad_cdevsw = {
 	.d_open = pad_open,
-	.d_close = cdev_pad_close,
-	.d_read = cdev_pad_read,
+	.d_close = pad_close,
+	.d_read = pad_read,
 	.d_write = nowrite,
 	.d_ioctl = noioctl,
 	.d_stop = nostop,
@@ -172,36 +148,34 @@ const struct cdevsw pad_cdevsw = {
 	.d_flag = D_OTHER | D_MPSAFE,
 };
 
-const struct fileops pad_fileops = {
-	.fo_name = "pad",
-	.fo_read = fops_pad_read,
-	.fo_write = pad_write,
-	.fo_ioctl = pad_ioctl,
-	.fo_fcntl = fnullop_fcntl,
-	.fo_stat = pad_stat,
-	.fo_poll = pad_poll,
-	.fo_close = fops_pad_close,
-	.fo_mmap = pad_mmap,
-	.fo_kqfilter = pad_kqfilter,
-	.fo_restart = fnullop_restart
-};
-
 CFATTACH_DECL2_NEW(pad, sizeof(pad_softc_t), pad_match, pad_attach, pad_detach,
 NULL, NULL, pad_childdet);
 
 void
 padattach(int n)
 {
-	int error;
+	int i, err;
+	cfdata_t cf;
 
-	error = config_cfattach_attach(pad_cd.cd_name, _ca);
-	if (error) {
+	aprint_debug("pad: requested %d units\n", n);
+
+	err = config_cfattach_attach(pad_cd.cd_name, _ca);
+	if (err) {
 		aprint_error("%s: couldn't register cfattach: %d\n",
-		pad_cd.cd_name, error);
+		pad_cd.cd_name, err);
 		config_cfdriver_detach(_cd);
 		return;
 	}
-	mutex_init(, MUTEX_DEFAULT, IPL_NONE);
+
+	for (i = 0; i < n; i++) {
+		cf = kmem_alloc(sizeof(struct cfdata), KM_SLEEP);
+		cf->cf_name = pad_cd.cd_name;
+		cf->cf_atname = pad_cd.cd_name;
+		cf->cf_unit = i;
+		cf->cf_fstate = FSTATE_STAR;
+
+		(void)config_attach_pseudo(cf);
+	}
 
 	return;
 }
@@ -244,7 +218,7 @@ pad_get_block(pad_softc_t *sc, pad_block
 	KASSERT(mutex_owned(>sc_lock));
 	KASSERT(pb != NULL);
 
-	if (sc->sc_buflen < (uint)blksize)
+	if 

CVS commit: src/sys/dev/pad

2018-01-26 Thread Paul Goyette
Module Name:src
Committed By:   pgoyette
Date:   Fri Jan 26 23:36:01 UTC 2018

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
Fix typo in previous.  mea culpa, mea culpa, mea maxima culpa


To generate a diff of this commit:
cvs rdiff -u -r1.51 -r1.52 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.51 src/sys/dev/pad/pad.c:1.52
--- src/sys/dev/pad/pad.c:1.51	Fri Jan 26 22:48:22 2018
+++ src/sys/dev/pad/pad.c	Fri Jan 26 23:36:01 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.51 2018/01/26 22:48:22 pgoyette Exp $ */
+/* $NetBSD: pad.c,v 1.52 2018/01/26 23:36:01 pgoyette Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.51 2018/01/26 22:48:22 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.52 2018/01/26 23:36:01 pgoyette Exp $");
 
 #include 
 #include 
@@ -308,7 +308,7 @@ pad_open(dev_t dev, int flags, int fmt, 
 	cfdata_t cf;
 	int error, fd, i;
 
-	erorr = 0;
+	error = 0;
 
 	mutex_enter();
 	if (PADUNIT(dev) == PADCLONER) {



CVS commit: src/sys/dev/pad

2018-01-26 Thread Paul Goyette
Module Name:src
Committed By:   pgoyette
Date:   Fri Jan 26 22:48:22 UTC 2018

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
Unitialized variable - CID/1428657


To generate a diff of this commit:
cvs rdiff -u -r1.50 -r1.51 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.50 src/sys/dev/pad/pad.c:1.51
--- src/sys/dev/pad/pad.c:1.50	Tue Jan  9 04:23:59 2018
+++ src/sys/dev/pad/pad.c	Fri Jan 26 22:48:22 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.50 2018/01/09 04:23:59 nat Exp $ */
+/* $NetBSD: pad.c,v 1.51 2018/01/26 22:48:22 pgoyette Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.50 2018/01/09 04:23:59 nat Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.51 2018/01/26 22:48:22 pgoyette Exp $");
 
 #include 
 #include 
@@ -308,6 +308,8 @@ pad_open(dev_t dev, int flags, int fmt, 
 	cfdata_t cf;
 	int error, fd, i;
 
+	erorr = 0;
+
 	mutex_enter();
 	if (PADUNIT(dev) == PADCLONER) {
 		for (i = 0; i < MAXDEVS; i++) {



CVS commit: src/sys/dev/pad

2018-01-08 Thread Nathanial Sloss
Module Name:src
Committed By:   nat
Date:   Tue Jan  9 04:23:59 UTC 2018

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
Fix pad on systems with many cores/cpus:

* Introduce a lock to serialize attach/detach of pad devices.
* Forcefully detach children of pad on close.
* Be more carefull in pad_open with regards to config_detach only
  if new instances of the pad device are created and fail to open.

Addresses PR kern/52889.

These changes were developed with and tested by pgoyette@.


To generate a diff of this commit:
cvs rdiff -u -r1.49 -r1.50 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.49 src/sys/dev/pad/pad.c:1.50
--- src/sys/dev/pad/pad.c:1.49	Sun Dec 17 21:57:11 2017
+++ src/sys/dev/pad/pad.c	Tue Jan  9 04:23:59 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.49 2017/12/17 21:57:11 pgoyette Exp $ */
+/* $NetBSD: pad.c,v 1.50 2018/01/09 04:23:59 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.49 2017/12/17 21:57:11 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.50 2018/01/09 04:23:59 nat Exp $");
 
 #include 
 #include 
@@ -67,6 +67,7 @@ __KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.49
 #define PADENC		AUDIO_ENCODING_SLINEAR_LE
 
 extern struct cfdriver pad_cd;
+kmutex_t padconfig;
 
 typedef struct pad_block {
 	uint8_t		*pb_ptr;
@@ -200,6 +201,7 @@ padattach(int n)
 		config_cfdriver_detach(_cd);
 		return;
 	}
+	mutex_init(, MUTEX_DEFAULT, IPL_NONE);
 
 	return;
 }
@@ -286,34 +288,13 @@ static int
 pad_detach(device_t self, int flags)
 {
 	pad_softc_t *sc;
-	int cmaj, mn, rc;
+	int cmaj, mn;
 
 	sc = device_private(self);
-	config_deactivate(sc->sc_audiodev);
-	
-	/* Start draining existing accessors of the device. */
-	if ((rc = config_detach_children(self, flags)) != 0)
-		return rc;
-
-	mutex_enter(>sc_lock);
-	sc->sc_dying = true;
-	cv_broadcast(>sc_condvar);
-	mutex_exit(>sc_lock);
-
-	KASSERT(sc->sc_open > 0);
-	sc->sc_open = 0;
-
 	cmaj = cdevsw_lookup_major(_cdevsw);
 	mn = device_unit(sc->sc_dev);
-	vdevgone(cmaj, mn, mn, VCHR);
-
-	pmf_device_deregister(sc->sc_dev);
-
-	mutex_destroy(>sc_lock);
-	mutex_destroy(>sc_intr_lock);
-	cv_destroy(>sc_condvar);
-
-	auconv_delete_encodings(sc->sc_encodings);
+	if (!sc->sc_dying)
+		vdevgone(cmaj, mn, mn, VCHR);
 
 	return 0;
 }
@@ -327,16 +308,17 @@ pad_open(dev_t dev, int flags, int fmt, 
 	cfdata_t cf;
 	int error, fd, i;
 
+	mutex_enter();
 	if (PADUNIT(dev) == PADCLONER) {
 		for (i = 0; i < MAXDEVS; i++) {
 			if (device_lookup(_cd, i) == NULL)
 break;
 		}
 		if (i == MAXDEVS)
-			return ENXIO;
+			goto bad;
 	} else {
 		if (PADUNIT(dev) >= MAXDEVS)
-			return ENXIO;
+			goto bad;
 		i = PADUNIT(dev);
 	}
 
@@ -346,18 +328,23 @@ pad_open(dev_t dev, int flags, int fmt, 
 	cf->cf_unit = i;
 	cf->cf_fstate = FSTATE_STAR;
 
+	bool existing = false;
 	paddev = device_lookup(_cd, minor(dev));
 	if (paddev == NULL)
 		paddev = config_attach_pseudo(cf);
+	else
+		existing = true;
 	if (paddev == NULL)
-		return ENXIO;
+		goto bad;
 
 	sc = device_private(paddev);
 	if (sc == NULL)
-		return ENXIO;
+		goto bad;
 
-	if (sc->sc_open == 1)
+	if (sc->sc_open == 1) {
+		mutex_exit();
 		return EBUSY;
+	}
 
 	sc->sc_dev = paddev;
 	sc->sc_dying = false;
@@ -365,7 +352,9 @@ pad_open(dev_t dev, int flags, int fmt, 
 	if (PADUNIT(dev) == PADCLONER) {
 		error = fd_allocfile(, );
 		if (error) {
-			config_detach(sc->sc_dev, 0);
+			if (existing == false)
+config_detach(sc->sc_dev, 0);
+			mutex_exit();
 			return error;
 		}
 	}
@@ -373,7 +362,9 @@ pad_open(dev_t dev, int flags, int fmt, 
 	if (auconv_create_encodings(pad_formats, PAD_NFORMATS,
 	>sc_encodings) != 0) {
 		aprint_error_dev(sc->sc_dev, "couldn't create encodings\n");
-		config_detach(sc->sc_dev, 0);
+		if (existing == false)
+			config_detach(sc->sc_dev, 0);
+		mutex_exit();
 		return EINVAL;
 	}
 
@@ -394,17 +385,52 @@ pad_open(dev_t dev, int flags, int fmt, 
 		KASSERT(error == EMOVEFD);
 	}	
 	sc->sc_open = 1;
+	mutex_exit();
 
 	return error;
+bad:
+	mutex_exit();
+	return ENXIO;
 }
 
 static int
 pad_close(struct pad_softc *sc)
 {
+	int rc;
+
 	if (sc == NULL)
 		return ENXIO;
 
-	return config_detach(sc->sc_dev, DETACH_FORCE);
+	mutex_enter();
+	config_deactivate(sc->sc_audiodev);
+	
+	/* Start draining existing accessors of the device. */
+	if ((rc = config_detach_children(sc->sc_dev,
+	DETACH_SHUTDOWN|DETACH_FORCE)) != 0) {
+		mutex_exit();
+		return rc;
+	}
+
+	mutex_enter(>sc_lock);
+	sc->sc_dying = true;
+	cv_broadcast(>sc_condvar);
+	mutex_exit(>sc_lock);
+
+	KASSERT(sc->sc_open > 0);
+	sc->sc_open = 0;
+
+	pmf_device_deregister(sc->sc_dev);
+
+	mutex_destroy(>sc_lock);
+	mutex_destroy(>sc_intr_lock);
+	cv_destroy(>sc_condvar);
+
+	

CVS commit: src/sys/dev/pad

2017-12-17 Thread Paul Goyette
Module Name:src
Committed By:   pgoyette
Date:   Sun Dec 17 21:57:11 UTC 2017

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
If config_fini_component() fails (due to device driver busy), don't
discard its error value when re-attaching the devsw.  If the devsw
is successfully re-attached and we return success, the module will
get detached anyway.  And, since the device is actually busy, we'll
eventually panic.

Thanks to nat@ for providing the reproduction instructions.

XXX A driver-busy condition will currently still trigger the error
XXX message from config_fini_component()
XXX configure: attachment `pad' of `pad' driver fini failed: 16
XXX This will be addresses separately by having pad maintain its own
XXX ref-count and not relying on config_fini_component() to detect
XXX the busy state.


To generate a diff of this commit:
cvs rdiff -u -r1.48 -r1.49 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.48 src/sys/dev/pad/pad.c:1.49
--- src/sys/dev/pad/pad.c:1.48	Sat Dec 16 06:39:07 2017
+++ src/sys/dev/pad/pad.c	Sun Dec 17 21:57:11 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.48 2017/12/16 06:39:07 pgoyette Exp $ */
+/* $NetBSD: pad.c,v 1.49 2017/12/17 21:57:11 pgoyette Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.48 2017/12/16 06:39:07 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.49 2017/12/17 21:57:11 pgoyette Exp $");
 
 #include 
 #include 
@@ -955,7 +955,7 @@ pad_modcmd(modcmd_t cmd, void *arg)
 		error = config_fini_component(cfdriver_ioconf_pad,
 		pad_cfattach, cfdata_ioconf_pad);
 		if (error) {
-			error = devsw_attach(pad_cd.cd_name, NULL, ,
+			devsw_attach(pad_cd.cd_name, NULL, ,
 			_cdevsw, );
 			break;
 		}



CVS commit: src/sys/dev/pad

2017-12-15 Thread Paul Goyette
Module Name:src
Committed By:   pgoyette
Date:   Sat Dec 16 02:45:14 UTC 2017

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
Remove the correct extra #endif

:)


To generate a diff of this commit:
cvs rdiff -u -r1.46 -r1.47 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.46 src/sys/dev/pad/pad.c:1.47
--- src/sys/dev/pad/pad.c:1.46	Sat Dec 16 02:13:13 2017
+++ src/sys/dev/pad/pad.c	Sat Dec 16 02:45:14 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.46 2017/12/16 02:13:13 mrg Exp $ */
+/* $NetBSD: pad.c,v 1.47 2017/12/16 02:45:14 pgoyette Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.46 2017/12/16 02:13:13 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.47 2017/12/16 02:45:14 pgoyette Exp $");
 
 #include 
 #include 
@@ -928,7 +928,6 @@ static struct cfdata pad_cfdata[] = {
 	},
 	{ NULL, NULL, 0, 0, NULL, 0, NULL }
 };
-#endif
 
 /* provide the vectors required for config_{init,fini}_component() */
 
@@ -940,7 +939,7 @@ static const struct cfattachinit pad_cfa
 	{ "pad", pad_cfattachinit },
 	{ NULL, NULL }
 };
-
+#endif
 
 static int
 pad_modcmd(modcmd_t cmd, void *arg)



CVS commit: src/sys/dev/pad

2017-12-15 Thread matthew green
Module Name:src
Committed By:   mrg
Date:   Sat Dec 16 02:13:13 UTC 2017

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
remove extra #endif left in previous commit.


To generate a diff of this commit:
cvs rdiff -u -r1.45 -r1.46 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.45 src/sys/dev/pad/pad.c:1.46
--- src/sys/dev/pad/pad.c:1.45	Fri Dec 15 23:57:42 2017
+++ src/sys/dev/pad/pad.c	Sat Dec 16 02:13:13 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.45 2017/12/15 23:57:42 pgoyette Exp $ */
+/* $NetBSD: pad.c,v 1.46 2017/12/16 02:13:13 mrg Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.45 2017/12/15 23:57:42 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.46 2017/12/16 02:13:13 mrg Exp $");
 
 #include 
 #include 
@@ -941,7 +941,6 @@ static const struct cfattachinit pad_cfa
 	{ NULL, NULL }
 };
 
-#endif
 
 static int
 pad_modcmd(modcmd_t cmd, void *arg)



CVS commit: src/sys/dev/pad

2017-12-15 Thread Paul Goyette
Module Name:src
Committed By:   pgoyette
Date:   Fri Dec 15 23:57:42 UTC 2017

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
Replace manipulation of individual config structures with calls to
config_{init,fini}_component()


To generate a diff of this commit:
cvs rdiff -u -r1.44 -r1.45 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.44 src/sys/dev/pad/pad.c:1.45
--- src/sys/dev/pad/pad.c:1.44	Fri Dec 15 11:49:32 2017
+++ src/sys/dev/pad/pad.c	Fri Dec 15 23:57:42 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.44 2017/12/15 11:49:32 pgoyette Exp $ */
+/* $NetBSD: pad.c,v 1.45 2017/12/15 23:57:42 pgoyette Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.44 2017/12/15 11:49:32 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.45 2017/12/15 23:57:42 pgoyette Exp $");
 
 #include 
 #include 
@@ -903,6 +903,8 @@ MODULE(MODULE_CLASS_DRIVER, pad, "audio"
 
 #ifdef _MODULE
 
+/* XXX These should really be created by config(1)'s IOCONF mechanism */
+
 static const struct cfiattrdata audiobuscf_iattrdata = {
 	"audiobus", 0, { { NULL, NULL, 0 }, }
 };
@@ -928,6 +930,19 @@ static struct cfdata pad_cfdata[] = {
 };
 #endif
 
+/* provide the vectors required for config_{init,fini}_component() */
+
+struct cfdriver * const pad_cfdriver[] = { _cd, NULL };
+
+static struct cfattach * const pad_cfattachinit[] = { _ca, NULL };
+
+static const struct cfattachinit pad_cfattach[] = {
+	{ "pad", pad_cfattachinit },
+	{ NULL, NULL }
+};
+
+#endif
+
 static int
 pad_modcmd(modcmd_t cmd, void *arg)
 {
@@ -939,59 +954,39 @@ pad_modcmd(modcmd_t cmd, void *arg)
 	switch (cmd) {
 	case MODULE_CMD_INIT:
 #ifdef _MODULE
-		error = config_cfdriver_attach(_cd);
-		if (error) {
+		error = config_init_component(pad_cfdriver, pad_cfattach,
+		pad_cfdata);
+		if (error)
 			break;
-		}
-
-		error = config_cfattach_attach(pad_cd.cd_name, _ca);
-		if (error) {
-			config_cfdriver_detach(_cd);
-			aprint_error("%s: unable to register cfattach\n",
-pad_cd.cd_name);
-
-			break;
-		}
-
-		error = config_cfdata_attach(pad_cfdata, 1);
-		if (error) {
-			config_cfattach_detach(pad_cd.cd_name, _ca);
-			config_cfdriver_detach(_cd);
-			aprint_error("%s: unable to register cfdata\n",
-pad_cd.cd_name);
-
-			break;
-		}
 
 		error = devsw_attach(pad_cd.cd_name, NULL, ,
-		_cdevsw, );
+			_cdevsw, );
 		if (error) {
-			config_cfdata_detach(pad_cfdata);
-			config_cfattach_detach(pad_cd.cd_name, _ca);
-			config_cfdriver_detach(_cd);
-			aprint_error("%s: unable to register devsw\n",
-pad_cd.cd_name);
-
+			config_fini_component(pad_cfdriver, pad_cfattach,
+			pad_cfdata);
 			break;
 		}
 
 		(void)config_attach_pseudo(pad_cfdata);
 #endif
-
 		break;
+
 	case MODULE_CMD_FINI:
 #ifdef _MODULE
-		error = config_cfdata_detach(pad_cfdata);
+		error = devsw_detach(NULL, _cdevsw);
+		if (error)
+			break;
+
+		error = config_fini_component(pad_cfdriver, pad_cfattach,
+		pad_cfdata);
 		if (error) {
+			error = devsw_attach(pad_cd.cd_name, NULL, ,
+			_cdevsw, );
 			break;
 		}
-
-		config_cfattach_detach(pad_cd.cd_name, _ca);
-		config_cfdriver_detach(_cd);
-		devsw_detach(NULL, _cdevsw);
 #endif
-
 		break;
+
 	default:
 		error = ENOTTY;
 	}



CVS commit: src/sys/dev/pad

2017-12-15 Thread Paul Goyette
Module Name:src
Committed By:   pgoyette
Date:   Fri Dec 15 11:49:32 UTC 2017

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
Rework so that module infrastructure is provided even when the module
is built-in to the kernel.

XXX pullup-8?


To generate a diff of this commit:
cvs rdiff -u -r1.43 -r1.44 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.43 src/sys/dev/pad/pad.c:1.44
--- src/sys/dev/pad/pad.c:1.43	Thu Nov 30 20:25:55 2017
+++ src/sys/dev/pad/pad.c	Fri Dec 15 11:49:32 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.43 2017/11/30 20:25:55 christos Exp $ */
+/* $NetBSD: pad.c,v 1.44 2017/12/15 11:49:32 pgoyette Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.43 2017/11/30 20:25:55 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.44 2017/12/15 11:49:32 pgoyette Exp $");
 
 #include 
 #include 
@@ -899,10 +899,10 @@ pad_swvol_dtor(stream_filter_t *this)
 		kmem_free(this, sizeof(auvolconv_filter_t));
 }
 
-#ifdef _MODULE
-
 MODULE(MODULE_CLASS_DRIVER, pad, "audio");
 
+#ifdef _MODULE
+
 static const struct cfiattrdata audiobuscf_iattrdata = {
 	"audiobus", 0, { { NULL, NULL, 0 }, }
 };
@@ -926,18 +926,22 @@ static struct cfdata pad_cfdata[] = {
 	},
 	{ NULL, NULL, 0, 0, NULL, 0, NULL }
 };
+#endif
 
 static int
 pad_modcmd(modcmd_t cmd, void *arg)
 {
+#ifdef _MODULE
 	devmajor_t cmajor = NODEVMAJOR, bmajor = NODEVMAJOR;
-	int error;
+#endif
+	int error = 0;
 
 	switch (cmd) {
 	case MODULE_CMD_INIT:
+#ifdef _MODULE
 		error = config_cfdriver_attach(_cd);
 		if (error) {
-			return error;
+			break;
 		}
 
 		error = config_cfattach_attach(pad_cd.cd_name, _ca);
@@ -946,7 +950,7 @@ pad_modcmd(modcmd_t cmd, void *arg)
 			aprint_error("%s: unable to register cfattach\n",
 pad_cd.cd_name);
 
-			return error;
+			break;
 		}
 
 		error = config_cfdata_attach(pad_cfdata, 1);
@@ -956,41 +960,41 @@ pad_modcmd(modcmd_t cmd, void *arg)
 			aprint_error("%s: unable to register cfdata\n",
 pad_cd.cd_name);
 
-			return error;
+			break;
 		}
 
 		error = devsw_attach(pad_cd.cd_name, NULL, ,
 		_cdevsw, );
 		if (error) {
-			error = config_cfdata_detach(pad_cfdata);
-			if (error) {
-return error;
-			}
+			config_cfdata_detach(pad_cfdata);
 			config_cfattach_detach(pad_cd.cd_name, _ca);
 			config_cfdriver_detach(_cd);
 			aprint_error("%s: unable to register devsw\n",
 pad_cd.cd_name);
 
-			return error;
+			break;
 		}
 
 		(void)config_attach_pseudo(pad_cfdata);
+#endif
 
-		return 0;
+		break;
 	case MODULE_CMD_FINI:
+#ifdef _MODULE
 		error = config_cfdata_detach(pad_cfdata);
 		if (error) {
-			return error;
+			break;
 		}
 
 		config_cfattach_detach(pad_cd.cd_name, _ca);
 		config_cfdriver_detach(_cd);
 		devsw_detach(NULL, _cdevsw);
+#endif
 
-		return 0;
+		break;
 	default:
-		return ENOTTY;
+		error = ENOTTY;
 	}
-}
 
-#endif
+	return error;
+}



CVS commit: src/sys/dev/pad

2017-07-29 Thread Nathanial Sloss
Module Name:src
Committed By:   nat
Date:   Sun Jul 30 00:50:52 UTC 2017

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
The pad module will now compile with WARNS=5.


To generate a diff of this commit:
cvs rdiff -u -r1.41 -r1.42 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.41 src/sys/dev/pad/pad.c:1.42
--- src/sys/dev/pad/pad.c:1.41	Sun Jul  2 13:32:50 2017
+++ src/sys/dev/pad/pad.c	Sun Jul 30 00:50:52 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.41 2017/07/02 13:32:50 nat Exp $ */
+/* $NetBSD: pad.c,v 1.42 2017/07/30 00:50:52 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.41 2017/07/02 13:32:50 nat Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.42 2017/07/30 00:50:52 nat Exp $");
 
 #include 
 #include 
@@ -241,7 +241,7 @@ pad_get_block(pad_softc_t *sc, pad_block
 	KASSERT(mutex_owned(>sc_lock));
 	KASSERT(pb != NULL);
 
-	if (sc->sc_buflen < blksize)
+	if (sc->sc_buflen < (uint)blksize)
 		return ERESTART;
 
 	pb->pb_ptr = (sc->sc_audiobuf + sc->sc_rpos);



CVS commit: src/sys/dev/pad

2017-07-02 Thread Nathanial Sloss
Module Name:src
Committed By:   nat
Date:   Sun Jul  2 13:32:51 UTC 2017

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
If a particular pad device is opened, ie pad1 then configure and use pad1
if it is not already configured.

This improves scriptability as you will know the particular pad(4) device
you have opened.

pad(4) devices still have a cloning interface if pad device (minor
number 254) is opened it will attach the next free device.  This action
can be repeated.

XXX update MAKEDEV scripts to make /dev/pad the cloning device.

Ok christos@.


To generate a diff of this commit:
cvs rdiff -u -r1.40 -r1.41 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.40 src/sys/dev/pad/pad.c:1.41
--- src/sys/dev/pad/pad.c:1.40	Sun Jul  2 05:59:27 2017
+++ src/sys/dev/pad/pad.c	Sun Jul  2 13:32:50 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.40 2017/07/02 05:59:27 nat Exp $ */
+/* $NetBSD: pad.c,v 1.41 2017/07/02 13:32:50 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.40 2017/07/02 05:59:27 nat Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.41 2017/07/02 13:32:50 nat Exp $");
 
 #include 
 #include 
@@ -58,6 +58,7 @@ __KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.40
 #include 
 
 #define MAXDEVS		128
+#define PADCLONER	254
 #define PADUNIT(x)	minor(x)
 
 #define PADFREQ		44100
@@ -110,8 +111,11 @@ static stream_filter_t *pad_swvol_filter
 const audio_params_t *, const audio_params_t *);
 static void	pad_swvol_dtor(stream_filter_t *);
 
-static int pad_close(struct file *);
-static int pad_read(struct file *, off_t *, struct uio *, kauth_cred_t, int);
+static int pad_close(struct pad_softc *);
+static int pad_read(struct pad_softc *, off_t *, struct uio *, kauth_cred_t, int);
+
+static int fops_pad_close(struct file *);
+static int fops_pad_read(struct file *, off_t *, struct uio *, kauth_cred_t, int);
 static int pad_write(struct file *, off_t *, struct uio *, kauth_cred_t, int);
 static int pad_ioctl(struct file *, u_long, void *);
 static int pad_kqfilter(struct file *, struct knote *);
@@ -149,11 +153,13 @@ static int	pad_add_block(pad_softc_t *, 
 static int	pad_get_block(pad_softc_t *, pad_block_t *, int);
 
 dev_type_open(pad_open);
+dev_type_close(cdev_pad_close);
+dev_type_read(cdev_pad_read);
 
 const struct cdevsw pad_cdevsw = {
 	.d_open = pad_open,
-	.d_close = noclose,
-	.d_read = noread,
+	.d_close = cdev_pad_close,
+	.d_read = cdev_pad_read,
 	.d_write = nowrite,
 	.d_ioctl = noioctl,
 	.d_stop = nostop,
@@ -166,13 +172,13 @@ const struct cdevsw pad_cdevsw = {
 };
 
 const struct fileops pad_fileops = {
-	.fo_read = pad_read,
+	.fo_read = fops_pad_read,
 	.fo_write = pad_write,
 	.fo_ioctl = pad_ioctl,
 	.fo_fcntl = fnullop_fcntl,
 	.fo_stat = pad_stat,
 	.fo_poll = pad_poll,
-	.fo_close = pad_close,
+	.fo_close = fops_pad_close,
 	.fo_mmap = pad_mmap,
 	.fo_kqfilter = pad_kqfilter,
 	.fo_restart = fnullop_restart
@@ -308,7 +314,7 @@ pad_detach(device_t self, int flags)
 
 	auconv_delete_encodings(sc->sc_encodings);
 
-	return rc;
+	return 0;
 }
 
 int
@@ -320,12 +326,18 @@ pad_open(dev_t dev, int flags, int fmt, 
 	cfdata_t cf;
 	int error, fd, i;
 
-	for (i = 0; i < MAXDEVS; i++) {
-		if (device_lookup(_cd, i) == NULL)
-			break;
+	if (PADUNIT(dev) == PADCLONER) {
+		for (i = 0; i < MAXDEVS; i++) {
+			if (device_lookup(_cd, i) == NULL)
+break;
+		}
+		if (i == MAXDEVS)
+			return ENXIO;
+	} else {
+		if (PADUNIT(dev) >= MAXDEVS)
+			return ENXIO;
+		i = PADUNIT(dev);
 	}
-	if (i == MAXDEVS)
-		return ENXIO;
 
 	cf = kmem_alloc(sizeof(struct cfdata), KM_SLEEP);
 	cf->cf_name = pad_cd.cd_name;
@@ -333,18 +345,27 @@ pad_open(dev_t dev, int flags, int fmt, 
 	cf->cf_unit = i;
 	cf->cf_fstate = FSTATE_STAR;
 
-	paddev = config_attach_pseudo(cf);
+	if (device_lookup(_cd, minor(dev)) == NULL)
+		paddev = config_attach_pseudo(cf);
+	else
+		paddev = device_lookup(_cd, minor(dev));
+
 	sc = device_private(paddev);
-	sc->sc_dev = paddev;
-	sc->sc_dying = false;
+	if (sc == NULL)
+		return ENXIO;
 
 	if (sc->sc_open == 1)
 		return EBUSY;
 
-	error = fd_allocfile(, );
-	if (error) {
-		config_detach(sc->sc_dev, 0);
-		return error;
+	sc->sc_dev = paddev;
+	sc->sc_dying = false;
+
+	if (PADUNIT(dev) == PADCLONER) {
+		error = fd_allocfile(, );
+		if (error) {
+			config_detach(sc->sc_dev, 0);
+			return error;
+		}
 	}
 
 	if (auconv_create_encodings(pad_formats, PAD_NFORMATS,
@@ -366,28 +387,47 @@ pad_open(dev_t dev, int flags, int fmt, 
 	if (!pmf_device_register(sc->sc_dev, NULL, NULL))
 		aprint_error_dev(sc->sc_dev, "couldn't establish power handler\n");
 
-	error = fd_clone(fp, fd, flags, _fileops, sc);
-	KASSERT(error == EMOVEFD);
-	
+	if (PADUNIT(dev) == PADCLONER) {
+		error = fd_clone(fp, fd, flags, 

CVS commit: src/sys/dev/pad

2017-07-02 Thread Nathanial Sloss
Module Name:src
Committed By:   nat
Date:   Sun Jul  2 05:59:27 UTC 2017

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
Return early from read if kpause is interrupted by a signal.


To generate a diff of this commit:
cvs rdiff -u -r1.39 -r1.40 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.39 src/sys/dev/pad/pad.c:1.40
--- src/sys/dev/pad/pad.c:1.39	Sat Jul  1 23:31:19 2017
+++ src/sys/dev/pad/pad.c	Sun Jul  2 05:59:27 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.39 2017/07/01 23:31:19 nat Exp $ */
+/* $NetBSD: pad.c,v 1.40 2017/07/02 05:59:27 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.39 2017/07/01 23:31:19 nat Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.40 2017/07/02 05:59:27 nat Exp $");
 
 #include 
 #include 
@@ -488,8 +488,12 @@ pad_read(struct file *fp, off_t *offp, s
 			wait_ticks = (hz * sc->sc_remainder) / 100;
 			if (wait_ticks > 0) {
 sc->sc_remainder -= wait_ticks * 100 / hz;
-kpause("padwait", TRUE, wait_ticks,
+err = kpause("padwait", TRUE, wait_ticks,
 >sc_lock);
+if (err != EWOULDBLOCK) {
+	mutex_exit(>sc_lock);
+	continue;
+}
 			}
 		}
 



CVS commit: src/sys/dev/pad

2017-06-30 Thread Nathanial Sloss
Module Name:src
Committed By:   nat
Date:   Sat Jul  1 05:50:10 UTC 2017

Modified Files:
src/sys/dev/pad: pad.c padvar.h

Log Message:
sc_audiodev should be defined as a device_t as this is what audio_attach_mi
returns.


To generate a diff of this commit:
cvs rdiff -u -r1.37 -r1.38 src/sys/dev/pad/pad.c
cvs rdiff -u -r1.9 -r1.10 src/sys/dev/pad/padvar.h

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

Modified files:

Index: src/sys/dev/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.37 src/sys/dev/pad/pad.c:1.38
--- src/sys/dev/pad/pad.c:1.37	Mon Jun 19 23:54:00 2017
+++ src/sys/dev/pad/pad.c	Sat Jul  1 05:50:10 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.37 2017/06/19 23:54:00 nat Exp $ */
+/* $NetBSD: pad.c,v 1.38 2017/07/01 05:50:10 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.37 2017/06/19 23:54:00 nat Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.38 2017/07/01 05:50:10 nat Exp $");
 
 #include 
 #include 
@@ -277,7 +277,7 @@ pad_attach(device_t parent, device_t sel
 	sc->sc_swvol = 255;
 	sc->sc_buflen = 0;
 	sc->sc_rpos = sc->sc_wpos = 0;
-	sc->sc_audiodev = (void *)audio_attach_mi(_hw_if, sc, sc->sc_dev);
+	sc->sc_audiodev = audio_attach_mi(_hw_if, sc, sc->sc_dev);
 
 	if (!pmf_device_register(self, NULL, NULL))
 		aprint_error_dev(self, "couldn't establish power handler\n");

Index: src/sys/dev/pad/padvar.h
diff -u src/sys/dev/pad/padvar.h:1.9 src/sys/dev/pad/padvar.h:1.10
--- src/sys/dev/pad/padvar.h:1.9	Tue Jun  6 07:31:40 2017
+++ src/sys/dev/pad/padvar.h	Sat Jul  1 05:50:10 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: padvar.h,v 1.9 2017/06/06 07:31:40 nat Exp $ */
+/* $NetBSD: padvar.h,v 1.10 2017/07/01 05:50:10 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -41,7 +41,7 @@ typedef struct pad_softc {
 	kmutex_t	sc_lock;
 	kmutex_t	sc_intr_lock;
 
-	struct audio_softc *sc_audiodev;
+	device_t	sc_audiodev;
 	int		sc_blksize;
 
 #define PAD_BLKSIZE	8192



CVS commit: src/sys/dev/pad

2017-06-19 Thread Nathanial Sloss
Module Name:src
Committed By:   nat
Date:   Mon Jun 19 23:54:00 UTC 2017

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
Use defines to specify pad audio format.  NFCI.

Ok christos@.


To generate a diff of this commit:
cvs rdiff -u -r1.36 -r1.37 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.36 src/sys/dev/pad/pad.c:1.37
--- src/sys/dev/pad/pad.c:1.36	Tue Jun  6 07:32:41 2017
+++ src/sys/dev/pad/pad.c	Mon Jun 19 23:54:00 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.36 2017/06/06 07:32:41 nat Exp $ */
+/* $NetBSD: pad.c,v 1.37 2017/06/19 23:54:00 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.36 2017/06/06 07:32:41 nat Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.37 2017/06/19 23:54:00 nat Exp $");
 
 #include 
 #include 
@@ -54,6 +54,11 @@ __KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.36
 
 #define PADUNIT(x)	minor(x)
 
+#define PADFREQ		44100
+#define PADCHAN		2
+#define PADPREC		16
+#define PADENC		AUDIO_ENCODING_SLINEAR_LE
+
 extern struct cfdriver pad_cd;
 
 typedef struct pad_block {
@@ -120,8 +125,8 @@ static const struct audio_hw_if pad_hw_i
 
 #define PAD_NFORMATS	1
 static const struct audio_format pad_formats[PAD_NFORMATS] = {
-	{ NULL, AUMODE_PLAY|AUMODE_RECORD, AUDIO_ENCODING_SLINEAR_LE, 16, 16,
-	  2, AUFMT_STEREO, 1, { 44100 } },
+	{ NULL, AUMODE_PLAY|AUMODE_RECORD, PADENC, PADPREC, PADPREC,
+	  PADCHAN, AUFMT_STEREO, 1, { PADFREQ } },
 };
 
 extern void	padattach(int);
@@ -339,8 +344,8 @@ pad_close(dev_t dev, int flags, int fmt,
 	return 0;
 }
 
-#define PAD_BYTES_PER_SEC   (44100 * sizeof(int16_t) * 2)
-#define BYTESTOSLEEP 	(int64_t)(PAD_BLKSIZE)
+#define PAD_BYTES_PER_SEC   (PADFREQ * PADPREC / NBBY * PADCHAN)
+#define BYTESTOSLEEP	(int64_t)(PAD_BLKSIZE)
 #define TIMENEXTREAD	(int64_t)(BYTESTOSLEEP * 100 / PAD_BYTES_PER_SEC)
 
 int



CVS commit: src/sys/dev/pad

2017-06-06 Thread Nathanial Sloss
Module Name:src
Committed By:   nat
Date:   Tue Jun  6 07:32:41 UTC 2017

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
Style change.


To generate a diff of this commit:
cvs rdiff -u -r1.35 -r1.36 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.35 src/sys/dev/pad/pad.c:1.36
--- src/sys/dev/pad/pad.c:1.35	Tue Jun  6 07:29:35 2017
+++ src/sys/dev/pad/pad.c	Tue Jun  6 07:32:41 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.35 2017/06/06 07:29:35 nat Exp $ */
+/* $NetBSD: pad.c,v 1.36 2017/06/06 07:32:41 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.35 2017/06/06 07:29:35 nat Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.36 2017/06/06 07:32:41 nat Exp $");
 
 #include 
 #include 
@@ -318,9 +318,8 @@ pad_open(dev_t dev, int flags, int fmt, 
 	if (sc == NULL)
 		return ENXIO;
 
-	if (atomic_swap_uint(>sc_open, 1) != 0) {
+	if (atomic_swap_uint(>sc_open, 1) != 0)
 		return EBUSY;
-	}
 	
 	return 0;
 }



CVS commit: src/sys/dev/pad

2017-06-06 Thread Nathanial Sloss
Module Name:src
Committed By:   nat
Date:   Tue Jun  6 07:31:41 UTC 2017

Modified Files:
src/sys/dev/pad: padvar.h

Log Message:
pad blocksize 1024 -> 8192.  Helps when sleeping in rate limiter.


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/dev/pad/padvar.h

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

Modified files:

Index: src/sys/dev/pad/padvar.h
diff -u src/sys/dev/pad/padvar.h:1.8 src/sys/dev/pad/padvar.h:1.9
--- src/sys/dev/pad/padvar.h:1.8	Sat May 27 10:02:26 2017
+++ src/sys/dev/pad/padvar.h	Tue Jun  6 07:31:40 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: padvar.h,v 1.8 2017/05/27 10:02:26 nat Exp $ */
+/* $NetBSD: padvar.h,v 1.9 2017/06/06 07:31:40 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -44,7 +44,7 @@ typedef struct pad_softc {
 	struct audio_softc *sc_audiodev;
 	int		sc_blksize;
 
-#define PAD_BLKSIZE	1024
+#define PAD_BLKSIZE	8192
 #define PAD_BUFSIZE	65536
 	uint8_t		sc_audiobuf[PAD_BUFSIZE];
 	uint32_t	sc_buflen;



CVS commit: src/sys/dev/pad

2017-06-06 Thread Nathanial Sloss
Module Name:src
Committed By:   nat
Date:   Tue Jun  6 07:29:35 UTC 2017

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
Simplification of rate limiter.  It now works uni/multiprocessor.


To generate a diff of this commit:
cvs rdiff -u -r1.34 -r1.35 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.34 src/sys/dev/pad/pad.c:1.35
--- src/sys/dev/pad/pad.c:1.34	Tue Jun  6 07:27:15 2017
+++ src/sys/dev/pad/pad.c	Tue Jun  6 07:29:35 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.34 2017/06/06 07:27:15 nat Exp $ */
+/* $NetBSD: pad.c,v 1.35 2017/06/06 07:29:35 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.34 2017/06/06 07:27:15 nat Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.35 2017/06/06 07:29:35 nat Exp $");
 
 #include 
 #include 
@@ -370,10 +370,11 @@ pad_read(dev_t dev, struct uio *uio, int
 		nowusec = (now.tv_sec * 100) + now.tv_usec;
 		lastusec = (sc->sc_last.tv_sec * 100) +
 		 sc->sc_last.tv_usec;
-		if (lastusec + TIMENEXTREAD > nowusec &&
-		 sc->sc_bytes_count >= BYTESTOSLEEP) {
-			sc->sc_remainder +=
-			((lastusec + TIMENEXTREAD) - nowusec);
+		if (lastusec + TIMENEXTREAD > nowusec) {
+			if (sc->sc_bytes_count >= BYTESTOSLEEP) {
+sc->sc_remainder +=
+((lastusec + TIMENEXTREAD) - nowusec);
+			}
 			
 			wait_ticks = (hz * sc->sc_remainder) / 100;
 			if (wait_ticks > 0) {
@@ -381,19 +382,14 @@ pad_read(dev_t dev, struct uio *uio, int
 kpause("padwait", TRUE, wait_ticks,
 >sc_lock);
 			}
+		}
 
+		if (sc->sc_bytes_count >= BYTESTOSLEEP)
 			sc->sc_bytes_count -= BYTESTOSLEEP;
-			getmicrotime(>sc_last);
-		} else if (sc->sc_bytes_count >= BYTESTOSLEEP) {
-			sc->sc_bytes_count -= BYTESTOSLEEP;
-			getmicrotime(>sc_last);
-		} else if (lastusec + TIMENEXTREAD <= nowusec) {
-			getmicrotime(>sc_last);
-			sc->sc_remainder = 0;
-		}
 
 		err = pad_get_block(sc, , min(uio->uio_resid, PAD_BLKSIZE));
 		if (!err) {
+			getmicrotime(>sc_last);
 			sc->sc_bytes_count += pb.pb_len;
 			mutex_exit(>sc_lock);
 			err = uiomove(pb.pb_ptr, pb.pb_len, uio);



CVS commit: src/sys/dev/pad

2017-06-06 Thread Nathanial Sloss
Module Name:src
Committed By:   nat
Date:   Tue Jun  6 07:27:15 UTC 2017

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
sc_bytes_count needs to be set in pad_audio_open not pad_open.


To generate a diff of this commit:
cvs rdiff -u -r1.33 -r1.34 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.33 src/sys/dev/pad/pad.c:1.34
--- src/sys/dev/pad/pad.c:1.33	Tue Jun  6 07:18:38 2017
+++ src/sys/dev/pad/pad.c	Tue Jun  6 07:27:15 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.33 2017/06/06 07:18:38 nat Exp $ */
+/* $NetBSD: pad.c,v 1.34 2017/06/06 07:27:15 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.33 2017/06/06 07:18:38 nat Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.34 2017/06/06 07:27:15 nat Exp $");
 
 #include 
 #include 
@@ -322,10 +322,6 @@ pad_open(dev_t dev, int flags, int fmt, 
 		return EBUSY;
 	}
 	
-	getmicrotime(>sc_last);
-	sc->sc_bytes_count = 0;
-	sc->sc_remainder = 0;
-
 	return 0;
 }
 
@@ -438,6 +434,7 @@ pad_audio_open(void *opaque, int flags)
 		return EIO;
 
 	getmicrotime(>sc_last);
+	sc->sc_bytes_count = 0;
 	sc->sc_remainder = 0;
 
 	return 0;



CVS commit: src/sys/dev/pad

2017-06-06 Thread Nathanial Sloss
Module Name:src
Committed By:   nat
Date:   Tue Jun  6 07:18:38 UTC 2017

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
Express BYTESTOSLEEP as an 64 bit integer.
Use BYTESTOSLEEP in expresson of BYTES_PER_SEC.


To generate a diff of this commit:
cvs rdiff -u -r1.32 -r1.33 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.32 src/sys/dev/pad/pad.c:1.33
--- src/sys/dev/pad/pad.c:1.32	Thu Jun  1 09:44:30 2017
+++ src/sys/dev/pad/pad.c	Tue Jun  6 07:18:38 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.32 2017/06/01 09:44:30 pgoyette Exp $ */
+/* $NetBSD: pad.c,v 1.33 2017/06/06 07:18:38 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.32 2017/06/01 09:44:30 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.33 2017/06/06 07:18:38 nat Exp $");
 
 #include 
 #include 
@@ -345,8 +345,8 @@ pad_close(dev_t dev, int flags, int fmt,
 }
 
 #define PAD_BYTES_PER_SEC   (44100 * sizeof(int16_t) * 2)
-#define TIMENEXTREAD	(PAD_BLKSIZE * 100 / PAD_BYTES_PER_SEC)
-#define BYTESTOSLEEP 	(PAD_BLKSIZE)
+#define BYTESTOSLEEP 	(int64_t)(PAD_BLKSIZE)
+#define TIMENEXTREAD	(int64_t)(BYTESTOSLEEP * 100 / PAD_BYTES_PER_SEC)
 
 int
 pad_read(dev_t dev, struct uio *uio, int flags)



CVS commit: src/sys/dev/pad

2017-05-27 Thread Nathanial Sloss
Module Name:src
Committed By:   nat
Date:   Sat May 27 10:43:30 UTC 2017

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
Add missing sc_bytes_count.


To generate a diff of this commit:
cvs rdiff -u -r1.29 -r1.30 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.29 src/sys/dev/pad/pad.c:1.30
--- src/sys/dev/pad/pad.c:1.29	Sat May 27 10:02:26 2017
+++ src/sys/dev/pad/pad.c	Sat May 27 10:43:30 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.29 2017/05/27 10:02:26 nat Exp $ */
+/* $NetBSD: pad.c,v 1.30 2017/05/27 10:43:30 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.29 2017/05/27 10:02:26 nat Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.30 2017/05/27 10:43:30 nat Exp $");
 
 #include 
 #include 
@@ -396,6 +396,7 @@ pad_read(dev_t dev, struct uio *uio, int
 
 		err = pad_get_block(sc, , min(uio->uio_resid, PAD_BLKSIZE));
 		if (!err) {
+			sc->sc_bytes_count += pb.pb_len;
 			mutex_exit(>sc_lock);
 			err = uiomove(pb.pb_ptr, pb.pb_len, uio);
 			continue;



CVS commit: src/sys/dev/pad

2017-05-27 Thread Nathanial Sloss
Module Name:src
Committed By:   nat
Date:   Sat May 27 10:02:26 UTC 2017

Modified Files:
src/sys/dev/pad: pad.c padvar.h

Log Message:
Rework of previous.
Math for BYTESTOSLEEP and TIMENEXTREAD is now correct.


To generate a diff of this commit:
cvs rdiff -u -r1.28 -r1.29 src/sys/dev/pad/pad.c
cvs rdiff -u -r1.7 -r1.8 src/sys/dev/pad/padvar.h

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

Modified files:

Index: src/sys/dev/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.28 src/sys/dev/pad/pad.c:1.29
--- src/sys/dev/pad/pad.c:1.28	Thu Feb 23 23:13:27 2017
+++ src/sys/dev/pad/pad.c	Sat May 27 10:02:26 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.28 2017/02/23 23:13:27 nat Exp $ */
+/* $NetBSD: pad.c,v 1.29 2017/05/27 10:02:26 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.28 2017/02/23 23:13:27 nat Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.29 2017/05/27 10:02:26 nat Exp $");
 
 #include 
 #include 
@@ -321,6 +321,8 @@ pad_open(dev_t dev, int flags, int fmt, 
 	}
 	
 	getmicrotime(>sc_last);
+	sc->sc_bytes_count = 0;
+	sc->sc_remainder = 0;
 
 	return 0;
 }
@@ -340,8 +342,9 @@ pad_close(dev_t dev, int flags, int fmt,
 	return 0;
 }
 
-#define PAD_BYTES_PER_SEC (44100 * sizeof(int16_t) * 2)
-#define TIMENEXTREAD	(PAD_BLKSIZE * 1000 / PAD_BYTES_PER_SEC)
+#define PAD_BYTES_PER_SEC   (44100 * sizeof(int16_t) * 2)
+#define TIMENEXTREAD	(PAD_BLKSIZE * 100 / PAD_BYTES_PER_SEC)
+#define BYTESTOSLEEP 	(PAD_BLKSIZE)
 
 int
 pad_read(dev_t dev, struct uio *uio, int flags)
@@ -369,18 +372,28 @@ pad_read(dev_t dev, struct uio *uio, int
 		nowusec = (now.tv_sec * 100) + now.tv_usec;
 		lastusec = (sc->sc_last.tv_sec * 100) +
 		 sc->sc_last.tv_usec;
-		if (lastusec + TIMENEXTREAD > nowusec) {
-			wait_ticks = (hz * ((lastusec + TIMENEXTREAD) -
-			 nowusec)) / 100;
+		if (lastusec + TIMENEXTREAD > nowusec &&
+		 sc->sc_bytes_count >= BYTESTOSLEEP) {
+			sc->sc_remainder +=
+			((lastusec + TIMENEXTREAD) - nowusec);
+			
+			wait_ticks = (hz * sc->sc_remainder) / 100;
 			if (wait_ticks > 0) {
+sc->sc_remainder -= wait_ticks * 100 / hz;
 kpause("padwait", TRUE, wait_ticks,
 >sc_lock);
 			}
+
+			sc->sc_bytes_count -= BYTESTOSLEEP;
+			getmicrotime(>sc_last);
+		} else if (sc->sc_bytes_count >= BYTESTOSLEEP) {
+			sc->sc_bytes_count -= BYTESTOSLEEP;
+			getmicrotime(>sc_last);
+		} else if (lastusec + TIMENEXTREAD <= nowusec) {
+			getmicrotime(>sc_last);
+			sc->sc_remainder = 0;
 		}
-		sc->sc_last.tv_sec =
-			(lastusec + TIMENEXTREAD) / 100;
-		sc->sc_last.tv_usec =
-			(lastusec + TIMENEXTREAD) % 100;
+
 		err = pad_get_block(sc, , min(uio->uio_resid, PAD_BLKSIZE));
 		if (!err) {
 			mutex_exit(>sc_lock);
@@ -422,6 +435,8 @@ pad_audio_open(void *opaque, int flags)
 		return EIO;
 
 	getmicrotime(>sc_last);
+	sc->sc_remainder = 0;
+
 	return 0;
 }
 

Index: src/sys/dev/pad/padvar.h
diff -u src/sys/dev/pad/padvar.h:1.7 src/sys/dev/pad/padvar.h:1.8
--- src/sys/dev/pad/padvar.h:1.7	Thu Feb 23 23:13:27 2017
+++ src/sys/dev/pad/padvar.h	Sat May 27 10:02:26 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: padvar.h,v 1.7 2017/02/23 23:13:27 nat Exp $ */
+/* $NetBSD: padvar.h,v 1.8 2017/05/27 10:02:26 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -52,6 +52,8 @@ typedef struct pad_softc {
 
 	uint8_t		sc_swvol;
 	struct timeval	sc_last;
+	int		sc_bytes_count;
+	uint32_t	sc_remainder;
 } pad_softc_t;
 
 #endif /* !_SYS_DEV_PAD_PADVAR_H */



CVS commit: src/sys/dev/pad

2017-02-23 Thread Nathanial Sloss
Module Name:src
Committed By:   nat
Date:   Thu Feb 23 23:13:27 UTC 2017

Modified Files:
src/sys/dev/pad: pad.c padvar.h

Log Message:
Update pad due to changes in audio.  sc_bytes_count and BYTESTOSLEEP are
no longer required.


To generate a diff of this commit:
cvs rdiff -u -r1.27 -r1.28 src/sys/dev/pad/pad.c
cvs rdiff -u -r1.6 -r1.7 src/sys/dev/pad/padvar.h

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

Modified files:

Index: src/sys/dev/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.27 src/sys/dev/pad/pad.c:1.28
--- src/sys/dev/pad/pad.c:1.27	Thu Jan 26 04:10:27 2017
+++ src/sys/dev/pad/pad.c	Thu Feb 23 23:13:27 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.27 2017/01/26 04:10:27 nat Exp $ */
+/* $NetBSD: pad.c,v 1.28 2017/02/23 23:13:27 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.27 2017/01/26 04:10:27 nat Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.28 2017/02/23 23:13:27 nat Exp $");
 
 #include 
 #include 
@@ -321,7 +321,6 @@ pad_open(dev_t dev, int flags, int fmt, 
 	}
 	
 	getmicrotime(>sc_last);
-	sc->sc_bytes_count = 0;
 
 	return 0;
 }
@@ -342,8 +341,7 @@ pad_close(dev_t dev, int flags, int fmt,
 }
 
 #define PAD_BYTES_PER_SEC (44100 * sizeof(int16_t) * 2)
-#define TIMENEXTREAD	(20 * 1000)
-#define BYTESTOSLEEP ((PAD_BYTES_PER_SEC / (100 / TIMENEXTREAD)) + PAD_BLKSIZE)
+#define TIMENEXTREAD	(PAD_BLKSIZE * 1000 / PAD_BYTES_PER_SEC)
 
 int
 pad_read(dev_t dev, struct uio *uio, int flags)
@@ -371,27 +369,20 @@ pad_read(dev_t dev, struct uio *uio, int
 		nowusec = (now.tv_sec * 100) + now.tv_usec;
 		lastusec = (sc->sc_last.tv_sec * 100) +
 		 sc->sc_last.tv_usec;
-		if (lastusec + TIMENEXTREAD > nowusec &&
-		 sc->sc_bytes_count >= BYTESTOSLEEP) {
+		if (lastusec + TIMENEXTREAD > nowusec) {
 			wait_ticks = (hz * ((lastusec + TIMENEXTREAD) -
 			 nowusec)) / 100;
 			if (wait_ticks > 0) {
 kpause("padwait", TRUE, wait_ticks,
- >sc_lock);
+>sc_lock);
 			}
-
-			sc->sc_bytes_count -= BYTESTOSLEEP;
-			getmicrotime(>sc_last);
-		} else if (sc->sc_bytes_count >= BYTESTOSLEEP) {
-			sc->sc_bytes_count -= BYTESTOSLEEP;
-			getmicrotime(>sc_last);
-		} else if (lastusec + TIMENEXTREAD <= nowusec)
-			getmicrotime(>sc_last);
-
+		}
+		sc->sc_last.tv_sec =
+			(lastusec + TIMENEXTREAD) / 100;
+		sc->sc_last.tv_usec =
+			(lastusec + TIMENEXTREAD) % 100;
 		err = pad_get_block(sc, , min(uio->uio_resid, PAD_BLKSIZE));
 		if (!err) {
-			sc->sc_bytes_count += pb.pb_len;
-
 			mutex_exit(>sc_lock);
 			err = uiomove(pb.pb_ptr, pb.pb_len, uio);
 			continue;

Index: src/sys/dev/pad/padvar.h
diff -u src/sys/dev/pad/padvar.h:1.6 src/sys/dev/pad/padvar.h:1.7
--- src/sys/dev/pad/padvar.h:1.6	Fri Feb 26 13:17:04 2016
+++ src/sys/dev/pad/padvar.h	Thu Feb 23 23:13:27 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: padvar.h,v 1.6 2016/02/26 13:17:04 nat Exp $ */
+/* $NetBSD: padvar.h,v 1.7 2017/02/23 23:13:27 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -52,7 +52,6 @@ typedef struct pad_softc {
 
 	uint8_t		sc_swvol;
 	struct timeval	sc_last;
-	int		sc_bytes_count;
 } pad_softc_t;
 
 #endif /* !_SYS_DEV_PAD_PADVAR_H */



CVS commit: src/sys/dev/pad

2017-01-25 Thread Nathanial Sloss
Module Name:src
Committed By:   nat
Date:   Thu Jan 26 04:10:27 UTC 2017

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
Don't hold the thread_lock between successive calls to sc_intr as it
breaks mixing.

This will help passing the atf test.  Changes to audio.c to ensue this
will be in a followup commit.


To generate a diff of this commit:
cvs rdiff -u -r1.26 -r1.27 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.26 src/sys/dev/pad/pad.c:1.27
--- src/sys/dev/pad/pad.c:1.26	Sat Oct 15 07:08:06 2016
+++ src/sys/dev/pad/pad.c	Thu Jan 26 04:10:27 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.26 2016/10/15 07:08:06 nat Exp $ */
+/* $NetBSD: pad.c,v 1.27 2017/01/26 04:10:27 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.26 2016/10/15 07:08:06 nat Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.27 2017/01/26 04:10:27 nat Exp $");
 
 #include 
 #include 
@@ -362,11 +362,11 @@ pad_read(dev_t dev, struct uio *uio, int
 
 	err = 0;
 
-	mutex_enter(>sc_lock);
-	intr = sc->sc_intr;
-	intrarg = sc->sc_intrarg;
-
 	while (uio->uio_resid > 0 && !err) {
+		mutex_enter(>sc_lock);
+		intr = sc->sc_intr;
+		intrarg = sc->sc_intrarg;
+
 		getmicrotime();
 		nowusec = (now.tv_sec * 100) + now.tv_usec;
 		lastusec = (sc->sc_last.tv_sec * 100) +
@@ -394,7 +394,6 @@ pad_read(dev_t dev, struct uio *uio, int
 
 			mutex_exit(>sc_lock);
 			err = uiomove(pb.pb_ptr, pb.pb_len, uio);
-			mutex_enter(>sc_lock);
 			continue;
 		}
 
@@ -407,16 +406,17 @@ pad_read(dev_t dev, struct uio *uio, int
 			intr = sc->sc_intr;
 			intrarg = sc->sc_intrarg;
 			err = 0;
+			mutex_exit(>sc_lock);
 			continue;
 		}
 		err = cv_wait_sig(>sc_condvar, >sc_lock);
-		if (err != 0)
+		if (err != 0) {
+			mutex_exit(>sc_lock);
 			break;
+		}
 
-		intr = sc->sc_intr;
-		intrarg = sc->sc_intrarg;
+		mutex_exit(>sc_lock);
 	}
-	mutex_exit(>sc_lock);
 
 	return err;
 }



CVS commit: src/sys/dev/pad

2016-02-26 Thread Nathanial Sloss
Module Name:src
Committed By:   nat
Date:   Fri Feb 26 13:17:04 UTC 2016

Modified Files:
src/sys/dev/pad: pad.c padvar.h

Log Message:
Allow reads from pad(4) less or greater than PAD_BLKSIZE.

Ensure that audio data is ready before reading.
Addresses PR 39204.

OK jmcneil@.


To generate a diff of this commit:
cvs rdiff -u -r1.23 -r1.24 src/sys/dev/pad/pad.c
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/pad/padvar.h

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

Modified files:

Index: src/sys/dev/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.23 src/sys/dev/pad/pad.c:1.24
--- src/sys/dev/pad/pad.c:1.23	Fri Jul 10 21:58:56 2015
+++ src/sys/dev/pad/pad.c	Fri Feb 26 13:17:04 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.23 2015/07/10 21:58:56 nat Exp $ */
+/* $NetBSD: pad.c,v 1.24 2016/02/26 13:17:04 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -27,7 +27,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.23 2015/07/10 21:58:56 nat Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.24 2016/02/26 13:17:04 nat Exp $");
 
 #include 
 #include 
@@ -43,6 +43,7 @@ __KERNEL_RCSID(0, "$NetBSD: pad.c,v 1.23
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include 
@@ -316,6 +317,9 @@ pad_open(dev_t dev, int flags, int fmt, 
 	if (atomic_swap_uint(>sc_open, 1) != 0) {
 		return EBUSY;
 	}
+	
+	getmicrotime(>sc_last);
+	sc->sc_bytes_count = 0;
 
 	return 0;
 }
@@ -335,14 +339,20 @@ pad_close(dev_t dev, int flags, int fmt,
 	return 0;
 }
 
+#define PAD_BYTES_PER_SEC (44100 * sizeof(int16_t) * 2)
+#define TIMENEXTREAD	(20 * 1000)
+#define BYTESTOSLEEP (PAD_BYTES_PER_SEC / (100 / TIMENEXTREAD))
+
 int
 pad_read(dev_t dev, struct uio *uio, int flags)
 {
+	struct timeval now;
+	uint64_t nowusec, lastusec;
 	pad_softc_t *sc;
 	pad_block_t pb;
 	void (*intr)(void *);
 	void *intrarg;
-	int err;
+	int err, wait_ticks;
 
 	sc = device_lookup_private(_cd, PADUNIT(dev));
 	if (sc == NULL)
@@ -354,10 +364,32 @@ pad_read(dev_t dev, struct uio *uio, int
 	intr = sc->sc_intr;
 	intrarg = sc->sc_intrarg;
 
-	kpreempt_disable();
 	while (uio->uio_resid > 0 && !err) {
+		getmicrotime();
+		nowusec = (now.tv_sec * 100) + now.tv_usec;
+		lastusec = (sc->sc_last.tv_sec * 100) +
+		 sc->sc_last.tv_usec;
+		if (lastusec + TIMENEXTREAD > nowusec &&
+		 sc->sc_bytes_count >= BYTESTOSLEEP) {
+			wait_ticks = (hz * ((lastusec + TIMENEXTREAD) -
+			 nowusec)) / 100;
+			if (wait_ticks > 0) {
+kpause("padwait", TRUE, wait_ticks,
+ >sc_lock);
+			}
+
+			sc->sc_bytes_count -= BYTESTOSLEEP;
+			getmicrotime(>sc_last);
+		} else if (sc->sc_bytes_count >= BYTESTOSLEEP) {
+			sc->sc_bytes_count -= BYTESTOSLEEP;
+			getmicrotime(>sc_last);
+		} else if (lastusec + TIMENEXTREAD <= nowusec)
+			getmicrotime(>sc_last);
+
 		err = pad_get_block(sc, , min(uio->uio_resid, PAD_BLKSIZE));
 		if (!err) {
+			sc->sc_bytes_count += pb.pb_len;
+
 			mutex_exit(>sc_lock);
 			err = uiomove(pb.pb_ptr, pb.pb_len, uio);
 			mutex_enter(>sc_lock);
@@ -366,7 +398,9 @@ pad_read(dev_t dev, struct uio *uio, int
 
 		if (intr) {
 			mutex_enter(>sc_intr_lock);
+			kpreempt_disable();
 			(*intr)(intrarg);
+			kpreempt_enable();
 			mutex_exit(>sc_intr_lock);
 			intr = sc->sc_intr;
 			intrarg = sc->sc_intrarg;
@@ -374,22 +408,13 @@ pad_read(dev_t dev, struct uio *uio, int
 			continue;
 		}
 		err = cv_wait_sig(>sc_condvar, >sc_lock);
-		if (err != 0) {
-			mutex_exit(>sc_lock);
-			kpreempt_enable();
-			return err;
-		}
+		if (err != 0)
+			break;
+
 		intr = sc->sc_intr;
 		intrarg = sc->sc_intrarg;
 	}
-
-	if (intr) {
-		mutex_enter(>sc_intr_lock);
-		(*intr)(intrarg);
-		mutex_exit(>sc_intr_lock);
-	}
 	mutex_exit(>sc_lock);
-	kpreempt_enable();
 
 	return err;
 }

Index: src/sys/dev/pad/padvar.h
diff -u src/sys/dev/pad/padvar.h:1.5 src/sys/dev/pad/padvar.h:1.6
--- src/sys/dev/pad/padvar.h:1.5	Tue Nov 18 01:53:17 2014
+++ src/sys/dev/pad/padvar.h	Fri Feb 26 13:17:04 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: padvar.h,v 1.5 2014/11/18 01:53:17 jmcneill Exp $ */
+/* $NetBSD: padvar.h,v 1.6 2016/02/26 13:17:04 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill 
@@ -51,6 +51,8 @@ typedef struct pad_softc {
 	uint32_t	sc_rpos, sc_wpos;
 
 	uint8_t		sc_swvol;
+	struct timeval	sc_last;
+	int		sc_bytes_count;
 } pad_softc_t;
 
 #endif /* !_SYS_DEV_PAD_PADVAR_H */



CVS commit: src/sys/dev/pad

2015-07-10 Thread Nathanial Sloss
Module Name:src
Committed By:   nat
Date:   Fri Jul 10 21:58:56 UTC 2015

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
Wrap up calls to sc_intr in kpreempt[en/dis]able.

This commit was approved by christos@


To generate a diff of this commit:
cvs rdiff -u -r1.22 -r1.23 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.22 src/sys/dev/pad/pad.c:1.23
--- src/sys/dev/pad/pad.c:1.22	Tue Nov 18 01:53:17 2014
+++ src/sys/dev/pad/pad.c	Fri Jul 10 21:58:56 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.22 2014/11/18 01:53:17 jmcneill Exp $ */
+/* $NetBSD: pad.c,v 1.23 2015/07/10 21:58:56 nat Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill jmcne...@invisible.ca
@@ -27,7 +27,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: pad.c,v 1.22 2014/11/18 01:53:17 jmcneill Exp $);
+__KERNEL_RCSID(0, $NetBSD: pad.c,v 1.23 2015/07/10 21:58:56 nat Exp $);
 
 #include sys/types.h
 #include sys/param.h
@@ -354,6 +354,7 @@ pad_read(dev_t dev, struct uio *uio, int
 	intr = sc-sc_intr;
 	intrarg = sc-sc_intrarg;
 
+	kpreempt_disable();
 	while (uio-uio_resid  0  !err) {
 		err = pad_get_block(sc, pb, min(uio-uio_resid, PAD_BLKSIZE));
 		if (!err) {
@@ -375,6 +376,7 @@ pad_read(dev_t dev, struct uio *uio, int
 		err = cv_wait_sig(sc-sc_condvar, sc-sc_lock);
 		if (err != 0) {
 			mutex_exit(sc-sc_lock);
+			kpreempt_enable();
 			return err;
 		}
 		intr = sc-sc_intr;
@@ -387,6 +389,7 @@ pad_read(dev_t dev, struct uio *uio, int
 		mutex_exit(sc-sc_intr_lock);
 	}
 	mutex_exit(sc-sc_lock);
+	kpreempt_enable();
 
 	return err;
 }



CVS commit: src/sys/dev/pad

2013-11-01 Thread Christos Zoulas
Module Name:src
Committed By:   christos
Date:   Sat Nov  2 00:37:12 UTC 2013

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
sprinke __diagused


To generate a diff of this commit:
cvs rdiff -u -r1.19 -r1.20 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.19 src/sys/dev/pad/pad.c:1.20
--- src/sys/dev/pad/pad.c:1.19	Wed Nov 23 20:54:08 2011
+++ src/sys/dev/pad/pad.c	Fri Nov  1 20:37:12 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.19 2011/11/24 01:54:08 agc Exp $ */
+/* $NetBSD: pad.c,v 1.20 2013/11/02 00:37:12 christos Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill jmcne...@invisible.ca
@@ -27,7 +27,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: pad.c,v 1.19 2011/11/24 01:54:08 agc Exp $);
+__KERNEL_RCSID(0, $NetBSD: pad.c,v 1.20 2013/11/02 00:37:12 christos Exp $);
 
 #include sys/types.h
 #include sys/param.h
@@ -401,7 +401,7 @@ pad_set_params(void *opaque, int setmode
 audio_params_t *play, audio_params_t *rec,
 stream_filter_list_t *pfil, stream_filter_list_t *rfil)
 {
-	pad_softc_t *sc;
+	pad_softc_t *sc __diagused;
 
 	sc = (pad_softc_t *)opaque;
 
@@ -458,7 +458,7 @@ static int
 pad_start_input(void *opaque, void *block, int blksize,
 void (*intr)(void *), void *intrarg)
 {
-	pad_softc_t *sc;
+	pad_softc_t *sc __diagused;
 
 	sc = (pad_softc_t *)opaque;
 
@@ -487,7 +487,7 @@ pad_halt_output(void *opaque)
 static int
 pad_halt_input(void *opaque)
 {
-	pad_softc_t *sc;
+	pad_softc_t *sc __diagused;
 
 	sc = (pad_softc_t *)opaque;
 
@@ -547,7 +547,7 @@ pad_get_port(void *opaque, mixer_ctrl_t 
 static int
 pad_query_devinfo(void *opaque, mixer_devinfo_t *di)
 {
-	pad_softc_t *sc;
+	pad_softc_t *sc __diagused;
 
 	sc = (pad_softc_t *)opaque;
 
@@ -590,7 +590,7 @@ pad_query_devinfo(void *opaque, mixer_de
 static int
 pad_get_props(void *opaque)
 {
-	pad_softc_t *sc;
+	pad_softc_t *sc __diagused;
 
 	sc = (pad_softc_t *)opaque;
 
@@ -603,7 +603,7 @@ static int
 pad_round_blocksize(void *opaque, int blksize, int mode,
 const audio_params_t *p)
 {
-	pad_softc_t *sc;
+	pad_softc_t *sc __diagused;
 
 	sc = (pad_softc_t *)opaque;
 	KASSERT(mutex_owned(sc-sc_lock));



CVS commit: src/sys/dev/pad

2011-11-23 Thread Jared D. McNeill
Module Name:src
Committed By:   jmcneill
Date:   Thu Nov 24 01:11:05 UTC 2011

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
splaudio is no more


To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.17 src/sys/dev/pad/pad.c:1.18
--- src/sys/dev/pad/pad.c:1.17	Wed Nov 23 23:07:33 2011
+++ src/sys/dev/pad/pad.c	Thu Nov 24 01:11:04 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.17 2011/11/23 23:07:33 jmcneill Exp $ */
+/* $NetBSD: pad.c,v 1.18 2011/11/24 01:11:04 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill jmcne...@invisible.ca
@@ -27,7 +27,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: pad.c,v 1.17 2011/11/23 23:07:33 jmcneill Exp $);
+__KERNEL_RCSID(0, $NetBSD: pad.c,v 1.18 2011/11/24 01:11:04 jmcneill Exp $);
 
 #include sys/types.h
 #include sys/param.h
@@ -672,9 +672,7 @@ pad_modcmd(modcmd_t cmd, void *arg)
 			return error;
 		}
 
-		s = splaudio();
 		error = config_cfdata_attach(pad_cfdata, 1);
-		splx(s);
 		if (error) {
 			config_cfattach_detach(pad_cd.cd_name, pad_ca);
 			config_cfdriver_detach(pad_cd);



CVS commit: src/sys/dev/pad

2011-11-23 Thread Alistair G. Crooks
Module Name:src
Committed By:   agc
Date:   Thu Nov 24 01:54:08 UTC 2011

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
get rid of a variable which is no longer used after the demise of splaudio


To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.19 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.18 src/sys/dev/pad/pad.c:1.19
--- src/sys/dev/pad/pad.c:1.18	Thu Nov 24 01:11:04 2011
+++ src/sys/dev/pad/pad.c	Thu Nov 24 01:54:08 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.18 2011/11/24 01:11:04 jmcneill Exp $ */
+/* $NetBSD: pad.c,v 1.19 2011/11/24 01:54:08 agc Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill jmcne...@invisible.ca
@@ -27,7 +27,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: pad.c,v 1.18 2011/11/24 01:11:04 jmcneill Exp $);
+__KERNEL_RCSID(0, $NetBSD: pad.c,v 1.19 2011/11/24 01:54:08 agc Exp $);
 
 #include sys/types.h
 #include sys/param.h
@@ -654,7 +654,7 @@ static int
 pad_modcmd(modcmd_t cmd, void *arg)
 {
 	devmajor_t cmajor = NODEVMAJOR, bmajor = NODEVMAJOR;
-	int error, s;
+	int error;
 
 	switch (cmd) {
 	case MODULE_CMD_INIT:



CVS commit: src/sys/dev/pad

2011-02-28 Thread Jeff Rizzo
Module Name:src
Committed By:   riz
Date:   Mon Feb 28 16:56:39 UTC 2011

Modified Files:
src/sys/dev/pad: padvol.c

Log Message:
Use le16enc()/be16enc() to encode LE/BE values back into the audio stream.
This fixes the tests/dev/audio test on my macppc box.

While I'm here, use le16dec()/be16dec() directly instead of rewriting them.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/dev/pad/padvol.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/pad/padvol.c
diff -u src/sys/dev/pad/padvol.c:1.4 src/sys/dev/pad/padvol.c:1.5
--- src/sys/dev/pad/padvol.c:1.4	Mon Sep  7 18:23:06 2009
+++ src/sys/dev/pad/padvol.c	Mon Feb 28 16:56:39 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: padvol.c,v 1.4 2009/09/07 18:23:06 jmcneill Exp $ */
+/* $NetBSD: padvol.c,v 1.5 2011/02/28 16:56:39 riz Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill jmcne...@invisible.ca
@@ -27,7 +27,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: padvol.c,v 1.4 2009/09/07 18:23:06 jmcneill Exp $);
+__KERNEL_RCSID(0, $NetBSD: padvol.c,v 1.5 2011/02/28 16:56:39 riz Exp $);
 
 #include sys/types.h
 #include sys/param.h
@@ -35,6 +35,7 @@
 #include sys/condvar.h
 #include sys/kmem.h
 #include sys/device.h
+#include sys/endian.h
 
 #include dev/audiovar.h
 #include dev/auconv.h
@@ -88,9 +89,9 @@
 	m = (dst-end - dst-start)  ~1;
 	m = min(m, max_used);
 	FILTER_LOOP_PROLOGUE(this-src, 2, dst, 2, m) {
-		j = (s[1]  8 | s[0]);
+		j = le16dec(s);
 		wp = (int16_t *)d;
-		*wp = ((j * sc-sc_swvol) / 255);
+		le16enc(wp, (j * sc-sc_swvol) / 255);
 	} FILTER_LOOP_EPILOGUE(this-src, dst);
 
 	return 0;
@@ -114,9 +115,9 @@
 	m = (dst-end - dst-start)  ~1;
 	m = min(m, max_used);
 	FILTER_LOOP_PROLOGUE(this-src, 2, dst, 2, m) {
-		j = (s[0]  8 | s[1]);
+		j = be16dec(s);
 		wp = (int16_t *)d;
-		*wp = ((j * sc-sc_swvol) / 255);
+		be16enc(wp, (j * sc-sc_swvol) / 255);
 	} FILTER_LOOP_EPILOGUE(this-src, dst);
 
 	return 0;



CVS commit: src/sys/dev/pad

2010-09-03 Thread Jared D. McNeill
Module Name:src
Committed By:   jmcneill
Date:   Fri Sep  3 19:19:49 UTC 2010

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
- return EIO if audio data is received and /dev/pad isn't open
- give a better description for AUDIO_GETDEV


To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.15 src/sys/dev/pad/pad.c:1.16
--- src/sys/dev/pad/pad.c:1.15	Mon Jun 28 17:45:08 2010
+++ src/sys/dev/pad/pad.c	Fri Sep  3 19:19:48 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.15 2010/06/28 17:45:08 pooka Exp $ */
+/* $NetBSD: pad.c,v 1.16 2010/09/03 19:19:48 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill jmcne...@invisible.ca
@@ -27,7 +27,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: pad.c,v 1.15 2010/06/28 17:45:08 pooka Exp $);
+__KERNEL_RCSID(0, $NetBSD: pad.c,v 1.16 2010/09/03 19:19:48 jmcneill Exp $);
 
 #include sys/types.h
 #include sys/param.h
@@ -54,12 +54,6 @@
 
 extern struct cfdriver pad_cd;
 
-static struct audio_device pad_device = {
-	Pseudo Audio,
-	1.0,
-	pad,
-};
-
 typedef struct pad_block {
 	uint8_t		*pb_ptr;
 	int		pb_len;
@@ -181,6 +175,9 @@
 {
 	int l;
 
+	if (sc-sc_open == 0)
+		return EIO;
+
 	if (sc-sc_buflen + blksize  PAD_BUFSIZE)
 		return ENOBUFS;
 
@@ -476,8 +473,9 @@
 static int
 pad_getdev(void *opaque, struct audio_device *ret)
 {
-
-	*ret = pad_device;
+	strlcpy(ret-name, Virtual Audio, sizeof(ret-name));
+	strlcpy(ret-version, osrelease, sizeof(ret-version));
+	strlcpy(ret-config, pad, sizeof(ret-config));
 
 	return 0;
 }



CVS commit: src/sys/dev/pad

2010-06-28 Thread Antti Kantee
Module Name:src
Committed By:   pooka
Date:   Mon Jun 28 17:45:08 UTC 2010

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
Don't print spammy message if read is interrupted (ctrl-c)
while waiting for data.


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.14 src/sys/dev/pad/pad.c:1.15
--- src/sys/dev/pad/pad.c:1.14	Sat May  1 23:40:21 2010
+++ src/sys/dev/pad/pad.c	Mon Jun 28 17:45:08 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.14 2010/05/01 23:40:21 pooka Exp $ */
+/* $NetBSD: pad.c,v 1.15 2010/06/28 17:45:08 pooka Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill jmcne...@invisible.ca
@@ -27,7 +27,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: pad.c,v 1.14 2010/05/01 23:40:21 pooka Exp $);
+__KERNEL_RCSID(0, $NetBSD: pad.c,v 1.15 2010/06/28 17:45:08 pooka Exp $);
 
 #include sys/types.h
 #include sys/param.h
@@ -359,8 +359,10 @@
 			hz/100);
 			if (err != 0  err != EWOULDBLOCK) {
 mutex_exit(sc-sc_mutex);
-aprint_error_dev(sc-sc_dev,
-cv_timedwait_sig returned %d\n, err);
+if (err != ERESTART)
+	aprint_error_dev(sc-sc_dev,
+	cv_timedwait_sig returned %d\n,
+	err);
 return EINTR;
 			}
 			intr = sc-sc_intr;



CVS commit: src/sys/dev/pad

2010-04-09 Thread Adam Hoka
Module Name:src
Committed By:   ahoka
Date:   Fri Apr  9 13:39:17 UTC 2010

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
Add support to be built as a kernel module.


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.12 src/sys/dev/pad/pad.c:1.13
--- src/sys/dev/pad/pad.c:1.12	Mon Jan 18 23:57:14 2010
+++ src/sys/dev/pad/pad.c	Fri Apr  9 13:39:17 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.12 2010/01/18 23:57:14 dyoung Exp $ */
+/* $NetBSD: pad.c,v 1.13 2010/04/09 13:39:17 ahoka Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill jmcne...@invisible.ca
@@ -27,7 +27,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: pad.c,v 1.12 2010/01/18 23:57:14 dyoung Exp $);
+__KERNEL_RCSID(0, $NetBSD: pad.c,v 1.13 2010/04/09 13:39:17 ahoka Exp $);
 
 #include sys/types.h
 #include sys/param.h
@@ -41,6 +41,7 @@
 #include sys/select.h
 #include sys/audioio.h
 #include sys/vnode.h
+#include sys/module.h
 
 #include dev/audio_if.h
 #include dev/audiovar.h
@@ -566,3 +567,100 @@
 {
 	return PAD_BLKSIZE;
 }
+
+#ifdef _MODULE
+
+MODULE(MODULE_CLASS_DRIVER, pad, NULL);
+
+static const struct cfiattrdata audiobuscf_iattrdata = {
+	audiobus, 0, { { NULL, NULL, 0 }, }
+};
+static const struct cfiattrdata * const pad_attrs[] = {
+	audiobuscf_iattrdata, NULL
+};
+
+CFDRIVER_DECL(pad, DV_DULL, pad_attrs);
+extern struct cfattach pad_ca;
+static int padloc[] = { -1, -1 };
+
+static struct cfdata pad_cfdata[] = {
+	{
+		.cf_name = pad,
+		.cf_atname = pad,
+		.cf_unit = 0,
+		.cf_fstate = FSTATE_STAR,
+		.cf_loc = padloc,
+		.cf_flags = 0,
+		.cf_pspec = NULL,
+	},
+	{ NULL }
+};
+
+static int
+pad_modcmd(modcmd_t cmd, void *arg)
+{
+	devmajor_t cmajor = NODEVMAJOR, bmajor = NODEVMAJOR;
+	int error, s;
+
+	switch (cmd) {
+	case MODULE_CMD_INIT:
+		error = config_cfdriver_attach(pad_cd);
+		if (error) {
+			return error;
+		}
+
+		error = config_cfattach_attach(pad_cd.cd_name, pad_ca);
+		if (error) {
+			config_cfdriver_detach(pad_cd);
+			aprint_error(%s: unable to register cfattach\n,
+pad_cd.cd_name);
+
+			return error;
+		}
+
+		s = splaudio();
+		error = config_cfdata_attach(pad_cfdata, 1);
+		splx(s);
+		if (error) {
+			config_cfattach_detach(pad_cd.cd_name, pad_ca);
+			config_cfdriver_detach(pad_cd);
+			aprint_error(%s: unable to register cfdata\n,
+pad_cd.cd_name);
+
+			return error;
+		}
+
+		error = devsw_attach(pad_cd.cd_name, NULL, bmajor, pad_cdevsw, cmajor);
+		if (error) {
+			error = config_cfdata_detach(pad_cfdata);
+			if (error) {
+return error;
+			}
+			config_cfattach_detach(pad_cd.cd_name, pad_ca);
+			config_cfdriver_detach(pad_cd);
+			aprint_error(%s: unable to register devsw\n,
+pad_cd.cd_name);
+
+			return error;
+		}
+
+		(void)config_attach_pseudo(pad_cfdata);
+
+		return 0;
+	case MODULE_CMD_FINI:
+		error = config_cfdata_detach(pad_cfdata);
+		if (error) {
+			return error;
+		}
+
+		config_cfattach_detach(pad_cd.cd_name, pad_ca);
+		config_cfdriver_detach(pad_cd);
+		devsw_detach(NULL, pad_cdevsw);
+
+		return 0;
+	default:
+		return ENOTTY;
+	}
+}
+
+#endif



CVS commit: src/sys/dev/pad

2010-01-18 Thread David Young
Module Name:src
Committed By:   dyoung
Date:   Mon Jan 18 23:57:14 UTC 2010

Modified Files:
src/sys/dev/pad: pad.c

Log Message:
If the device does not exist, return ENXIO, as is customary, instead of
ENODEV.  Ok jmcne...@.


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/sys/dev/pad/pad.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/pad/pad.c
diff -u src/sys/dev/pad/pad.c:1.11 src/sys/dev/pad/pad.c:1.12
--- src/sys/dev/pad/pad.c:1.11	Sat Mar 14 11:08:28 2009
+++ src/sys/dev/pad/pad.c	Mon Jan 18 23:57:14 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: pad.c,v 1.11 2009/03/14 11:08:28 ad Exp $ */
+/* $NetBSD: pad.c,v 1.12 2010/01/18 23:57:14 dyoung Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill jmcne...@invisible.ca
@@ -27,7 +27,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: pad.c,v 1.11 2009/03/14 11:08:28 ad Exp $);
+__KERNEL_RCSID(0, $NetBSD: pad.c,v 1.12 2010/01/18 23:57:14 dyoung Exp $);
 
 #include sys/types.h
 #include sys/param.h
@@ -297,7 +297,7 @@
 
 	sc = device_lookup_private(pad_cd, PADUNIT(dev));
 	if (sc == NULL)
-		return ENODEV;
+		return ENXIO;
 
 	if (sc-sc_open++) {
 		sc-sc_open--;
@@ -314,7 +314,7 @@
 
 	sc = device_lookup_private(pad_cd, PADUNIT(dev));
 	if (sc == NULL)
-		return ENODEV;
+		return ENXIO;
 
 	KASSERT(sc-sc_open  0);
 	sc-sc_open--;
@@ -333,7 +333,7 @@
 
 	sc = device_lookup_private(pad_cd, PADUNIT(dev));
 	if (sc == NULL)
-		return ENODEV;
+		return ENXIO;
 
 	err = 0;
 



CVS commit: src/sys/dev/pad

2009-09-08 Thread Jared D. McNeill
Module Name:src
Committed By:   jmcneill
Date:   Tue Sep  8 09:47:43 UTC 2009

Modified Files:
src/sys/dev/pad: files.pad

Log Message:
PR# kern/39899: audio attach with pad(4) segfaults

Make sure pad pulls in auconv mulaw support.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/dev/pad/files.pad

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/pad/files.pad
diff -u src/sys/dev/pad/files.pad:1.3 src/sys/dev/pad/files.pad:1.4
--- src/sys/dev/pad/files.pad:1.3	Tue Jun 10 12:49:16 2008
+++ src/sys/dev/pad/files.pad	Tue Sep  8 09:47:42 2009
@@ -1,5 +1,5 @@
-# $NetBSD: files.pad,v 1.3 2008/06/10 12:49:16 drochner Exp $
+# $NetBSD: files.pad,v 1.4 2009/09/08 09:47:42 jmcneill Exp $
 
-defpseudodev pad: audiobus, auconv, aurateconv
+defpseudodev pad: audiobus, auconv, aurateconv, mulaw
 file	dev/pad/pad.c		pad
 file	dev/pad/padvol.c	pad