aboutsummaryrefslogtreecommitdiffstats
path: root/sound/usb/usbaudio.c
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2006-05-18 03:35:15 -0400
committerJaroslav Kysela <perex@suse.cz>2006-06-22 15:33:47 -0400
commitfaf8d11743961c720c85be191f8a08c00e5c5d60 (patch)
treec769a20e29e8fa2f43c4f01e410ed502bf9ecdef /sound/usb/usbaudio.c
parent474167d646cb2147b9fcd7bacf5cdf8177ed43c4 (diff)
[ALSA] usb-audio: add workaround for CSR Bluetooth Headphones (Saitek A-250)
Some devices don't have the required class-specific endpoint descriptors. Instead of making this case an error, this patch makes the driver guess the endpoint attributes. Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Diffstat (limited to 'sound/usb/usbaudio.c')
-rw-r--r--sound/usb/usbaudio.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c
index 8100516e1f79..770642a5953e 100644
--- a/sound/usb/usbaudio.c
+++ b/sound/usb/usbaudio.c
@@ -2627,9 +2627,10 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no)
2627 if (!csep && altsd->bNumEndpoints >= 2) 2627 if (!csep && altsd->bNumEndpoints >= 2)
2628 csep = snd_usb_find_desc(alts->endpoint[1].extra, alts->endpoint[1].extralen, NULL, USB_DT_CS_ENDPOINT); 2628 csep = snd_usb_find_desc(alts->endpoint[1].extra, alts->endpoint[1].extralen, NULL, USB_DT_CS_ENDPOINT);
2629 if (!csep || csep[0] < 7 || csep[2] != EP_GENERAL) { 2629 if (!csep || csep[0] < 7 || csep[2] != EP_GENERAL) {
2630 snd_printk(KERN_ERR "%d:%u:%d : no or invalid class specific endpoint descriptor\n", 2630 snd_printk(KERN_WARN "%d:%u:%d : no or invalid"
2631 " class specific endpoint descriptor\n",
2631 dev->devnum, iface_no, altno); 2632 dev->devnum, iface_no, altno);
2632 continue; 2633 csep = NULL;
2633 } 2634 }
2634 2635
2635 fp = kmalloc(sizeof(*fp), GFP_KERNEL); 2636 fp = kmalloc(sizeof(*fp), GFP_KERNEL);
@@ -2648,7 +2649,7 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no)
2648 if (snd_usb_get_speed(dev) == USB_SPEED_HIGH) 2649 if (snd_usb_get_speed(dev) == USB_SPEED_HIGH)
2649 fp->maxpacksize = (((fp->maxpacksize >> 11) & 3) + 1) 2650 fp->maxpacksize = (((fp->maxpacksize >> 11) & 3) + 1)
2650 * (fp->maxpacksize & 0x7ff); 2651 * (fp->maxpacksize & 0x7ff);
2651 fp->attributes = csep[3]; 2652 fp->attributes = csep ? csep[3] : 0;
2652 2653
2653 /* some quirks for attributes here */ 2654 /* some quirks for attributes here */
2654 2655