• Karol Kosik's avatar
    ALSA: usb-audio: Support multiple control interfaces · 6aa87001
    Karol Kosik authored
    Registering Numark Party Mix II fails with error 'bogus bTerminalLink 1'.
    The problem stems from the driver not being able to find input/output
    terminals required to configure audio streaming. The information about
    those terminals is stored in AudioControl Interface. Numark device
    contains 2 AudioControl Interfaces and the driver checks only one of them.
    
    According to the USB standard, a device can have multiple audio functions,
    each represented by Audio Interface Collection. Every audio function is
    considered to be closed box and will contain unique AudioControl Interface
    and zero or more AudioStreaming and MIDIStreaming Interfaces.
    
    The Numark device adheres to the standard and defines two audio functions:
    - MIDIStreaming function
    - AudioStreaming function
    It starts with MIDI function, followed by the audio function. The driver
    saves the first AudioControl Interface in `snd_usb_audio` structure
    associated with the entire device. It then attempts to use this interface
    to query for terminals and clocks. However, this fails because the correct
    information is stored in the second AudioControl Interface, defined in the
    second Audio Interface Collection.
    
    This patch introduces a structure holding association between each
    MIDI/Audio Interface and its corresponding AudioControl Interface,
    instead of relying on AudioControl Interface defined for the entire
    device. This structure is populated during usb probing phase and leveraged
    later when querying for terminals and when sending USB requests.
    
    Alternative solutions considered include:
    - defining a quirk for Numark where the order of interface is manually
    changed, or terminals are hardcoded in the driver. This solution would
    have fixed only this model, though it seems that device is USB compliant,
    and it also seems that other devices from this company may be affected.
    What's more, it looks like products from other manufacturers have similar
    problems, i.e. Rane One DJ console
    - keeping a list of all AudioControl Interfaces and querying all of them
    to find required information. That would have solved my problem and have
    low probability of breaking other devices, as we would always start with
    the same logic of querying first AudioControl Interface. This solution
    would not have followed the standard though.
    
    This patch preserves the `snd_usb_audio.ctrl_intf` variable, which holds
    the first AudioControl Interface, and uses it as a fallback when some
    interfaces are not parsed correctly and lack an associated AudioControl
    Interface, i.e., when configured via quirks.
    
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=217865Signed-off-by: default avatarKarol Kosik <k.kosik@outlook.com>
    Link: https://patch.msgid.link/AS8P190MB1285893F4735C8B32AD3886BEC852@AS8P190MB1285.EURP190.PROD.OUTLOOK.COMSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    6aa87001
helper.h 1.51 KB