asix-sigma: Only open the USB device once (fails with newer libftdi)

The asix-sigma driver was reported to fail in combination with newer
libftdi versions, because the firmware upload routine opened again an
already opened device, and then failed to claim the interface. Which was
not fatal before with previous libftdi versions.

Remove the redundant open call. Remove the local FTDI context variable,
which brings the firmware upload routine in line with all other calls
that communicate to the USB device.

This fixes bug #471.

Suggested-By: Marian Cingel <cingel.marian@gmail.com>
This commit is contained in:
Gerhard Sittig 2017-06-25 12:24:13 +02:00 committed by Uwe Hermann
parent ac9534f48a
commit 1f4f98e05c
1 changed files with 7 additions and 18 deletions

View File

@ -446,7 +446,6 @@ static int upload_firmware(struct sr_context *ctx,
unsigned char pins;
size_t buf_size;
const char *firmware;
struct ftdi_context *ftdic;
/* Avoid downloading the same firmware multiple times. */
firmware = sigma_firmware_files[firmware_idx];
@ -455,28 +454,18 @@ static int upload_firmware(struct sr_context *ctx,
return SR_OK;
}
/* Make sure it's an ASIX SIGMA. */
ftdic = &devc->ftdic;
ret = ftdi_usb_open_desc(ftdic, USB_VENDOR, USB_PRODUCT,
USB_DESCRIPTION, NULL);
if (ret < 0) {
sr_err("ftdi_usb_open failed: %s",
ftdi_get_error_string(ftdic));
return SR_ERR;
}
ret = ftdi_set_bitmode(ftdic, 0xdf, BITMODE_BITBANG);
ret = ftdi_set_bitmode(&devc->ftdic, 0xdf, BITMODE_BITBANG);
if (ret < 0) {
sr_err("ftdi_set_bitmode failed: %s",
ftdi_get_error_string(ftdic));
ftdi_get_error_string(&devc->ftdic));
return SR_ERR;
}
/* Four times the speed of sigmalogan - Works well. */
ret = ftdi_set_baudrate(ftdic, 750 * 1000);
ret = ftdi_set_baudrate(&devc->ftdic, 750 * 1000);
if (ret < 0) {
sr_err("ftdi_set_baudrate failed: %s",
ftdi_get_error_string(ftdic));
ftdi_get_error_string(&devc->ftdic));
return SR_ERR;
}
@ -499,14 +488,14 @@ static int upload_firmware(struct sr_context *ctx,
g_free(buf);
ret = ftdi_set_bitmode(ftdic, 0x00, BITMODE_RESET);
ret = ftdi_set_bitmode(&devc->ftdic, 0x00, BITMODE_RESET);
if (ret < 0) {
sr_err("ftdi_set_bitmode failed: %s",
ftdi_get_error_string(ftdic));
ftdi_get_error_string(&devc->ftdic));
return SR_ERR;
}
ftdi_usb_purge_buffers(ftdic);
ftdi_usb_purge_buffers(&devc->ftdic);
/* Discard garbage. */
while (sigma_read(&pins, 1, devc) == 1)