+ 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;
+ }
+
+ const char *serial = adapter_get_required_serial();
+ if (serial) {
+ ret = jaylink_parse_serial_number(serial, &serial_number);
+ if (ret == JAYLINK_ERR) {
+ LOG_ERROR("Invalid serial number: %s", serial);
+ jaylink_exit(jayctx);
+ return ERROR_JTAG_INIT_FAILED;
+ }
+ if (ret != JAYLINK_OK) {
+ LOG_ERROR("jaylink_parse_serial_number() failed: %s", jaylink_strerror(ret));
+ jaylink_exit(jayctx);
+ return ERROR_JTAG_INIT_FAILED;
+ }
+ use_serial_number = true;
+ use_usb_address = false;
+ }
+
+ 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;
+ }