• Stephen Warren's avatar
    ARM: Tegra: DMA: Fail safe if initialization fails · ccac0515
    Stephen Warren authored
    tegra_dma_init currently simply bails out early if any initialization fails.
    This skips various data-structure initialization. In turn, this means that
    tegra_dma_allocate_channel can still hand out channels. In this case, when
    tegra_dma_free_channel is called, which calls tegra_dma_cancel, the walking
    on ch->list will OOPS since the list's next/prev pointers may still be
    NULL.
    
    To solve this, add an explicit "initialized" flag, only set this once _init
    has fully completed successfully, and have _allocate_channel refuse to hand
    out channels if this is not set.
    
    While at it, simplify _init:
    * Remove redundant memsets
    * Use bitmap_fill to mark all channels as in-use up-front, and remove
      some now-redundant bitmap initialization loops.
    * Only mark a channel as free once all channel-related initialization has
      completed.
    
    Finally, the successful exit path from _init always has ret==0, so just
    hard-code that return. The error path still returns ret.
    Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
    Signed-off-by: default avatarColin Cross <ccross@android.com>
    ccac0515
dma.c 20.3 KB