At Wed, 24 Apr 2013 19:38:42 +0200, Daniel Mack wrote: > > The USB_DT_CS_ENDPOINT class-specific endpoint descriptor is usually > stuffed directly after the standard USB endpoint descriptor, and this is > where the driver currently expects it to be. > > There are, however, devices in the wild that have it the other way > around in their descriptor sets, so the USB_DT_CS_ENDPOINT comes > *before* the standard enpoint. Devices known to implement it that way > are "Sennheiser BTD-500" and Plantronics USB headsets. > > When the driver can't find the USB_DT_CS_ENDPOINT, it won't be able to > change sample rates, as the bitmask for the validity of this command is > storen in bmAttributes of that descriptor. > > Fix this by searching the entire interface instead of just the extra > bytes of the first endpoint, in case the latter fails. > > Signed-off-by: Daniel Mack <zonque@xxxxxxxxx> > Reported-and-tested-by: Torstein Hegge <hegge@xxxxxxxxxxx> > Reported-and-tested-by: Yves G <alsa-user@xxxxxxxxxxxx> > Cc: stable@xxxxxxxxxx Applied. Thanks. Takashi > --- > sound/usb/stream.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/sound/usb/stream.c b/sound/usb/stream.c > index 8951f77..7db2f89 100644 > --- a/sound/usb/stream.c > +++ b/sound/usb/stream.c > @@ -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" > -- > 1.8.1.4 > ------------------------------------------------------------------------------ Try New Relic Now & We'll Send You this Cool Shirt New Relic is the only SaaS-based application performance monitoring service that delivers powerful full stack analytics. Optimize and monitor your browser, app, & servers with just a few lines of code. Try New Relic and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_apr _______________________________________________ Alsa-user mailing list Alsa-user@xxxxxxxxxxxxxxxxxxxxx https://lists.sourceforge.net/lists/listinfo/alsa-user