summaryrefslogtreecommitdiff
path: root/src/flash/nor/core.c
diff options
context:
space:
mode:
authorØyvind Harboe <oyvind.harboe@zylin.com>2010-06-11 08:10:39 +0200
committerØyvind Harboe <oyvind.harboe@zylin.com>2010-06-11 15:53:23 +0200
commit4532dc78314a543f205e15d37d1bc7fa03df7595 (patch)
tree5178378ba58ccaf136feb236faac45767fb194c1 /src/flash/nor/core.c
parent0538081246fafbfb74d554bb1b758412534aa254 (diff)
downloadopenocd+libswd-4532dc78314a543f205e15d37d1bc7fa03df7595.tar.gz
openocd+libswd-4532dc78314a543f205e15d37d1bc7fa03df7595.tar.bz2
openocd+libswd-4532dc78314a543f205e15d37d1bc7fa03df7595.tar.xz
openocd+libswd-4532dc78314a543f205e15d37d1bc7fa03df7595.zip
flash: add error handling to get_flash_by_addr/name
autoprobing can fail and this error has to be reported up the call stack. Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
Diffstat (limited to 'src/flash/nor/core.c')
-rw-r--r--src/flash/nor/core.c39
1 files changed, 27 insertions, 12 deletions
diff --git a/src/flash/nor/core.c b/src/flash/nor/core.c
index 429bad67..d2f2754d 100644
--- a/src/flash/nor/core.c
+++ b/src/flash/nor/core.c
@@ -197,7 +197,7 @@ struct flash_bank *get_flash_bank_by_name_noprobe(const char *name)
return NULL;
}
-struct flash_bank *get_flash_bank_by_name(const char *name)
+int get_flash_bank_by_name(const char *name, struct flash_bank **bank_result)
{
struct flash_bank *bank;
int retval;
@@ -210,11 +210,12 @@ struct flash_bank *get_flash_bank_by_name(const char *name)
if (retval != ERROR_OK)
{
LOG_ERROR("auto_probe failed %d\n", retval);
- return NULL;
+ return retval;
}
}
- return bank;
+ *bank_result = bank;
+ return ERROR_OK;
}
int get_flash_bank_by_num(int num, struct flash_bank **bank)
@@ -238,8 +239,9 @@ int get_flash_bank_by_num(int num, struct flash_bank **bank)
return ERROR_OK;
}
-/* lookup flash bank by address */
-struct flash_bank *get_flash_bank_by_addr(struct target *target, uint32_t addr)
+/* lookup flash bank by address, bank not found is success, but
+ * result_bank is set to NULL. */
+int get_flash_bank_by_addr(struct target *target, uint32_t addr, bool check, struct flash_bank **result_bank)
{
struct flash_bank *c;
@@ -252,14 +254,22 @@ struct flash_bank *get_flash_bank_by_addr(struct target *target, uint32_t addr)
if (retval != ERROR_OK)
{
LOG_ERROR("auto_probe failed %d\n", retval);
- return NULL;
+ return retval;
}
/* check whether address belongs to this flash bank */
if ((addr >= c->base) && (addr <= c->base + (c->size - 1)) && target == c->target)
- return c;
+ {
+ *result_bank = c;
+ return ERROR_OK;
+ }
}
- LOG_ERROR("No flash at address 0x%08" PRIx32 "\n", addr);
- return NULL;
+ *result_bank = NULL;
+ if (check)
+ {
+ LOG_ERROR("No flash at address 0x%08" PRIx32 "\n", addr);
+ return ERROR_FAIL;
+ }
+ return ERROR_OK;
}
int default_flash_mem_blank_check(struct flash_bank *bank)
@@ -379,8 +389,9 @@ static int flash_iterate_address_range(struct target *target,
int last = -1;
int i;
- if ((c = get_flash_bank_by_addr(target, addr)) == NULL)
- return ERROR_FLASH_DST_OUT_OF_BANK; /* no corresponding bank found */
+ int retval = get_flash_bank_by_addr(target, addr, true, &c);
+ if (retval != ERROR_OK)
+ return retval;
if (c->size == 0 || c->num_sectors == 0)
{
@@ -588,7 +599,11 @@ int flash_write_unlock(struct target *target, struct image *image,
}
/* find the corresponding flash bank */
- if ((c = get_flash_bank_by_addr(target, run_address)) == NULL)
+ int retval;
+ retval = get_flash_bank_by_addr(target, run_address, false, &c);
+ if (retval != ERROR_OK)
+ return retval;
+ if (c == NULL)
{
section++; /* and skip it */
section_offset = 0;