• Linus Walleij's avatar
    mmc: core/mmci: restore pre/post_req behaviour · e13934bd
    Linus Walleij authored
    commit 64b12a68
    "mmc: core: fix prepared requests while doing bkops"
    is fixing a bug in the wrong way. A bug in the MMCI
    device driver is fixed by amending the MMC core.
    
    Thinking about it: what the pre- and post-callbacks
    are doing is to essentially map and unmap SG lists
    for DMA transfers. Why would we not be able to do that
    just because a BKOPS command is sent inbetween?
    Having to unprepare/prepare the next asynchronous
    request for DMA seems wrong.
    
    Looking the backtrace in that commit we can see what
    the real problem actually is:
    
    mmci_data_irq() is calling mmci_dma_unmap() twice
    which is goung to call arm_dma_unmap_sg() twice
    and v7_dma_inv_range() twice for the same sglist
    and that will crash.
    
    This happens because a request is prepared, then
    a BKOPS is sent. The IRQ completing the BKOPS command
    goes through mmci_data_irq() and thinks that a DMA
    operation has just been completed because
    dma_inprogress() reports true. It then proceeds to
    unmap the sglist.
    
    But that was wrong! dma_inprogress() should NOT be
    true because no DMA was actually in progress! We had
    just prepared the sglist, and the DMA channel
    dma_current has been configured, but NOT started!
    
    Because of this, the sglist is already unmapped when
    we get our actual data completion IRQ, and we are
    unmapping the sglist once more, and we get this crash.
    
    Therefore, we need to revert this solution pushing
    the problem to the core and causing problems, and
    instead augment the implementation such that
    dma_inprogress() only reports true if some DMA has
    actually been started.
    
    After this we can keep the request prepared during the
    BKOPS and we need not unprepare/reprepare it.
    
    Fixes: 64b12a68 ("mmc: core: fix prepared requests while doing bkops")
    Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    Tested-by: default avatarSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
    Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    e13934bd
mmci.c 49.7 KB