Hi all,

This patch unwinds the logic in jlink_tap_execute.

Cheers,

Zach
Index: src/jtag/jlink.c
===================================================================
--- src/jtag/jlink.c	(revision 1497)
+++ src/jtag/jlink.c	(working copy)
@@ -651,82 +641,79 @@
 	int i;
 	int result;
 
-	if (tap_length > 0)
+	if (!tap_length)
+		return ERROR_OK;
+
+	/* Pad last byte so that tap_length is divisible by 8 */
+	while (tap_length % 8 != 0)
 	{
-		/* Pad last byte so that tap_length is divisible by 8 */
-		while (tap_length % 8 != 0)
-		{
-			/* More of the last TMS value keeps us in the same state,
-			 * analogous to free-running JTAG interfaces. */
-			jlink_tap_append_step(last_tms, 0);
-		}
+		/* More of the last TMS value keeps us in the same state,
+		 * analogous to free-running JTAG interfaces. */
+		jlink_tap_append_step(last_tms, 0);
+	}
 
-		byte_length = tap_length / 8;
+	byte_length = tap_length / 8;
 
-		usb_out_buffer[0] = EMU_CMD_HW_JTAG3;
-		usb_out_buffer[1] = 0;
-		usb_out_buffer[2] = (tap_length >> 0) & 0xff;
-		usb_out_buffer[3] = (tap_length >> 8) & 0xff;
+	usb_out_buffer[0] = EMU_CMD_HW_JTAG3;
+	usb_out_buffer[1] = 0;
+	usb_out_buffer[2] = (tap_length >> 0) & 0xff;
+	usb_out_buffer[3] = (tap_length >> 8) & 0xff;
 
-		tms_offset = 4;
-		for (i = 0; i < byte_length; i++)
-		{
-			usb_out_buffer[tms_offset + i] = tms_buffer[i];
-		}
+	tms_offset = 4;
+	for (i = 0; i < byte_length; i++)
+	{
+		usb_out_buffer[tms_offset + i] = tms_buffer[i];
+	}
 
-		tdi_offset = tms_offset + byte_length;
-		for (i = 0; i < byte_length; i++)
-		{
-			usb_out_buffer[tdi_offset + i] = tdi_buffer[i];
-		}
+	tdi_offset = tms_offset + byte_length;
+	for (i = 0; i < byte_length; i++)
+	{
+		usb_out_buffer[tdi_offset + i] = tdi_buffer[i];
+	}
 
-		result = jlink_usb_message(jlink_jtag_handle, 4 + 2 * byte_length, byte_length);
+	result = jlink_usb_message(jlink_jtag_handle, 4 + 2 * byte_length, byte_length);
 
-		if (result == byte_length)
-		{
-			for (i = 0; i < byte_length; i++)
-			{
-				tdo_buffer[i] = usb_in_buffer[i];
-			}
+	if (result != byte_length)
+	{
+		LOG_ERROR("jlink_tap_execute, wrong result %d (expected %d)",
+				result, byte_length);
+		return ERROR_JTAG_QUEUE_FAILED;
+	}
 
-			for (i = 0; i < pending_scan_results_length; i++)
-			{
-				pending_scan_result_t *pending_scan_result = &pending_scan_results_buffer[i];
-				u8 *buffer = pending_scan_result->buffer;
-				int length = pending_scan_result->length;
-				int first = pending_scan_result->first;
-				scan_command_t *command = pending_scan_result->command;
+	for (i = 0; i < byte_length; i++)
+		tdo_buffer[i] = usb_in_buffer[i];
 
-				/* Copy to buffer */
-				buf_set_buf(tdo_buffer, first, buffer, 0, length);
+	for (i = 0; i < pending_scan_results_length; i++)
+	{
+		pending_scan_result_t *pending_scan_result = &pending_scan_results_buffer[i];
+		u8 *buffer = pending_scan_result->buffer;
+		int length = pending_scan_result->length;
+		int first = pending_scan_result->first;
+		scan_command_t *command = pending_scan_result->command;
 
-				DEBUG_JTAG_IO("pending scan result, length = %d", length);
+		/* Copy to buffer */
+		buf_set_buf(tdo_buffer, first, buffer, 0, length);
 
+		DEBUG_JTAG_IO("pending scan result, length = %d", length);
+
 #ifdef _DEBUG_USB_COMMS_
-				jlink_debug_buffer(buffer, byte_length);
+		jlink_debug_buffer(buffer, byte_length);
 #endif
 
-				if (jtag_read_buffer(buffer, command) != ERROR_OK)
-				{
-					jlink_tap_init();
-					return ERROR_JTAG_QUEUE_FAILED;
-				}
-
-				if (pending_scan_result->buffer != NULL)
-				{
-					free(pending_scan_result->buffer);
-				}
-			}
-		}
-		else
+		if (jtag_read_buffer(buffer, command) != ERROR_OK)
 		{
-			LOG_ERROR("jlink_tap_execute, wrong result %d, expected %d", result, byte_length);
+			jlink_tap_init();
 			return ERROR_JTAG_QUEUE_FAILED;
 		}
 
-		jlink_tap_init();
+		if (pending_scan_result->buffer != NULL)
+		{
+			free(pending_scan_result->buffer);
+		}
 	}
 
+	jlink_tap_init();
+
 	return ERROR_OK;
 }
 
_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to