• Sergei Shtylyov's avatar
    USB: musb: sanitize clearing TXCSR DMA bits (take 2) · b6e434a5
    Sergei Shtylyov authored
    The MUSB code clears TXCSR_DMAMODE incorrectly in several
    places, either asserting that TXCSR_DMAENAB is clear (when
    sometimes it isn't) or clearing both bits together.  Recent
    versions of the programmer's guide require DMAENAB to be
    cleared first, although some older ones didn't.
    
    Fix this and while at it:
    
     - In musb_gadget::txstate(), stop clearing the AUTOSET
       and DMAMODE bits for the CPPI case since they never
       get set anyway (the former bit is reserved on DaVinci);
       but do clear the DMAENAB bit on the DMA error path.
    
     - In musb_host::musb_ep_program(), remove the duplicate
       DMA controller specific code code clearing the TXCSR
       previous state, add the code to clear TXCSR DMA bits
       on the Inventra DMA error path, to replace such code
       (executed late) on the PIO path.
    
     - In musbhsdma::dma_channel_abort()/dma_controller_irq(),
       add/use the 'offset' variable to avoid MUSB_EP_OFFSET()
       invocations on every RXCSR/TXCSR access.
    
    [dbrownell@users.sourceforge.net: don't introduce CamelCase,
    shrink diff]
    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>
    b6e434a5
musb_gadget.c 52.9 KB