return ERROR_OK;
 }
 
-int target_call_timer_callbacks()
+static int target_call_timer_callbacks_check_time(int checktime)
 {
        target_timer_callback_t *callback = target_timer_callbacks;
        target_timer_callback_t *next_callback;
        {
                next_callback = callback->next;
                
-               if (((now.tv_sec >= callback->when.tv_sec) && (now.tv_usec >= callback->when.tv_usec))
-                       || (now.tv_sec > callback->when.tv_sec))
+               if ((!checktime&&callback->periodic)||
+                               (((now.tv_sec >= callback->when.tv_sec) && (now.tv_usec >= callback->when.tv_usec))
+                                               || (now.tv_sec > callback->when.tv_sec)))
                {
                        callback->callback(callback->priv);
                        if (callback->periodic)
        return ERROR_OK;
 }
 
+int target_call_timer_callbacks()
+{
+       return target_call_timer_callbacks_check_time(1);
+}
+
+/* invoke periodic callbacks immediately */
 int target_call_timer_callbacks_now()
 {
-       /* TODO: this should invoke the timer callbacks now. This is used to ensure that
-        * any outstanding polls, etc. are in fact invoked before a synchronous command 
-        * completes. 
-        */
-       return target_call_timer_callbacks();
+       return target_call_timer_callbacks(0);
 }