[alsa-devel] [PATCH v2] ALSA: snd-usb-audio: fixed mixer range reading during probing, when compiled with CONFIG_PM defined

Daniel Schürmann daschuer at mixxx.org
Wed Apr 24 20:34:58 CEST 2013


Hi Takashi,

I have tested you Idea, and It works fine as expected.
It is include a in the patch below.
I have also debugged deeper, and found out that there is still a scaling
issue of the Class 2 Mixer.
I will try to fix it in a separate patch.

Kind regards,

Daniel


2013/4/24 Daniel Schürmann <daschuer at mixxx.org>

> During probing, snd_usb_autoresume() fails with -ENODEV. This brakes
> get_ctl_value() in mixer.c when reading the range values. In the new
> version
> snd_usb_autoresume() returns 0 in this case which brakes not the following
> query. The following snd_usb_suspend() fails silently during probing
> anyway.
> The patch also makes the error messages more significant. The original
> error messages where identified as misleading during debug.
>
>
> Signed-off-by: Daniel Schürmann <daschuer at mixxx.org>
> ---
>  sound/usb/card.c  |    7 +++++--
>  sound/usb/mixer.c |   11 +++++++----
>  2 files changed, 12 insertions(+), 6 deletions(-)
>
> diff --git a/sound/usb/card.c b/sound/usb/card.c
> index 5254b18..2f55d00 100644
> --- a/sound/usb/card.c
> +++ b/sound/usb/card.c
> @@ -629,9 +629,12 @@ static void usb_audio_disconnect(struct usb_interface
> *intf)
>  int snd_usb_autoresume(struct snd_usb_audio *chip)
>  {
>         int err = -ENODEV;
> -
> +
> +       if (chip->probing) {
> +               return 0;
> +       }
>         down_read(&chip->shutdown_rwsem);
> -       if (!chip->shutdown && !chip->probing)
> +       if (!chip->shutdown)
>                 err = usb_autopm_get_interface(chip->pm_intf);
>         up_read(&chip->shutdown_rwsem);
>
> diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
> index ca4739c..5d4f3c6 100644
> --- a/sound/usb/mixer.c
> +++ b/sound/usb/mixer.c
> @@ -333,9 +333,12 @@ static int get_ctl_value_v2(struct
> usb_mixer_elem_info *cval, int request, int v
>
>         memset(buf, 0, sizeof(buf));
>
> -       ret = snd_usb_autoresume(chip) ? -EIO : 0;
> -       if (ret)
> +       ret = snd_usb_autoresume(chip);
> +       if (ret) {
> +               snd_printk(KERN_ERR "snd_usb_autoresume() failed with
> %d\n", ret);
> +               ret = -EIO;
>                 goto error;
> +       }
>
>         down_read(&chip->shutdown_rwsem);
>         if (chip->shutdown)
> @@ -351,8 +354,8 @@ static int get_ctl_value_v2(struct usb_mixer_elem_info
> *cval, int request, int v
>
>         if (ret < 0) {
>  error:
> -               snd_printk(KERN_ERR "cannot get ctl value: req = %#x,
> wValue = %#x, wIndex = %#x, type = %d\n",
> -                          request, validx, idx, cval->val_type);
> +               snd_printk(KERN_ERR "cannot get ctl value: req = %#x,
> wValue = %#x, wIndex = %#x, type = %d, ret = %d\n",
> +                          bRequest, validx, idx, cval->val_type, ret);
>                 return ret;
>         }
>
> --
> 1.7.9.5
>
>


More information about the Alsa-devel mailing list