[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