]> git.sur5r.net Git - openocd/commitdiff
XScale excessive waiting fix.
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Thu, 13 Mar 2008 08:16:34 +0000 (08:16 +0000)
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Thu, 13 Mar 2008 08:16:34 +0000 (08:16 +0000)
git-svn-id: svn://svn.berlios.de/openocd/trunk@509 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/target/xscale.c

index 18c5c3de6b5617bd42fb93902188b5bc2ab98a20..771812ccde89af67bebcbc34e48b91150498ea76 100644 (file)
@@ -481,41 +481,47 @@ int xscale_read_tx(target_t *target, int consume)
        jtag_set_check_value(fields+2, &field2_check_value, &field2_check_mask, NULL);
 
        gettimeofday(&timeout, NULL);
-       timeval_add_time(&timeout, 5, 0);
+       timeval_add_time(&timeout, 1, 0);
 
        for (;;)
        {
-               /* if we want to consume the register content (i.e. clear TX_READY),
-                * we have to go straight from Capture-DR to Shift-DR
-                * otherwise, we go from Capture-DR to Exit1-DR to Pause-DR
-               */
-               if (consume)
-                       jtag_add_pathmove(3, path);
-               else
-               {
-                       jtag_add_pathmove(sizeof(noconsume_path)/sizeof(*noconsume_path), noconsume_path);
-               }
-
-               jtag_add_dr_scan(3, fields, TAP_RTI);
-
-               if ((retval = jtag_execute_queue()) != ERROR_OK)
-               {
-                       ERROR("JTAG error while reading TX");
-                       return ERROR_TARGET_TIMEOUT;
-               }
-
-               gettimeofday(&now, NULL);
-               if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec)&& (now.tv_usec > timeout.tv_usec)))
-               {
-                       ERROR("time out reading TX register");
-                       return ERROR_TARGET_TIMEOUT;
-               }
-               if (!((!(field0_in & 1)) && consume))
+               int i;
+               for (i=0; i<100; i++)
                {
-                       break;
+                       /* if we want to consume the register content (i.e. clear TX_READY),
+                        * we have to go straight from Capture-DR to Shift-DR
+                        * otherwise, we go from Capture-DR to Exit1-DR to Pause-DR
+                       */
+                       if (consume)
+                               jtag_add_pathmove(3, path);
+                       else
+                       {
+                               jtag_add_pathmove(sizeof(noconsume_path)/sizeof(*noconsume_path), noconsume_path);
+                       }
+       
+                       jtag_add_dr_scan(3, fields, TAP_RTI);
+       
+                       if ((retval = jtag_execute_queue()) != ERROR_OK)
+                       {
+                               ERROR("JTAG error while reading TX");
+                               return ERROR_TARGET_TIMEOUT;
+                       }
+       
+                       gettimeofday(&now, NULL);
+                       if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec)&& (now.tv_usec > timeout.tv_usec)))
+                       {
+                               ERROR("time out reading TX register");
+                               return ERROR_TARGET_TIMEOUT;
+                       }
+                       if (!((!(field0_in & 1)) && consume))
+                       {
+                               goto done;
+                       }
                }
-               usleep(500*1000); /* avoid flooding the logs */
+               DEBUG("waiting 10ms");
+               usleep(10*1000); /* avoid flooding the logs */
        } 
+       done:
 
        if (!(field0_in & 1))
                return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
@@ -571,31 +577,37 @@ int xscale_write_rx(target_t *target)
        jtag_set_check_value(fields+2, &field2_check_value, &field2_check_mask, NULL);
 
        gettimeofday(&timeout, NULL);
-       timeval_add_time(&timeout, 5, 0);
+       timeval_add_time(&timeout, 1, 0);
 
        /* poll until rx_read is low */
        DEBUG("polling RX");
        for (;;)
        {
-               jtag_add_dr_scan(3, fields, TAP_RTI);
-
-               if ((retval = jtag_execute_queue()) != ERROR_OK)
-               {
-                       ERROR("JTAG error while writing RX");
-                       return retval;
-               }
-
-               gettimeofday(&now, NULL);
-               if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec)&& (now.tv_usec > timeout.tv_usec)))
+               int i;
+               for (i=0; i<10; i++)
                {
-                       ERROR("time out writing RX register");
-                       return ERROR_TARGET_TIMEOUT;
+                       jtag_add_dr_scan(3, fields, TAP_RTI);
+       
+                       if ((retval = jtag_execute_queue()) != ERROR_OK)
+                       {
+                               ERROR("JTAG error while writing RX");
+                               return retval;
+                       }
+       
+                       gettimeofday(&now, NULL);
+                       if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec)&& (now.tv_usec > timeout.tv_usec)))
+                       {
+                               ERROR("time out writing RX register");
+                               return ERROR_TARGET_TIMEOUT;
+                       }
+                       if (!(field0_in & 1))
+                               goto done;
                }
-               if (!(field0_in & 1))
-                       break;
-               usleep(500*1000); /* wait 500ms to avoid flooding the logs */
+               DEBUG("waiting 10ms");
+               usleep(10*1000); /* wait 10ms to avoid flooding the logs */
        }
-
+       done:
+       
        /* set rx_valid */
        field2 = 0x1;
        jtag_add_dr_scan(3, fields, TAP_RTI);