Hi Gerd, qemu-devel

We are trying to use USB host device assignment to propagate
Logitech H340 headset to QEMU guest with virtual XHCI controller
running Windows 10.

For some reason headphone function of the device does not work -
guest OS claims that the device does not complete requests.

We have a bunch of other devices that work, also, the same device operates 
properly when:

1. connected to physical machine running Windows 10,
2. assigned to the same QEMU VM running Ubuntu Linux or Windows 7,
3. assigned to QEMU VM with virtual OHCI controller and Windows 10.

From what we see, the difference between this Logitech device and other devices 
that work
is that it exposes Isochronous Synch Endpoint (see USB audio spec 3.7.2.2) for 
headphones function.

Windows traces show (AFAICT, they are pretty cryptic) that the device does not 
properly complete
isochronous IN transfers issued for this endpoint.

The difference between the problematic guest OS (Windows 10) and working
guest OS (Ubuntu Linux) is that Windows 10 driver uses event data TRB entries
for completion notification while Linux sets IOC bit in data transfer TRB 
descriptors.
This difference exists for both ISO IN and ISO OUT endpoints of headphones 
function.

On QEMU side it looks like guest sends a bunch of ISO OUT requests with data,
1 ISO is request to synch endpoint and then hangs reading MFINDEX register 
repeatedly.

Of course QEMU processes this ISO IN request and issues data transfer event
TRB which is visible in sniffer running on the guest side (Wireshark).
QEMU also generates events for all ISO OUT transfers, they are visible in
the sniffer as well.

There is a separate parts of logic in XHCI controller code responsible for 
generation
of Event Data Transfer Event TRBs and this code works properly as far as we can 
tell.

Do you have any idea about what could be wrong with this device or 
corresponding XHCI code?
Do you see any additional research directions or places to look into?

Thank you in advance,
Dmitry

Reply via email to