[lkml]   [2011]   [Dec]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[PATCH] Jabra SPEAK 410 USB - no audio playback

    The attached patch fixes USB audio support for the Jabra SPEAK 410 USB.

    The problem, as I understand it, is that the device contains a
    Class-Specific Endpoint (CS_ENDPOINT) descriptor before the Endpoint
    (ENDPOINT) descriptor. The USB code all assumes that CS_ENDPOINT can
    only appear after ENDPOINT. Therefore the USB code divides up the
    interface descriptor into "stuff before ENDPOINT" (in
    interface->extra) and "stuff after ENDPOINT" (in
    interface->endpoint[0]->extra). For this device, this division does
    not work.

    You can see lsusb for my device here:
    Notice the "** UNRECOGNIZED: 07 25 01 81 02 00 00" line which is the
    CS_ENDPOINT descriptor.

    The solution (which is a hack ...) is to also search interface->extra
    looking for the missing descriptor.

    For me, this fully enables the functions of this device.


    Richard Jones, Virtualization Group, Red Hat
    Read my programming blog:
    Fedora now supports 80 OCaml packages (the OPEN alternative to F#)
    diff -uNrp kernel-3.1.fc16.orig/sound/usb/stream.c
    --- kernel-3.1.fc16.orig/sound/usb/stream.c 2011-12-10 18:03:29.658729051 +0000
    +++ 2011-12-10 18:08:41.468694907 +0000
    @@ -164,6 +164,12 @@ static int parse_uac_endpoint_attributes

    csep = snd_usb_find_desc(alts->endpoint[0].extra, alts->endpoint[0].extralen, NULL, USB_DT_CS_ENDPOINT);

    + /* Jabra SPEAK 410 USB has CS_ENDPOINT before ordinary ENDPOINT,
    + * which confuses the USB descriptor parsing code. Try looking
    + * for CS_ENDPOINT in the interface->extra - RWMJ. */
    + if (!csep)
    + csep = snd_usb_find_desc(alts->extra, alts->extralen, NULL, USB_DT_CS_ENDPOINT);
    /* Creamware Noah has this descriptor after the 2nd endpoint */
    if (!csep && altsd->bNumEndpoints >= 2)
    csep = snd_usb_find_desc(alts->endpoint[1].extra, alts->endpoint[1].extralen, NULL, USB_DT_CS_ENDPOINT);
     \ /
      Last update: 2011-12-10 20:47    [W:0.022 / U:0.632 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site