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@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