aboutsummaryrefslogtreecommitdiff
path: root/src/flash/nor
diff options
context:
space:
mode:
authorAndreas Fritiofson <andreas.fritiofson@gmail.com>2016-08-14 00:51:50 +0200
committerAndreas Fritiofson <andreas.fritiofson@gmail.com>2016-08-14 02:09:58 +0100
commita7984eef039730fedb9d99bdc6205f956a2daad7 (patch)
treef1618c21850892c8cd68bdcc39f918b21efc0468 /src/flash/nor
parent2cc1c6daf2a8eea3c4bbda653cf1741afb270644 (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/flash/nor')
-rw-r--r--src/flash/nor/at91sam7.c20
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;