]> git.sur5r.net Git - openocd/commitdiff
target: lakemon: probemode entry isn't instantaneous
authorFelipe Balbi <felipe.balbi@linux.intel.com>
Fri, 24 Feb 2017 13:21:37 +0000 (15:21 +0200)
committerPaul Fertser <fercerpav@gmail.com>
Sat, 13 Jan 2018 09:24:50 +0000 (09:24 +0000)
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>
src/target/lakemont.c

index 2bd12fd41ce14b3562dd2c12715ce39d8d4d3577..5f92f0d1b31ca5b3bcb491eecabf11c52806d7bb 100644 (file)
@@ -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)