linux/drivers/mmc/host
Adrian Hunter 347ea32dc1 mmc: sdhci: Fix DMA descriptor with zero data length
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: Adrian Hunter <adrian.hunter@intel.com>
Cc: stable@vger.kernel.org # v3.19+
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
2015-12-22 11:32:15 +01:00
..
android-goldfish.c mmc: android-goldfish: remove incorrect __iomem annotation 2015-09-01 14:19:11 +02:00
atmel-mci.c mmc: atmel-mci: atmci_convert_chksize depends on controller version 2015-12-22 11:32:11 +01:00
au1xmmc.c mmc: host: drop owner assignment from platform_drivers 2014-10-20 16:20:56 +02:00
bfin_sdh.c
cb710-mmc.c
cb710-mmc.h
davinci_mmc.c mmc: davinci: Constify platform_device_id 2015-06-01 09:06:49 +02:00
dw_mmc-exynos.c mmc: mmc: extend the mmc_send_tuning() 2015-10-27 10:38:41 +01:00
dw_mmc-exynos.h mmc: dw_mmc: exynos: Support eMMC's HS400 mode 2015-03-23 14:13:28 +01:00
dw_mmc-k3.c mmc: dw_mmc: k3: Fix modalias to make module auto-loading work 2015-06-01 09:07:05 +02:00
dw_mmc-pci.c
dw_mmc-pltfm.c mmc: dw_mmc: Add external dma interface support 2015-10-26 16:00:16 +01:00
dw_mmc-pltfm.h
dw_mmc-rockchip.c mmc: core: Remove MMC_CAP_RUNTIME_RESUME as it's redundant 2015-12-22 11:32:03 +01:00
dw_mmc.c mmc: dw_mmc: fix the wrong setting for UHS-DDR50 mode 2015-10-29 11:00:43 +01:00
dw_mmc.h mmc: dw_mmc: fix the CardThreshold boundary at CardThrCtl register 2015-10-29 11:00:37 +01:00
jz4740_mmc.c
Kconfig mmc: mvsdio: delete platform data code path 2015-12-22 11:32:12 +01:00
Makefile mmc: sdhci-pci: Build o2micro support in the same module 2015-10-26 16:00:05 +01:00
mmc_spi.c spi: Updates for v4.4 2015-11-05 13:15:12 -08:00
mmci_qcom_dml.c
mmci_qcom_dml.h
mmci.c mmc: mmci: Cascade EPROBE_DEFER from regulators. 2015-03-25 09:46:35 +01:00
mmci.h
moxart-mmc.c mmc: moxart: Fix module autoload for OF platform driver 2015-10-26 15:59:57 +01:00
mtk-sd.c mmc: core: Remove MMC_CAP_RUNTIME_RESUME as it's redundant 2015-12-22 11:32:03 +01:00
mvsdio.c mmc: mvsdio: delete platform data code path 2015-12-22 11:32:12 +01:00
mvsdio.h
mxcmmc.c mmc: host: mxcmmc: Simplify a trivial if-return sequence 2015-06-01 09:07:02 +02:00
mxs-mmc.c mmc: mxs: Constify platform_device_id 2015-06-01 09:06:50 +02:00
of_mmc_spi.c
omap_hsmmc.c mmc: omap_hsmmc: No need to check DMA channel validity at module remove 2015-12-22 11:32:02 +01:00
omap.c mmc: omap: Fix module autoload for OF platform driver 2015-10-26 15:59:58 +01:00
pxamci.c mmc: pxamci: fix read-only gpio detection polarity 2015-11-09 13:04:03 +01:00
pxamci.h
rtsx_pci_sdmmc.c mmc: rtsx: Constify platform_device_id 2015-06-01 09:06:50 +02:00
rtsx_usb_sdmmc.c mmc: rtsx: Constify platform_device_id 2015-06-01 09:06:50 +02:00
s3cmci.c mmc: s3cmci: Constify platform_device_id 2015-06-01 09:06:51 +02:00
s3cmci.h
sdhci_f_sdh30.c mmc: sdhci_f_sdh30: Fix the size passed to sdhci_alloc_host 2015-06-01 09:06:46 +02:00
sdhci-acpi.c mmc: sdhci-acpi: Add more ACPI HIDs for Intel controllers 2015-10-26 16:00:20 +01:00
sdhci-bcm2835.c mmc: sdhci-bcm2835: Actually enable the clock 2015-06-01 09:56:07 +02:00
sdhci-bcm-kona.c mmc: sdhci-bcm-kona: fix logic to check for 8-bit data width 2015-10-26 15:59:55 +01:00
sdhci-cns3xxx.c mmc: sdhci: set the .remove to sdhci_pltfm_unregister() 2015-03-23 14:13:35 +01:00
sdhci-dove.c mmc: sdhci: set the .remove to sdhci_pltfm_unregister() 2015-03-23 14:13:35 +01:00
sdhci-esdhc-imx.c mmc: sdhci-esdhc-imx: correct the tuning-step setting 2015-12-22 11:32:09 +01:00
sdhci-esdhc.h mmc: sdhci-of-esdhc: support both BE and LE host controller 2015-10-26 16:00:08 +01:00
sdhci-iproc.c mmc: sdhci-iproc: fix oops in sdhci_iproc_writew 2015-03-23 14:13:47 +01:00
sdhci-msm.c mmc: mmc: extend the mmc_send_tuning() 2015-10-27 10:38:41 +01:00
sdhci-of-arasan.c mmc: sdhci-of-arasan: Add the support for sdhci-5.1 2015-08-27 14:50:54 +02:00
sdhci-of-at91.c mmc: sdhci-of-at91: add PM support 2015-12-22 11:32:06 +01:00
sdhci-of-esdhc.c mmc: sdhci-of-esdhc: add/remove some quirks according to vendor version 2015-12-22 11:32:11 +01:00
sdhci-of-hlwd.c mmc: sdhci: set the .remove to sdhci_pltfm_unregister() 2015-03-23 14:13:35 +01:00
sdhci-pci-core.c mmc: sdhci-pci: Do not default to 33 Ohm driver strength for Intel SPT 2015-12-22 11:32:14 +01:00
sdhci-pci-data.c mmc: sdhci-pci: Add support for drive strength selection for SPT 2015-06-01 09:07:14 +02:00
sdhci-pci-o2micro.c mmc: sdhci-pci: Make sdhci_pci_o2_fujin2_pci_init() static 2015-10-26 16:00:05 +01:00
sdhci-pci-o2micro.h mmc: sdhci-pci: Make sdhci_pci_o2_fujin2_pci_init() static 2015-10-26 16:00:05 +01:00
sdhci-pci.h mmc: sdhci-pci: Add more PCI IDs for Intel controllers 2015-10-26 16:00:19 +01:00
sdhci-pltfm.c mmc: core: enable support for the standard "wakeup-source" property 2015-12-22 11:32:01 +01:00
sdhci-pltfm.h
sdhci-pxav2.c mmc: sdhci-{pxav2,pxav3}: Use of_match_ptr() macro 2015-06-01 09:06:53 +02:00
sdhci-pxav3.c mmc: sdhci-pxav3: fix error handling of armada_38x_quirks 2015-10-08 19:24:23 +02:00
sdhci-s3c-regs.h
sdhci-s3c.c mmc: sdhci-s3c: Constify platform_device_id 2015-06-01 09:06:52 +02:00
sdhci-sirf.c mmc: mmc: extend the mmc_send_tuning() 2015-10-27 10:38:41 +01:00
sdhci-spear.c Update Viresh Kumar's email address 2015-07-17 16:39:53 -07:00
sdhci-st.c mmc: sdhci-st: Fix modalias to make module auto-loading work 2015-06-01 09:07:07 +02:00
sdhci-tegra.c mmc: tegra: Add Tegra210 support 2015-12-22 11:32:07 +01:00
sdhci.c mmc: sdhci: Fix DMA descriptor with zero data length 2015-12-22 11:32:15 +01:00
sdhci.h mmc: sdhci: add quirk SDHCI_QUIRK2_NEED_DELAY_AFTER_INT_CLK_RST 2015-10-08 19:55:05 +02:00
sdricoh_cs.c
sh_mmcif.c mmc: sh_mmcif: rework dma channel handling 2015-12-22 11:32:08 +01:00
sh_mobile_sdhi.c mmc: sh_mobile_sdhi: remove sh_mobile_sdhi_info 2015-03-05 21:54:26 +05:30
sunxi-mmc.c mmc: sunxi: Add card busy detection 2015-10-26 16:00:02 +01:00
tifm_sd.c mmc: Convert pr_warning to pr_warn 2014-09-24 10:13:09 +02:00
tmio_mmc_dma.c mmc: tmio: mmc: tmio: tmio_mmc_data has .chan_priv_?x 2015-03-05 21:54:17 +05:30
tmio_mmc_pio.c mmc: tmio: Fix timeout value for command request 2015-08-24 11:25:53 +02:00
tmio_mmc.c mmc: TMIO: Use devm_request_irq() 2015-06-01 09:06:48 +02:00
tmio_mmc.h mmc: tmio: mmc: tmio: tmio_mmc_data has .chan_priv_?x 2015-03-05 21:54:17 +05:30
toshsd.c mmc: toshsd: Fix unbalanced locking 2015-01-19 09:56:07 +01:00
toshsd.h mmc: add Toshiba PCI SD controller driver 2014-11-26 14:30:58 +01:00
usdhi6rol0.c mmc: usdhi6rol0: fix error return code 2015-08-27 14:50:56 +02:00
ushc.c
via-sdmmc.c
vub300.c mmc: vub300: Remove unneded semicolons 2015-10-26 15:59:54 +01:00
wbsd.c mmc: wbsd: Remove unneded semicolon 2015-10-26 15:59:53 +01:00
wbsd.h
wmt-sdmmc.c mmc: constify of_device_id array 2015-03-23 14:13:49 +01:00