jlink: fix device discovery when network is off 25/6025/3
authorBohdan Tymkiv <bohdan200@gmail.com>
Fri, 22 Jan 2021 15:13:34 +0000 (17:13 +0200)
committerPaul Fertser <fercerpav@gmail.com>
Sun, 24 Jan 2021 19:32:09 +0000 (19:32 +0000)
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 <bohdan200@gmail.com>
Reviewed-on: http://openocd.zylin.com/6025
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
Tested-by: jenkins
Reviewed-by: Marc Schink <dev@zapb.de>
src/jtag/drivers/jlink.c

index b915707eca9f301fa7149ce5ff450c140239189b..15d252cfbaad5b32fd3b327d93b2336333c64824 100644 (file)
@@ -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.");

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)