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

Commit 85a18ad9 authored by Pierre Ossman's avatar Pierre Ossman
Browse files

mmc: MMC sector based cards



Support for MMC 4.2 sector based cards. This tweaks the init a
bit and reads a new field out of the EXT_CSD.

Signed-off-by: default avatarPierre Ossman <drzeus@drzeus.cx>
parent de859895
Loading
Loading
Loading
Loading
+22 −3
Original line number Diff line number Diff line
@@ -1106,11 +1106,29 @@ 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) {
			printk("%s: unable to read EXT_CSD, performance "
				"might suffer.\n", mmc_hostname(card->host));
			if (card->csd.capacity == (4096 * 512)) {
				printk(KERN_ERR "%s: unable to read EXT_CSD "
					"on a possible high capacity card. "
					"Card will be ignored.\n",
					mmc_hostname(card->host));
				mmc_card_set_dead(card);
			} else {
				printk(KERN_WARNING "%s: unable to read "
					"EXT_CSD, performance might "
					"suffer.\n",
					mmc_hostname(card->host));
			}
			continue;
		}

		card->ext_csd.sectors =
			ext_csd[EXT_CSD_SEC_CNT + 0] << 0 |
			ext_csd[EXT_CSD_SEC_CNT + 1] << 8 |
			ext_csd[EXT_CSD_SEC_CNT + 2] << 16 |
			ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
		if (card->ext_csd.sectors)
			mmc_card_set_blockaddr(card);

		switch (ext_csd[EXT_CSD_CARD_TYPE]) {
		case EXT_CSD_CARD_TYPE_52 | EXT_CSD_CARD_TYPE_26:
			card->ext_csd.hs_max_dtr = 52000000;
@@ -1499,7 +1517,8 @@ static void mmc_setup(struct mmc_host *host)
			mmc_send_app_op_cond(host, host->ocr | (sd2 << 30), NULL);
		}
	} else {
		mmc_send_op_cond(host, host->ocr, NULL);
		/* The extra bit indicates that we support high capacity */
		mmc_send_op_cond(host, host->ocr | (1 << 30), NULL);
	}

	mmc_discover_cards(host);
+14 −5
Original line number Diff line number Diff line
@@ -491,11 +491,20 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card)

	blk_queue_hardsect_size(md->queue.queue, 1 << md->block_bits);

	if (!mmc_card_sd(card) && mmc_card_blockaddr(card)) {
		/*
		 * The EXT_CSD sector count is in number or 512 byte
		 * sectors.
		 */
		set_capacity(md->disk, card->ext_csd.sectors);
	} else {
		/*
		 * The CSD capacity field is in units of read_blkbits.
		 * set_capacity takes units of 512 bytes.
		 */
	set_capacity(md->disk, card->csd.capacity << (card->csd.read_blkbits - 9));
		set_capacity(md->disk,
			card->csd.capacity << (card->csd.read_blkbits - 9));
	}
	return md;

 err_putdisk:
+1 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ struct mmc_csd {

struct mmc_ext_csd {
	unsigned int		hs_max_dtr;
	unsigned int		sectors;
};

struct sd_scr {
+1 −0
Original line number Diff line number Diff line
@@ -284,6 +284,7 @@ struct _mmc_csd {
#define EXT_CSD_BUS_WIDTH	183	/* R/W */
#define EXT_CSD_HS_TIMING	185	/* R/W */
#define EXT_CSD_CARD_TYPE	196	/* RO */
#define EXT_CSD_SEC_CNT		212	/* RO, 4 bytes */

/*
 * EXT_CSD field definitions