To support SD Cards (or any other smart cards) bigger than 1GB there is a need to patch drivers/mmc/mmc_block.c, see also http://marc.theaimsgroup.com/?l=linux-kernel&m=114980773206129&w=2. The trikc is to set the block size staticaly to 512 Byte (9 Bit) instead of reading it from the card itself which results in my case in an error like "unable to set block size to 1024". Works fine for me and is included in other distros as well (seen in a forum, don't remember which one, I had to reboot my box to test the patch :-): --- a/drivers/mmc/mmc_block.c +++ b/drivers/mmc/mmc_block.c @@ -325,52 +325,11 @@ static struct mmc_blk_data *mmc_blk_allo md->read_only = mmc_blk_readonly(card); /* - * Figure out a workable block size. MMC cards have: - * - two block sizes, one for read and one for write. - * - may support partial reads and/or writes - * (allows block sizes smaller than specified) + * Both SD and MMC specifications state (although a bit + * unclearly in the MMC case) that a block size of 512 + * bytes must always be supported by the card. */ - md->block_bits = card->csd.read_blkbits; - if (card->csd.write_blkbits != card->csd.read_blkbits) { - if (card->csd.write_blkbits < card->csd.read_blkbits && - card->csd.read_partial) { - /* - * write block size is smaller than read block - * size, but we support partial reads, so choose - * the smaller write block size. - */ - md->block_bits = card->csd.write_blkbits; - } else if (card->csd.write_blkbits > card->csd.read_blkbits && - card->csd.write_partial) { - /* - * read block size is smaller than write block - * size, but we support partial writes. Use read - * block size. - */ - } else { - /* - * We don't support this configuration for writes. - */ - printk(KERN_ERR "%s: unable to select block size for " - "writing (rb%u wb%u rp%u wp%u)\n", - mmc_card_id(card), - 1 << card->csd.read_blkbits, - 1 << card->csd.write_blkbits, - card->csd.read_partial, - card->csd.write_partial); - md->read_only = 1; - } - } - - /* - * Refuse to allow block sizes smaller than 512 bytes. - */ - if (md->block_bits < 9) { - printk(KERN_ERR "%s: unable to support block size %u\n", - mmc_card_id(card), 1 << md->block_bits); - ret = -EINVAL; - goto err_kfree; - } + md->block_bits = 9; md->disk = alloc_disk(1 << MMC_SHIFT); if (md->disk == NULL) {
still valid for gentoo-sources-2.6.17-r5 :-(
Indeed, see my reply on the thread you linked to: http://marc.theaimsgroup.com/?l=linux-kernel&m=115546362627753&w=2 Perhaps you could email Pierre with the success report as a gentle reminder about this patch :)
This is merged into a subsystem tree
Fixed in gentoo-sources-2.6.17-r8 (genpatches-2.6.17-10). Thanks for the patch.
Works fine, thx a lot :-)