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
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
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.
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
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.