uint8_t buffer[AM7XXX_HEADER_WIRE_SIZE];
am7xxx_device_info *device_info;
am7xxx_context *ctx;
+ const struct am7xxx_usb_device_descriptor *desc;
am7xxx_device *next;
};
return;
}
-static am7xxx_device *add_new_device(am7xxx_context *ctx)
+static am7xxx_device *add_new_device(am7xxx_context *ctx,
+ const struct am7xxx_usb_device_descriptor *desc)
{
am7xxx_device **devices_list;
am7xxx_device *new_device;
memset(new_device, 0, sizeof(*new_device));
new_device->ctx = ctx;
+ new_device->desc = desc;
devices_list = &(ctx->devices_list);
info(ctx, "am7xxx device found, index: %d, name: %s\n",
current_index,
supported_devices[j].name);
- new_device = add_new_device(ctx);
+ new_device = add_new_device(ctx, &supported_devices[j]);
if (new_device == NULL) {
/* XXX, the caller may want
* to call am7xxx_shutdown() if
goto out;
}
- libusb_set_configuration((*dev)->usb_device, 2);
- libusb_claim_interface((*dev)->usb_device, 0);
+ /* XXX, the device is now open, if any
+ * of the calls below fail we need to
+ * close it again before bailing out.
+ */
+
+ ret = libusb_set_configuration((*dev)->usb_device, 2);
+ if (ret < 0) {
+ debug(ctx, "libusb_set_configuration failed\n");
+ debug(ctx, "Cannot set configuration 2\n");
+ goto out_libusb_close;
+ }
+
+ ret = libusb_claim_interface((*dev)->usb_device, 0);
+ if (ret < 0) {
+ debug(ctx, "libusb_claim_interface failed\n");
+ debug(ctx, "Cannot claim interface 0\n");
+out_libusb_close:
+ libusb_close((*dev)->usb_device);
+ (*dev)->usb_device = NULL;
+ goto out;
+ }
+
goto out;
}
current_index++;