• Sergei Shtylyov's avatar
    USB: musb: fix isochronous TXDMA (take 2) · 6b6e9710
    Sergei Shtylyov authored
    Multi-frame isochronous TX URBs transfers in DMA mode never
    complete with CPPI DMA because musb_host_tx() doesn't restart
    DMA on the second frame, only emitting a debug message.
    With Inventra DMA they complete, but in PIO mode.  To fix:
    
     - Factor out programming of the DMA transfer from
       musb_ep_program() into musb_tx_dma_program();
    
     - Reorder the code at the end of musb_host_tx() to
       facilitate the fallback to PIO iff DMA fails;
    
     - Handle the buffer offset consistently for both
       PIO and DMA modes;
    
     - Add an argument to musb_ep_program() for the same
       reason (it only worked correctly with non-zero
       offset of the first frame in PIO mode);
    
     - Set the completed isochronous frame descriptor's
       'actual_length' and 'status' fields correctly in
       DMA mode.
    
    Also, since CPPI reportedly doesn't like sending isochronous
    packets in the RNDIS mode, change the criterion for this
    mode to be used only for multi-packet transfers.  (There's
    no need for that mode in the single-packet case anyway.)
    
    [ dbrownell@users.sourceforge.net: split comment paragraph
    into bullet list, shrink patch delta, style tweaks ]
    Signed-off-by: default avatarPavel Kiryukhin <pkiryukhin@ru.mvista.com>
    Signed-off-by: default avatarSergei Shtylyov <sshtylyov@ru.mvista.com>
    Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    6b6e9710
cppi_dma.c 42.9 KB