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
321a193
..
2ba9561
100644
(file)
--- a/
src/am7xxx.c
+++ b/
src/am7xxx.c
@@
-34,7
+34,7
@@
* taken from: http://unixwiz.net/techtips/gnu-c-attributes.html)
*/
#ifndef __GNUC__
* taken from: http://unixwiz.net/techtips/gnu-c-attributes.html)
*/
#ifndef __GNUC__
-# define __attribute__(x) /*
NOTHING
*/
+# define __attribute__(x) /*
NOTHING
*/
#endif
/* Control shared library symbols visibility */
#endif
/* Control shared library symbols visibility */
@@
-385,8
+385,8
@@
static int read_data(am7xxx_device *dev, uint8_t *buffer, unsigned int len)
ret = libusb_bulk_transfer(dev->usb_device, 0x81, buffer, len, &transferred, 0);
if (ret != 0 || (unsigned int)transferred != len) {
ret = libusb_bulk_transfer(dev->usb_device, 0x81, buffer, len, &transferred, 0);
if (ret != 0 || (unsigned int)transferred != len) {
- error(dev->ctx, "
ret: %d\tt
ransferred: %d (expected %u)\n",
-
ret
, transferred, len);
+ error(dev->ctx, "
%s. T
ransferred: %d (expected %u)\n",
+
libusb_error_name(ret)
, transferred, len);
return ret;
}
return ret;
}
@@
-404,8
+404,8
@@
static int send_data(am7xxx_device *dev, uint8_t *buffer, unsigned int len)
ret = libusb_bulk_transfer(dev->usb_device, 0x1, buffer, len, &transferred, 0);
if (ret != 0 || (unsigned int)transferred != len) {
ret = libusb_bulk_transfer(dev->usb_device, 0x1, buffer, len, &transferred, 0);
if (ret != 0 || (unsigned int)transferred != len) {
- error(dev->ctx, "
ret: %d\tt
ransferred: %d (expected %u)\n",
-
ret
, transferred, len);
+ error(dev->ctx, "
%s. T
ransferred: %d (expected %u)\n",
+
libusb_error_name(ret)
, transferred, len);
return ret;
}
return ret;
}
@@
-704,7
+704,7
@@
static am7xxx_device *find_device(am7xxx_context *ctx,
static int open_device(am7xxx_context *ctx,
unsigned int device_index,
static int open_device(am7xxx_context *ctx,
unsigned int device_index,
- libusb_device
*
usb_dev,
+ libusb_device
*
usb_dev,
am7xxx_device **dev)
{
int ret;
am7xxx_device **dev)
{
int ret;
@@
-725,7
+725,7
@@
static int open_device(am7xxx_context *ctx,
ret = libusb_open(usb_dev, &((*dev)->usb_device));
if (ret < 0) {
ret = libusb_open(usb_dev, &((*dev)->usb_device));
if (ret < 0) {
- debug(ctx, "libusb_open failed
\n"
);
+ debug(ctx, "libusb_open failed
: %s\n", libusb_error_name(ret)
);
goto out;
}
goto out;
}
@@
-734,22
+734,42
@@
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) {
- debug(ctx, "libusb_set_configuration failed\n");
+ debug(ctx, "libusb_set_configuration failed: %s\n",
+ libusb_error_name(ret));
debug(ctx, "Cannot set configuration %hhu\n",
(*dev)->desc->configuration);
goto out_libusb_close;
}
}
debug(ctx, "Cannot set configuration %hhu\n",
(*dev)->desc->configuration);
goto out_libusb_close;
}
}
+ libusb_set_auto_detach_kernel_driver((*dev)->usb_device, 1);
+
ret = libusb_claim_interface((*dev)->usb_device,
(*dev)->desc->interface_number);
if (ret < 0) {
ret = libusb_claim_interface((*dev)->usb_device,
(*dev)->desc->interface_number);
if (ret < 0) {
- debug(ctx, "libusb_claim_interface failed\n");
+ debug(ctx, "libusb_claim_interface failed: %s\n",
+ libusb_error_name(ret));
debug(ctx, "Cannot claim interface %hhu\n",
(*dev)->desc->interface_number);
goto out_libusb_close;
debug(ctx, "Cannot claim interface %hhu\n",
(*dev)->desc->interface_number);
goto out_libusb_close;
@@
-759,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;
@@
-802,7
+832,7
@@
static int scan_devices(am7xxx_context *ctx, scan_op op,
unsigned int open_device_index, am7xxx_device **dev)
{
ssize_t num_devices;
unsigned int open_device_index, am7xxx_device **dev)
{
ssize_t num_devices;
- libusb_device
**
list;
+ libusb_device
**
list;
unsigned int current_index;
int i;
int ret;
unsigned int current_index;
int i;
int ret;