diff options
author | tanimura <tanimura@FreeBSD.org> | 2001-02-26 07:36:24 +0000 |
---|---|---|
committer | tanimura <tanimura@FreeBSD.org> | 2001-02-26 07:36:24 +0000 |
commit | b098573911bf8db046354234d13bbcd5291c761b (patch) | |
tree | 81d94790069a31a64b83c78ad7c57f8dea1414a0 /sys/dev/sound/isa/emu8000.c | |
parent | 377d1812e106143d2710c3701ddd668db9d0108a (diff) | |
download | FreeBSD-src-b098573911bf8db046354234d13bbcd5291c761b.zip FreeBSD-src-b098573911bf8db046354234d13bbcd5291c761b.tar.gz |
- Mutexify midi(4). The driver runs under the giant lock by default.
If you ever want to run midi(4) out of the giant lock, uncomment
MIDI_OUTOFGIANT in midi.h. Confirmed to work for csamidi with WITNESS
and INVARIANTS.
- midi_info, midi_open and seq_info are now tailqs, allowing arbitrary
numbers of devices to be configured.
- Do not send an active sensing message to reset midi modules.
- Clone /dev/sequencer*. /dev/sequencer0 and /dev/sequencer are generated
upon initialization.
Diffstat (limited to 'sys/dev/sound/isa/emu8000.c')
-rw-r--r-- | sys/dev/sound/isa/emu8000.c | 75 |
1 files changed, 7 insertions, 68 deletions
diff --git a/sys/dev/sound/isa/emu8000.c b/sys/dev/sound/isa/emu8000.c index 0efb05c..7067a8f 100644 --- a/sys/dev/sound/isa/emu8000.c +++ b/sys/dev/sound/isa/emu8000.c @@ -383,8 +383,6 @@ static int emupnp_attach(device_t dev) __unused; static d_open_t emu_open; static d_close_t emu_close; -static d_read_t emu_read; -static d_write_t emu_write; static d_ioctl_t emu_ioctl; static midi_callback_t emu_callback; @@ -397,6 +395,8 @@ struct emu_softc { device_t dev; /* device information */ mididev_info *devinfo; /* midi device information */ + struct mtx mtx; /* Mutex to protect a device */ + struct resource *io[3]; /* Base of io port */ int io_rid[3]; /* Io resource ID */ @@ -518,11 +518,7 @@ mididev_info emu_op_desc = { emu_open, emu_close, - emu_read, - emu_write, emu_ioctl, - NULL, - emu_callback, MIDI_BUFFSIZE, /* Queue Length */ @@ -723,23 +719,17 @@ emu_attach(device_t dev) emu_writehwcf3(scp, 0x0004); /* Fill the softc for this unit. */ - scp->devinfo = devinfo = create_mididev_info_unit(&unit, MDT_SYNTH); bcopy(&emu_synthinfo, &scp->synthinfo, sizeof(emu_synthinfo)); + mtx_init(&scp->mtx, "emumid", MTX_DEF); + scp->devinfo = devinfo = create_mididev_info_unit(MDT_SYNTH, &emu_op_desc, &midisynth_op_desc); /* Fill the midi info. */ - bcopy(&emu_op_desc, devinfo, sizeof(emu_op_desc)); - midiinit(devinfo, dev); - devinfo->flags = 0; - bcopy(&midisynth_op_desc, &devinfo->synth, sizeof(midisynth_op_desc)); devinfo->synth.readraw = emu_readraw; devinfo->synth.writeraw = emu_writeraw; snprintf(devinfo->midistat, sizeof(devinfo->midistat), "at 0x%x, 0x%x, 0x%x", (u_int)rman_get_start(scp->io[0]), (u_int)rman_get_start(scp->io[1]), (u_int)rman_get_start(scp->io[2])); - /* Init the queue. */ - devinfo->midi_dbuf_in.unit_size = devinfo->midi_dbuf_out.unit_size = 1; - midibuf_init(&devinfo->midi_dbuf_in); - midibuf_init(&devinfo->midi_dbuf_out); + midiinit(devinfo, dev); DEB(printf("emu%d: attached.\n", unit)); @@ -765,59 +755,6 @@ emu_close(dev_t i_dev, int flags, int mode, struct proc *p) } static int -emu_read(dev_t i_dev, struct uio *buf, int flag) -{ - sc_p scp; - mididev_info *devinfo; - int unit/*, s, len, ret*/; - - unit = MIDIUNIT(i_dev); - - devinfo = get_mididev_info(i_dev, &unit); - if (devinfo == NULL) { - DEB(printf("emu_read: unit %d is not configured.\n", unit)); - return (ENXIO); - } - scp = devinfo->softc; - if ((devinfo->fflags & FREAD) == 0) { - DEB(printf("emu_read: unit %d is not for reading.\n", unit)); - return (EIO); - } - - /* Drain the data. */ - midibuf_init(&devinfo->midi_dbuf_in); - - return (0); -} - -static int -emu_write(dev_t i_dev, struct uio *buf, int flag) -{ - sc_p scp; - mididev_info *devinfo; - int unit/*, s, len, ret*/; - - unit = MIDIUNIT(i_dev); - - devinfo = get_mididev_info(i_dev, &unit); - if (devinfo == NULL) { - DEB(printf("emu_write: unit %d is not configured.\n", unit)); - return (ENXIO); - } - scp = devinfo->softc; - if ((devinfo->fflags & FWRITE) == 0) { - DEB(printf("emu_write: unit %d is not for writing.\n", unit)); - return (EIO); - } - - /* Drain the data. */ - midibuf_init(&devinfo->midi_dbuf_out); - midibuf_init(&devinfo->midi_dbuf_passthru); - - return (0); -} - -static int emu_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct proc *p) { sc_p scp; @@ -868,6 +805,8 @@ emu_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct proc *p) static int emu_callback(mididev_info *devinfo, int reason) { + mtx_assert(&devinfo->flagqueue_mtx, MA_OWNED); + return (0); } |