summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-03-13 08:16:34 +0000
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-03-13 08:16:34 +0000
commitb8dab6d056e4c9d9964e8958717692e030235aac (patch)
tree772c3b78fa92963f1d8d1be3b888ad91514cc180
parent979d6b794362c8e2e0dc4d0e7040ae7be862462a (diff)
downloadopenocd_libswd-b8dab6d056e4c9d9964e8958717692e030235aac.tar.gz
openocd_libswd-b8dab6d056e4c9d9964e8958717692e030235aac.tar.bz2
openocd_libswd-b8dab6d056e4c9d9964e8958717692e030235aac.tar.xz
openocd_libswd-b8dab6d056e4c9d9964e8958717692e030235aac.zip
XScale excessive waiting fix.
git-svn-id: svn://svn.berlios.de/openocd/trunk@509 b42882b7-edfa-0310-969c-e2dbd0fdcd60
-rw-r--r--src/target/xscale.c104
1 files changed, 58 insertions, 46 deletions
diff --git a/src/target/xscale.c b/src/target/xscale.c
index 18c5c3de..771812cc 100644
--- a/src/target/xscale.c
+++ b/src/target/xscale.c
@@ -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);