On Thu, Nov 29, 2012 at 08:02:25PM +0100, Sascha Hauer wrote: > For these cards we have to calculate the size using the ext csd > sector count fields. > > Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> > --- > drivers/mci/mci-core.c | 20 ++++++++++++++------ > 1 file changed, 14 insertions(+), 6 deletions(-) > > diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c > index 0d601e3..942d126 100644 > --- a/drivers/mci/mci-core.c > +++ b/drivers/mci/mci-core.c > @@ -758,14 +758,21 @@ static void mci_extract_card_capacity_from_csd(struct mci *mci) > uint64_t csize, cmult; > > if (mci->high_capacity) { > - csize = (mci->csd[1] & 0x3f) << 16 | (mci->csd[2] & 0xffff0000) >> 16; > - cmult = 8; > + if (IS_SD(mci)) { > + csize = UNSTUFF_BITS(mci->csd, 48, 22); > + mci->capacity = (1 + csize) << 10; > + } else { > + mci->capacity = mci->ext_csd[EXT_CSD_SEC_CNT] << 0 | > + mci->ext_csd[EXT_CSD_SEC_CNT + 1] << 8 | > + mci->ext_csd[EXT_CSD_SEC_CNT + 2] << 16 | > + mci->ext_csd[EXT_CSD_SEC_CNT + 3] << 24; > + } > } else { > - csize = (mci->csd[1] & 0x3ff) << 2 | (mci->csd[2] & 0xc0000000) >> 30; > - cmult = (mci->csd[2] & 0x00038000) >> 15; > + cmult = UNSTUFF_BITS(mci->csd, 47, 3); > + csize = UNSTUFF_BITS(mci->csd, 62, 12); > + mci->capacity = (csize + 1) << (cmult + 2); > } > > - mci->capacity = (csize + 1) << (cmult + 2); > mci->capacity *= mci->read_bl_len; > dev_dbg(mci->mci_dev, "Capacity: %u MiB\n", (unsigned)(mci->capacity >> 20)); > } > @@ -996,7 +1003,6 @@ static int mci_startup(struct mci *mci) > mci_detect_version_from_csd(mci); > mci_extract_max_tran_speed_from_csd(mci); > mci_extract_block_lengths_from_csd(mci); > - mci_extract_card_capacity_from_csd(mci); > > /* sanitiy? */ > if (mci->read_bl_len > SECTOR_SIZE) { > @@ -1032,6 +1038,8 @@ static int mci_startup(struct mci *mci) > if (err) > return err; > > + mci_extract_card_capacity_from_csd(mci); > + > /* Restrict card's capabilities by what the host can do */ > mci->card_caps &= host->host_caps; Here's a fixup patch for this one: -- >From 67947f2d47a752e3c96bc6e29f92459e19e2eab2 Mon Sep 17 00:00:00 2001 From: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> Date: Thu, 29 Nov 2012 16:46:19 +0100 Subject: [PATCH] fixup! mci: Fix capacity calculation for high capacity MMC cards commit bbcf96113 moved the size calculation further down, but this has the effect that the size of cards with block sizes > 512 bytes is no longer correct. This is because barebox limits the blocksize to 512 bytes. To fix this use the blocksize value from the csd, not the barebox one. This is broken since: | commit bbcf961133e0d8ddf016ed698724d0ec8d7fd6b8 | Author: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> | Date: Thu Nov 29 16:48:19 2012 +0100 | | mci: Fix capacity calculation for high capacity MMC cards | | For these cards we have to calculate the size using the ext csd | sector count fields. | Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> --- drivers/mci/mci-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c index 6e556a8..4957256 100644 --- a/drivers/mci/mci-core.c +++ b/drivers/mci/mci-core.c @@ -773,7 +773,7 @@ static void mci_extract_card_capacity_from_csd(struct mci *mci) mci->capacity = (csize + 1) << (cmult + 2); } - mci->capacity *= mci->read_bl_len; + mci->capacity *= 1 << UNSTUFF_BITS(mci->csd, 80, 4);; dev_dbg(mci->mci_dev, "Capacity: %u MiB\n", (unsigned)(mci->capacity >> 20)); } -- 1.7.10.4 Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox