From: "Jordan Crouse" <jordan.crouse@amd.com>
To: linux-mips@linux-mips.org, rmk+lkml@arm.linux.org.uk, drzeus@drzeus.cx
Subject: [PATCH] Force MMC/SD to 512 byte block sizes
Date: Fri, 6 Jan 2006 09:44:06 -0700 [thread overview]
Message-ID: <20060106164406.GA15617@cosmic.amd.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 1078 bytes --]
This patch is not specific to the AU1200 SD driver, but thats what
we used to debug and verify this, so thats why it is applied against
the linux-mips tree. Pierre, I'm sending this to you too, because I thought
you may be interested.
Large SD cards (>=2GB) report a physical block size greater then 512 bytes
(2GB reports 1024, and 4GB reports 2048). However, a sample of different
brands of USB attached SD readers have shown that the logical block size
is still forced to 512 bytes.
The original mmc_block code was setting the block size to whatever the
card was reporting, thereby causing much pain and suffering when using
a card initialized elsewhere (bad partition tables, invalid FAT tables, etc).
This patch forces the block size to be 512 bytes, and adjusts the
capacity accordingly. With this you should be able to happily use very
large cards interchangeably between platforms. At least, it has worked for
us.
Comments welcome,
Jordan
--
Jordan Crouse
Senior Linux Engineer
AMD - Personal Connectivity Solutions Group
<www.amd.com/embeddedprocessors>
[-- Attachment #2: mmc_fix.patch --]
[-- Type: text/plain, Size: 1899 bytes --]
PATCH: Force MMC/SD to 512 byte block sizes.
Angry customers and investigation into USB attached MMC/SD
readers have lead us to believe that the SD device block size should
be fixed at 512 bytes regardless of the block size reported by the card.
This comes into play with >2G cards. After applying this fix, filesystems
written with a USB card reader can be read by the MMC subsystem and
vice-versa.
Signed-off-by: Jordan Crouse <jordan.crouse@amd.com>
---
drivers/mmc/mmc_block.c | 16 +++++++++++++---
1 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/drivers/mmc/mmc_block.c b/drivers/mmc/mmc_block.c
index d91fcf7..96fa121 100644
--- a/drivers/mmc/mmc_block.c
+++ b/drivers/mmc/mmc_block.c
@@ -303,6 +303,7 @@ static struct mmc_blk_data *mmc_blk_allo
{
struct mmc_blk_data *md;
int devidx, ret;
+ unsigned long cap;
devidx = find_first_zero_bit(dev_use, MMC_NUM_MINORS);
if (devidx >= MMC_NUM_MINORS)
@@ -356,10 +357,19 @@ static struct mmc_blk_data *mmc_blk_allo
sprintf(md->disk->disk_name, "mmcblk%d", devidx);
sprintf(md->disk->devfs_name, "mmc/blk%d", devidx);
- md->block_bits = card->csd.read_blkbits;
+ if (card->csd.read_blkbits > 9) {
+ md->block_bits = 9;
+
+ cap = card->csd.capacity <<
+ (card->csd.read_blkbits - 9);
+ }
+ else {
+ md->block_bits = card->csd.read_blkbits;
+ cap = card->csd.capacity;
+ }
blk_queue_hardsect_size(md->queue.queue, 1 << md->block_bits);
- set_capacity(md->disk, card->csd.capacity);
+ set_capacity(md->disk, cap);
}
out:
return md;
@@ -373,7 +383,7 @@ mmc_blk_set_blksize(struct mmc_blk_data
mmc_card_claim_host(card);
cmd.opcode = MMC_SET_BLOCKLEN;
- cmd.arg = 1 << card->csd.read_blkbits;
+ cmd.arg = 1 << ((card->csd.read_blkbits > 9) ? 9 : card->csd.read_blkbits);
cmd.flags = MMC_RSP_R1;
err = mmc_wait_for_cmd(card->host, &cmd, 5);
mmc_card_release_host(card);
next reply other threads:[~2006-01-06 16:35 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-01-06 16:44 Jordan Crouse [this message]
2006-01-06 16:59 ` [PATCH] Force MMC/SD to 512 byte block sizes Russell King
2006-01-06 17:42 ` Jordan Crouse
2006-01-09 17:49 ` Jordan Crouse
2006-01-06 17:04 ` [PATCH] " Pierre Ossman
2006-01-06 17:50 ` Jordan Crouse
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060106164406.GA15617@cosmic.amd.com \
--to=jordan.crouse@amd.com \
--cc=drzeus@drzeus.cx \
--cc=linux-mips@linux-mips.org \
--cc=rmk+lkml@arm.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox