Regression in audio playback with USB DAC caused by "USB: EHCI: use the new clear_tt_buffer interface"

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

 



Alan,

On Sun, Nov 15, 2009 at 04:24, Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> wrote:
> The errors were the lines like these:
>
> ffff880072773d80 2958351933 S Ci:1:007:0 s a1 83 0200 0300 0002 2 <
> ffff880072773d80 2958352055 C Ci:1:007:0 -32 0
>
> I don't know what "a1 83 0200 0300 0002" means -- some sort of audio
> class-specific request.  At any rate, the device didn't recognize or
> didn't respond to the request (the -32 error code), and that's the
> reason for sending the Clear-TT-Buffer requests.

I think it's possible that Clear-TT-Buffer is not needed in this
particular case. Possibly nothing is wrong.

To test this hypothesis further I booted a pristine git head, plugged
the DAC directly into the motherboard's ports and repeated the usbmon
exercise. Guess what, the -32 status still occurs, but naturally there
are no Clear-TT-Buffer requests -- and it just works!

I enabled ALSA debug logs, and it just shows errors getting the
current and maximum volume whenever I start alsamixer:
ALSA sound/usb/usbaudio.c:1351: setting usb interface 1:1
ALSA sound/usb/usbmixer.c:375: cannot get ctl value: req = 0x83,
wValue = 0x200, wIndex = 0x300, type = 4
ALSA sound/usb/usbmixer.c:740: 3:0: cannot get min/max values for
control 2 (id 3)
[last two repeated several times...]

Look at the req, wValue and wIndex values. Those are the same request
parameters as in the logs above. From looking at ALSA's source code in
usbmixer.c where it calls the internal get_cur_* it seems the errors
are expected. It seems ALSA doesn't trust some mixers 100% so it sends
a bunch of extra requests and then looks at all the results.

Below I'm leaving a detailed analysis I wrote before I realized that
there was a way to have ALSA printing the helpful debug messages. You
might find the part about status codes useful, if you still think that
something has to be done to handle this error.

====

The following assumes that I'm following the "Universal Serial Bus
Device Class Definition for Audio Devices" correctly
(http://www.usb.org/developers/devclass_docs/audio10.pdf).

>From §5.2.2.4.2 I gather that this is a request to get the maximum
volume, which is information that alsamixer would presumably want to
request on start up.
* GET_MAX = 0x83 according to a table in the appendix. There are also
some GET_CUR (0x81) requests.
* index 0300 -> unit 3, interface 0, which according to the lsusb
output is a feature unit.
* value 0200 -> control 2, channel 0, which according to the lsusb
output is a volume control.
* length 2 -> is the expected length of the volume parameter according
to §5.2.2.4.3.2.

Now why would this fail, I have no idea. I also don't understand why
we don't see the request for this information, just the answer from
the device (or I'm reading the usbmon output incorrectly).

I'm not having much success parsing the second line, I think. I'm
using table 3-1 in §3.7.1.2, according to which -32 (0xe0) indicates
an interrupt pending (D7=1), memory contents changed (D6=1), a
reserved bit set (D5), and originator being a control interface
(D3..0=0). The control interface/unit/something being of index 0
(second byte).

If the above were correct, which I doubt, then I think the following
paragraph from that section would apply:
"The proper response to an interrupt is either a Get Status request
(D6=0) or a Get Memory request
(D6=1). Issuing these requests to the appropriate originator must
clear the Interrupt Pending bit and the
Memory Contents Changed bit, if applicable."
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux