+ struct dev_context *devc;
+ libusb_device **devlist, *dev;
+ struct libusb_device_descriptor des;
+ int device_count, ret, i;
+
+ if (!(devc = sdi->priv)) {
+ sr_err("zp: %s: sdi->priv was NULL", __func__);
+ return SR_ERR_ARG;
+ }
+
+ device_count = libusb_get_device_list(usb_context, &devlist);
+ if (device_count < 0) {
+ sr_err("zp: Failed to retrieve device list");
+ return SR_ERR;
+ }
+
+ dev = NULL;
+ for (i = 0; i < device_count; i++) {
+ if ((ret = libusb_get_device_descriptor(devlist[i], &des))) {
+ sr_err("fx2lafw: Failed to get device descriptor: %d.",
+ ret);
+ continue;
+ }
+ if (libusb_get_bus_number(devlist[i]) == devc->usb->bus
+ && libusb_get_device_address(devlist[i]) == devc->usb->address) {
+ dev = devlist[i];
+ break;
+ }
+ }
+ if (!dev) {
+ sr_err("device on bus %d address %d disappeared!",
+ devc->usb->bus, devc->usb->address);
+ return SR_ERR;
+ }
+
+ if (!(ret = libusb_open(dev, &(devc->usb->devhdl)))) {
+ sdi->status = SR_ST_ACTIVE;
+ sr_info("zp: opened device %d on %d.%d interface %d",
+ sdi->index, devc->usb->bus,
+ devc->usb->address, USB_INTERFACE);
+ } else {
+ sr_err("zp: failed to open device: %d", ret);
+ return SR_ERR;
+ }