brcm2708: update against latest rpi-3.10.y branch
[openwrt.git] / target / linux / brcm2708 / patches-3.10 / 0022-sdhci-bcm2708-use-multiblock-type-transfers-for-sing.patch
1 From 9f5c2a77277b99949398e97cc753074d1b8e9521 Mon Sep 17 00:00:00 2001
2 From: popcornmix <popcornmix@gmail.com>
3 Date: Wed, 3 Jul 2013 00:42:49 +0100
4 Subject: [PATCH 022/174] sdhci-bcm2708: use multiblock-type transfers for
5  single blocks
6
7 There are issues with both single block reads (missed completion)
8 and writes (data loss in some cases!). Just don't do single block
9 transfers anymore, and treat them like multiblock transfers. This
10 adds a quirk for this and uses it.
11 ---
12  drivers/mmc/card/block.c         | 2 +-
13  drivers/mmc/host/sdhci-bcm2708.c | 3 +++
14  include/linux/mmc/host.h         | 1 +
15  3 files changed, 5 insertions(+), 1 deletion(-)
16
17 --- a/drivers/mmc/card/block.c
18 +++ b/drivers/mmc/card/block.c
19 @@ -1333,7 +1333,7 @@ static void mmc_blk_rw_rq_prep(struct mm
20                         brq->data.blocks = 1;
21         }
22  
23 -       if (brq->data.blocks > 1 || do_rel_wr) {
24 +       if (brq->data.blocks > 1 || do_rel_wr || card->host->caps2 & MMC_CAP2_FORCE_MULTIBLOCK) {
25                 /* SPI multiblock writes terminate using a special
26                  * token, not a STOP_TRANSMISSION request.
27                  */
28 --- a/drivers/mmc/host/sdhci-bcm2708.c
29 +++ b/drivers/mmc/host/sdhci-bcm2708.c
30 @@ -1266,6 +1266,9 @@ static int sdhci_bcm2708_probe(struct pl
31  
32      if (allow_highspeed)
33          host->mmc->caps |= MMC_CAP_SD_HIGHSPEED | MMC_CAP_MMC_HIGHSPEED;
34 +
35 +    /* single block writes cause data loss with some SD cards! */
36 +    host->mmc->caps2 |= MMC_CAP2_FORCE_MULTIBLOCK;
37  #endif
38  
39         ret = sdhci_add_host(host);
40 --- a/include/linux/mmc/host.h
41 +++ b/include/linux/mmc/host.h
42 @@ -281,6 +281,7 @@ struct mmc_host {
43  #define MMC_CAP2_PACKED_CMD    (MMC_CAP2_PACKED_RD | \
44                                  MMC_CAP2_PACKED_WR)
45  #define MMC_CAP2_NO_PRESCAN_POWERUP (1 << 14)  /* Don't power up before scan */
46 +#define MMC_CAP2_FORCE_MULTIBLOCK (1 << 31)    /* Always use multiblock transfers */
47  
48         mmc_pm_flag_t           pm_caps;        /* supported pm features */
49