[U-Boot] [PATCH] mmc: fix capacity calculation with high capacity mmc

According spec, high capacity mmc should be calculated by sector number multiply by sector size.
Signed-off-by: Lei Wen leiwen@marvell.com --- drivers/mmc/mmc.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index ea398a5..bb97171 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -441,6 +441,11 @@ int mmc_change_freq(struct mmc *mmc) if (!ext_csd[185]) return 0;
+ if (!IS_SD(mmc) && mmc->high_capacity) { + mmc->capacity = ext_csd[212] | (ext_csd[213] << 8) + | (ext_csd[214] << 16) | (ext_csd[215] << 24); + mmc->capacity *= mmc->read_bl_len; + } /* High Speed is set, there are two types: 52MHz and 26MHz */ if (cardtype & MMC_HS_52MHZ) mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;

Dear Lei Wen,
According spec, high capacity mmc should be calculated by sector number multiply by sector size.
Signed-off-by: Lei Wen leiwen@marvell.com
drivers/mmc/mmc.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index ea398a5..bb97171 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -441,6 +441,11 @@ int mmc_change_freq(struct mmc *mmc) if (!ext_csd[185]) return 0;
- if (!IS_SD(mmc) && mmc->high_capacity) {
mmc->capacity = ext_csd[212] | (ext_csd[213] << 8)
| (ext_csd[214] << 16) | (ext_csd[215] << 24);
mmc->capacity *= mmc->read_bl_len;
- } /* High Speed is set, there are two types: 52MHz and 26MHz */ if (cardtype & MMC_HS_52MHZ) mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
Sorry to kick in again...
a) this calculation is already done in line 717, and certainly does not belong in a function called "mmc_change_freq".
b) the current Top-Of-Tree code already calculates the capacity correctly:
32GB SDHC Card:
Device: mci Manufacturer ID: 3 OEM: 5344 Name: SD32G Tran Speed: 25000000 Rd Block Len: 512 SD version 2.0 High Capacity: Yes Capacity: 31914983424 Bus Width: 4-bit
c) is that now an incremental patch to the one you sent previously?
Best Regards, Reinhard

Hi Reinhard ,
On Mon, Sep 6, 2010 at 10:07 PM, Reinhard Meyer u-boot@emk-elektronik.de wrote:
Dear Lei Wen,
According spec, high capacity mmc should be calculated by sector number multiply by sector size.
Signed-off-by: Lei Wen leiwen@marvell.com
drivers/mmc/mmc.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index ea398a5..bb97171 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -441,6 +441,11 @@ int mmc_change_freq(struct mmc *mmc) if (!ext_csd[185]) return 0;
- if (!IS_SD(mmc) && mmc->high_capacity) {
- mmc->capacity = ext_csd[212] | (ext_csd[213] << 8)
- | (ext_csd[214] << 16) | (ext_csd[215] << 24);
- mmc->capacity *= mmc->read_bl_len;
- }
/* High Speed is set, there are two types: 52MHz and 26MHz */ if (cardtype & MMC_HS_52MHZ) mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
Sorry to kick in again...
a) this calculation is already done in line 717, and certainly does not belong in a function called "mmc_change_freq".
b) the current Top-Of-Tree code already calculates the capacity correctly:
32GB SDHC Card:
Device: mci Manufacturer ID: 3 OEM: 5344 Name: SD32G Tran Speed: 25000000 Rd Block Len: 512 SD version 2.0 High Capacity: Yes Capacity: 31914983424 Bus Width: 4-bit
Yes, for sd card, the calculation method is right. But for mmc with high capacity, the calculation is wrong. You could try a mmc card with high capacity, like emmc card.
c) is that now an incremental patch to the one you sent previously?
It is a separate one. :-)
Best regards, Lei

Hi Wolfgang,
How about merge this patch? :-)
Best regards, Lei
On Mon, Sep 6, 2010 at 10:11 PM, Lei Wen adrian.wenl@gmail.com wrote:
Hi Reinhard ,
On Mon, Sep 6, 2010 at 10:07 PM, Reinhard Meyer u-boot@emk-elektronik.de wrote:
Dear Lei Wen,
According spec, high capacity mmc should be calculated by sector number multiply by sector size.
Signed-off-by: Lei Wen leiwen@marvell.com
drivers/mmc/mmc.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index ea398a5..bb97171 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -441,6 +441,11 @@ int mmc_change_freq(struct mmc *mmc) if (!ext_csd[185]) return 0;
- if (!IS_SD(mmc) && mmc->high_capacity) {
- mmc->capacity = ext_csd[212] | (ext_csd[213] << 8)
- | (ext_csd[214] << 16) | (ext_csd[215] << 24);
- mmc->capacity *= mmc->read_bl_len;
- }
/* High Speed is set, there are two types: 52MHz and 26MHz */ if (cardtype & MMC_HS_52MHZ) mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
Sorry to kick in again...
a) this calculation is already done in line 717, and certainly does not belong in a function called "mmc_change_freq".
b) the current Top-Of-Tree code already calculates the capacity correctly:
32GB SDHC Card:
Device: mci Manufacturer ID: 3 OEM: 5344 Name: SD32G Tran Speed: 25000000 Rd Block Len: 512 SD version 2.0 High Capacity: Yes Capacity: 31914983424 Bus Width: 4-bit
Yes, for sd card, the calculation method is right. But for mmc with high capacity, the calculation is wrong. You could try a mmc card with high capacity, like emmc card.
c) is that now an incremental patch to the one you sent previously?
It is a separate one. :-)
Best regards, Lei

