[alsa-devel] [git pull] bugfix for 3.7
Takashi Iwai
tiwai at suse.de
Mon Nov 19 11:00:15 CET 2012
At Sun, 18 Nov 2012 17:58:00 +0100,
Clemens Ladisch wrote:
>
> The following change since commit a0d271cbfed1dd50278c6b06bead3d00ba0a88f9:
>
> Linux 3.6 (2012-09-30 16:47:46 -0700)
>
> is available in the git repository at:
>
> git://git.alsa-project.org/alsa-kprivate.git usb-midi-fix-3.7
>
> for you to fetch up to e99ddfde6ae0dd2662bb40435696002b590e4057:
>
> ALSA: ua101, usx2y: fix broken MIDI output (2012-11-18 17:15:24 +0100)
>
> ----------------------------------------------------------------
> ALSA: ua101, usx2y: fix broken MIDI output
>
> Commit 88a8516a2128 (ALSA: usbaudio: implement USB autosuspend) added
> autosuspend code to all files making up the snd-usb-audio driver.
> However, midi.c is part of snd-usb-lib and is also used by other
> drivers, not all of which support autosuspend. Thus, calls to
> usb_autopm_get_interface() could fail, and this unexpected error would
> result in the MIDI output being completely unusable.
>
> Make it work by ignoring the error that is expected with drivers that do
> not support autosuspend.
>
> Reported-by: Colin Fletcher <colin.m.fletcher at googlemail.com>
> Reported-by: Devin Venable <venable.devin at gmail.com>
> Reported-by: Dr Nick Bailey <nicholas.bailey at glasgow.ac.uk>
> Reported-by: Jannis Achstetter <jannis_achstetter at web.de>
> Reported-by: Rui Nuno Capela <rncbc at rncbc.org>
> Cc: Oliver Neukum <oliver at neukum.org>
> Cc: 2.6.39+ <stable at vger.kernel.org>
> Signed-off-by: Clemens Ladisch <clemens at ladisch.de>
Thanks, pulled now.
Takashi
> ---
> sound/usb/midi.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/sound/usb/midi.c b/sound/usb/midi.c
> index c83f614..eeefbce 100644
> --- a/sound/usb/midi.c
> +++ b/sound/usb/midi.c
> @@ -148,6 +148,7 @@ struct snd_usb_midi_out_endpoint {
> struct snd_usb_midi_out_endpoint* ep;
> struct snd_rawmidi_substream *substream;
> int active;
> + bool autopm_reference;
> uint8_t cable; /* cable number << 4 */
> uint8_t state;
> #define STATE_UNKNOWN 0
> @@ -1076,7 +1077,8 @@ static int snd_usbmidi_output_open(struct snd_rawmidi_substream *substream)
> return -ENXIO;
> }
> err = usb_autopm_get_interface(umidi->iface);
> - if (err < 0)
> + port->autopm_reference = err >= 0;
> + if (err < 0 && err != -EACCES)
> return -EIO;
> substream->runtime->private_data = port;
> port->state = STATE_UNKNOWN;
> @@ -1087,9 +1089,11 @@ static int snd_usbmidi_output_open(struct snd_rawmidi_substream *substream)
> static int snd_usbmidi_output_close(struct snd_rawmidi_substream *substream)
> {
> struct snd_usb_midi* umidi = substream->rmidi->private_data;
> + struct usbmidi_out_port *port = substream->runtime->private_data;
>
> substream_open(substream, 0);
> - usb_autopm_put_interface(umidi->iface);
> + if (port->autopm_reference)
> + usb_autopm_put_interface(umidi->iface);
> return 0;
> }
>
More information about the Alsa-devel
mailing list