Commit 1762a59d8e8b5e99f6f4a0f292b40f3cacb108ba

Authored by Martin Schwenke
Committed by Takashi Iwai
1 parent b7838c2b91

ALSA: usb-audio: Add quirk for Focusrite Scarlett 18i6

Probing this device currently fails in snd_usb_audio_probe() because
the call to snd_usb_create_mixer() fails.  This is due to unknown or
non-standard interface descriptor subtypes in parse_audio_unit():

  usbaudio: unit 51: unexpected type 0x09
  snd-usb-audio: probe of 1-8:1.0 failed with error -5

Some people are working around this by recompiling usb-audio with the
call to snd_usb_create_mixer() commented out.  It would be nice to
avoid that.

While the best idea would be to look into the mixer creation failure,
a reasonable short-term solution is to use quirks to only probe the
trouble-free interfaces.  This allows audio and MIDI interfaces to be
used without any obvious issues.

Interface 0 is the main one to ignore.  It contains lots of
control-fu, including the unexpected interface descriptor subtypes.
Interface 5 is for firmware updates and I'm not sure how to get
support for this.  Interface 3 is some sort of control interface that
I don't understand:

    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        3
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      1 Control Device
      bInterfaceProtocol      0
      iInterface              0
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      1 (HEADER)
        bcdADC               1.00
        wTotalLength            9
        bInCollection           1
        baInterfaceNr( 0)       1

Signed-off-by: Martin Schwenke <martin@meltin.net>
Signed-off-by: Takashi Iwai <tiwai@suse.de>

Showing 1 changed file with 52 additions and 0 deletions Side-by-side Diff

sound/usb/quirks-table.h
... ... @@ -2957,6 +2957,58 @@
2957 2957  
2958 2958 {
2959 2959 /*
  2960 + * Focusrite Scarlett 18i6
  2961 + *
  2962 + * Avoid mixer creation, which otherwise fails because some of
  2963 + * the interface descriptor subtypes for interface 0 are
  2964 + * unknown. That should be fixed or worked-around but this at
  2965 + * least allows the device to be used successfully with a DAW
  2966 + * and an external mixer. See comments below about other
  2967 + * ignored interfaces.
  2968 + */
  2969 + USB_DEVICE(0x1235, 0x8004),
  2970 + .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
  2971 + .vendor_name = "Focusrite",
  2972 + .product_name = "Scarlett 18i6",
  2973 + .ifnum = QUIRK_ANY_INTERFACE,
  2974 + .type = QUIRK_COMPOSITE,
  2975 + .data = & (const struct snd_usb_audio_quirk[]) {
  2976 + {
  2977 + /* InterfaceSubClass 1 (Control Device) */
  2978 + .ifnum = 0,
  2979 + .type = QUIRK_IGNORE_INTERFACE
  2980 + },
  2981 + {
  2982 + .ifnum = 1,
  2983 + .type = QUIRK_AUDIO_STANDARD_INTERFACE
  2984 + },
  2985 + {
  2986 + .ifnum = 2,
  2987 + .type = QUIRK_AUDIO_STANDARD_INTERFACE
  2988 + },
  2989 + {
  2990 + /* InterfaceSubClass 1 (Control Device) */
  2991 + .ifnum = 3,
  2992 + .type = QUIRK_IGNORE_INTERFACE
  2993 + },
  2994 + {
  2995 + .ifnum = 4,
  2996 + .type = QUIRK_MIDI_STANDARD_INTERFACE
  2997 + },
  2998 + {
  2999 + /* InterfaceSubClass 1 (Device Firmware Update) */
  3000 + .ifnum = 5,
  3001 + .type = QUIRK_IGNORE_INTERFACE
  3002 + },
  3003 + {
  3004 + .ifnum = -1
  3005 + }
  3006 + }
  3007 + }
  3008 +},
  3009 +
  3010 +{
  3011 + /*
2960 3012 * Some USB MIDI devices don't have an audio control interface,
2961 3013 * so we have to grab MIDI streaming interfaces here.
2962 3014 */