Exemple #1
0
/*
 * Given the decoded CSD structure, decode the raw CID to our CID structure.
 */
static int mmc_decode_cid(struct mmc_card *card)
{
	u32 *resp = card->raw_cid;

	/*
	 * The selection of the format here is based upon published
	 * specs from sandisk and from what people have reported.
	 */
	switch (card->csd.mmca_vsn) {
	case 0: /* MMC v1.0 - v1.2 */
	case 1: /* MMC v1.4 */
		card->cid.manfid	= UNSTUFF_BITS(resp, 104, 24);
		card->cid.prod_name[0]	= UNSTUFF_BITS(resp, 96, 8);
		card->cid.prod_name[1]	= UNSTUFF_BITS(resp, 88, 8);
		card->cid.prod_name[2]	= UNSTUFF_BITS(resp, 80, 8);
		card->cid.prod_name[3]	= UNSTUFF_BITS(resp, 72, 8);
		card->cid.prod_name[4]	= UNSTUFF_BITS(resp, 64, 8);
		card->cid.prod_name[5]	= UNSTUFF_BITS(resp, 56, 8);
		card->cid.prod_name[6]	= UNSTUFF_BITS(resp, 48, 8);
		card->cid.hwrev		= UNSTUFF_BITS(resp, 44, 4);
		card->cid.fwrev		= UNSTUFF_BITS(resp, 40, 4);
		card->cid.serial	= UNSTUFF_BITS(resp, 16, 24);
		card->cid.month		= UNSTUFF_BITS(resp, 12, 4);
		card->cid.year		= UNSTUFF_BITS(resp, 8, 4) + 1997;
		break;

	case 2: /* MMC v2.0 - v2.2 */
	case 3: /* MMC v3.1 - v3.3 */
	case 4: /* MMC v4 */
		card->cid.manfid	= UNSTUFF_BITS(resp, 120, 8);
		card->cid.oemid		= UNSTUFF_BITS(resp, 104, 16);
		card->cid.prod_name[0]	= UNSTUFF_BITS(resp, 96, 8);
		card->cid.prod_name[1]	= UNSTUFF_BITS(resp, 88, 8);
		card->cid.prod_name[2]	= UNSTUFF_BITS(resp, 80, 8);
		card->cid.prod_name[3]	= UNSTUFF_BITS(resp, 72, 8);
		card->cid.prod_name[4]	= UNSTUFF_BITS(resp, 64, 8);
		card->cid.prod_name[5]	= UNSTUFF_BITS(resp, 56, 8);
		card->cid.serial	= UNSTUFF_BITS(resp, 16, 32);
		card->cid.month		= UNSTUFF_BITS(resp, 12, 4);
		card->cid.year		= UNSTUFF_BITS(resp, 8, 4) + 1997;
		break;

	default:
		printk(KERN_ERR "%s: card has unknown MMCA version %d\n",
			mmc_hostname(card->host), card->csd.mmca_vsn);
		return -EINVAL;
	}

	return 0;
}
/*
 * Given a 128-bit response, decode to our card CSD structure.
 */
