jtag: clean up jtag_sleep, handle short sleeps correctly via usleep
authorØyvind Harboe <oyvind.harboe@zylin.com>
Thu, 3 Mar 2011 08:14:30 +0000 (09:14 +0100)
committerØyvind Harboe <oyvind.harboe@zylin.com>
Tue, 15 Mar 2011 09:36:16 +0000 (10:36 +0100)
short sleeps are handled via usleep, longer sleeps we round up
to nearest ms.

There was a bug in jtag_sleep() in that it would round *down*
to nearest ms, thus making all <1ms sleeps 0. Found by inspection
rather than symptom.

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
src/jtag/core.c

index d7e1ccec764e50b93f80727185b08be73af44280..68c125707bbbf92bcb7b1f5f2450175d946928cb 100644 (file)
@@ -871,9 +871,16 @@ static int jtag_reset_callback(enum jtag_event event, void *priv)
        return ERROR_OK;
 }
 
+/* sleep at least us microseconds. When we sleep more than 1000ms we
+ * do an alive sleep, i.e. keep GDB alive. Note that we could starve
+ * GDB if we slept for <1000ms many times.
+ */
 void jtag_sleep(uint32_t us)
 {
-       alive_sleep(us/1000);
+       if (us < 1000)
+               usleep(us);
+       else
+               alive_sleep((us+999)/1000);
 }
 
 /* Maximum number of enabled JTAG devices we expect in the scan chain,