Dear Lei Wen,
In message AANLkTimaQtTCJf52DjF-AhdEfFQbHfwyeJD3024VwFWu@mail.gmail.com you wrote:
How about merge this patch? :-)
I will wait for a pull request from the responsible custodian.
Maybe you should have put him on cc: ... (done now).
Best regards,
Wolfgang Denk

Dear Wolfgang Denk, Lei Wen, Andy Fleming,
Dear Lei Wen,
In messageAANLkTimaQtTCJf52DjF-AhdEfFQbHfwyeJD3024VwFWu@mail.gmail.com you wrote:
How about merge this patch? :-)
I will wait for a pull request from the responsible custodian.
Maybe you should have put him on cc: ... (done now).
@@ -441,6 +441,11 @@ int mmc_change_freq(struct mmc *mmc)
if (!ext_csd[185]) return 0;
if (!IS_SD(mmc) && mmc->high_capacity) {
mmc->capacity = ext_csd[212] | (ext_csd[213] << 8)
| (ext_csd[214] << 16) | (ext_csd[215] << 24);
mmc->capacity *= mmc->read_bl_len;
} /* High Speed is set, there are two types: 52MHz and 26MHz */
I am still convinced "mmc_change_freq()" is the wrong place to do that calculation. All other card types do it around line 700...
Best Regards, Reinhard

Dear Reinhard,
On Sun, Sep 19, 2010 at 12:32 PM, Reinhard Meyer u-boot@emk-elektronik.de wrote:
Dear Wolfgang Denk, Lei Wen, Andy Fleming,
Dear Lei Wen,
In messageAANLkTimaQtTCJf52DjF-AhdEfFQbHfwyeJD3024VwFWu@mail.gmail.com you wrote:
How about merge this patch? :-)
I will wait for a pull request from the responsible custodian.
Maybe you should have put him on cc: ... (done now).
@@ -441,6 +441,11 @@ int mmc_change_freq(struct mmc *mmc)
if (!ext_csd[185]) return 0;
- if (!IS_SD(mmc) && mmc->high_capacity) {
- mmc->capacity = ext_csd[212] | (ext_csd[213] << 8)
- | (ext_csd[214] << 16) | (ext_csd[215] << 24);
- mmc->capacity *= mmc->read_bl_len;
- }
/* High Speed is set, there are two types: 52MHz and 26MHz */
I am still convinced "mmc_change_freq()" is the wrong place to do that calculation. All other card types do it around line 700...
But in other place, how could we get the ext_csd info? If you could let me get this line at the line, as you said 700, I am fine to put this code to there...
Thanks, Lei

On Sat, Sep 18, 2010 at 3:49 PM, Wolfgang Denk wd@denx.de wrote:
Dear Lei Wen,
In message AANLkTimaQtTCJf52DjF-AhdEfFQbHfwyeJD3024VwFWu@mail.gmail.com you wrote:
How about merge this patch? :-)
I will wait for a pull request from the responsible custodian.
Maybe you should have put him on cc: ... (done now).
I pinged Andy about some mmc patches that he replied "Applied" to back in May but never made it into the repo. I see no emails from him to the u-boot list for sometime.
Andy, are you still around? Freescalers, any info?
Thanks John

Dne Út 21. září 2010 16:45:25 John Rigby napsal(a):
On Sat, Sep 18, 2010 at 3:49 PM, Wolfgang Denk wd@denx.de wrote:
Dear Lei Wen,
In message AANLkTimaQtTCJf52DjF-AhdEfFQbHfwyeJD3024VwFWu@mail.gmail.com
you wrote:
How about merge this patch? :-)
I will wait for a pull request from the responsible custodian.
Maybe you should have put him on cc: ... (done now).
I pinged Andy about some mmc patches that he replied "Applied" to back in May but never made it into the repo. I see no emails from him to the u-boot list for sometime.
Andy, are you still around? Freescalers, any info?
Andy's around, but he's slow sometimes ... definition of "slow" is relative though :)
Thanks John _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
participants (6)
-
John Rigby
-
Lei Wen
-
Lei Wen
-
Marek Vasut
-
Reinhard Meyer
-
Wolfgang Denk