X-Git-Url: https://git.ao2.it/libam7xxx.git/blobdiff_plain/3fc490e6530865e1b33cd57c7a6bfcc9aff66ab6..521c3915354a7119b67969fe9824b31710d732ca:/src/am7xxx.c diff --git a/src/am7xxx.c b/src/am7xxx.c index 83d9a91..e809c55 100644 --- a/src/am7xxx.c +++ b/src/am7xxx.c @@ -109,6 +109,7 @@ struct _am7xxx_device { 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; }; @@ -451,7 +452,8 @@ static void log_message(am7xxx_context *ctx, 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; @@ -469,6 +471,7 @@ static am7xxx_device *add_new_device(am7xxx_context *ctx) memset(new_device, 0, sizeof(*new_device)); new_device->ctx = ctx; + new_device->desc = desc; devices_list = &(ctx->devices_list); @@ -565,7 +568,7 @@ static int scan_devices(am7xxx_context *ctx, scan_op op, 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 @@ -598,8 +601,28 @@ static int scan_devices(am7xxx_context *ctx, scan_op op, 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++;