[U-Boot] [PATCH 1/2] mmc: add boundary check for mmc operation

Signed-off-by: Lei Wen leiwen@marvell.com --- drivers/mmc/mmc.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-)
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index cf4ea16..5ff1c54 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -92,6 +92,11 @@ mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
blklen = mmc->write_bl_len;
+ if (start > mmc->block_dev.lba || (start + blkcnt) > mmc->block_dev.lba) { + puts("operation exceed mmc boundary..\n + This devices only have 0x%x blocks\n", mmc->block_dev.lba); + return 0; + } err = mmc_set_blocklen(mmc, mmc->write_bl_len);
if (err) { @@ -219,6 +224,11 @@ static ulong mmc_bread(int dev_num, ulong start, lbaint_t blkcnt, void *dst) if (!mmc) return 0;
+ if (start > mmc->block_dev.lba || (start + blkcnt) > mmc->block_dev.lba) { + puts("operation exceed mmc boundary..\n + This devices only have 0x%x blocks\n", mmc->block_dev.lba); + return 0; + } /* We always do full block reads from the card */ err = mmc_set_blocklen(mmc, mmc->read_bl_len);

Signed-off-by: Lei Wen leiwen@marvell.com --- common/cmd_mmc.c | 20 ++++++++++++++++++++ disk/part.c | 3 +++ 2 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/common/cmd_mmc.c b/common/cmd_mmc.c index c0b30d8..fe04f8d 100644 --- a/common/cmd_mmc.c +++ b/common/cmd_mmc.c @@ -154,6 +154,25 @@ int do_mmcops(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) mmc_init(mmc);
return 0; + } else if (strncmp(argv[1], "part", 4) == 0) { + int dev = simple_strtoul(argv[2], NULL, 10); + block_dev_desc_t *mmc_dev; + struct mmc *mmc = find_mmc_device(dev); + + if (!mmc) { + puts("no mmc devices available\n"); + return 1; + } + mmc_init(mmc); + mmc_dev = mmc_get_dev(dev); + if (mmc_dev != NULL && + mmc_dev->type != DEV_TYPE_UNKNOWN) { + print_part(mmc_dev); + return 0; + } + + puts("get mmc type error!\n"); + return 1; }
case 0: @@ -230,5 +249,6 @@ U_BOOT_CMD( "read <device num> addr blk# cnt\n" "mmc write <device num> addr blk# cnt\n" "mmc rescan <device num>\n" + "mmc part <device num>- lists avaiable partition on mmc\n" "mmc list - lists available devices"); #endif diff --git a/disk/part.c b/disk/part.c index 3ba88c7..1806fe6 100644 --- a/disk/part.c +++ b/disk/part.c @@ -364,6 +364,9 @@ static void print_part_header (const char *type, block_dev_desc_t * dev_desc) case IF_TYPE_DOC: puts ("DOC"); break; + case IF_TYPE_MMC: + puts ("MMC"); + break; default: puts ("UNKNOWN"); break;

Hello.
On 13-09-2010 8:06, Lei Wen wrote:
Signed-off-by: Lei Wenleiwen@marvell.com
common/cmd_mmc.c | 20 ++++++++++++++++++++ disk/part.c | 3 +++ 2 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/common/cmd_mmc.c b/common/cmd_mmc.c index c0b30d8..fe04f8d 100644 --- a/common/cmd_mmc.c +++ b/common/cmd_mmc.c @@ -154,6 +154,25 @@ int do_mmcops(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) mmc_init(mmc);
return 0;
} else if (strncmp(argv[1], "part", 4) == 0) {
int dev = simple_strtoul(argv[2], NULL, 10);
block_dev_desc_t *mmc_dev;
struct mmc *mmc = find_mmc_device(dev);
if (!mmc) {
puts("no mmc devices available\n");
return 1;
}
mmc_init(mmc);
mmc_dev = mmc_get_dev(dev);
if (mmc_dev != NULL &&
mmc_dev->type != DEV_TYPE_UNKNOWN) {
Too much indentation.
WBR, Sergei

Hello.
On 13-09-2010 8:06, Lei Wen wrote:
Signed-off-by: Lei Wenleiwen@marvell.com
drivers/mmc/mmc.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-)
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index cf4ea16..5ff1c54 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -92,6 +92,11 @@ mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
blklen = mmc->write_bl_len;
- if (start > mmc->block_dev.lba || (start + blkcnt) > mmc->block_dev.lba) {
The second comparison should suffice, no? Also, parens are not necessary.
puts("operation exceed mmc boundary..\n
This devices only have 0x%x blocks\n",
mmc->block_dev.lba);
Where's the cloging quote? String literals are not broken up like this -- this adds extra spaces to them. Should be:
puts("operation exceed mmc boundary..\n" "This devices only have 0x%x blocks\n", mmc->block_dev.lba);
return 0;
} err = mmc_set_blocklen(mmc, mmc->write_bl_len);
if (err) {
@@ -219,6 +224,11 @@ static ulong mmc_bread(int dev_num, ulong start, lbaint_t blkcnt, void *dst) if (!mmc) return 0;
- if (start > mmc->block_dev.lba || (start + blkcnt) > mmc->block_dev.lba) {
puts("operation exceed mmc boundary..\n
This devices only have 0x%x blocks\n", mmc->block_dev.lba);
Same comments here...
WBR, Sergei

On Mon, Sep 13, 2010 at 4:52 PM, Sergei Shtylyov sshtylyov@mvista.com wrote:
Hello.
On 13-09-2010 8:06, Lei Wen wrote:
Signed-off-by: Lei Wenleiwen@marvell.com
drivers/mmc/mmc.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-)
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index cf4ea16..5ff1c54 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -92,6 +92,11 @@ mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
blklen = mmc->write_bl_len;
- if (start > mmc->block_dev.lba || (start + blkcnt) >
mmc->block_dev.lba) {
The second comparison should suffice, no? Also, parens are not necessary.
Em, that is correct.
- puts("operation exceed mmc boundary..\n
- This devices only have 0x%x blocks\n",
mmc->block_dev.lba);
Where's the cloging quote? String literals are not broken up like this -- this adds extra spaces to them. Should be:
I see... Thanks, Lei
puts("operation exceed mmc boundary..\n" "This devices only have 0x%x blocks\n", mmc->block_dev.lba);
- return 0;
- }
err = mmc_set_blocklen(mmc, mmc->write_bl_len);
if (err) { @@ -219,6 +224,11 @@ static ulong mmc_bread(int dev_num, ulong start, lbaint_t blkcnt, void *dst) if (!mmc) return 0;
- if (start > mmc->block_dev.lba || (start + blkcnt) >
mmc->block_dev.lba) {
- puts("operation exceed mmc boundary..\n
- This devices only have 0x%x blocks\n",
mmc->block_dev.lba);
Same comments here...
WBR, Sergei
participants (3)
-
Lei Wen
-
Lei Wen
-
Sergei Shtylyov