diff options
author | Bing Zhao <bzhao@marvell.com> | 2010-03-05 16:43:25 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-06 14:26:36 -0500 |
commit | 3fb7fb4a01d09f81d1daaf65e52d929734bd691f (patch) | |
tree | 8feac2d211f833fc1ef287aba3b138886454f45c | |
parent | 729adf1b5f4562f67fe8bf6c1df97edc1128fac7 (diff) |
sdio: add quirk to clamp byte mode transfer
Some SDIO cards expect byte transfers not to exceed the configured block
transfer size. Add a quirk to that effect.
Patches to make use of this quirk will be sent separately.
Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: Nicolas Pitre <nico@marvell.com>
Cc: <linux-mmc@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | drivers/mmc/core/sdio_io.c | 7 | ||||
-rw-r--r-- | include/linux/mmc/card.h | 7 |
2 files changed, 13 insertions, 1 deletions
diff --git a/drivers/mmc/core/sdio_io.c b/drivers/mmc/core/sdio_io.c index f9aa8a7deffa..87c618904ee2 100644 --- a/drivers/mmc/core/sdio_io.c +++ b/drivers/mmc/core/sdio_io.c | |||
@@ -189,7 +189,12 @@ static inline unsigned int sdio_max_byte_size(struct sdio_func *func) | |||
189 | { | 189 | { |
190 | unsigned mval = min(func->card->host->max_seg_size, | 190 | unsigned mval = min(func->card->host->max_seg_size, |
191 | func->card->host->max_blk_size); | 191 | func->card->host->max_blk_size); |
192 | mval = min(mval, func->max_blksize); | 192 | |
193 | if (mmc_blksz_for_byte_mode(func->card)) | ||
194 | mval = min(mval, func->cur_blksize); | ||
195 | else | ||
196 | mval = min(mval, func->max_blksize); | ||
197 | |||
193 | return min(mval, 512u); /* maximum size for byte mode */ | 198 | return min(mval, 512u); /* maximum size for byte mode */ |
194 | } | 199 | } |
195 | 200 | ||
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 2ee22e8af110..d02d2c6e0cfe 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h | |||
@@ -99,6 +99,8 @@ struct mmc_card { | |||
99 | #define MMC_STATE_BLOCKADDR (1<<3) /* card uses block-addressing */ | 99 | #define MMC_STATE_BLOCKADDR (1<<3) /* card uses block-addressing */ |
100 | unsigned int quirks; /* card quirks */ | 100 | unsigned int quirks; /* card quirks */ |
101 | #define MMC_QUIRK_LENIENT_FN0 (1<<0) /* allow SDIO FN0 writes outside of the VS CCCR range */ | 101 | #define MMC_QUIRK_LENIENT_FN0 (1<<0) /* allow SDIO FN0 writes outside of the VS CCCR range */ |
102 | #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1) /* use func->cur_blksize */ | ||
103 | /* for byte mode */ | ||
102 | 104 | ||
103 | u32 raw_cid[4]; /* raw card CID */ | 105 | u32 raw_cid[4]; /* raw card CID */ |
104 | u32 raw_csd[4]; /* raw card CSD */ | 106 | u32 raw_csd[4]; /* raw card CSD */ |
@@ -139,6 +141,11 @@ static inline int mmc_card_lenient_fn0(const struct mmc_card *c) | |||
139 | return c->quirks & MMC_QUIRK_LENIENT_FN0; | 141 | return c->quirks & MMC_QUIRK_LENIENT_FN0; |
140 | } | 142 | } |
141 | 143 | ||
144 | static inline int mmc_blksz_for_byte_mode(const struct mmc_card *c) | ||
145 | { | ||
146 | return c->quirks & MMC_QUIRK_BLKSZ_FOR_BYTE_MODE; | ||
147 | } | ||
148 | |||
142 | #define mmc_card_name(c) ((c)->cid.prod_name) | 149 | #define mmc_card_name(c) ((c)->cid.prod_name) |
143 | #define mmc_card_id(c) (dev_name(&(c)->dev)) | 150 | #define mmc_card_id(c) (dev_name(&(c)->dev)) |
144 | 151 | ||