CVS commit: src/sys/dev/pad
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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