Subject: [PATCH] [UBUNTU:sound/pci/ca0106/] Fix error
handling for nonexistent mpu401 interface (ca0106 driver)
UpstreamStatus: Not merged
This commit covers the ca0106 driver, which I inadvertently
missed in a
grep output for the last set of fixes for Malone #34831.
Signed-off-by: Daniel T Chen <crimsun ubuntu.com>
---
sound/pci/ca0106/ca_midi.c | 35
+++++++++++++++++++++++++++--------
1 files changed, 27 insertions(+), 8 deletions(-)
38b60a8996a26c82c4166c2f6398901a7243f768
diff --git a/sound/pci/ca0106/ca_midi.c
b/sound/pci/ca0106/ca_midi.c
index 2e08b27..7f42270 100644
--- a/sound/pci/ca0106/ca_midi.c
+++ b/sound/pci/ca0106/ca_midi.c
 -86,7
+86,7  static void ca_midi_interrupt(ca_midi_t
}
-static void ca_midi_cmd(ca_midi_t *midi, unsigned char cmd,
int ack)
+static int ca_midi_cmd(ca_midi_t *midi, unsigned char cmd,
int ack)
{
unsigned long flags;
int timeout, ok;
 -111,12
+111,15  static void ca_midi_cmd(ca_midi_t *midi,
ok = 1;
}
spin_unlock_irqrestore(&midi->input_lock, flags);
- if (!ok)
+ if (!ok) {
snd_printk(KERN_ERR "ca_midi_cmd: 0x%x failed at
0x%x (status = 0x%x, data = 0x%x)!!!\n",
cmd,
midi->get_dev_id_port(midi->dev_id),
ca_midi_read_stat(midi),
ca_midi_read_data(midi));
+ return 1;
+ }
+ return 0;
}
static int ca_midi_input_open(snd_rawmidi_substream_t *
substream)
 -130,12
+133,17  static int ca_midi_input_open(snd_rawmid
midi->substream_input = substream;
if (!(midi->midi_mode & CA_MIDI_MODE_OUTPUT)) {
spin_unlock_irqrestore(&midi->open_lock, flags);
- ca_midi_cmd(midi, midi->reset, 1);
- ca_midi_cmd(midi, midi->enter_uart, 1);
+ if (ca_midi_cmd(midi, midi->reset, 1))
+ goto error_out;
+ if (ca_midi_cmd(midi, midi->enter_uart, 1))
+ goto error_out;
} else {
spin_unlock_irqrestore(&midi->open_lock, flags);
}
return 0;
+
+error_out:
+ return -EIO;
}
static int ca_midi_output_open(snd_rawmidi_substream_t *
substream)
 -149,18
+157,24  static int ca_midi_output_open(snd_rawmi
midi->substream_output = substream;
if (!(midi->midi_mode & CA_MIDI_MODE_INPUT)) {
spin_unlock_irqrestore(&midi->open_lock, flags);
- ca_midi_cmd(midi, midi->reset, 1);
- ca_midi_cmd(midi, midi->enter_uart, 1);
+ if (ca_midi_cmd(midi, midi->reset, 1))
+ goto error_out;
+ if (ca_midi_cmd(midi, midi->enter_uart, 1))
+ goto error_out;
} else {
spin_unlock_irqrestore(&midi->open_lock, flags);
}
return 0;
+
+error_out:
+ return -EIO;
}
static int ca_midi_input_close(snd_rawmidi_substream_t *
substream)
{
ca_midi_t *midi = (ca_midi_t
*)substream->rmidi->private_data;
unsigned long flags;
+ int err = 0;
snd_assert(midi->dev_id, return -ENXIO);
spin_lock_irqsave(&midi->open_lock, flags);
 -169,10
+183,12  static int ca_midi_input_close(snd_rawmi
midi->substream_input = NULL;
if (!(midi->midi_mode & CA_MIDI_MODE_OUTPUT)) {
spin_unlock_irqrestore(&midi->open_lock, flags);
- ca_midi_cmd(midi, midi->reset, 0);
+ err = ca_midi_cmd(midi, midi->reset, 0);
} else {
spin_unlock_irqrestore(&midi->open_lock, flags);
}
+ if (err)
+ return -EIO;
return 0;
}
 -180,6
+196,7  static int ca_midi_output_close(snd_rawm
{
ca_midi_t *midi = (ca_midi_t
*)substream->rmidi->private_data;
unsigned long flags;
+ int err = 0;
snd_assert(midi->dev_id, return -ENXIO);
spin_lock_irqsave(&midi->open_lock, flags);
 -190,10
+207,12  static int ca_midi_output_close(snd_rawm
if (!(midi->midi_mode & CA_MIDI_MODE_INPUT)) {
spin_unlock_irqrestore(&midi->open_lock, flags);
- ca_midi_cmd(midi, midi->reset, 0);
+ err = ca_midi_cmd(midi, midi->reset, 0);
} else {
spin_unlock_irqrestore(&midi->open_lock, flags);
}
+ if (err)
+ return -EIO;
return 0;
}
--
1.1.3
--
Daniel T. Chen crimsun ubuntu.com
GPG key: www.sh.nu/~crimsun/pubkey.gpg.asc
--
kernel-team mailing list
kernel-team lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/kernel-team
|