static void mmc_decode_csd(struct mmc_card *card)
{
	struct mmc_csd *csd = &card->csd;
	unsigned int e, m, csd_struct;
	u32 *resp = card->raw_csd;

	/*
	 * We only understand CSD structure v1.0, v1.1 and v2.
	 * v2 has extra information in bits 15, 11 and 10.
	 */
	csd_struct = UNSTUFF_BITS(resp, 126, 2);

	switch (csd_struct) {
	case 0:
		m = UNSTUFF_BITS(resp, 115, 4);
		e = UNSTUFF_BITS(resp, 112, 3);
		csd->tacc_ns	 = (tacc_exp[e] * tacc_mant[m] + 9) / 10;
		csd->tacc_clks	 = UNSTUFF_BITS(resp, 104, 8) * 100;

		m = UNSTUFF_BITS(resp, 99, 4);
		e = UNSTUFF_BITS(resp, 96, 3);
		csd->max_dtr	  = tran_exp[e] * tran_mant[m];
		csd->cmdclass	  = UNSTUFF_BITS(resp, 84, 12);

		e = UNSTUFF_BITS(resp, 47, 3);
		m = UNSTUFF_BITS(resp, 62, 12);
		csd->capacity	  = (1 + m) << (e + 2);

		csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4);
		csd->read_partial = UNSTUFF_BITS(resp, 79, 1);
		csd->write_misalign = UNSTUFF_BITS(resp, 78, 1);
		csd->read_misalign = UNSTUFF_BITS(resp, 77, 1);
		csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3);
		csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4);
		csd->write_partial = UNSTUFF_BITS(resp, 21, 1);
		break;
	case 1:
		/*
		 * This is a block-addressed SDHC card. Most
		 * interesting fields are unused and have fixed
		 * values. To avoid getting tripped by buggy cards,
		 * we assume those fixed values ourselves.
		 */
		mmc_card_set_blockaddr(card);

		csd->tacc_ns	 = 0; /* Unused */
		csd->tacc_clks	 = 0; /* Unused */

		m = UNSTUFF_BITS(resp, 99, 4);
		e = UNSTUFF_BITS(resp, 96, 3);
		csd->max_dtr	  = tran_exp[e] * tran_mant[m];
		csd->cmdclass	  = UNSTUFF_BITS(resp, 84, 12);

		m = UNSTUFF_BITS(resp, 48, 22);
		csd->capacity     = (1 + m) << 10;

		csd->read_blkbits = 9;
		csd->read_partial = 0;
		csd->write_misalign = 0;
		csd->read_misalign = 0;
		csd->r2w_factor = 4; /* Unused */
		csd->write_blkbits = 9;
		csd->write_partial = 0;

		sd_card_set_type(1);
		break;
	default:
		printk("%s: unrecognised CSD structure version %d\n",
			mmc_hostname(card->host), csd_struct);
		return;
	}
}
Exemple #3
0
/*
 * Given a 128-bit response, decode to our card CSD structure.
 */
static int mmc_decode_csd(struct mmc_card *card)
{
	struct mmc_csd *csd = &card->csd;
	unsigned int e, m;
	u32 *resp = card->raw_csd;

	/*
	 * We only understand CSD structure v1.1 and v1.2.
	 * v1.2 has extra information in bits 15, 11 and 10.
	 * We also support eMMC v4.4 & v4.41.
	 */
	csd->structure = UNSTUFF_BITS(resp, 126, 2);
	if (csd->structure == 0) {
		printk(KERN_ERR "%s: unrecognised CSD structure version %d\n",
			mmc_hostname(card->host), csd->structure);
		return -EINVAL;
	}

	csd->mmca_vsn	 = UNSTUFF_BITS(resp, 122, 4);
	m = UNSTUFF_BITS(resp, 115, 4);
	e = UNSTUFF_BITS(resp, 112, 3);
	csd->tacc_ns	 = (tacc_exp[e] * tacc_mant[m] + 9) / 10;
	csd->tacc_clks	 = UNSTUFF_BITS(resp, 104, 8) * 100;

	m = UNSTUFF_BITS(resp, 99, 4);
	e = UNSTUFF_BITS(resp, 96, 3);
	csd->max_dtr	  = tran_exp[e] * tran_mant[m];
	csd->cmdclass	  = UNSTUFF_BITS(resp, 84, 12);

	e = UNSTUFF_BITS(resp, 47, 3);
	m = UNSTUFF_BITS(resp, 62, 12);
	csd->capacity	  = (1 + m) << (e + 2);

	csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4);
	csd->read_partial = UNSTUFF_BITS(resp, 79, 1);
	csd->write_misalign = UNSTUFF_BITS(resp, 78, 1);
	csd->read_misalign = UNSTUFF_BITS(resp, 77, 1);
	csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3);
	csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4);
	csd->write_partial = UNSTUFF_BITS(resp, 21, 1);

	return 0;
}
Exemple #4
0
/*
 * Given a 128-bit response, decode to our card CSD structure.
 */
