drivers/bcm2835gpio: fix usage messages
[fw/openocd] / src / jtag / drivers / jtag_vpi.c
index a1787d496445815d9eba03fbada3234292a68de8..35c70312d6d507b13e352dbbd54d1526f59580f5 100644 (file)
 #include <arpa/inet.h>
 #endif
 
+#ifndef _WIN32
+#include <netinet/tcp.h>
+#endif
+
 #define NO_TAP_SHIFT   0
 #define TAP_SHIFT      1
 
@@ -204,23 +208,20 @@ static int jtag_vpi_queue_tdi_xfer(uint8_t *bits, int nb_bits, int tap_shift)
 static int jtag_vpi_queue_tdi(uint8_t *bits, int nb_bits, int tap_shift)
 {
        int nb_xfer = DIV_ROUND_UP(nb_bits, XFERT_MAX_SIZE * 8);
-       uint8_t *xmit_buffer = bits;
-       int xmit_nb_bits = nb_bits;
-       int i = 0;
        int retval;
 
        while (nb_xfer) {
-
                if (nb_xfer ==  1) {
-                       retval = jtag_vpi_queue_tdi_xfer(&xmit_buffer[i], xmit_nb_bits, tap_shift);
+                       retval = jtag_vpi_queue_tdi_xfer(bits, nb_bits, tap_shift);
                        if (retval != ERROR_OK)
                                return retval;
                } else {
-                       retval = jtag_vpi_queue_tdi_xfer(&xmit_buffer[i], XFERT_MAX_SIZE * 8, NO_TAP_SHIFT);
+                       retval = jtag_vpi_queue_tdi_xfer(bits, XFERT_MAX_SIZE * 8, NO_TAP_SHIFT);
                        if (retval != ERROR_OK)
                                return retval;
-                       xmit_nb_bits -= XFERT_MAX_SIZE * 8;
-                       i += XFERT_MAX_SIZE;
+                       nb_bits -= XFERT_MAX_SIZE * 8;
+                       if (bits)
+                               bits += XFERT_MAX_SIZE;
                }
 
                nb_xfer--;
@@ -371,6 +372,8 @@ static int jtag_vpi_execute_queue(void)
 
 static int jtag_vpi_init(void)
 {
+       int flag = 1;
+
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (sockfd < 0) {
                LOG_ERROR("Could not create socket");
@@ -398,6 +401,13 @@ static int jtag_vpi_init(void)
                return ERROR_COMMAND_CLOSE_CONNECTION;
        }
 
+       if (serv_addr.sin_addr.s_addr == htonl(INADDR_LOOPBACK)) {
+               /* This increases performance drematically for local
+                * connections, which is the most likely arrangement
+                * for a VPI connection. */
+               setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(int));
+       }
+
        LOG_INFO("Connection to %s : %u succeed", server_address, server_port);
 
        return ERROR_OK;