All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lei Wen <leiwen@marvell.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH V3] mmc: seperate block number into small parts for multi-write cmd
Date: Mon, 11 Oct 2010 23:39:04 +0800	[thread overview]
Message-ID: <1286811544-9312-1-git-send-email-leiwen@marvell.com> (raw)
In-Reply-To: <20101011113513.A4B571508A2@gemini.denx.de>

Constraint the mmc framework to only send no more than 65535
blocks in one go during the multi-write command. This constraint
comes due to the limitation of 16bit width block counter register
at some hardware.

Signed-off-by: Lei Wen <leiwen@marvell.com>
Cc: Reinhard Meyer <u-boot@emk-elektronik.de>
---
V3: return to the V1 solution that keep the 65535 constraint,
    but cut the 512KiB dma limitation
V2: add additional members in mmc structure

 drivers/mmc/mmc.c |   52 ++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 36 insertions(+), 16 deletions(-)

diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 80cd9bf..18980e6 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -78,17 +78,11 @@ struct mmc *find_mmc_device(int dev_num)
 }
 
 static ulong
-mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
+mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src)
 {
 	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;
 
@@ -97,12 +91,6 @@ mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
 			start + blkcnt, mmc->block_dev.lba);
 		return 0;
 	}
-	err = mmc_set_blocklen(mmc, mmc->write_bl_len);
-
-	if (err) {
-		printf("set write bl len failed\n\r");
-		return err;
-	}
 
 	if (blkcnt > 1)
 		cmd.cmdidx = MMC_CMD_WRITE_MULTIPLE_BLOCK;
@@ -123,7 +111,6 @@ mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
 	data.flags = MMC_DATA_WRITE;
 
 	err = mmc_send_cmd(mmc, &cmd, &data);
-
 	if (err) {
 		printf("mmc write failed\n\r");
 		return err;
@@ -134,9 +121,42 @@ mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
 		cmd.cmdarg = 0;
 		cmd.resp_type = MMC_RSP_R1b;
 		cmd.flags = 0;
-		stoperr = mmc_send_cmd(mmc, &cmd, NULL);
+		err = mmc_send_cmd(mmc, &cmd, NULL);
+		if (err) {
+			printf("mmc fail to send stop cmd\n\r");
+			return err;
+		}
+	}
+
+	return blkcnt;
+}
+
+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);
+	lbaint_t cur, blocks_todo = blkcnt;
+
+	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;
 	}
 
+	do {
+		/* The 65535 constraint comes from some hardware has
+		 * only 16 bit width block number counter */
+		cur = (blocks_todo > 65535) ? 65535 : blocks_todo;
+		if(mmc_write_blocks(mmc, start, cur, src) != cur)
+			return -1;
+		blocks_todo -= cur;
+		start += cur;
+		src += cur * mmc->write_bl_len;
+	} while (blocks_todo > 0);
 	return blkcnt;
 }
 
-- 
1.7.0.4

  reply	other threads:[~2010-10-11 15:39 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-09-06  7:19 [U-Boot] [PATCH] mmc: seperate block number into small parts for multi-write cmd Lei Wen
2010-09-06  8:28 ` 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     ` Lei Wen [this message]
2010-10-13 19:57       ` [U-Boot] [PATCH V3] " 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=1286811544-9312-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.