Re: [PATCH] ALSA: snd-usb: try harder to find USB_DT_CS_ENDPOINT

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [ALSA Devel]     [Linux Audio Users]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]

  Powered by Linux