rlink: simplify and optimize queue fill level checks
Add a helper function for running the queue if it would overflow otherwise. Use it to simplify the queue fill level checks and optimize in a few cases that would previously run the queue prematurely. Signed-off-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
This commit is contained in:
parent
d23d61a932
commit
0b64be2019
|
@ -799,6 +799,24 @@ dtc_queue_run(void) {
|
||||||
return(retval);
|
return(retval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* runs the queue if it cannot take reserved_cmd bytes of command data
|
||||||
|
* or reserved_reply bytes of reply data */
|
||||||
|
static
|
||||||
|
int
|
||||||
|
dtc_queue_run_if_full(
|
||||||
|
int reserved_cmd,
|
||||||
|
int reserved_reply
|
||||||
|
) {
|
||||||
|
/* reserve one additional byte for the STOP cmd appended during run */
|
||||||
|
if (dtc_queue.cmd_index + reserved_cmd + 1 > USB_EP2BANK_SIZE)
|
||||||
|
return dtc_queue_run();
|
||||||
|
|
||||||
|
if (dtc_queue.reply_index + reserved_reply > USB_EP2IN_SIZE)
|
||||||
|
return dtc_queue_run();
|
||||||
|
|
||||||
|
return ERROR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
int
|
int
|
||||||
tap_state_queue_init(void) {
|
tap_state_queue_init(void) {
|
||||||
|
@ -829,12 +847,8 @@ tap_state_queue_run(void) {
|
||||||
if ((bits >= 8) || !i) {
|
if ((bits >= 8) || !i) {
|
||||||
byte_param <<= (8 - bits);
|
byte_param <<= (8 - bits);
|
||||||
|
|
||||||
/* make sure there's room for stop, byte op, and one byte */
|
/* make sure there's room for two cmd bytes */
|
||||||
if (dtc_queue.cmd_index >= (sizeof(dtc_queue.cmd_buffer) - (1 + 1 + 1))) {
|
dtc_queue_run_if_full(2, 0);
|
||||||
dtc_queue.cmd_buffer[dtc_queue.cmd_index++] =
|
|
||||||
DTC_CMD_STOP;
|
|
||||||
dtc_queue_run();
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef USE_HARDWARE_SHIFTER_FOR_TMS
|
#ifdef USE_HARDWARE_SHIFTER_FOR_TMS
|
||||||
if (bits == 8) {
|
if (bits == 8) {
|
||||||
|
@ -1145,12 +1159,9 @@ rlink_scan(
|
||||||
if (extra_bits && (type == SCAN_OUT)) {
|
if (extra_bits && (type == SCAN_OUT)) {
|
||||||
/* Schedule any extra bits into the DTC command buffer, padding as needed */
|
/* Schedule any extra bits into the DTC command buffer, padding as needed */
|
||||||
/* For SCAN_OUT, this comes before the full bytes so the (leading) padding bits will fall off the end */
|
/* For SCAN_OUT, this comes before the full bytes so the (leading) padding bits will fall off the end */
|
||||||
/* make sure there's room for stop, byte op, and one byte */
|
|
||||||
if (
|
/* make sure there's room for two cmd bytes */
|
||||||
(dtc_queue.cmd_index >= sizeof(dtc_queue.cmd_buffer) - (1 + 1 + 1))
|
dtc_queue_run_if_full(2, 0);
|
||||||
) {
|
|
||||||
dtc_queue_run();
|
|
||||||
}
|
|
||||||
|
|
||||||
x = 0;
|
x = 0;
|
||||||
dtc_mask = 1 << (extra_bits - 1);
|
dtc_mask = 1 << (extra_bits - 1);
|
||||||
|
@ -1177,22 +1188,9 @@ rlink_scan(
|
||||||
|
|
||||||
/* Loop scheduling full bytes into the DTC command buffer */
|
/* Loop scheduling full bytes into the DTC command buffer */
|
||||||
while (byte_bits) {
|
while (byte_bits) {
|
||||||
if (type == SCAN_IN) {
|
/* make sure there's room for one (for in scans) or two cmd bytes and
|
||||||
/* make sure there's room for stop and byte op */
|
* at least one reply byte for in or inout scans*/
|
||||||
x = (dtc_queue.cmd_index >= sizeof(dtc_queue.cmd_buffer) - (1 + 1));
|
dtc_queue_run_if_full(type == SCAN_IN ? 1 : 2, type != SCAN_OUT ? 1 : 0);
|
||||||
} else {
|
|
||||||
/* make sure there's room for stop, byte op, and at least one byte */
|
|
||||||
x = (dtc_queue.cmd_index >= sizeof(dtc_queue.cmd_buffer) - (1 + 1 + 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type != SCAN_OUT) {
|
|
||||||
/* make sure there's room for at least one reply byte */
|
|
||||||
x |= (dtc_queue.reply_index >= USB_EP2IN_SIZE - (1));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (x) {
|
|
||||||
dtc_queue_run();
|
|
||||||
}
|
|
||||||
|
|
||||||
chunk_bits = byte_bits;
|
chunk_bits = byte_bits;
|
||||||
/* we can only use up to 16 bytes at a time */
|
/* we can only use up to 16 bytes at a time */
|
||||||
|
@ -1270,14 +1268,10 @@ rlink_scan(
|
||||||
|
|
||||||
if (extra_bits && (type != SCAN_OUT)) {
|
if (extra_bits && (type != SCAN_OUT)) {
|
||||||
/* Schedule any extra bits into the DTC command buffer */
|
/* Schedule any extra bits into the DTC command buffer */
|
||||||
/* make sure there's room for stop, byte op, and one byte */
|
|
||||||
if (
|
/* make sure there's room for one (for in scans) or two cmd bytes
|
||||||
(dtc_queue.cmd_index >= sizeof(dtc_queue.cmd_buffer) - (1 + 1 + 1))
|
* and one reply byte */
|
||||||
||
|
dtc_queue_run_if_full(type == SCAN_IN ? 1 : 2, 1);
|
||||||
(dtc_queue.reply_index >= USB_EP2IN_SIZE - (1))
|
|
||||||
) {
|
|
||||||
dtc_queue_run();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dtc_queue_enqueue_reply(
|
if (dtc_queue_enqueue_reply(
|
||||||
type, buffer, scan_size, tdi_bit_offset,
|
type, buffer, scan_size, tdi_bit_offset,
|
||||||
|
@ -1322,14 +1316,10 @@ rlink_scan(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Schedule the last bit into the DTC command buffer */
|
/* Schedule the last bit into the DTC command buffer */
|
||||||
/* make sure there's room for stop, and bit pair command */
|
|
||||||
if (
|
/* make sure there's room for one cmd byte and one reply byte
|
||||||
(dtc_queue.cmd_index >= sizeof(dtc_queue.cmd_buffer) - (1 + 1))
|
* for in or inout scans*/
|
||||||
||
|
dtc_queue_run_if_full(1, type == SCAN_OUT ? 0 : 1);
|
||||||
(dtc_queue.reply_index >= USB_EP2IN_SIZE - (1))
|
|
||||||
) {
|
|
||||||
dtc_queue_run();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type == SCAN_OUT) {
|
if (type == SCAN_OUT) {
|
||||||
dtc_queue.cmd_buffer[dtc_queue.cmd_index++] =
|
dtc_queue.cmd_buffer[dtc_queue.cmd_index++] =
|
||||||
|
|
Loading…
Reference in New Issue