* [PATCH] mci multiblock write
@ 2011-11-11 11:38 Sascha Hauer
2011-11-11 11:38 ` [PATCH 1/2] mci: implement multi block write Sascha Hauer
2011-11-11 11:38 ` [PATCH 2/2] mci: remove unnecessary loops Sascha Hauer
0 siblings, 2 replies; 5+ messages in thread
From: Sascha Hauer @ 2011-11-11 11:38 UTC (permalink / raw)
To: barebox
Two patches I had lying around for some time.
Sascha Hauer (2):
mci: implement multi block write
mci: remove unnecessary loops
drivers/mci/mci-core.c | 81 ++++++++++++++++++++++++++++--------------------
1 files changed, 47 insertions(+), 34 deletions(-)
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/2] mci: implement multi block write
2011-11-11 11:38 [PATCH] mci multiblock write Sascha Hauer
@ 2011-11-11 11:38 ` Sascha Hauer
2011-11-11 11:47 ` Belisko Marek
2011-11-11 11:38 ` [PATCH 2/2] mci: remove unnecessary loops Sascha Hauer
1 sibling, 1 reply; 5+ messages in thread
From: Sascha Hauer @ 2011-11-11 11:38 UTC (permalink / raw)
To: barebox
This speeds up writes to MMC/SD cards significantly.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mci/mci-core.c | 30 ++++++++++++++++++++++++++----
1 files changed, 26 insertions(+), 4 deletions(-)
diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c
index 09f7e29..58f7f6d 100644
--- a/drivers/mci/mci-core.c
+++ b/drivers/mci/mci-core.c
@@ -107,12 +107,20 @@ static void *sector_buf;
* @return Transaction status (0 on success)
*/
#ifdef CONFIG_MCI_WRITE
-static int mci_block_write(struct device_d *mci_dev, const void *src, unsigned blocknum)
+static int mci_block_write(struct device_d *mci_dev, const void *src, unsigned blocknum,
+ int blocks)
{
struct mci *mci = GET_MCI_DATA(mci_dev);
struct mci_cmd cmd;
struct mci_data data;
const void *buf;
+ unsigned mmccmd;
+ int ret;
+
+ if (blocks > 1)
+ mmccmd = MMC_CMD_WRITE_MULTIPLE_BLOCK;
+ else
+ mmccmd = MMC_CMD_WRITE_SINGLE_BLOCK;
if ((unsigned long)src & 0x3) {
memcpy(sector_buf, src, 512);
@@ -122,16 +130,30 @@ static int mci_block_write(struct device_d *mci_dev, const void *src, unsigned b
}
mci_setup_cmd(&cmd,
- MMC_CMD_WRITE_SINGLE_BLOCK,
+ mmccmd,
mci->high_capacity != 0 ? blocknum : blocknum * mci->write_bl_len,
MMC_RSP_R1);
data.src = buf;
- data.blocks = 1;
+ data.blocks = blocks;
data.blocksize = mci->write_bl_len;
data.flags = MMC_DATA_WRITE;
- return mci_send_cmd(mci_dev, &cmd, &data);
+ ret = mci_send_cmd(mci_dev, &cmd, &data);
+ if (ret)
+ return ret;
+
+
+ if (blocks > 1) {
+ mci_setup_cmd(&cmd,
+ MMC_CMD_STOP_TRANSMISSION,
+ 0, MMC_RSP_R1b);
+ ret = mci_send_cmd(mci_dev, &cmd, NULL);
+ if (ret)
+ return ret;
+ }
+
+ return ret;
}
#endif
--
1.7.7.1
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 2/2] mci: remove unnecessary loops
2011-11-11 11:38 [PATCH] mci multiblock write Sascha Hauer
2011-11-11 11:38 ` [PATCH 1/2] mci: implement multi block write Sascha Hauer
@ 2011-11-11 11:38 ` Sascha Hauer
1 sibling, 0 replies; 5+ messages in thread
From: Sascha Hauer @ 2011-11-11 11:38 UTC (permalink / raw)
To: barebox
We used to loop around the sectors in mci_sd_write/mci_sd_read.
Now that we have multi block read and write this is not necessary
anymore.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mci/mci-core.c | 51 +++++++++++++++++++----------------------------
1 files changed, 21 insertions(+), 30 deletions(-)
diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c
index 58f7f6d..651bcbf 100644
--- a/drivers/mci/mci-core.c
+++ b/drivers/mci/mci-core.c
@@ -988,21 +988,17 @@ static int mci_sd_write(struct device_d *disk_dev, uint64_t sector_start,
return -EINVAL;
}
- while (sector_count) {
- /* size of the block number field in the MMC/SD command is 32 bit only */
- if (sector_start > MAX_BUFFER_NUMBER) {
- pr_debug("Cannot handle block number %llu. Too large!\n",
- sector_start);
- return -EINVAL;
- }
- rc = mci_block_write(mci_dev, buffer, sector_start);
- if (rc != 0) {
- pr_debug("Writing block %u failed with %d\n", (unsigned)sector_start, rc);
- return rc;
- }
- sector_count--;
- buffer += mci->write_bl_len;
- sector_start++;
+ /* size of the block number field in the MMC/SD command is 32 bit only */
+ if (sector_start > MAX_BUFFER_NUMBER) {
+ pr_debug("Cannot handle block number %llu. Too large!\n",
+ sector_start);
+ return -EINVAL;
+ }
+
+ rc = mci_block_write(mci_dev, buffer, sector_start, sector_count);
+ if (rc != 0) {
+ pr_debug("Writing block %u failed with %d\n", (unsigned)sector_start, rc);
+ return rc;
}
return 0;
@@ -1036,21 +1032,16 @@ static int mci_sd_read(struct device_d *disk_dev, uint64_t sector_start,
return -EINVAL;
}
- while (sector_count) {
- int now = min(sector_count, 32U);
- if (sector_start > MAX_BUFFER_NUMBER) {
- pr_err("Cannot handle block number %u. Too large!\n",
- (unsigned)sector_start);
- return -EINVAL;
- }
- rc = mci_read_block(mci_dev, buffer, (unsigned)sector_start, now);
- if (rc != 0) {
- pr_debug("Reading block %u failed with %d\n", (unsigned)sector_start, rc);
- return rc;
- }
- sector_count -= now;
- buffer += mci->read_bl_len * now;
- sector_start += now;
+ if (sector_start > MAX_BUFFER_NUMBER) {
+ pr_err("Cannot handle block number %u. Too large!\n",
+ (unsigned)sector_start);
+ return -EINVAL;
+ }
+
+ rc = mci_read_block(mci_dev, buffer, (unsigned)sector_start, sector_count);
+ if (rc != 0) {
+ pr_debug("Reading block %u failed with %d\n", (unsigned)sector_start, rc);
+ return rc;
}
return 0;
--
1.7.7.1
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] mci: implement multi block write
2011-11-11 11:38 ` [PATCH 1/2] mci: implement multi block write Sascha Hauer
@ 2011-11-11 11:47 ` Belisko Marek
2011-11-11 11:59 ` Sascha Hauer
0 siblings, 1 reply; 5+ messages in thread
From: Belisko Marek @ 2011-11-11 11:47 UTC (permalink / raw)
To: Sascha Hauer; +Cc: barebox
On Fri, Nov 11, 2011 at 12:38 PM, Sascha Hauer <s.hauer@pengutronix.de> wrote:
> This speeds up writes to MMC/SD cards significantly.
>
> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
> ---
> drivers/mci/mci-core.c | 30 ++++++++++++++++++++++++++----
> 1 files changed, 26 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c
> index 09f7e29..58f7f6d 100644
> --- a/drivers/mci/mci-core.c
> +++ b/drivers/mci/mci-core.c
> @@ -107,12 +107,20 @@ static void *sector_buf;
> * @return Transaction status (0 on success)
> */
> #ifdef CONFIG_MCI_WRITE
> -static int mci_block_write(struct device_d *mci_dev, const void *src, unsigned blocknum)
> +static int mci_block_write(struct device_d *mci_dev, const void *src, unsigned blocknum,
> + int blocks)
> {
> struct mci *mci = GET_MCI_DATA(mci_dev);
> struct mci_cmd cmd;
> struct mci_data data;
> const void *buf;
> + unsigned mmccmd;
> + int ret;
> +
> + if (blocks > 1)
> + mmccmd = MMC_CMD_WRITE_MULTIPLE_BLOCK;
> + else
> + mmccmd = MMC_CMD_WRITE_SINGLE_BLOCK;
>
> if ((unsigned long)src & 0x3) {
> memcpy(sector_buf, src, 512);
> @@ -122,16 +130,30 @@ static int mci_block_write(struct device_d *mci_dev, const void *src, unsigned b
> }
>
> mci_setup_cmd(&cmd,
> - MMC_CMD_WRITE_SINGLE_BLOCK,
> + mmccmd,
> mci->high_capacity != 0 ? blocknum : blocknum * mci->write_bl_len,
> MMC_RSP_R1);
>
> data.src = buf;
> - data.blocks = 1;
> + data.blocks = blocks;
> data.blocksize = mci->write_bl_len;
> data.flags = MMC_DATA_WRITE;
>
> - return mci_send_cmd(mci_dev, &cmd, &data);
> + ret = mci_send_cmd(mci_dev, &cmd, &data);
> + if (ret)
> + return ret;
> +
> +
Necessary 2 new lines here?
> + if (blocks > 1) {
> + mci_setup_cmd(&cmd,
> + MMC_CMD_STOP_TRANSMISSION,
> + 0, MMC_RSP_R1b);
> + ret = mci_send_cmd(mci_dev, &cmd, NULL);
> + if (ret)
> + return ret;
> + }
> +
> + return ret;
> }
> #endif
>
> --
> 1.7.7.1
>
>
> _______________________________________________
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
>
regards,
marek
--
as simple and primitive as possible
-------------------------------------------------
Marek Belisko - OPEN-NANDRA
Freelance Developer
Ruska Nova Ves 219 | Presov, 08005 Slovak Republic
Tel: +421 915 052 184
skype: marekwhite
twitter: #opennandra
web: http://open-nandra.com
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] mci: implement multi block write
2011-11-11 11:47 ` Belisko Marek
@ 2011-11-11 11:59 ` Sascha Hauer
0 siblings, 0 replies; 5+ messages in thread
From: Sascha Hauer @ 2011-11-11 11:59 UTC (permalink / raw)
To: Belisko Marek; +Cc: barebox
On Fri, Nov 11, 2011 at 12:47:04PM +0100, Belisko Marek wrote:
> >
> > - return mci_send_cmd(mci_dev, &cmd, &data);
> > + ret = mci_send_cmd(mci_dev, &cmd, &data);
> > + if (ret)
> > + return ret;
> > +
> > +
> Necessary 2 new lines here?
I removed one of them and it still works, so no ;)
Sascha
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2011-11-11 11:59 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-11-11 11:38 [PATCH] mci multiblock write Sascha Hauer
2011-11-11 11:38 ` [PATCH 1/2] mci: implement multi block write Sascha Hauer
2011-11-11 11:47 ` Belisko Marek
2011-11-11 11:59 ` Sascha Hauer
2011-11-11 11:38 ` [PATCH 2/2] mci: remove unnecessary loops Sascha Hauer
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox