projects
/
libam7xxx.git
/ blobdiff
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
am7xxx: release the interface when needed in open_device()
[libam7xxx.git]
/
src
/
am7xxx.c
diff --git
a/src/am7xxx.c
b/src/am7xxx.c
index
f4203e3
..
2ba9561
100644
(file)
--- a/
src/am7xxx.c
+++ b/
src/am7xxx.c
@@
-734,8
+734,24
@@
static int open_device(am7xxx_context *ctx,
*/
current_configuration = -1;
*/
current_configuration = -1;
- libusb_get_configuration((*dev)->usb_device, ¤t_configuration);
+ ret = libusb_get_configuration((*dev)->usb_device,
+ ¤t_configuration);
+ if (ret < 0) {
+ debug(ctx, "libusb_get_configuration failed: %s\n",
+ libusb_error_name(ret));
+ goto out_libusb_close;
+ }
+
if (current_configuration != (*dev)->desc->configuration) {
if (current_configuration != (*dev)->desc->configuration) {
+ /*
+ * In principle kernel drivers bound to each interface should
+ * be detached before setting the configuration, but in
+ * practice this is not necessary for most devices.
+ *
+ * For example something like the following function would be
+ * called:
+ * libusb_detach_all_kernel_drivers((*dev)->usb_device);
+ */
ret = libusb_set_configuration((*dev)->usb_device,
(*dev)->desc->configuration);
if (ret < 0) {
ret = libusb_set_configuration((*dev)->usb_device,
(*dev)->desc->configuration);
if (ret < 0) {
@@
-763,16
+779,26
@@
static int open_device(am7xxx_context *ctx,
* http://libusb.sourceforge.net/api-1.0/caveats.html
*/
current_configuration = -1;
* http://libusb.sourceforge.net/api-1.0/caveats.html
*/
current_configuration = -1;
- libusb_get_configuration((*dev)->usb_device, ¤t_configuration);
+ ret = libusb_get_configuration((*dev)->usb_device,
+ ¤t_configuration);
+ if (ret < 0) {
+ debug(ctx, "libusb_get_configuration after claim failed: %s\n",
+ libusb_error_name(ret));
+ goto out_libusb_release_interface;
+ }
+
if (current_configuration != (*dev)->desc->configuration) {
if (current_configuration != (*dev)->desc->configuration) {
- debug(ctx, "libusb configuration changed
\n");
- debug(ctx, "Cannot claim interface %hhu\n",
-
(*dev)->desc->interface_number)
;
- goto out_libusb_
clos
e;
+ debug(ctx, "libusb configuration changed
(expected: %hhu, current: %hhu\n",
+ (*dev)->desc->configuration, current_configuration);
+
ret = -EINVAL
;
+ goto out_libusb_
release_interfac
e;
}
out:
return ret;
}
out:
return ret;
+out_libusb_release_interface:
+ libusb_release_interface((*dev)->usb_device,
+ (*dev)->desc->interface_number);
out_libusb_close:
libusb_close((*dev)->usb_device);
(*dev)->usb_device = NULL;
out_libusb_close:
libusb_close((*dev)->usb_device);
(*dev)->usb_device = NULL;