diff --git a/src/tap/usbconn/libftdi.c b/src/tap/usbconn/libftdi.c index 34457d0..5933d0f 100644 --- a/src/tap/usbconn/libftdi.c +++ b/src/tap/usbconn/libftdi.c @@ -68,6 +68,7 @@ usbconn_ftdi_flush (ftdi_param_t *p) { int xferred; int recvd = 0; + struct ftdi_transfer_control *tc; if (!p->fc) return -1; @@ -75,19 +76,6 @@ usbconn_ftdi_flush (ftdi_param_t *p) if (p->send_buffered == 0) return 0; - if ((xferred = ftdi_write_data (p->fc, p->send_buf, p->send_buffered)) < 0) - urj_error_set (URJ_ERROR_FTD, _("ftdi_write_data() failed: %s"), - ftdi_get_error_string (p->fc)); - - if (xferred < p->send_buffered) - { - urj_error_set (URJ_ERROR_ILLEGAL_STATE, - _("Written fewer bytes than requested")); - return -1; - } - - p->send_buffered = 0; - /* now read all scheduled receive bytes */ if (p->to_recv) { @@ -106,13 +94,28 @@ usbconn_ftdi_flush (ftdi_param_t *p) return -1; } - while (recvd == 0) - if ((recvd = ftdi_read_data (p->fc, + if ((tc = ftdi_read_data_submit (p->fc, &(p->recv_buf[p->recv_write_idx]), - p->to_recv)) < 0) - urj_error_set (URJ_ERROR_FTD, - _("Error from ftdi_read_data(): %s"), - ftdi_get_error_string (p->fc)); + p->to_recv)) == NULL) + urj_error_set (URJ_ERROR_FTD, + _("Error from ftdi_read_data_submit(): %s"), + ftdi_get_error_string (p->fc)); + } + + if ((xferred = ftdi_write_data (p->fc, p->send_buf, p->send_buffered)) < 0) + perror (ftdi_get_error_string (p->fc)); + + if (xferred < p->send_buffered) + { + urj_error_set (URJ_ERROR_FTD, _("Written fewer bytes than requested.")); + return -1; + } + + p->send_buffered = 0; + + if (p->to_recv) + { + recvd = ftdi_transfer_data_done (tc); if (recvd < p->to_recv) urj_log (URJ_LOG_LEVEL_NORMAL, diff --git a/src/tap/usbconn/libftdx.h b/src/tap/usbconn/libftdx.h index f84e5cf..a79578f 100644 --- a/src/tap/usbconn/libftdx.h +++ b/src/tap/usbconn/libftdx.h @@ -30,7 +30,7 @@ Larger values might speed up comm, but there's an upper limit when too many bytes are sent and the underlying libftdi or libftd2xx don't fetch the returned data in time -> deadlock */ -#define URJ_USBCONN_FTDI_MAXRECV ( 4 * 64) +#define URJ_USBCONN_FTDI_MAXRECV (63 * 64) #define URJ_USBCONN_FTD2XX_MAXRECV (63 * 64) #define URJ_USBCONN_FTDX_MAXRECV (URJ_USBCONN_FTD2XX_MAXRECV < URJ_USBCONN_FTDI_MAXRECV ? URJ_USBCONN_FTD2XX_MAXRECV : URJ_USBCONN_FTDI_MAXRECV)