[PATCH] [UBUNTU:sound/pci/ca0106/] Fix error handling for nonexistent mpu401 interface (ca0106 driver)

crimsun at fungus.sh.nu crimsun at fungus.sh.nu
Fri May 12 20:03:33 UTC 2006


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 at 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 at ubuntu.com
GPG key:   www.sh.nu/~crimsun/pubkey.gpg.asc
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20060512/676256c1/attachment.sig>


More information about the kernel-team mailing list