Re: [PATCH 1/1] mtd:nor:timeout:fix do_write_buffer() timeout error

Alexander Shiyan shc_work at mail.ru
Sun May 18 21:45:15 PDT 2014


Mon, 19 May 2014 02:41:29 +0000 от Bean Huo 霍斌斌 (beanhuo) <beanhuo at micron.com>:
> The size of the buffer program has been increased from 256 to 512 ,
> 2ms maximum timeout can not adapt to all the different vendor's norflash,
> There maximum timeout information in the CFI area,so the best way is to
> choose the result calculated according to timeout field of struct cfi_ident
> that probed from norflash's CFI aera.This is also a standard defined by CFI.
> 
> Without this change, if the size of buffer program is 512 or bigger than 256,
> due to timeout is the shorter than that the chip required,do_write_buffer
> sometimes fails.
> 
> Tested with Micron JS28F512M29EWx and Micron MT28EW512ABA flash devices.
> 
> Signed-off-by: bean huo <beanhuo at micron.com>
> ---
>  drivers/mtd/chips/cfi_cmdset_0002.c |   46 ++++++++++++++++++++++++++++++++---
>  1 file changed, 43 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c
> index e21fde9..2a08f9f 100644
> --- a/drivers/mtd/chips/cfi_cmdset_0002.c
> +++ b/drivers/mtd/chips/cfi_cmdset_0002.c
> @@ -628,10 +628,42 @@ struct mtd_info *cfi_cmdset_0002(struct map_info *map, int primary)
>  		cfi->chips[i].word_write_time = 1<<cfi->cfiq->WordWriteTimeoutTyp;
>  		cfi->chips[i].buffer_write_time = 1<<cfi->cfiq->BufWriteTimeoutTyp;
>  		cfi->chips[i].erase_time = 1<<cfi->cfiq->BlockEraseTimeoutTyp;
> +		/*
> +		 * We first calculate the timeout max according to timeout
> +		 * field of struct cfi_ident that probed from chip's CFI
> +		 * aera,If haven't probed this information,we will specify
> +		 * a default value,and the time unit is us.
> +		 */
> +		if (cfi->cfiq->WordWriteTimeoutTyp &&
> +			cfi->cfiq->WordWriteTimeoutMax){
> +			cfi->chips[i].word_write_time_max =
> +				1<<(cfi->cfiq->WordWriteTimeoutTyp +
> +					cfi->cfiq->WordWriteTimeoutMax);
> +			} else {
> +		/* specify maximum timeout for byte/word program 2000us */
> +				cfi->chips[i].word_write_time_max = 2000;
> +				}
> +		if (cfi->cfiq->BufWriteTimeoutTyp &&
> +			cfi->cfiq->BufWriteTimeoutMax){
> +			cfi->chips[i].buffer_write_time_max =
> +				1<<(cfi->cfiq->BufWriteTimeoutTyp +
> +					cfi->cfiq->BufWriteTimeoutMax);
> +			} else {
> +		/* specify maximum timeout for buffer program 2000us */
> +				cfi->chips[i].buffer_write_time_max = 2000;
> +				}
> +		if (cfi->cfiq->BlockEraseTimeoutTyp &&
> +			cfi->cfiq->BlockEraseTimeoutMax){
> +			cfi->chips[i].erase_time_max =
> +				1<<(cfi->cfiq->BlockEraseTimeoutTyp +
> +					cfi->cfiq->BlockEraseTimeoutMax);
> +			} else {
> +	/* specify maximum timeout per individual block erase 3000000us */
> +				cfi->chips[i].erase_time_max = 3000000;
> +				}
>  		cfi->chips[i].ref_point_counter = 0;
>  		init_waitqueue_head(&(cfi->chips[i].wq));
>  	}
> -
>  	map->fldrv = &cfi_amdstd_chipdrv;
>  
>  	return cfi_amdstd_setup(mtd);
> @@ -1462,8 +1494,16 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip,
>  {
>  	struct cfi_private *cfi = map->fldrv_priv;
>  	unsigned long timeo = jiffies + HZ;

I want to suggest one stuff not related to this patch.
On my opinion, all occurrences of HZ must be converted
into msecs_to_jiffies().

---



More information about the linux-mtd mailing list