static int mmc_decode_csd(struct mmc_card *card)
{
	struct mmc_csd *csd = &card->csd;
	unsigned int e, m, csd_struct;
	u32 *resp = card->raw_csd;

	csd_struct = UNSTUFF_BITS(resp, 126, 2);

	switch (csd_struct) {
	case 0:
		m = UNSTUFF_BITS(resp, 115, 4);
		e = UNSTUFF_BITS(resp, 112, 3);
		csd->tacc_ns	 = (tacc_exp[e] * tacc_mant[m] + 9) / 10;
		csd->tacc_clks	 = UNSTUFF_BITS(resp, 104, 8) * 100;

		m = UNSTUFF_BITS(resp, 99, 4);
		e = UNSTUFF_BITS(resp, 96, 3);
		csd->max_dtr	  = tran_exp[e] * tran_mant[m];
		csd->cmdclass	  = UNSTUFF_BITS(resp, 84, 12);

		e = UNSTUFF_BITS(resp, 47, 3);
		m = UNSTUFF_BITS(resp, 62, 12);
		csd->capacity	  = (1 + m) << (e + 2);

		csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4);
		csd->read_partial = UNSTUFF_BITS(resp, 79, 1);
		csd->write_misalign = UNSTUFF_BITS(resp, 78, 1);
		csd->read_misalign = UNSTUFF_BITS(resp, 77, 1);
		csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3);
		csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4);
		csd->write_partial = UNSTUFF_BITS(resp, 21, 1);

		if (UNSTUFF_BITS(resp, 46, 1)) {
			csd->erase_size = 1;
		} else if (csd->write_blkbits >= 9) {
			csd->erase_size = UNSTUFF_BITS(resp, 39, 7) + 1;
			csd->erase_size <<= csd->write_blkbits - 9;
		}
		break;
	case 1:
		/*
		 * This is a block-addressed SDHC card. Most
		 * interesting fields are unused and have fixed
		 * values. To avoid getting tripped by buggy cards,
		 * we assume those fixed values ourselves.
		 */
		mmc_card_set_blockaddr(card);

		csd->tacc_ns	 = 0; /* Unused */
		csd->tacc_clks	 = 0; /* Unused */

		m = UNSTUFF_BITS(resp, 99, 4);
		e = UNSTUFF_BITS(resp, 96, 3);
		csd->max_dtr	  = tran_exp[e] * tran_mant[m];
		csd->cmdclass	  = UNSTUFF_BITS(resp, 84, 12);

		m = UNSTUFF_BITS(resp, 48, 22);
		csd->capacity     = (1 + m) << 10;

		csd->read_blkbits = 9;
		csd->read_partial = 0;
		csd->write_misalign = 0;
		csd->read_misalign = 0;
		csd->r2w_factor = 4; /* Unused */
		csd->write_blkbits = 9;
		csd->write_partial = 0;
		csd->erase_size = 1;
		break;
	default:
		printk(KERN_ERR "%s: unrecognised CSD structure version %d\n",
			mmc_hostname(card->host), csd_struct);
		return -EINVAL;
	}

	card->erase_size = csd->erase_size;

	return 0;
}
/*
 * Given the decoded CSD structure, decode the raw CID to our CID structure.
 */
static void mmc_decode_cid(struct mmc_card *card)
{
	u32 *resp = card->raw_cid;

	memset(&card->cid, 0, sizeof(struct mmc_cid));

	if (mmc_card_sd(card)) {
		card->cid.manfid = UNSTUFF_BITS(resp, 120, 8);
		card->cid.oemid = UNSTUFF_BITS(resp, 104, 16);
		card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8);
		card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8);
		card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8);
		card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8);
		card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8);
		card->cid.hwrev = UNSTUFF_BITS(resp, 60, 4);
		card->cid.fwrev = UNSTUFF_BITS(resp, 56, 4);
		card->cid.serial = UNSTUFF_BITS(resp, 24, 32);
		card->cid.year = UNSTUFF_BITS(resp, 12, 8);
		card->cid.month = UNSTUFF_BITS(resp, 8, 4);
		card->cid.year += 2000;
	} else {
		/*
		 * The selection of the format here is guesswork based upon
		 * information people have sent to date.
		 */
		switch (card->csd.mmca_vsn) {
		case 0:	/* MMC v1.0 - v1.2 */
		case 1:	/* MMC v1.4 */
			card->cid.manfid = UNSTUFF_BITS(resp, 104, 24);
			card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8);
			card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8);
			card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8);
			card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8);
			card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8);
			card->cid.prod_name[5] = UNSTUFF_BITS(resp, 56, 8);
			card->cid.prod_name[6] = UNSTUFF_BITS(resp, 48, 8);
			card->cid.hwrev = UNSTUFF_BITS(resp, 44, 4);
			card->cid.fwrev = UNSTUFF_BITS(resp, 40, 4);
			card->cid.serial = UNSTUFF_BITS(resp, 16, 24);
			card->cid.month = UNSTUFF_BITS(resp, 12, 4);
			card->cid.year = UNSTUFF_BITS(resp, 8, 4);
			card->cid.year += 1997;
			break;
		case 2:	/* MMC v2.0 - v2.2 */
		case 3:	/* MMC v3.1 - v3.3 */
			card->cid.manfid = UNSTUFF_BITS(resp, 120, 8);
			card->cid.oemid = UNSTUFF_BITS(resp, 104, 16);
			card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8);
			card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8);
			card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8);
			card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8);
			card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8);
			card->cid.prod_name[5] = UNSTUFF_BITS(resp, 56, 8);
			card->cid.serial = UNSTUFF_BITS(resp, 16, 32);
			card->cid.month = UNSTUFF_BITS(resp, 12, 4);
			card->cid.year = UNSTUFF_BITS(resp, 8, 4);
			card->cid.year += 1997;
			break;
		default:
			sd_printk(KERN_ERR, "card has unknown MMCA"
				  " version %d\n", card->csd.mmca_vsn);
			break;
		}
	}
}
Exemple #6
0
/*
 * Given a 128-bit response, decode to our card CSD structure.
 */
