[U-Boot] [PATCH] Improve read performance of gerenic mmc.
Mike Frysinger
vapier at gentoo.org
Wed Nov 4 03:56:11 CET 2009
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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20091103/ca83e148/attachment.pgp
More information about the U-Boot
mailing list