Module Name: src Committed By: riastradh Date: Sat Apr 16 11:12:21 UTC 2022
Modified Files: src/sys/dev: sequencer.c Log Message: sequencer(4): Sprinkle KNF. - Sort includes. - Nix trailing whitespace. - No parens for return. - Blank line between declarations and statements. - Note MP bug with unit allocation. No functional change intended. To generate a diff of this commit: cvs rdiff -u -r1.76 -r1.77 src/sys/dev/sequencer.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/sequencer.c diff -u src/sys/dev/sequencer.c:1.76 src/sys/dev/sequencer.c:1.77 --- src/sys/dev/sequencer.c:1.76 Thu Mar 31 19:30:15 2022 +++ src/sys/dev/sequencer.c Sat Apr 16 11:12:21 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: sequencer.c,v 1.76 2022/03/31 19:30:15 pgoyette Exp $ */ +/* $NetBSD: sequencer.c,v 1.77 2022/04/16 11:12:21 riastradh Exp $ */ /* * Copyright (c) 1998, 2008 The NetBSD Foundation, Inc. @@ -55,7 +55,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sequencer.c,v 1.76 2022/03/31 19:30:15 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sequencer.c,v 1.77 2022/04/16 11:12:21 riastradh Exp $"); #ifdef _KERNEL_OPT #include "sequencer.h" @@ -63,27 +63,29 @@ __KERNEL_RCSID(0, "$NetBSD: sequencer.c, #endif #include <sys/param.h> -#include <sys/ioctl.h> -#include <sys/fcntl.h> -#include <sys/vnode.h> -#include <sys/select.h> -#include <sys/poll.h> -#include <sys/kmem.h> -#include <sys/proc.h> -#include <sys/systm.h> -#include <sys/syslog.h> -#include <sys/kernel.h> -#include <sys/signalvar.h> -#include <sys/conf.h> +#include <sys/types.h> + +#include <sys/atomic.h> #include <sys/audioio.h> -#include <sys/midiio.h> +#include <sys/conf.h> #include <sys/device.h> +#include <sys/fcntl.h> #include <sys/intr.h> -#include <sys/atomic.h> -#include <sys/pcq.h> -#include <sys/vnode.h> +#include <sys/ioctl.h> #include <sys/kauth.h> +#include <sys/kernel.h> +#include <sys/kmem.h> +#include <sys/midiio.h> #include <sys/module.h> +#include <sys/pcq.h> +#include <sys/poll.h> +#include <sys/proc.h> +#include <sys/select.h> +#include <sys/signalvar.h> +#include <sys/syslog.h> +#include <sys/systm.h> +#include <sys/vnode.h> +#include <sys/vnode.h> #include <dev/midi_if.h> #include <dev/midivar.h> @@ -149,7 +151,8 @@ static void seq_timer_waitabs(struct seq static int seq_do_timing(struct sequencer_softc *, seq_event_t *); static int seq_do_local(struct sequencer_softc *, seq_event_t *); static int seq_do_sysex(struct sequencer_softc *, seq_event_t *); -static int seq_do_fullsize(struct sequencer_softc *, seq_event_t *, struct uio *); +static int seq_do_fullsize(struct sequencer_softc *, seq_event_t *, + struct uio *); static int seq_input_event(struct sequencer_softc *, seq_event_t *); static int seq_drain(struct sequencer_softc *); static void seq_startoutput(struct sequencer_softc *); @@ -168,7 +171,8 @@ static int midiseq_pgmchange(struct midi static int midiseq_chnpressure(struct midi_dev *, int, seq_event_t *); static int midiseq_ctlchange(struct midi_dev *, int, seq_event_t *); static int midiseq_pitchbend(struct midi_dev *, int, seq_event_t *); -static int midiseq_loadpatch(struct midi_dev *, struct sysex_info *, struct uio *); +static int midiseq_loadpatch(struct midi_dev *, struct sysex_info *, + struct uio *); void midiseq_in(struct midi_dev *, u_char *, int); static dev_type_open(sequenceropen); @@ -193,12 +197,14 @@ const struct cdevsw sequencer_cdevsw = { .d_discard = nodiscard, .d_flag = D_OTHER | D_MPSAFE }; -static LIST_HEAD(, sequencer_softc) sequencers = LIST_HEAD_INITIALIZER(sequencers); +static LIST_HEAD(, sequencer_softc) sequencers = + LIST_HEAD_INITIALIZER(sequencers); static kmutex_t sequencer_lock; static void sequencerdestroy(struct sequencer_softc *sc) { + callout_halt(&sc->sc_callout, &sc->lock); callout_destroy(&sc->sc_callout); softint_disestablish(sc->sih); @@ -214,6 +220,7 @@ static struct sequencer_softc * sequencercreate(int unit) { struct sequencer_softc *sc = kmem_zalloc(sizeof(*sc), KM_SLEEP); + sc->sc_unit = unit; callout_init(&sc->sc_callout, CALLOUT_MPSAFE); sc->sih = softint_establish(SOFTINT_NET | SOFTINT_MPSAFE, @@ -235,12 +242,14 @@ static struct sequencer_softc * sequencerget(int unit) { struct sequencer_softc *sc; + if (unit < 0) { #ifdef DIAGNOSTIC panic("%s: unit %d!", __func__, unit); #endif return NULL; } + mutex_enter(&sequencer_lock); LIST_FOREACH(sc, &sequencers, sc_link) { if (sc->sc_unit == unit) { @@ -249,18 +258,26 @@ sequencerget(int unit) } } mutex_exit(&sequencer_lock); + + /* + * XXXSMP -- nothing excludes another thread from creating the + * same unit here + */ if ((sc = sequencercreate(unit)) == NULL) return NULL; + mutex_enter(&sequencer_lock); LIST_INSERT_HEAD(&sequencers, sc, sc_link); mutex_exit(&sequencer_lock); + return sc; } #ifdef notyet -static void +static void sequencerput(struct sequencer_softc *sc) { + mutex_enter(&sequencer_lock); LIST_REMOVE(sc, sc_link); mutex_exit(&sequencer_lock); @@ -271,6 +288,7 @@ sequencerput(struct sequencer_softc *sc) void sequencerattach(int n) { + mutex_init(&sequencer_lock, MUTEX_DEFAULT, IPL_NONE); } @@ -297,6 +315,7 @@ sequencer_enter(dev_t dev, struct sequen /* First, find the device and take sc_lock. */ if ((sc = sequencerget(SEQUENCERUNIT(dev))) == NULL) return ENXIO; + mutex_enter(&sc->lock); while (sc->dvlock) { cv_wait(&sc->lchan, &sc->lock); @@ -400,7 +419,7 @@ seq_drain(struct sequencer_softc *sc) error = 0; while (!SEQ_QEMPTY(&sc->outq) && !error) error = cv_timedwait_sig(&sc->wchan, &sc->lock, 60*hz); - return (error); + return error; } static void @@ -493,7 +512,7 @@ sequencerclose(dev_t dev, int flags, int DPRINTF(("%s: %"PRIx64" done\n", __func__, dev)); - return (0); + return 0; } static int @@ -511,7 +530,7 @@ seq_input_event(struct sequencer_softc * cmd->unknown.byte[6])); q = &sc->inq; if (SEQ_QFULL(q)) - return (ENOMEM); + return ENOMEM; SEQ_QPUT(q, *cmd); cv_broadcast(&sc->rchan); selnotify(&sc->rsel, 0, NOTE_SUBMIT); @@ -652,7 +671,7 @@ sequencerwrite(dev_t dev, struct uio *ui int error; seq_event_t cmdbuf; int size; - + DPRINTFN(2, ("sequencerwrite: %"PRIx64", count=%d\n", dev, (int)uio->uio_resid)); @@ -869,6 +888,7 @@ sequencerpoll(dev_t dev, int events, str { struct sequencer_softc *sc; int revents = 0; + if ((sc = sequencerget(SEQUENCERUNIT(dev))) == NULL) return ENXIO; @@ -976,6 +996,7 @@ sequencerkqfilter(dev_t dev, struct knot { struct sequencer_softc *sc; struct selinfo *sip; + if ((sc = sequencerget(SEQUENCERUNIT(dev))) == NULL) return ENXIO; @@ -991,7 +1012,7 @@ sequencerkqfilter(dev_t dev, struct knot break; default: - return (EINVAL); + return EINVAL; } kn->kn_hook = sc; @@ -1000,7 +1021,7 @@ sequencerkqfilter(dev_t dev, struct knot selrecord_knote(sip, kn); mutex_exit(&sc->lock); - return (0); + return 0; } static void @@ -1051,11 +1072,11 @@ seq_do_command(struct sequencer_softc *s case SEQOLD_MIDIPUTC: dev = b->putc.device; if (dev < 0 || dev >= sc->nmidi) - return (ENXIO); + return ENXIO; return midiseq_out(sc->devs[dev], &b->putc.byte, 1, 0); default: DPRINTFN(-1,("seq_do_command: unimpl command %02x\n", b->tag)); - return (EINVAL); + return EINVAL; } } @@ -1139,7 +1160,7 @@ seq_do_local(struct sequencer_softc *sc, KASSERT(mutex_owned(&sc->lock)); - return (EINVAL); + return EINVAL; } static int @@ -1153,7 +1174,7 @@ seq_do_sysex(struct sequencer_softc *sc, dev = b->sysex.device; if (dev < 0 || dev >= sc->nmidi) - return (ENXIO); + return ENXIO; DPRINTF(("%s: dev=%d\n", __func__, dev)); md = sc->devs[dev]; @@ -1275,7 +1296,7 @@ seq_do_timing(struct sequencer_softc *sc error = EINVAL; break; } - return (error); + return error; } static int @@ -1293,10 +1314,10 @@ seq_do_fullsize(struct sequencer_softc * memcpy(&sysex, b, sizeof(*b)); dev = sysex.device_no; if (/* dev < 0 || */ dev >= sc->nmidi) - return (ENXIO); + return ENXIO; DPRINTFN(2, ("seq_do_fullsize: fmt=%04x, dev=%d, len=%d\n", sysex.key, dev, sysex.len)); - return (midiseq_loadpatch(sc->devs[dev], &sysex, uio)); + return midiseq_loadpatch(sc->devs[dev], &sysex, uio); } /* @@ -1429,7 +1450,7 @@ midiseq_open(int unit, int flags) dev_t dev; vnode_t *vp; int oflags; - + major = devsw_name2chr("midi", NULL, 0); dev = makedev(major, unit); @@ -1468,12 +1489,13 @@ midiseq_open(int unit, int flags) if (mi.props & MIDI_PROP_CAN_INPUT) md->capabilities |= SYNTH_CAP_INPUT; sc->seq_md = md; - return (md); + return md; } static void midiseq_close(struct midi_dev *md) { + DPRINTFN(2, ("midiseq_close: %d\n", md->unit)); (void)vn_close(md->vp, 0, kauth_cred_get()); kmem_free(md, sizeof(*md)); @@ -1504,6 +1526,7 @@ midiseq_out(struct midi_dev *md, u_char static int midiseq_noteon(struct midi_dev *md, int chan, int key, seq_event_t *ev) { + return midiseq_out(md, (uint8_t[]){ MIDI_NOTEON | chan, key, ev->c_NOTEON.velocity & 0x7f}, 3, 1); } @@ -1511,6 +1534,7 @@ midiseq_noteon(struct midi_dev *md, int static int midiseq_noteoff(struct midi_dev *md, int chan, int key, seq_event_t *ev) { + return midiseq_out(md, (uint8_t[]){ MIDI_NOTEOFF | chan, key, ev->c_NOTEOFF.velocity & 0x7f}, 3, 1); } @@ -1518,6 +1542,7 @@ midiseq_noteoff(struct midi_dev *md, int static int midiseq_keypressure(struct midi_dev *md, int chan, int key, seq_event_t *ev) { + return midiseq_out(md, (uint8_t[]){ MIDI_KEY_PRESSURE | chan, key, ev->c_KEY_PRESSURE.pressure & 0x7f}, 3, 1); @@ -1526,6 +1551,7 @@ midiseq_keypressure(struct midi_dev *md, static int midiseq_pgmchange(struct midi_dev *md, int chan, seq_event_t *ev) { + if (ev->c_PGM_CHANGE.program > 127) return EINVAL; return midiseq_out(md, (uint8_t[]){ @@ -1535,6 +1561,7 @@ midiseq_pgmchange(struct midi_dev *md, i static int midiseq_chnpressure(struct midi_dev *md, int chan, seq_event_t *ev) { + if (ev->c_CHN_PRESSURE.pressure > 127) return EINVAL; return midiseq_out(md, (uint8_t[]){ @@ -1544,6 +1571,7 @@ midiseq_chnpressure(struct midi_dev *md, static int midiseq_ctlchange(struct midi_dev *md, int chan, seq_event_t *ev) { + if (ev->c_CTL_CHANGE.controller > 127) return EINVAL; return midiseq_out( md, (uint8_t[]){ @@ -1555,6 +1583,7 @@ midiseq_ctlchange(struct midi_dev *md, i static int midiseq_pitchbend(struct midi_dev *md, int chan, seq_event_t *ev) { + return midiseq_out(md, (uint8_t[]){ MIDI_PITCH_BEND | chan, ev->c_PITCH_BEND.value & 0x7f, @@ -1572,7 +1601,7 @@ midiseq_loadpatch(struct midi_dev *md, if (sysex->key != SEQ_SYSEX_PATCH) { DPRINTFN(-1,("midiseq_loadpatch: bad patch key 0x%04x\n", sysex->key)); - return (EINVAL); + return EINVAL; } if (uio->uio_resid < sysex->len) /* adjust length, should be an error */ @@ -1655,13 +1684,13 @@ const struct cdevsw midi_cdevsw = { int midi_unit_count(void) { - return (0); + return 0; } static int midiopen(dev_t dev, int flags, int ifmt, struct lwp *l) { - return (ENXIO); + return ENXIO; } struct cfdriver midi_cd; @@ -1676,13 +1705,13 @@ midi_getinfo(dev_t dev, struct midi_info static int midiclose(dev_t dev, int flags, int ifmt, struct lwp *l) { - return (ENXIO); + return ENXIO; } int midi_writebytes(int unit, u_char *bf, int cc) { - return (ENXIO); + return ENXIO; } #endif /* NMIDI == 0 */