static int mmc_decode_csd(struct mmc_card *card)
{
	struct mmc_csd *csd = &card->csd;
	unsigned int e, m, csd_struct;
	u32 *resp = card->raw_csd;

	/*
	 * We only understand CSD structure v1.1 and v1.2.
	 * v1.2 has extra information in bits 15, 11 and 10.
	 *
	 * For SanDisk iNAND, after comparing 1.3 with 1.2, I think
	 * 1.3 is compatible with 1.2.
	 */
	csd_struct = UNSTUFF_BITS(resp, 126, 2);
	if (csd_struct != 1 && csd_struct != 2 && csd_struct != 3) {
		printk(KERN_ERR "%s: unrecognised CSD structure version 1.%d\n",
			mmc_hostname(card->host), csd_struct);
		return -EINVAL;
	}

	csd->mmca_vsn	 = UNSTUFF_BITS(resp, 122, 4);
	m = UNSTUFF_BITS(resp, 115, 4);
	e = UNSTUFF_BITS(resp, 112, 3);
	csd->tacc_ns	 = (tacc_exp[e] * tacc_mant[m] + 9) / 10;
	csd->tacc_clks	 = UNSTUFF_BITS(resp, 104, 8) * 100;

	m = UNSTUFF_BITS(resp, 99, 4);
	e = UNSTUFF_BITS(resp, 96, 3);
	csd->max_dtr	  = tran_exp[e] * tran_mant[m];
	csd->cmdclass	  = UNSTUFF_BITS(resp, 84, 12);

	e = UNSTUFF_BITS(resp, 47, 3);
	m = UNSTUFF_BITS(resp, 62, 12);
	csd->capacity	  = (1 + m) << (e + 2);

	csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4);
	csd->read_partial = UNSTUFF_BITS(resp, 79, 1);
	csd->write_misalign = UNSTUFF_BITS(resp, 78, 1);
	csd->read_misalign = UNSTUFF_BITS(resp, 77, 1);
	csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3);
	csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4);
	csd->write_partial = UNSTUFF_BITS(resp, 21, 1);

	return 0;
}
Exemple #7
0
/*
 * Given the decoded CSD structure, decode the raw CID to our CID structure.
 */
void mmc_decode_cid(struct mmc_card *card)
{
	u32 *resp = card->raw_cid;

	memset(&card->cid, 0, sizeof(struct mmc_cid));

	/*
	 * SD doesn't currently have a version field so we will
	 * have to assume we can parse this.
	 */
	card->cid.manfid		= UNSTUFF_BITS(resp, 120, 8);
	card->cid.oemid			= UNSTUFF_BITS(resp, 104, 16);
	card->cid.prod_name[0]		= UNSTUFF_BITS(resp, 96, 8);
	card->cid.prod_name[1]		= UNSTUFF_BITS(resp, 88, 8);
	card->cid.prod_name[2]		= UNSTUFF_BITS(resp, 80, 8);
	card->cid.prod_name[3]		= UNSTUFF_BITS(resp, 72, 8);
	card->cid.prod_name[4]		= UNSTUFF_BITS(resp, 64, 8);
	card->cid.hwrev			= UNSTUFF_BITS(resp, 60, 4);
	card->cid.fwrev			= UNSTUFF_BITS(resp, 56, 4);
	card->cid.serial		= UNSTUFF_BITS(resp, 24, 32);
	card->cid.year			= UNSTUFF_BITS(resp, 12, 8);
	card->cid.month			= UNSTUFF_BITS(resp, 8, 4);

	card->cid.year += 2000; /* SD cards year offset */
}
/*
 * Given a 128-bit response, decode to our card CSD structure.
 */
