+ /* expected in stream:
+ LCOUNT <u32 loop_count>
+ */
+ u8 count_buf[4];
+
+ if ( read(xsvf_fd, count_buf, 4) < 0 )
+ {
+ do_abort = 1;
+ break;
+ }
+
+ loop_count = be_to_h_u32(count_buf);
+ LOG_DEBUG("LCOUNT %d", loop_count);
+ }
+ break;
+
+ case LDELAY:
+ {
+ /* expected in stream:
+ LDELAY <u8 wait_state> <u32 clock_count> <u32 usecs_to_sleep>
+ */
+ u8 state;
+ u8 clock_buf[4];
+ u8 usecs_buf[4];
+
+ if ( read(xsvf_fd, &state, 1) < 0
+ || read(xsvf_fd, clock_buf, 4) < 0
+ || read(xsvf_fd, usecs_buf, 4) < 0 )
+ {
+ do_abort = 1;
+ break;
+ }
+
+ loop_state = xsvf_to_tap(state);
+ loop_clocks = be_to_h_u32(clock_buf);
+ loop_usecs = be_to_h_u32(usecs_buf);
+
+ LOG_DEBUG("LDELAY %s clocks:%d usecs:%d", jtag_state_name(loop_state), loop_clocks, loop_usecs);
+ }
+ break;
+
+ /* LSDR is more like XSDRTDO than it is like XSDR. It uses LDELAY which
+ * comes with clocks !AND! sleep requirements.
+ */
+ case LSDR:
+ {
+ int limit = loop_count;
+ int matched = 0;
+ int attempt;
+
+ LOG_DEBUG("LSDR");
+
+ if ( xsvf_read_buffer(xsdrsize, xsvf_fd, dr_out_buf) != ERROR_OK
+ || xsvf_read_buffer(xsdrsize, xsvf_fd, dr_in_buf) != ERROR_OK )
+ {
+ do_abort = 1;
+ break;
+ }
+
+ if (limit < 1)
+ limit = 1;
+
+ for( attempt=0; attempt<limit; ++attempt )
+ {
+ scan_field_t field;
+
+ field.tap = tap;
+ field.num_bits = xsdrsize;
+ field.out_value = dr_out_buf;
+ field.out_mask = NULL;
+ field.in_value = NULL;
+
+ if (attempt > 0)
+ LOG_USER("LSDR retry %d", attempt);
+
+ jtag_set_check_value(&field, dr_in_buf, dr_in_mask, NULL);
+ if (tap == NULL)
+ jtag_add_plain_dr_scan(1, &field, loop_state);
+ else
+ jtag_add_dr_scan(1, &field, loop_state);
+
+ /* LOG_DEBUG("FLUSHING QUEUE"); */
+ result = jtag_execute_queue();
+ if(result == ERROR_OK)
+ {
+ matched = 1;
+ break;
+ }
+
+ jtag_add_clocks(loop_clocks);
+ jtag_add_sleep(loop_usecs);
+ }
+
+ if (!matched )
+ {
+ LOG_USER( "LSDR mismatch" );
+ tdo_mismatch = 1;
+ break;
+ }