|
@@ -393,6 +393,14 @@ static int parse_uac_endpoint_attributes(struct snd_usb_audio *chip,
|
|
|
if (!csep && altsd->bNumEndpoints >= 2)
|
|
|
csep = snd_usb_find_desc(alts->endpoint[1].extra, alts->endpoint[1].extralen, NULL, USB_DT_CS_ENDPOINT);
|
|
|
|
|
|
+ /*
|
|
|
+ * If we can't locate the USB_DT_CS_ENDPOINT descriptor in the extra
|
|
|
+ * bytes after the first endpoint, go search the entire interface.
|
|
|
+ * Some devices have it directly *before* the standard endpoint.
|
|
|
+ */
|
|
|
+ if (!csep)
|
|
|
+ csep = snd_usb_find_desc(alts->extra, alts->extralen, NULL, USB_DT_CS_ENDPOINT);
|
|
|
+
|
|
|
if (!csep || csep->bLength < 7 ||
|
|
|
csep->bDescriptorSubtype != UAC_EP_GENERAL) {
|
|
|
snd_printk(KERN_WARNING "%d:%u:%d : no or invalid"
|