@@ -863,9 +863,12 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card,
blk_queue_logical_block_size(md->queue.queue, 512);
set_capacity(md->disk, size);
- if (mmc_host_cmd23(card->host) &&
- mmc_card_mmc(card))
- md->flags |= MMC_BLK_CMD23;
+ if (mmc_host_cmd23(card->host)) {
+ if (mmc_card_mmc(card) ||
+ (mmc_card_sd(card) &&
+ card->scr.cmds & SD_SCR_CMD23_SUPPORT))
+ md->flags |= MMC_BLK_CMD23;
+ }
if (mmc_card_mmc(card) &&
md->flags & MMC_BLK_CMD23 &&
@@ -195,6 +195,13 @@ static int mmc_decode_scr(struct mmc_card *card)
else
card->erased_byte = 0x0;
+ if (scr->sda_vsn == SCR_SPEC_VER_2) {
+
+ /* Check if Physical Layer Spec v3.0X is supported. */
+ scr->sda_spec3 = UNSTUFF_BITS(resp, 47, 1);
+ if (scr->sda_spec3)
+ scr->cmds = UNSTUFF_BITS(resp, 32, 2);
+ }
return 0;
}
@@ -67,9 +67,13 @@ struct mmc_ext_csd {
struct sd_scr {
unsigned char sda_vsn;
+ unsigned char sda_spec3;
unsigned char bus_widths;
#define SD_SCR_BUS_WIDTH_1 (1<<0)
#define SD_SCR_BUS_WIDTH_4 (1<<2)
+ unsigned char cmds;
+#define SD_SCR_CMD20_SUPPORT (1<<0)
+#define SD_SCR_CMD23_SUPPORT (1<<1)
};
struct sd_ssr {
@@ -59,7 +59,7 @@
#define SCR_SPEC_VER_0 0 /* Implements system specification 1.0 - 1.01 */
#define SCR_SPEC_VER_1 1 /* Implements system specification 1.10 */
-#define SCR_SPEC_VER_2 2 /* Implements system specification 2.00 */
+#define SCR_SPEC_VER_2 2 /* Implements system specification 2.00-3.0X */
/*
* SD bus widths
SD cards operating at UHS104 or better support SET_BLOCK_COUNT. Cc: arindam.nath@amd.com Cc: cjb@laptop.org Cc: arnd@arndb.de Signed-off-by: Andrei Warkentin <andreiw@motorola.com> --- drivers/mmc/card/block.c | 9 ++++++--- drivers/mmc/core/sd.c | 7 +++++++ include/linux/mmc/card.h | 4 ++++ include/linux/mmc/sd.h | 2 +- 4 files changed, 18 insertions(+), 4 deletions(-)