[U-Boot] [PATCH] Improve read performance of gerenic mmc.
Lv Terry-R65388
r65388 at freescale.com
Wed Nov 4 04:14:13 CET 2009
Hi Mike,
Thanks~~
I will send another patch.
Yours
Terry
-----Original Message-----
From: Mike Frysinger [mailto:vapier at gentoo.org]
Sent: 2009年11月4日 10:56
To: u-boot at lists.denx.de
Cc: Lv Terry-R65388
Subject: Re: [U-Boot] [PATCH] Improve read performance of gerenic mmc.
On Tuesday 03 November 2009 21:36:58 Terry Lv wrote:
> Signed-off-by: Terry Lv <r65388 at freescale.com>
your subject has a spelling typo, and generally you should avoid using complete sentences in it (i.e. drop the period).
> --- a/drivers/mmc/mmc.c
> +++ b/drivers/mmc/mmc.c
> @@ -88,7 +88,7 @@ mmc_bwrite(int dev_num, ulong start, lbaint_t
> blkcnt, const void*src) err = mmc_set_blocklen(mmc,
> mmc->write_bl_len);
>
> if (err) {
> - printf("set write bl len failed\n\r");
> + puts("set write bl len failed\n\r");
> return err;
> }
>
> @@ -113,7 +113,7 @@ mmc_bwrite(int dev_num, ulong start, lbaint_t
> blkcnt, const void*src) err = mmc_send_cmd(mmc, &cmd, &data);
>
> if (err) {
> - printf("mmc write failed\n\r");
> + puts("mmc write failed\n\r");
> return err;
> }
>
> @@ -164,7 +164,7 @@ int mmc_read(struct mmc *mmc, u64 src, uchar *dst,
> int
> size) buffer = malloc(blklen);
>
> if (!buffer) {
> - printf("Could not allocate buffer for MMC read!\n");
> + puts("Could not allocate buffer for MMC read!\n");
> return -1;
> }
these changes dont look related to your changelog at all
unrelated, but dont know why the code is doing \n\r ... it should only be doing \n ...
> @@ -205,27 +205,56 @@ free_buffer:
>
> static ulong mmc_bread(int dev_num, ulong start, lbaint_t blkcnt,
> void
> *dst) {
> + struct mmc_cmd cmd;
> + struct mmc_data data;
> int err;
> - int i;
> + int stoperr = 0;
> struct mmc *mmc = find_mmc_device(dev_num);
> + int blklen;
>
> if (!mmc)
> - return 0;
> + return -1;
>
> - /* We always do full block reads from the card */
> - err = mmc_set_blocklen(mmc, mmc->read_bl_len);
> + blklen = mmc->read_bl_len;
> +
> + err = mmc_set_blocklen(mmc, blklen);
>
> if (err) {
> - return 0;
> + puts("set read bl len failed\n\r");
> + return err;
> }
>
> - for (i = start; i < start + blkcnt; i++, dst += mmc->read_bl_len) {
> - err = mmc_read_block(mmc, dst, i);
> + if (blkcnt > 1)
> + cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK;
> + else
> + cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;
>
> - if (err) {
> - printf("block read failed: %d\n", err);
> - return i - start;
> - }
> + if (mmc->high_capacity)
> + cmd.cmdarg = start;
> + else
> + cmd.cmdarg = start * blklen;
> +
> + cmd.resp_type = MMC_RSP_R1;
> + cmd.flags = 0;
> +
> + data.dest = dst;
> + data.blocks = blkcnt;
> + data.blocksize = blklen;
> + data.flags = MMC_DATA_READ;
> +
> + err = mmc_send_cmd(mmc, &cmd, &data);
> +
> + if (err) {
> + puts("mmc read failed\n\r");
> + return err;
> + }
> +
> + if (blkcnt > 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);
> }
>
> return blkcnt;
i imagine the changes do wat you say, but you really should explain in your changelog how/why your changes work -mike
More information about the U-Boot
mailing list