• Adrian Hunter's avatar
    mmc: sdhci: Fix DMA descriptor with zero data length · 347ea32d
    Adrian Hunter authored
    SDHCI has built-in DMA called ADMA2.  ADMA2 uses a descriptor
    table to define DMA scatter-gather.  Each desciptor can specify
    a data length up to 65536 bytes, however the length field is
    only 16-bits so zero means 65536.  Consequently, putting zero
    when the size is zero must not be allowed.  This patch fixes
    one case where zero data length could be set inadvertently.
    
    The problem happens because unaligned data gets split and the
    code did not consider that the remaining aligned portion might
    be zero length.  That case really only happens for SDIO because
    SD and eMMC cards transfer blocks that are invariably sector-
    aligned.  For SDIO, access to function registers is done by
    data transfer (CMD53) when the register is bigger than 1 byte.
    Generally registers are 4 bytes but 2-byte registers are possible.
    So DMA of 4 bytes or less can happen.  When 32-bit DMA is used,
    the data alignment must be 4, so 4-byte transfers won't casue a
    problem, but a 2-byte transfer could.  However with the introduction
    of 64-bit DMA, the data alignment for 64-bit DMA was made 8 bytes,
    so all 4-byte transfers not on 8-byte boundaries get "split" into
    a 4-byte chunk and a 0-byte chunk, thereby hitting the bug.
    
    In fact, a closer look at the SDHCI specs indicates that only the
    descriptor table requires 8-byte alignment for 64-bit DMA.  That
    will be dealt with in a separate patch, but the potential for a
    2-byte access remains, so this fix is needed anyway.
    Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
    Cc: stable@vger.kernel.org # v3.19+
    Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    347ea32d
sdhci.c 91.5 KB