static void mmc_decode_csd(struct mmc_card *card)
{
	struct mmc_csd *csd = &card->csd;
	unsigned int e, m, csd_struct;
	u32 *resp = card->raw_csd;

	/*
	 * We only understand CSD structure v1.0, v1.1 and v2.
	 * v2 has extra information in bits 15, 11 and 10.
	 */
	csd_struct = UNSTUFF_BITS(resp, 126, 2);
	if (csd_struct != 0 && csd_struct != 1 && csd_struct != 2) {
		sd_printk(KERN_ERR, "unrecognised CSD structure"
			  " version %d\n", csd_struct);
		return;
	}

	csd->mmca_vsn = UNSTUFF_BITS(resp, 122, 4);

	/* TAAC */
	m = UNSTUFF_BITS(resp, 115, 4);
	e = UNSTUFF_BITS(resp, 112, 3);
	csd->tacc_ns = (tacc_exp[e] * tacc_mant[m] + 9) / 10;

	/* NSAC */
	csd->tacc_clks = UNSTUFF_BITS(resp, 104, 8) * 100;

	/* TRAN_SPEED */
	m = UNSTUFF_BITS(resp, 99, 4);
	e = UNSTUFF_BITS(resp, 96, 3);
	csd->max_dtr = tran_exp[e] * tran_mant[m];

	/* CCC */
	csd->cmdclass = UNSTUFF_BITS(resp, 84, 12);

	/* READ_BL_LEN */
	csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4);

	/* C_SIZE */
	m = UNSTUFF_BITS(resp, 62, 12);

	/* C_SIZE_MULT */
	e = UNSTUFF_BITS(resp, 47, 3);

	csd->capacity = (1 + m) << (e + 2);	/* in card blocks */
}
Exemple #9
0
void sd_parse_csd(int raw[4], struct csd *csd) {
	csd->file_format        = UNSTUFF_BITS(raw, 2, 2);
	csd->tmp_write_protect  = UNSTUFF_BITS(raw, 4, 1);
	csd->perm_write_protect = UNSTUFF_BITS(raw, 5, 1);
	csd->copy               = UNSTUFF_BITS(raw, 6, 1);
	csd->file_format_grp    = UNSTUFF_BITS(raw, 7, 1);
	csd->write_bl_partial   = UNSTUFF_BITS(raw, 13, 1);
	csd->write_bl_len       = UNSTUFF_BITS(raw, 14, 4);
	csd->r2w_factor         = UNSTUFF_BITS(raw, 18, 3);
	csd->wp_grp_enable      = UNSTUFF_BITS(raw, 23, 1);
	csd->wp_grp_size        = UNSTUFF_BITS(raw, 24, 7);
	csd->sector_size        = UNSTUFF_BITS(raw, 31, 7);
	csd->erase_blk_en       = UNSTUFF_BITS(raw, 38, 1);
	csd->c_size_mult        = UNSTUFF_BITS(raw, 39, 3);
	csd->vdd_w_curr_max     = UNSTUFF_BITS(raw, 42, 3);
	csd->vdd_w_curr_min     = UNSTUFF_BITS(raw, 45, 3);
	csd->vdd_r_curr_max     = UNSTUFF_BITS(raw, 48, 3);
	csd->vdd_r_curr_min     = UNSTUFF_BITS(raw, 51, 3);
	csd->c_size             = UNSTUFF_BITS(raw, 54, 12);
	csd->dsr_imp            = UNSTUFF_BITS(raw, 68, 1);
	csd->read_blk_misalign  = UNSTUFF_BITS(raw, 69, 1);
	csd->write_blk_misalign = UNSTUFF_BITS(raw, 70, 1);
	csd->read_bl_partial    = UNSTUFF_BITS(raw, 71, 1);
	csd->read_bl_len        = UNSTUFF_BITS(raw, 72, 4);
	csd->ccc                = UNSTUFF_BITS(raw, 76, 12);
	csd->tran_speed         = UNSTUFF_BITS(raw, 88, 8);
	csd->nsac               = UNSTUFF_BITS(raw, 96, 8);
	csd->taac               = UNSTUFF_BITS(raw, 104, 8);
	csd->csd_structure      = UNSTUFF_BITS(raw, 118, 2);
}
Exemple #10
0
/*
 * Given a 128-bit response, decode to our card CSD structure.
 */
