• Daniel Mack's avatar
    usb: musb: cppi41: fire hrtimer according to programmed channel length · 50aea6fc
    Daniel Mack authored
    The musb/cppi41 code installs a hrtimer to work around DMA completion
    interrupts that have fired too early on AM335x hardware. This timer
    is currently programmed to first fire 140 microseconds after the DMA
    completion callback. According to the commit which introduced it
    (a655f481, "usb: musb: musb_cppi41: handle pre-mature TX complete
    interrupt"), that value is is considered a 'rule of thumb' that worked
    well with the test case described in the commit log.
    
    Test show, however, that for USB audio devices and much smaller packet
    sizes, the timer has to fire earlier in order to correctly handle the audio
    stream. The original test case had output transfer sizes of 1514 bytes, and
    a delay of 140 microseconds. For audio devices with 24 bytes channel size, 3
    microseconds seem to work well.
    
    Hence, let's assume that the time it takes to clear the bit correlates with
    the number of bytes transferred. The referenced commit log mentions such a
    suspicion as well. Let the timer fire in cppi41_channel->total_len/10
    microseconds to correctly handle both cases.
    
    Also, shorten the interval in which the timer fires again in case of
    a non-empty early_tx list.
    
    With these changes in place, both FS and HS audio devices appear to work
    well on AM335x hardware.
    Signed-off-by: default avatarDaniel Mack <zonque@gmail.com>
    Reported-by: default avatarSebastian Reimers <sebastian.reimers@googlemail.com>
    Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
    50aea6fc
musb_cppi41.c 18.2 KB