• G
    usb-ehci: multiqueue support · 8ac6d699
    Gerd Hoffmann 提交于
    This patch adds support for keeping multiple queues going at the same
    time.  One slow device will not affect other devices any more.
    
    The patch adds code to manage EHCIQueue structs.  It also does a number
    of changes to the state machine:
    
     * The state machine will never ever stop in EXECUTING any more.
       Instead it will continue with the next queue (aka HORIZONTALQH) when
       the usb device returns USB_RET_ASYNC.
     * The state machine will stop processing when it figures it walks in
       circles (easy to figure now that we have a EHCIQueue struct for each
       QH we've processed).  The bailout logic should not be needed any
       more.  For now it is still in, but will assert() in case it triggers.
     * The state machine will just skip queues with a async USBPacket in
       flight.
     * The state machine will resume processing as soon as the async
       USBPacket is finished.
    
    The patch also takes care to flush the QH struct back to guest memory
    when needed, so we don't get stale data when (re-)loading it from guest
    memory in FETCHQH state.
    
    It also makes the writeback code to not touch the first three dwords of
    the QH struct as the EHCI must not write them.  This actually fixes a
    bug where QH chaining changes (next ptr) by the linux ehci driver where
    overwritten by the emulated EHCI.
    Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
    8ac6d699
trace-events 24.6 KB