[flashrom] [PATCH] fix chip size limiting in atapromise

Joseph C. Lehner joseph.c.lehner at gmail.com
Sun Jan 17 12:51:53 CET 2016


Just tested it, programmer is still working on my Ultra100!

Regards,
Joseph

On 2016-01-17 01:57, Carl-Daniel Hailfinger wrote:
> Atapromise chip size limiting has two bugs I didn't catch during review,
> but only in the moment of commit.
> 
> The current code is checking model_id to remember if a chip has already
> been limited, but if flashchips.c contains two subsequent chips with
> different vendor_id but identical model_id the adjustment will not be
> done. Switch to checking the chip size instead.
> 
> If a chip has multiple whole-chip erase functions, only one will be
> modified. Fix that.
> 
> Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>
> 
> Index: flashrom-atapromise_fix_limit_chip/atapromise.c
> ===================================================================
> --- flashrom-atapromise_fix_limit_chip/atapromise.c	(Revision 1916)
> +++ flashrom-atapromise_fix_limit_chip/atapromise.c	(Arbeitskopie)
> @@ -79,38 +79,35 @@
>  
>  static void atapromise_limit_chip(struct flashchip *chip)
>  {
> -	static uint32_t last_model_id = 0;
>  	unsigned int i, size;
> +	unsigned int usable_erasers = 0;
>  
> -	if (chip->model_id == last_model_id)
> -		return;
> -
>  	size = chip->total_size * 1024;
> -	if (size > rom_size) {
> -		/* Undefine all block_erasers that don't operate on the whole chip,
> -		 * and adjust the eraseblock size of the one that does.
> -		 */
> -		for (i = 0; i < NUM_ERASEFUNCTIONS; ++i) {
> -			if (chip->block_erasers[i].eraseblocks[0].size != size) {
> -				chip->block_erasers[i].eraseblocks[0].count = 0;
> -				chip->block_erasers[i].block_erase = NULL;
> -			} else {
> -				chip->block_erasers[i].eraseblocks[0].size = rom_size;
> -				break;
> -			}
> -		}
>  
> -		if (i != NUM_ERASEFUNCTIONS) {
> -			chip->total_size = rom_size / 1024;
> -			if (chip->page_size > rom_size)
> -				chip->page_size = rom_size;
> +	/* Chip is small enough or already limited. */
> +	if (size <= rom_size)
> +       		return;
> +
> +	/* Undefine all block_erasers that don't operate on the whole chip,
> +	 * and adjust the eraseblock size of those which do.
> +	 */
> +	for (i = 0; i < NUM_ERASEFUNCTIONS; ++i) {
> +		if (chip->block_erasers[i].eraseblocks[0].size != size) {
> +			chip->block_erasers[i].eraseblocks[0].count = 0;
> +			chip->block_erasers[i].block_erase = NULL;
>  		} else {
> -			msg_pdbg("Failed to adjust size of chip \"%s\" (%d kB).\n", chip->name,
> -				 chip->total_size);
> +			chip->block_erasers[i].eraseblocks[0].size = rom_size;
> +			usable_erasers++;
>  		}
>  	}
>  
> -	last_model_id = chip->model_id;
> +	if (usable_erasers) {
> +		chip->total_size = rom_size / 1024;
> +		if (chip->page_size > rom_size)
> +			chip->page_size = rom_size;
> +	} else {
> +		msg_pdbg("Failed to adjust size of chip \"%s\" (%d kB).\n", chip->name, chip->total_size);
> +	}
>  }
>  
>  int atapromise_init(void)
> 





More information about the flashrom mailing list