[PATCH 3/3] ALSA: usb-audio: Properly match with audio interface class

Takashi Iwai tiwai at suse.de
Sat Aug 22 18:05:29 CEST 2020


On Sat, 22 Aug 2020 17:27:35 +0200,
Alexander Tsoy wrote:
> 
> В Пн, 17/08/2020 в 10:21 +0200, Takashi Iwai пишет:
> > There are a few entries in the quirk table that set the device ID
> > with
> > USB_DEVICE() macro while having an extra bInterfaceClass field.  But
> > bInterfaceClass field is never checked unless the proper match_flags
> > is set, so those may match incorrectly with all interfaces.
> > 
> > Introduce another macro to match with the vid/pid pair and the audio
> > class interface, and apply it to such entries, so that they can match
> > properly.
> > 
> > Signed-off-by: Takashi Iwai <tiwai at suse.de>
> > ---
> >  sound/usb/quirks-table.h | 55 +++++++++++++++++---------------------
> > ----------
> >  1 file changed, 19 insertions(+), 36 deletions(-)
> > 
> > diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h
> > index 988bb9d00192..7a80ef31bbe4 100644
> > --- a/sound/usb/quirks-table.h
> > +++ b/sound/usb/quirks-table.h
> > @@ -35,6 +35,14 @@
> >  	.bInterfaceClass = USB_CLASS_AUDIO, \
> >  	.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
> >  
> > +/* Another standard entry matching with vid/pid and the audio class
> > */
> > +#define USB_AUDIO_CLASS(vend, prod) \
> > +	.match_flags = USB_DEVICE_ID_MATCH_DEVICE | \
> > +		       USB_DEVICE_ID_MATCH_INT_CLASS, \
> > +	.idVendor = vend, \
> > +	.idProduct = prod, \
> > +	.bInterfaceClass = USB_CLASS_AUDIO
> > +
> >  /* FTDI devices */
> >  {
> >  	USB_DEVICE(0x0403, 0xb8d8),
> > @@ -68,34 +76,14 @@
> >  	}
> >  },
> >  
> > -{
> > -	/* E-Mu 0202 USB */
> > -	.match_flags = USB_DEVICE_ID_MATCH_DEVICE,
> > -	.idVendor = 0x041e,
> > -	.idProduct = 0x3f02,
> > -	.bInterfaceClass = USB_CLASS_AUDIO,
> > -},
> > -{
> > -	/* E-Mu 0404 USB */
> > -	.match_flags = USB_DEVICE_ID_MATCH_DEVICE,
> > -	.idVendor = 0x041e,
> > -	.idProduct = 0x3f04,
> > -	.bInterfaceClass = USB_CLASS_AUDIO,
> > -},
> > -{
> > -	/* E-Mu Tracker Pre */
> > -	.match_flags = USB_DEVICE_ID_MATCH_DEVICE,
> > -	.idVendor = 0x041e,
> > -	.idProduct = 0x3f0a,
> > -	.bInterfaceClass = USB_CLASS_AUDIO,
> > -},
> > -{
> > -	/* E-Mu 0204 USB */
> > -	.match_flags = USB_DEVICE_ID_MATCH_DEVICE,
> > -	.idVendor = 0x041e,
> > -	.idProduct = 0x3f19,
> > -	.bInterfaceClass = USB_CLASS_AUDIO,
> > -},
> > +/* E-Mu 0202 USB */
> > +{ USB_AUDIO_CLASS(0x041e, 0x3f02) },
> > +/* E-Mu 0404 USB */
> > +{ USB_AUDIO_CLASS(0x041e, 0x3f04) },
> > +/* E-Mu Tracker Pre */
> > +{ USB_AUDIO_CLASS(0x041e, 0x3f0a) },
> > +/* E-Mu 0204 USB */
> > +{ USB_AUDIO_CLASS(0x041e, 0x3f19) },
> >  
> >  /*
> >   * HP Wireless Audio
> > @@ -2751,10 +2739,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
> >  },
> >  
> >  /* KeithMcMillen Stringport */
> > -{
> > -	USB_DEVICE(0x1f38, 0x0001),
> > -	.bInterfaceClass = USB_CLASS_AUDIO,
> > -},
> > +{ USB_AUDIO_CLASS(0x1f38, 0x0001) },
> >  
> >  /* Miditech devices */
> >  {
> > @@ -2977,10 +2962,7 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge",
> > "HVR-950Q"),
> >  },
> >  {
> >  	/* Tascam US122 MKII - playback-only support */
> > -	.match_flags = USB_DEVICE_ID_MATCH_DEVICE,
> > -	.idVendor = 0x0644,
> > -	.idProduct = 0x8021,
> > -	.bInterfaceClass = USB_CLASS_AUDIO,
> > +	USB_AUDIO_CLASS(0x0644, 0x8021),
> >  	.driver_info = (unsigned long) &(const struct
> > snd_usb_audio_quirk) {
> >  		.vendor_name = "TASCAM",
> >  		.product_name = "US122 MKII",
> > @@ -3612,3 +3594,4 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge",
> > "HVR-950Q"),
> >  
> >  #undef USB_DEVICE_VENDOR_SPEC
> >  #undef USB_AUDIO_DEVICE
> > +#undef USB_AUDIO_CLASS
> 
> I don't know anything about KeithMcMillen Stringport, but all other
> devices (US122 MKII and E-mu) seems to have Vendor-specific Class.

OK, then it must be with USB_DEVICE_VENDOR_SPEC macro instead although
they had .bInterfaceClass = USB_CLASS_AUDIO line wrongly.
Could you submit the correction patch, or shall I fix in my side?

> And
> since the driver should already match all compliant devices, the only
> potentional use for USB_AUDIO_CLASS macro is for devices
> with bInterfaceClass = USB_CLASS_AUDIO and with some invalid
> bInterfaceSubClass.

The problem is that without the class match in addition to the device
id match, it would match too eagerly, e.g. if a USB device defines
multiple different classes with the same device id like HID and
video.  So we should restrict the matching as much as possible.


thanks,

Takashi


More information about the Alsa-devel mailing list