mirror of
https://github.com/torvalds/linux.git
synced 2024-12-02 17:11:33 +00:00
mmc: don't call switch on old cards
Make sure we don't call the switch function on cards too old to support it. They should just ignore it, but some have been reported to lock up instead. Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
This commit is contained in:
parent
71651297a4
commit
3373c0ae6a
@ -15,6 +15,7 @@
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/mmc/card.h>
|
||||
#include <linux/mmc/mmc.h>
|
||||
#include <linux/mmc/sd.h>
|
||||
|
||||
#include "core.h"
|
||||
#include "sysfs.h"
|
||||
@ -192,6 +193,16 @@ static int mmc_read_switch(struct mmc_card *card)
|
||||
int err;
|
||||
u8 *status;
|
||||
|
||||
if (card->scr.sda_vsn < SCR_SPEC_VER_1)
|
||||
return MMC_ERR_NONE;
|
||||
|
||||
if (!(card->csd.cmdclass & CCC_SWITCH)) {
|
||||
printk(KERN_WARNING "%s: card lacks mandatory switch "
|
||||
"function, performance might suffer.\n",
|
||||
mmc_hostname(card->host));
|
||||
return MMC_ERR_NONE;
|
||||
}
|
||||
|
||||
err = MMC_ERR_FAILED;
|
||||
|
||||
status = kmalloc(64, GFP_KERNEL);
|
||||
@ -204,10 +215,9 @@ static int mmc_read_switch(struct mmc_card *card)
|
||||
|
||||
err = mmc_sd_switch(card, 0, 0, 1, status);
|
||||
if (err != MMC_ERR_NONE) {
|
||||
/*
|
||||
* Card not supporting high-speed will ignore the
|
||||
* command.
|
||||
*/
|
||||
printk(KERN_WARNING "%s: problem reading switch "
|
||||
"capabilities, performance might suffer.\n",
|
||||
mmc_hostname(card->host));
|
||||
err = MMC_ERR_NONE;
|
||||
goto out;
|
||||
}
|
||||
@ -229,6 +239,12 @@ static int mmc_switch_hs(struct mmc_card *card)
|
||||
int err;
|
||||
u8 *status;
|
||||
|
||||
if (card->scr.sda_vsn < SCR_SPEC_VER_1)
|
||||
return MMC_ERR_NONE;
|
||||
|
||||
if (!(card->csd.cmdclass & CCC_SWITCH))
|
||||
return MMC_ERR_NONE;
|
||||
|
||||
if (!(card->host->caps & MMC_CAP_SD_HIGHSPEED))
|
||||
return MMC_ERR_NONE;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user