Re: [PATCH 2/5] mci: Fix capacity calculation for high capacity MMC cards

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux Embedded]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux