From: Lei Wen <leiwen@marvell.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] mmc: seperate block number into small parts for multi-write cmd
Date: Mon, 6 Sep 2010 15:19:27 +0800 [thread overview]
Message-ID: <1283757567-15161-1-git-send-email-leiwen@marvell.com> (raw)
As mmc host limitation, the max number of block in one go
should be limited to 65535, and the max buffer size should
not excceed 512k bytes.
Signed-off-by: Lei Wen <leiwen@marvell.com>
---
drivers/mmc/mmc.c | 56 +++++++++++++++++++++++++++++++++-------------------
1 files changed, 35 insertions(+), 21 deletions(-)
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 94d1ac2..ea398a5 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -77,29 +77,16 @@ struct mmc *find_mmc_device(int dev_num)
return NULL;
}
-static ulong
-mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
+int mmc_write_block(struct mmc *mmc, ulong *src, ulong start, uint blocknum)
{
struct mmc_cmd cmd;
struct mmc_data data;
- int err;
- int stoperr = 0;
- struct mmc *mmc = find_mmc_device(dev_num);
- int blklen;
-
- if (!mmc)
- return -1;
-
+ int blklen, err;
blklen = mmc->write_bl_len;
- err = mmc_set_blocklen(mmc, mmc->write_bl_len);
-
- if (err) {
- printf("set write bl len failed\n\r");
- return err;
- }
-
- if (blkcnt > 1)
+ BUG_ON(blklen * blocknum > 524288);
+ BUG_ON(blocknum > 65535);
+ if (blocknum > 1)
cmd.cmdidx = MMC_CMD_WRITE_MULTIPLE_BLOCK;
else
cmd.cmdidx = MMC_CMD_WRITE_SINGLE_BLOCK;
@@ -113,7 +100,7 @@ mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
cmd.flags = 0;
data.src = src;
- data.blocks = blkcnt;
+ data.blocks = blocknum;
data.blocksize = blklen;
data.flags = MMC_DATA_WRITE;
@@ -124,14 +111,41 @@ mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
return err;
}
- if (blkcnt > 1) {
+ if (blocknum > 1) {
cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
cmd.cmdarg = 0;
cmd.resp_type = MMC_RSP_R1b;
cmd.flags = 0;
- stoperr = mmc_send_cmd(mmc, &cmd, NULL);
+ mmc_send_cmd(mmc, &cmd, NULL);
}
+ return blocknum;
+}
+
+static ulong
+mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
+{
+ int err;
+ struct mmc *mmc = find_mmc_device(dev_num);
+ unsigned int max;
+ lbaint_t tmp = blkcnt, cur;
+
+ if (!mmc)
+ return -1;
+
+ err = mmc_set_blocklen(mmc, mmc->write_bl_len);
+ if (err) {
+ printf("set write bl len failed\n\r");
+ return err;
+ }
+
+ max = 524288 / mmc->write_bl_len;
+ do {
+ cur = (tmp > max) ? max : tmp;
+ tmp -= cur;
+ if(mmc_write_block(mmc, src, start, cur) != cur)
+ return -1;
+ } while (tmp > 0);
return blkcnt;
}
--
1.7.0.4
next reply other threads:[~2010-09-06 7:19 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-06 7:19 Lei Wen [this message]
2010-09-06 8:28 ` [U-Boot] [PATCH] mmc: seperate block number into small parts for multi-write cmd Wolfgang Denk
2010-09-06 8:40 ` Lei Wen
2010-09-06 9:23 ` Reinhard Meyer
2010-09-06 9:31 ` Lei Wen
2010-09-06 10:16 ` Reinhard Meyer
2010-09-06 10:48 ` Lei Wen
2010-09-06 11:50 ` Reinhard Meyer
2010-10-10 4:20 ` Lei Wen
2010-10-10 6:48 ` Wolfgang Denk
2010-10-10 8:49 ` Lei Wen
2010-10-10 9:22 ` Wolfgang Denk
2010-10-10 9:27 ` Lei Wen
2010-10-10 9:39 ` Reinhard Meyer
2010-10-10 9:44 ` Lei Wen
2010-10-10 9:33 ` Reinhard Meyer
2010-10-10 9:42 ` Lei Wen
2010-10-11 3:42 ` [U-Boot] [PATCH V2] " Lei Wen
2010-10-11 9:00 ` Reinhard Meyer
2010-10-11 9:22 ` Wolfgang Denk
2010-10-11 9:27 ` Lei Wen
2010-10-11 10:44 ` [U-Boot] [PATCH] " Reinhard Meyer
2010-10-11 11:35 ` Wolfgang Denk
2010-10-11 15:39 ` [U-Boot] [PATCH V3] " Lei Wen
2010-10-13 19:57 ` Wolfgang Denk
2010-10-14 5:38 ` [U-Boot] [PATCH V4] " Lei Wen
2010-10-25 18:46 ` Steve Sakoman
2010-10-27 18:39 ` Wolfgang Denk
2010-10-27 19:59 ` Steve Sakoman
2010-10-27 6:04 ` [U-Boot] [PATCH V3] " Lei Wen
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=1283757567-15161-1-git-send-email-leiwen@marvell.com \
--to=leiwen@marvell.com \
--cc=u-boot@lists.denx.de \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.