summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/isa/emu8000.c
diff options
context:
space:
mode:
authortanimura <tanimura@FreeBSD.org>2001-02-26 07:36:24 +0000
committertanimura <tanimura@FreeBSD.org>2001-02-26 07:36:24 +0000
commitb098573911bf8db046354234d13bbcd5291c761b (patch)
tree81d94790069a31a64b83c78ad7c57f8dea1414a0 /sys/dev/sound/isa/emu8000.c
parent377d1812e106143d2710c3701ddd668db9d0108a (diff)
downloadFreeBSD-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.c75
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);
}
OpenPOWER on IntegriCloud