[ALSA] usb-audio: add workaround for CSR Bluetooth Headphones (Saitek A-250)
authorClemens Ladisch <clemens@ladisch.de>
Thu, 18 May 2006 07:35:15 +0000 (09:35 +0200)
committerJaroslav Kysela <perex@suse.cz>
Thu, 22 Jun 2006 19:33:47 +0000 (21:33 +0200)
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>
sound/usb/usbaudio.c

index 8100516e1f799c4bdc5f64b8f3f96879557fac32..770642a5953e149ba1357eb7da64b069d891a2e9 100644 (file)
@@ -2627,9 +2627,10 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no)
                if (!csep && altsd->bNumEndpoints >= 2)
                        csep = snd_usb_find_desc(alts->endpoint[1].extra, alts->endpoint[1].extralen, NULL, USB_DT_CS_ENDPOINT);
                if (!csep || csep[0] < 7 || csep[2] != EP_GENERAL) {
-                       snd_printk(KERN_ERR "%d:%u:%d : no or invalid class specific endpoint descriptor\n",
+                       snd_printk(KERN_WARN "%d:%u:%d : no or invalid"
+                                  " class specific endpoint descriptor\n",
                                   dev->devnum, iface_no, altno);
-                       continue;
+                       csep = NULL;
                }
 
                fp = kmalloc(sizeof(*fp), GFP_KERNEL);
@@ -2648,7 +2649,7 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no)
                if (snd_usb_get_speed(dev) == USB_SPEED_HIGH)
                        fp->maxpacksize = (((fp->maxpacksize >> 11) & 3) + 1)
                                        * (fp->maxpacksize & 0x7ff);
-               fp->attributes = csep[3];
+               fp->attributes = csep ? csep[3] : 0;
 
                /* some quirks for attributes here */