(lwla_send_bitstream): Unref the mapped file earlier in order
to simplify the error handling.
(lwla_receive_reply): Do not treat a reply buffer length of
zero as silent no-op. That logic was left over from an earlier
iteration, before the distinction between reply buffer size and
expected read length was introduced.
ret = libusb_bulk_transfer(usb->devhdl, EP_BITSTREAM,
(unsigned char *)stream, length,
&xfer_len, USB_TIMEOUT);
ret = libusb_bulk_transfer(usb->devhdl, EP_BITSTREAM,
(unsigned char *)stream, length,
&xfer_len, USB_TIMEOUT);
+ g_mapped_file_unref(file);
+
if (ret != 0) {
sr_err("Failed to transfer bitstream: %s.",
libusb_error_name(ret));
if (ret != 0) {
sr_err("Failed to transfer bitstream: %s.",
libusb_error_name(ret));
- g_mapped_file_unref(file);
return SR_ERR;
}
if (xfer_len != (int)length) {
sr_err("Failed to transfer bitstream: incorrect length "
"%d != %d.", xfer_len, (int)length);
return SR_ERR;
}
if (xfer_len != (int)length) {
sr_err("Failed to transfer bitstream: incorrect length "
"%d != %d.", xfer_len, (int)length);
- g_mapped_file_unref(file);
- g_mapped_file_unref(file);
sr_info("FPGA bitstream download of %d bytes done.", xfer_len);
/* This delay appears to be necessary for reliable operation. */
sr_info("FPGA bitstream download of %d bytes done.", xfer_len);
/* This delay appears to be necessary for reliable operation. */
const uint16_t *command, int cmd_len)
{
int ret;
const uint16_t *command, int cmd_len)
{
int ret;
- if (usb == NULL || command == NULL || cmd_len < 1)
+ if (usb == NULL || command == NULL || cmd_len <= 0)
ret = libusb_bulk_transfer(usb->devhdl, EP_COMMAND,
(unsigned char *)command, cmd_len * 2,
&xfer_len, USB_TIMEOUT);
ret = libusb_bulk_transfer(usb->devhdl, EP_COMMAND,
(unsigned char *)command, cmd_len * 2,
&xfer_len, USB_TIMEOUT);
uint16_t *reply, int reply_len, int expect_len)
{
int ret;
uint16_t *reply, int reply_len, int expect_len)
{
int ret;
- int xfer_len = 0;
-
- if (reply_len == 0)
- return SR_OK;
- if (usb == NULL || reply == NULL || reply_len < 0)
+ if (usb == NULL || reply == NULL || reply_len <= 0)
ret = libusb_bulk_transfer(usb->devhdl, EP_REPLY,
(unsigned char *)reply, reply_len * 2,
&xfer_len, USB_TIMEOUT);
ret = libusb_bulk_transfer(usb->devhdl, EP_REPLY,
(unsigned char *)reply, reply_len * 2,
&xfer_len, USB_TIMEOUT);
{
int ret;
uint16_t command[2];
{
int ret;
uint16_t command[2];
+ uint16_t reply[256]; /* full EP buffer to avoid overflows */
command[0] = LWLA_WORD(CMD_READ_REG);
command[1] = LWLA_WORD(reg);
command[0] = LWLA_WORD(CMD_READ_REG);
command[1] = LWLA_WORD(reg);