Commit ae06eaf9 authored by Pierre Ossman's avatar Pierre Ossman

mmc: Graceful fallback for fancy features

MMC high-speed, wide bus support and SD high-speed
are functions that aren't critical for correct
operation of the card. As such, they shouldn't mark
the card as bad or dead when there is a failure
activating these features.

This is needed in particular on some really stupid
hardware (e.g. Winbond's) where not all data transfer
commands are supported.
Signed-off-by: default avatarPierre Ossman <drzeus@drzeus.cx>
parent 5ba593a9
...@@ -1092,7 +1092,8 @@ static void mmc_process_ext_csds(struct mmc_host *host) ...@@ -1092,7 +1092,8 @@ static void mmc_process_ext_csds(struct mmc_host *host)
mmc_wait_for_req(host, &mrq); mmc_wait_for_req(host, &mrq);
if (cmd.error != MMC_ERR_NONE || data.error != MMC_ERR_NONE) { if (cmd.error != MMC_ERR_NONE || data.error != MMC_ERR_NONE) {
mmc_card_set_dead(card); printk("%s: unable to read EXT_CSD, performance "
"might suffer.\n", mmc_hostname(card->host));
continue; continue;
} }
...@@ -1108,7 +1109,6 @@ static void mmc_process_ext_csds(struct mmc_host *host) ...@@ -1108,7 +1109,6 @@ static void mmc_process_ext_csds(struct mmc_host *host)
printk("%s: card is mmc v4 but doesn't support " printk("%s: card is mmc v4 but doesn't support "
"any high-speed modes.\n", "any high-speed modes.\n",
mmc_hostname(card->host)); mmc_hostname(card->host));
mmc_card_set_bad(card);
continue; continue;
} }
...@@ -1289,7 +1289,9 @@ static void mmc_read_switch_caps(struct mmc_host *host) ...@@ -1289,7 +1289,9 @@ static void mmc_read_switch_caps(struct mmc_host *host)
mmc_wait_for_req(host, &mrq); mmc_wait_for_req(host, &mrq);
if (cmd.error != MMC_ERR_NONE || data.error != MMC_ERR_NONE) { if (cmd.error != MMC_ERR_NONE || data.error != MMC_ERR_NONE) {
mmc_card_set_dead(card); printk("%s: unable to read switch capabilities, "
"performance might suffer.\n",
mmc_hostname(card->host));
continue; continue;
} }
...@@ -1321,12 +1323,8 @@ static void mmc_read_switch_caps(struct mmc_host *host) ...@@ -1321,12 +1323,8 @@ static void mmc_read_switch_caps(struct mmc_host *host)
mmc_wait_for_req(host, &mrq); mmc_wait_for_req(host, &mrq);
if (cmd.error != MMC_ERR_NONE || data.error != MMC_ERR_NONE) { if (cmd.error != MMC_ERR_NONE || data.error != MMC_ERR_NONE ||
mmc_card_set_dead(card); (status[16] & 0xF) != 1) {
continue;
}
if ((status[16] & 0xF) != 1) {
printk(KERN_WARNING "%s: Problem switching card " printk(KERN_WARNING "%s: Problem switching card "
"into high-speed mode!\n", "into high-speed mode!\n",
mmc_hostname(host)); mmc_hostname(host));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment