diff options
author | Felipe Balbi <felipe.balbi@linux.intel.com> | 2017-02-24 15:21:37 +0200 |
---|---|---|
committer | Paul Fertser <fercerpav@gmail.com> | 2018-01-13 09:24:50 +0000 |
commit | 1ea313e333f60aed254ef6a7a052a2cebbc884e1 (patch) | |
tree | c6bd46d99ad712b901e9eaa3fe04af920e6c0309 /src/target | |
parent | ea80232c5e67fe07dff00d54d4f4ac7adf9e3e78 (diff) |
target: lakemon: probemode entry isn't instantaneous
When testing with Intel Galileo GEN2 I have noticed a few iterations
where probemode entry took a little longer. At most I had to read
tapstatus twice. This patch uses a loop of up to 100 iterations to
wait for tapstatus to update with PM entry results.
Change-Id: I1c87d7dde715255b3fd2460d299b9493218533fc
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
Reviewed-on: http://openocd.zylin.com/4013
Tested-by: jenkins
Reviewed-by: Paul Fertser <fercerpav@gmail.com>
Diffstat (limited to 'src/target')
-rw-r--r-- | src/target/lakemont.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/src/target/lakemont.c b/src/target/lakemont.c index 2bd12fd4..5f92f0d1 100644 --- a/src/target/lakemont.c +++ b/src/target/lakemont.c @@ -444,6 +444,8 @@ static uint32_t get_tapstatus(struct target *t) static int enter_probemode(struct target *t) { uint32_t tapstatus = 0; + int retries = 100; + tapstatus = get_tapstatus(t); LOG_DEBUG("TS before PM enter = 0x%08" PRIx32, tapstatus); if (tapstatus & TS_PM_BIT) { @@ -456,15 +458,17 @@ static int enter_probemode(struct target *t) scan.out[0] = 1; if (drscan(t, scan.out, scan.in, 1) != ERROR_OK) return ERROR_FAIL; - tapstatus = get_tapstatus(t); - LOG_DEBUG("TS after PM enter = 0x%08" PRIx32, tapstatus); - if ((tapstatus & TS_PM_BIT) && (!(tapstatus & TS_EN_PM_BIT))) - return ERROR_OK; - else { - LOG_ERROR("%s PM enter error, tapstatus = 0x%08" PRIx32 - , __func__, tapstatus); - return ERROR_FAIL; + + while (retries--) { + tapstatus = get_tapstatus(t); + LOG_DEBUG("TS after PM enter = 0x%08" PRIx32, tapstatus); + if ((tapstatus & TS_PM_BIT) && (!(tapstatus & TS_EN_PM_BIT))) + return ERROR_OK; } + + LOG_ERROR("%s PM enter error, tapstatus = 0x%08" PRIx32 + , __func__, tapstatus); + return ERROR_FAIL; } static int exit_probemode(struct target *t) |