2009-01-09 03:54:05

by yi li

[permalink] [raw]
Subject: [BUG] MMC/SD: SDHC card capacity not correct

Hi Pierre,

I am using a Transcend SDHC 8GB SD card, with mmc-spi driver in
Linux-2.6.28. When inserting the card, the messages shows the card
capacity is "3.51 GiB":
"mmc0: new SDHC card on SPI
mmcblk0: mmc0:0000 SDC 3.51 GiB
mmcblk0: p1 "

While fdisk shows correct capacity:
" fdisk -l /dev/mmcblk0
Disk /dev/mmcblk0: 8068 MB, 8068268032 bytes
249 heads, 62 sectors/track, 1020 cylinders
Units = cylinders of 15438 * 512 = 7904256 bytes

Device Boot Start End Blocks Id System
/dev/mmcblk0p1 1 1020 7873349 83 Linux
"
So I think there are something wrong with mmc-block code.

Could you please have a look? (I am not on the LKML btw).

Best Regards,
- Li Yi


2009-01-12 04:59:23

by yi li

[permalink] [raw]
Subject: Re: [BUG] MMC/SD: SDHC card capacity not correct

On Mon, Jan 12, 2009 at 4:48 AM, Nifty niftylinkern Mitch
<[email protected]> wrote:
>
> Check the partition map. I see one partition smaller than the SD card.
> Compare /dev/mmcblk0 and /dev/mmcblk0p1.
> If this is the answer post a follow up to the kernel list that it was solved.
>

Thanks for the response, but what do you mean?
There is only one partition in the partition table, i.e.,
/dev/mmcblk0p1, isn't it?

fdisk /dev/mmcblk0

Command (m for help): p

Disk /dev/mmcblk0: 8068 MB, 8068268032 bytes
249 heads, 62 sectors/track, 1020 cylinders
Units = cylinders of 15438 * 512 = 7904256 bytes

Device Boot Start End Blocks Id System
/dev/mmcblk0p1 1 1020 7873349 83 Linux

Command (m for help): x
Expert command (m for help): p
Disk /dev/mmcblk0: 249 heads, 62 sectors, 1020 cylinders

Nr AF Hd Sec Cyl Hd Sec Cyl Start Size ID
1 00 1 1 0 248 62 1019 62 15746698 83
2 00 0 0 0 0 0 0 0 0 00
3 00 0 0 0 0 0 0 0 0 00
4 00 0 0 0 0 0 0 0 0 00

-Yi

2009-01-12 15:20:58

by Pierre Ossman

[permalink] [raw]
Subject: Re: [BUG] MMC/SD: SDHC card capacity not correct

On Fri, 9 Jan 2009 11:53:52 +0800
"yi li" <[email protected]> wrote:

> Hi Pierre,
>
> I am using a Transcend SDHC 8GB SD card, with mmc-spi driver in
> Linux-2.6.28. When inserting the card, the messages shows the card
> capacity is "3.51 GiB":
> "mmc0: new SDHC card on SPI
> mmcblk0: mmc0:0000 SDC 3.51 GiB
> mmcblk0: p1 "
>
> While fdisk shows correct capacity:
> " fdisk -l /dev/mmcblk0
> Disk /dev/mmcblk0: 8068 MB, 8068268032 bytes

Odd. Is the entire device accessible? (I.e. is it just a printk
problem?)

Could you give me a dmesg dump with MMC_DEBUG turned on in Kconfig?

Rgds
--
-- Pierre Ossman

Linux kernel, MMC maintainer http://www.kernel.org
rdesktop, core developer http://www.rdesktop.org

WARNING: This correspondence is being monitored by the
Swedish government. Make sure your server uses encryption
for SMTP traffic and consider using PGP for end-to-end
encryption.

2009-01-13 08:00:33

by yi li

[permalink] [raw]
Subject: Re: [BUG] MMC/SD: SDHC card capacity not correct

On Mon, Jan 12, 2009 at 11:20 PM, Pierre Ossman <[email protected]> wrote:
>
> Odd. Is the entire device accessible? (I.e. is it just a printk
> problem?)
>

It is a printk problem.

> Could you give me a dmesg dump with MMC_DEBUG turned on in Kconfig?
>

I did debug on my side (I think it is more easy to reproduce here :-)
). The issue is in mmc/card/block.c: mmc_block_probe().

"string_get_size(get_capacity(md->disk) << 9, STRING_UNITS_2,
cap_str, sizeof(cap_str));
"
get_capacity() returns a type "sector_t" value, since I am working on
a 32-bit processor (Analog Devices BF537),
and I did not enable CONFIG_LBD, "sector_t" is actually a 32-bit
"unsigned long". So "get_capacity(md->disk) << 9" loses the MSB.

I can think of two fixes:

1. Set CONFIG_LBD
2. Fix like this:
--- card/block.c 2009-01-13 15:56:05.000000000 +0800
+++ card/block.c.new 2009-01-13 15:53:45.000000000 +0800
@@ -514,7 +514,7 @@ static int mmc_blk_probe(struct mmc_card
if (err)
goto out;

- string_get_size(get_capacity(md->disk) << 9, STRING_UNITS_2,
+ string_get_size((u64)get_capacity(md->disk) << 9, STRING_UNITS_2,
cap_str, sizeof(cap_str));
printk(KERN_INFO "%s: %s %s %s %s\n",
md->disk->disk_name, mmc_card_id(card), mmc_card_name(card),

I prefer the second fix, what do you think?

Regards,

-Li Yi

2009-01-24 17:46:18

by Pierre Ossman

[permalink] [raw]
Subject: Re: [BUG] MMC/SD: SDHC card capacity not correct

On Tue, 13 Jan 2009 16:00:21 +0800
yi li <[email protected]> wrote:

> 2. Fix like this:
> --- card/block.c 2009-01-13 15:56:05.000000000 +0800
> +++ card/block.c.new 2009-01-13 15:53:45.000000000 +0800
> @@ -514,7 +514,7 @@ static int mmc_blk_probe(struct mmc_card
> if (err)
> goto out;
>
> - string_get_size(get_capacity(md->disk) << 9, STRING_UNITS_2,
> + string_get_size((u64)get_capacity(md->disk) << 9, STRING_UNITS_2,
> cap_str, sizeof(cap_str));
> printk(KERN_INFO "%s: %s %s %s %s\n",
> md->disk->disk_name, mmc_card_id(card), mmc_card_name(card),
>
> I prefer the second fix, what do you think?
>

Agreed. Send me a proper patch with a S-o-b and all that. :)

Rgds
--
-- Pierre Ossman

Linux kernel, MMC maintainer http://www.kernel.org
rdesktop, core developer http://www.rdesktop.org

WARNING: This correspondence is being monitored by the
Swedish government. Make sure your server uses encryption
for SMTP traffic and consider using PGP for end-to-end
encryption.