at91sam7: do not touch flash banks which belong to other targets

at91sam7_read_part_info() walks throw all flash banks following
current one.

I don't know why it has to do it at all (possibly for multi-bank
devices like SAM7S512), but if there is more than one target in JTAG
chain, this lookup can touch flash bank of another (possibly not
halted) target, which cause probe error and current command
execution abort.

[andreas.fritiofson@gmail.com]: Change to for-loop and reduce
indentation

Change-Id: Ide50e93578786e1250f7a0fd0e3d296247924814
Signed-off-by: Sergey A. Borshch <sb-sf@users.sourceforge.net>
Signed-off-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
Reviewed-on: http://openocd.zylin.com/2610
Tested-by: jenkins
__archive__
Andreas Fritiofson 2016-08-14 00:51:50 +02:00
parent 2cc1c6daf2
commit a7984eef03
1 changed files with 7 additions and 13 deletions

View File

@ -371,10 +371,9 @@ static int at91sam7_read_part_info(struct flash_bank *bank)
if (at91sam7_info->cidr != 0) {
/* flash already configured, update clock and check for protected sectors */
struct flash_bank *fb = bank;
struct flash_bank *t_bank = bank;
while (t_bank) {
for (struct flash_bank *t_bank = bank; t_bank; t_bank = t_bank->next) {
if (t_bank->target != target)
continue;
/* re-calculate master clock frequency */
at91sam7_read_clock_info(t_bank);
@ -383,9 +382,6 @@ static int at91sam7_read_part_info(struct flash_bank *bank)
/* check protect state */
at91sam7_protect_check(t_bank);
t_bank = fb->next;
fb = t_bank;
}
return ERROR_OK;
@ -400,9 +396,10 @@ static int at91sam7_read_part_info(struct flash_bank *bank)
if (at91sam7_info->flash_autodetection == 0) {
/* banks and sectors are already created, based on data from input file */
struct flash_bank *fb = bank;
struct flash_bank *t_bank = bank;
while (t_bank) {
for (struct flash_bank *t_bank = bank; t_bank; t_bank = t_bank->next) {
if (t_bank->target != target)
continue;
at91sam7_info = t_bank->driver_priv;
at91sam7_info->cidr = cidr;
@ -423,9 +420,6 @@ static int at91sam7_read_part_info(struct flash_bank *bank)
/* check protect state */
at91sam7_protect_check(t_bank);
t_bank = fb->next;
fb = t_bank;
}
return ERROR_OK;