• Douglas Anderson's avatar
    usb: dwc2: host: Properly set even/odd frame · 9cf1a601
    Douglas Anderson authored
    When setting up ISO and INT transfers dwc2 needs to specify whether the
    transfer is for an even or an odd frame (or microframe if the controller
    is running in high speed mode).
    
    The controller appears to use this as a simple way to figure out if a
    transfer should happen right away (in the current microframe) or should
    happen at the start of the next microframe.  Said another way:
    
    - If you set "odd" and the current frame number is odd it appears that
      the controller will try to transfer right away.  Same thing if you set
      "even" and the current frame number is even.
    - If the oddness you set and the oddness of the frame number are
      _different_, the transfer will be delayed until the frame number
      changes.
    
    As I understand it, the above technique allows you to plan ahead of time
    where possible by always working on the next frame.  ...but it still
    allows you to properly respond immediately to things that happened in
    the previous frame.
    
    The old dwc2_hc_set_even_odd_frame() didn't really handle this concept.
    It always looked at the frame number and setup the transfer to happen in
    the next frame.  In some cases that meant that certain transactions
    would be transferred in the wrong frame.
    
    We'll try our best to set the even / odd to do the transfer in the
    scheduled frame.  If that fails then we'll do an ugly "schedule ASAP".
    We'll also modify the scheduler code to handle this and not try to
    schedule a second transfer for the same frame.
    
    Note that this change relies on the work to redo the microframe
    scheduler.  It can work atop ("usb: dwc2: host: Manage frame nums better
    in scheduler") but it works even better after ("usb: dwc2: host: Totally
    redo the microframe scheduler").
    
    With this change my stressful USB test (USB webcam + USB audio +
    keyboards) has less audio crackling than before.
    Acked-by: default avatarJohn Youn <johnyoun@synopsys.com>
    Signed-off-by: default avatarDouglas Anderson <dianders@chromium.org>
    Tested-by: default avatarHeiko Stuebner <heiko@sntech.de>
    Tested-by: default avatarStefan Wahren <stefan.wahren@i2se.com>
    Signed-off-by: default avatarFelipe Balbi <balbi@kernel.org>
    9cf1a601
hcd_queue.c 33.9 KB