Move back off timer to target struct79/1179/4
authorMathias K <kesmtp@freenet.de>
Mon, 25 Feb 2013 17:15:15 +0000 (25 18:15 +0100)
committerSpencer Oliver <spen@spen-soft.co.uk>
Tue, 5 Mar 2013 15:08:52 +0000 (5 15:08 +0000)
Move the global target back off timer to the target struct. This will
fix the wrong error handling with multi target devices like smp systems.

Change-Id: Ia327182ed5d13ca87323700017a8c40ecc6b25a3
Signed-off-by: Mathias K <kesmtp@freenet.de>
Reviewed-on: http://openocd.zylin.com/1179
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
Tested-by: jenkins
Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
src/target/target.c
src/target/target.h

index 45b4577..d768fda 100644 (file)
@@ -2164,9 +2164,6 @@ static int sense_handler(void)
        return ERROR_OK;
 }
 
-static int backoff_times;
-static int backoff_count;
-
 /* process target state changes */
 static int handle_target(void *priv)
 {
@@ -2222,13 +2219,6 @@ static int handle_target(void *priv)
                recursive = 0;
        }
 
-       if (backoff_times > backoff_count) {
-               /* do not poll this time as we failed previously */
-               backoff_count++;
-               return ERROR_OK;
-       }
-       backoff_count = 0;
-
        /* Poll targets for state changes unless that's globally disabled.
         * Skip targets that are currently disabled.
         */
@@ -2238,19 +2228,26 @@ static int handle_target(void *priv)
                if (!target->tap->enabled)
                        continue;
 
+               if (target->backoff.times > target->backoff.count) {
+                       /* do not poll this time as we failed previously */
+                       target->backoff.count++;
+                       continue;
+               }
+               target->backoff.count = 0;
+
                /* only poll target if we've got power and srst isn't asserted */
                if (!powerDropout && !srstAsserted) {
                        /* polling may fail silently until the target has been examined */
                        retval = target_poll(target);
                        if (retval != ERROR_OK) {
                                /* 100ms polling interval. Increase interval between polling up to 5000ms */
-                               if (backoff_times * polling_interval < 5000) {
-                                       backoff_times *= 2;
-                                       backoff_times++;
+                               if (target->backoff.times * polling_interval < 5000) {
+                                       target->backoff.times *= 2;
+                                       target->backoff.times++;
                                }
                                LOG_USER("Polling target %s failed, GDB will be halted. Polling again in %dms",
                                                target_name(target),
-                                               backoff_times * polling_interval);
+                                               target->backoff.times * polling_interval);
 
                                /* Tell GDB to halt the debugger. This allows the user to
                                 * run monitor commands to handle the situation.
@@ -2259,9 +2256,9 @@ static int handle_target(void *priv)
                                return retval;
                        }
                        /* Since we succeeded, we reset backoff count */
-                       if (backoff_times > 0)
+                       if (target->backoff.times > 0)
                                LOG_USER("Polling target %s succeeded again", target_name(target));
-                       backoff_times = 0;
+                       target->backoff.times = 0;
                }
        }
 
index 9707bcc..3eade51 100644 (file)
@@ -108,6 +108,12 @@ struct gdb_service {
        int32_t core[2];
 };
 
+/* target back off timer */
+struct backoff_timer {
+       int times;
+       int count;
+};
+
 /* target_type.h contains the full definition of struct target_type */
 struct target {
        struct target_type *type;                       /* target type definition (name, access functions) */
@@ -171,7 +177,7 @@ struct target {
        struct rtos *rtos;                                      /* Instance of Real Time Operating System support */
        bool rtos_auto_detect;                          /* A flag that indicates that the RTOS has been specified as "auto"
                                                                                 * and must be detected when symbols are offered */
-
+       struct backoff_timer backoff;
        int smp;                                                        /* add some target attributes for smp support */
        struct target_list *head;
        /* the gdb service is there in case of smp, we have only one gdb server