When using a high capacity card with a density less than
 2 GB a wrong size is calculated. According to JEDEC 4.41 there is no
 differentiation for C_SIZE register between low and high capacity cards.
 Use ext_csd sector count to calculate capacity instead.

Signed-off-by: Oliver Metz <oli...@freetz.org>
---
 drivers/mmc/mmc.c | 20 ++++----------------
 1 file changed, 4 insertions(+), 16 deletions(-)

diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 84dae4d..ff11ff9 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -884,15 +884,9 @@ static int mmc_startup(struct mmc *mmc)
        else
                mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
 
-       if (mmc->high_capacity) {
-               csize = (mmc->csd[1] & 0x3f) << 16
-                       | (mmc->csd[2] & 0xffff0000) >> 16;
-               cmult = 8;
-       } else {
-               csize = (mmc->csd[1] & 0x3ff) << 2
-                       | (mmc->csd[2] & 0xc0000000) >> 30;
-               cmult = (mmc->csd[2] & 0x00038000) >> 15;
-       }
+       csize = (mmc->csd[1] & 0x3ff) << 2
+               | (mmc->csd[2] & 0xc0000000) >> 30;
+       cmult = (mmc->csd[2] & 0x00038000) >> 15;
 
        mmc->capacity_user = (csize + 1) << (cmult + 2);
        mmc->capacity_user *= mmc->read_bl_len;
@@ -927,18 +921,12 @@ static int mmc_startup(struct mmc *mmc)
                /* check  ext_csd version and capacity */
                err = mmc_send_ext_csd(mmc, ext_csd);
                if (!err && (ext_csd[EXT_CSD_REV] >= 2)) {
-                       /*
-                        * According to the JEDEC Standard, the value of
-                        * ext_csd's capacity is valid if the value is more
-                        * than 2GB
-                        */
                        capacity = ext_csd[EXT_CSD_SEC_CNT] << 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;
                        capacity *= MMC_MAX_BLOCK_LEN;
-                       if ((capacity >> 20) > 2 * 1024)
-                               mmc->capacity_user = capacity;
+                       mmc->capacity_user = capacity;
                }
 
                switch (ext_csd[EXT_CSD_REV]) {
-- 
1.8.4

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to