diff options
author | Pierre Ossman <drzeus@drzeus.cx> | 2007-01-07 16:59:06 +0100 |
---|---|---|
committer | Pierre Ossman <drzeus@drzeus.cx> | 2007-02-04 20:54:11 +0100 |
commit | ae06eaf9abb1fd00e413753786e13406eda5819a (patch) | |
tree | 9b4a71e649d933734f09ee95d016a4fe143169c6 /drivers/mmc | |
parent | 5ba593a97206fb96dc0e63f209e6ade86452844f (diff) | |
download | kernel-crypto-ae06eaf9abb1fd00e413753786e13406eda5819a.tar.gz kernel-crypto-ae06eaf9abb1fd00e413753786e13406eda5819a.tar.xz kernel-crypto-ae06eaf9abb1fd00e413753786e13406eda5819a.zip |
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: Pierre Ossman <drzeus@drzeus.cx>
Diffstat (limited to 'drivers/mmc')
-rw-r--r-- | drivers/mmc/mmc.c | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index fb04bdd26c3..5046a166134 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -1092,7 +1092,8 @@ static void mmc_process_ext_csds(struct mmc_host *host) mmc_wait_for_req(host, &mrq); 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; } @@ -1108,7 +1109,6 @@ static void mmc_process_ext_csds(struct mmc_host *host) printk("%s: card is mmc v4 but doesn't support " "any high-speed modes.\n", mmc_hostname(card->host)); - mmc_card_set_bad(card); continue; } @@ -1289,7 +1289,9 @@ static void mmc_read_switch_caps(struct mmc_host *host) mmc_wait_for_req(host, &mrq); 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; } @@ -1321,12 +1323,8 @@ static void mmc_read_switch_caps(struct mmc_host *host) mmc_wait_for_req(host, &mrq); - if (cmd.error != MMC_ERR_NONE || data.error != MMC_ERR_NONE) { - mmc_card_set_dead(card); - continue; - } - - if ((status[16] & 0xF) != 1) { + if (cmd.error != MMC_ERR_NONE || data.error != MMC_ERR_NONE || + (status[16] & 0xF) != 1) { printk(KERN_WARNING "%s: Problem switching card " "into high-speed mode!\n", mmc_hostname(host)); |