static int mmc_decode_csd(struct mmc_card *card)
{
	struct mmc_csd *csd = &card->csd;
	unsigned int e, m, a, b;
	u32 *resp = card->raw_csd;

	/*
	 * We only understand CSD structure v1.1 and v1.2.
	 * v1.2 has extra information in bits 15, 11 and 10.
	 * We also support eMMC v4.4 & v4.41.
	 */
	csd->structure = UNSTUFF_BITS(resp, 126, 2);
	if (csd->structure == 0) {
		printk(KERN_ERR "%s: unrecognised CSD structure version %d\n",
			mmc_hostname(card->host), csd->structure);
		return -EINVAL;
	}

	csd->mmca_vsn	 = UNSTUFF_BITS(resp, 122, 4);
	m = UNSTUFF_BITS(resp, 115, 4);
	e = UNSTUFF_BITS(resp, 112, 3);
	csd->tacc_ns	 = (tacc_exp[e] * tacc_mant[m] + 9) / 10;
	csd->tacc_clks	 = UNSTUFF_BITS(resp, 104, 8) * 100;

	m = UNSTUFF_BITS(resp, 99, 4);
	e = UNSTUFF_BITS(resp, 96, 3);
	csd->max_dtr	  = tran_exp[e] * tran_mant[m];
	csd->cmdclass	  = UNSTUFF_BITS(resp, 84, 12);

	e = UNSTUFF_BITS(resp, 47, 3);
	m = UNSTUFF_BITS(resp, 62, 12);
	csd->capacity	  = (1 + m) << (e + 2);
#ifdef CONFIG_EMBEDDED_MMC_START_OFFSET
	/* for sector-addressed cards, this will cause csd->capacity to wrap */
	if (mmc_card_blockaddr(card))
		csd->capacity -= card->host->ops->get_host_offset(card->host);
#endif

	csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4);
	csd->read_partial = UNSTUFF_BITS(resp, 79, 1);
	csd->write_misalign = UNSTUFF_BITS(resp, 78, 1);
	csd->read_misalign = UNSTUFF_BITS(resp, 77, 1);
	csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3);
	csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4);
	csd->write_partial = UNSTUFF_BITS(resp, 21, 1);

	a = UNSTUFF_BITS(resp, 42, 5);
	b = UNSTUFF_BITS(resp, 37, 5);
	csd->erase_size = (a + 1) * (b + 1);
	csd->erase_size <<= csd->write_blkbits;

	return 0;
}
Exemple #11
0
/*!
 * MMCDecodeCID - decode the raw CID to our CID structure.
 */
