From: Bohdan Tymkiv Date: Fri, 22 Jan 2021 15:13:34 +0000 (+0200) Subject: jlink: fix device discovery when network is off X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=090209275bc7796eb6b5e3a23158683bc88e354c;p=fw%2Fopenocd jlink: fix device discovery when network is off If user specifies a serial number for the jlink device, openocd extends the search to network jlink devices too, without checking if the host has a valid and functional network connection. If the network is not functional, libjaylink returns error. This error invalidates the discovery on USB, even if it was successful. Factor-out parts of the jlink_init into separate jlink_open_device function, use that function to firstly discover and match USB devices and, if matching device was not found on the USB bus and serial number was specified, repeat discovery and matching via TCP. Fixes: https://sourceforge.net/p/openocd/tickets/294/ Change-Id: Iea0de1640d4e5b21ecc7e9c1dd6d36f214d647c2 Signed-off-by: Bohdan Tymkiv Reviewed-on: http://openocd.zylin.com/6025 Reviewed-by: Antonio Borneo Tested-by: jenkins Reviewed-by: Marc Schink --- diff --git a/src/jtag/drivers/jlink.c b/src/jtag/drivers/jlink.c index b915707ec..15d252cfb 100644 --- a/src/jtag/drivers/jlink.c +++ b/src/jtag/drivers/jlink.c @@ -553,59 +553,17 @@ static bool jlink_usb_location_equal(struct jaylink_device *dev) } -static int jlink_init(void) +static int jlink_open_device(uint32_t ifaces, bool *found_device) { - int ret; - struct jaylink_device **devs; - unsigned int i; - bool found_device; - uint32_t tmp; - char *firmware_version; - struct jaylink_hardware_version hwver; - struct jaylink_hardware_status hwstatus; - enum jaylink_usb_address address; - size_t length; - size_t num_devices; - uint32_t host_interfaces; - - LOG_DEBUG("Using libjaylink %s (compiled with %s).", - jaylink_version_package_get_string(), JAYLINK_VERSION_PACKAGE_STRING); - - if (!jaylink_library_has_cap(JAYLINK_CAP_HIF_USB) && use_usb_address) { - LOG_ERROR("J-Link driver does not support USB devices."); - return ERROR_JTAG_INIT_FAILED; - } - - ret = jaylink_init(&jayctx); - + int ret = jaylink_discovery_scan(jayctx, ifaces); if (ret != JAYLINK_OK) { - LOG_ERROR("jaylink_init() failed: %s.", jaylink_strerror(ret)); - return ERROR_JTAG_INIT_FAILED; - } - - ret = jaylink_log_set_callback(jayctx, &jaylink_log_handler, NULL); - - if (ret != JAYLINK_OK) { - LOG_ERROR("jaylink_log_set_callback() failed: %s.", - jaylink_strerror(ret)); - jaylink_exit(jayctx); - return ERROR_JTAG_INIT_FAILED; - } - - host_interfaces = JAYLINK_HIF_USB; - - if (use_serial_number) - host_interfaces |= JAYLINK_HIF_TCP; - - ret = jaylink_discovery_scan(jayctx, host_interfaces); - - if (ret != JAYLINK_OK) { - LOG_ERROR("jaylink_discovery_scan() failed: %s.", - jaylink_strerror(ret)); + LOG_ERROR("jaylink_discovery_scan() failed: %s.", jaylink_strerror(ret)); jaylink_exit(jayctx); return ERROR_JTAG_INIT_FAILED; } + size_t num_devices; + struct jaylink_device **devs; ret = jaylink_get_devices(jayctx, &devs, &num_devices); if (ret != JAYLINK_OK) { @@ -623,12 +581,13 @@ static int jlink_init(void) return ERROR_JTAG_INIT_FAILED; } - found_device = false; + *found_device = false; - for (i = 0; devs[i]; i++) { + for (size_t i = 0; devs[i]; i++) { struct jaylink_device *dev = devs[i]; if (use_serial_number) { + uint32_t tmp; ret = jaylink_device_get_serial_number(dev, &tmp); if (ret == JAYLINK_ERR_NOT_AVAILABLE) { @@ -644,6 +603,7 @@ static int jlink_init(void) } if (use_usb_address) { + enum jaylink_usb_address address; ret = jaylink_device_get_usb_address(dev, &address); if (ret == JAYLINK_ERR_NOT_SUPPORTED) { @@ -664,7 +624,7 @@ static int jlink_init(void) ret = jaylink_open(dev, &devh); if (ret == JAYLINK_OK) { - found_device = true; + *found_device = true; break; } @@ -672,6 +632,52 @@ static int jlink_init(void) } jaylink_free_devices(devs, true); + return ERROR_OK; +} + + +static int jlink_init(void) +{ + int ret; + char *firmware_version; + struct jaylink_hardware_version hwver; + struct jaylink_hardware_status hwstatus; + size_t length; + + LOG_DEBUG("Using libjaylink %s (compiled with %s).", + jaylink_version_package_get_string(), JAYLINK_VERSION_PACKAGE_STRING); + + if (!jaylink_library_has_cap(JAYLINK_CAP_HIF_USB) && use_usb_address) { + LOG_ERROR("J-Link driver does not support USB devices."); + return ERROR_JTAG_INIT_FAILED; + } + + ret = jaylink_init(&jayctx); + + if (ret != JAYLINK_OK) { + LOG_ERROR("jaylink_init() failed: %s.", jaylink_strerror(ret)); + return ERROR_JTAG_INIT_FAILED; + } + + ret = jaylink_log_set_callback(jayctx, &jaylink_log_handler, NULL); + + if (ret != JAYLINK_OK) { + LOG_ERROR("jaylink_log_set_callback() failed: %s.", + jaylink_strerror(ret)); + jaylink_exit(jayctx); + return ERROR_JTAG_INIT_FAILED; + } + + bool found_device; + ret = jlink_open_device(JAYLINK_HIF_USB, &found_device); + if (ret != ERROR_OK) + return ret; + + if (!found_device && use_serial_number) { + ret = jlink_open_device(JAYLINK_HIF_TCP, &found_device); + if (ret != ERROR_OK) + return ret; + } if (!found_device) { LOG_ERROR("No J-Link device found.");