diff options
author | Andreas Fritiofson <andreas.fritiofson@gmail.com> | 2016-08-14 00:51:50 +0200 |
---|---|---|
committer | Andreas Fritiofson <andreas.fritiofson@gmail.com> | 2016-08-14 02:09:58 +0100 |
commit | a7984eef039730fedb9d99bdc6205f956a2daad7 (patch) | |
tree | f1618c21850892c8cd68bdcc39f918b21efc0468 /src | |
parent | 2cc1c6daf2a8eea3c4bbda653cf1741afb270644 (diff) |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/flash/nor/at91sam7.c | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/src/flash/nor/at91sam7.c b/src/flash/nor/at91sam7.c index 0d81f062..ccb1a74a 100644 --- a/src/flash/nor/at91sam7.c +++ b/src/flash/nor/at91sam7.c @@ -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; |