static int MMCDecodeCID(struct mmc_card *card)
{
	dword *resp = card->raw_cid;

	switch (card->csd.mmca_vsn)
    {
    	case 0: /* MMC v1.0 - v1.2 */
    	case 1: /* MMC v1.4 */
    		card->cid.manfid	    = UNSTUFF_BITS(resp, 104, 24);
    		card->cid.prod_name[0]	= UNSTUFF_BITS(resp, 96, 8);
    		card->cid.prod_name[1]	= UNSTUFF_BITS(resp, 88, 8);
    		card->cid.prod_name[2]	= UNSTUFF_BITS(resp, 80, 8);
    		card->cid.prod_name[3]	= UNSTUFF_BITS(resp, 72, 8);
    		card->cid.prod_name[4]	= UNSTUFF_BITS(resp, 64, 8);
    		card->cid.prod_name[5]	= UNSTUFF_BITS(resp, 56, 8);
    		card->cid.prod_name[6]	= UNSTUFF_BITS(resp, 48, 8);
    		card->cid.hwrev		    = UNSTUFF_BITS(resp, 44, 4);
    		card->cid.fwrev		    = UNSTUFF_BITS(resp, 40, 4);
    		card->cid.serial	    = UNSTUFF_BITS(resp, 16, 24);
    		card->cid.month		    = UNSTUFF_BITS(resp, 12, 4);
    		card->cid.year		    = UNSTUFF_BITS(resp, 8, 4) + 1997;
    		break;

    	case 2: /* MMC v2.0 - v2.2 */
    	case 3: /* MMC v3.1 - v3.3 */
    	case 4: /* MMC v4 */
    		card->cid.manfid	    = UNSTUFF_BITS(resp, 120, 8);
    		card->cid.oemid		    = UNSTUFF_BITS(resp, 104, 16);
    		card->cid.prod_name[0]	= UNSTUFF_BITS(resp, 96, 8);
    		card->cid.prod_name[1]	= UNSTUFF_BITS(resp, 88, 8);
    		card->cid.prod_name[2]	= UNSTUFF_BITS(resp, 80, 8);
    		card->cid.prod_name[3]	= UNSTUFF_BITS(resp, 72, 8);
    		card->cid.prod_name[4]	= UNSTUFF_BITS(resp, 64, 8);
    		card->cid.prod_name[5]	= UNSTUFF_BITS(resp, 56, 8);
    		card->cid.serial	    = UNSTUFF_BITS(resp, 16, 32);
    		card->cid.month		    = UNSTUFF_BITS(resp, 12, 4);
    		card->cid.year		    = UNSTUFF_BITS(resp, 8, 4) + 1997;
    		break;

    	default:
    		MMCTraceM(("    >>> card has unknown MMCA version %d\n", card->csd.mmca_vsn));
    		return -EINVAL;
	}

    MMCTraceM(("scr     %08x%08x\n", card->raw_scr[0], card->raw_scr[1]));
    MMCTraceM(("date    %02d/%04d\n", card->cid.month, card->cid.year));
    MMCTraceM(("fwrev   0x%x\n", card->cid.fwrev));
    MMCTraceM(("hwrev   0x%x\n", card->cid.hwrev));
    MMCTraceM(("manfid  0x%06x\n", card->cid.manfid));
    MMCTraceM(("name    %s\n", card->cid.prod_name));
    MMCTraceM(("oemid   0x%04x\n", card->cid.oemid));
    MMCTraceM(("serial  0x%08x\n", card->cid.serial));

	return 0;
}
Exemple #12
0
/*!
 * MMCDecodeCSD - decode the raw CSD to our card CSD structure.
 */
static int MMCDecodeCSD(struct mmc_card *card)
{
	struct mmc_csd *csd = &card->csd;
	unsigned int e, m, csd_struct;
	dword *resp = card->raw_csd;

	csd_struct = UNSTUFF_BITS(resp, 126, 2);
	if (csd_struct != 1 && csd_struct != 2)
    {
		MMCTraceM(("    >>> unrecognised CSD structure version %d\n", csd_struct));
		return -EINVAL;
	}

	csd->mmca_vsn	 = UNSTUFF_BITS(resp, 122, 4);
	m = UNSTUFF_BITS(resp, 115, 4);
	e = UNSTUFF_BITS(resp, 112, 3);
	csd->tacc_ns	 = (tacc_exp[e] * tacc_mant[m] + 9) / 10;
	csd->tacc_clks	 = UNSTUFF_BITS(resp, 104, 8) * 100;

	m = UNSTUFF_BITS(resp, 99, 4);
	e = UNSTUFF_BITS(resp, 96, 3);
	csd->max_dtr	  = tran_exp[e] * tran_mant[m];
	csd->cmdclass	  = UNSTUFF_BITS(resp, 84, 12);

	e = UNSTUFF_BITS(resp, 47, 3);
	m = UNSTUFF_BITS(resp, 62, 12);
	csd->capacity	  = (1 + m) << (e + 2);

	csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4);
	csd->read_partial = UNSTUFF_BITS(resp, 79, 1);
	csd->write_misalign = UNSTUFF_BITS(resp, 78, 1);
	csd->read_misalign = UNSTUFF_BITS(resp, 77, 1);
	csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3);
	csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4);
	csd->write_partial = UNSTUFF_BITS(resp, 21, 1);

    MMCTraceM(("capacity        0x%X\n", csd->capacity));
    MMCTraceM(("max_dtr         0x%X\n", csd->max_dtr));
    MMCTraceM(("read_blkbits    0x%X\n", csd->read_blkbits));
    MMCTraceM(("read_partial    0x%X\n", csd->read_partial));
    MMCTraceM(("write_blkbits   0x%X\n", csd->write_blkbits));
    MMCTraceM(("write_partial   0x%X\n", csd->write_partial));

	return 0;
}