Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3373c0ae authored by Pierre Ossman's avatar Pierre Ossman
Browse files

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: default avatarPierre Ossman <drzeus@drzeus.cx>
parent 71651297
Loading
Loading
Loading
Loading
+20 −4
Original line number Diff line number Diff line
@@ -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;