| From stable-bounces@linux.kernel.org Sat Sep 16 21:06:20 2006 |
| Message-ID: <450CC959.9070709@gentoo.org> |
| Date: Sun, 17 Sep 2006 00:04:41 -0400 |
| From: Pierre Ossman <drzeus@drzeus.cx> |
| To: stable@kernel.org |
| Cc: drzeus@drzeus.cx |
| Subject: MMC: Always use a sector size of 512 bytes |
| |
| From: Pierre Ossman <drzeus@drzeus.cx> |
| |
| Both MMC and SD specifications specify (although a bit unclearly in the MMC |
| case) that a sector size of 512 bytes must always be supported by the card. |
| |
| Cards can report larger "native" size than this, and cards >= 2 GB even |
| must do so. Most other readers use 512 bytes even for these cards. We should |
| do the same to be compatible. |
| |
| Signed-off-by: Pierre Ossman <drzeus@drzeus.cx> |
| Cc: Daniel Drake <dsd@gentoo.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/mmc/mmc_block.c | 49 +++--------------------------------------------- |
| 1 file changed, 4 insertions(+), 45 deletions(-) |
| |
| --- linux-2.6.17.13.orig/drivers/mmc/mmc_block.c |
| +++ linux-2.6.17.13/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) { |