OLD | NEW |
1 /* | 1 /* |
2 * Linux usbfs backend for libusb | 2 * Linux usbfs backend for libusbx |
3 * Copyright (C) 2007-2009 Daniel Drake <dsd@gentoo.org> | 3 * Copyright © 2007-2009 Daniel Drake <dsd@gentoo.org> |
4 * Copyright (c) 2001 Johannes Erdfelt <johannes@erdfelt.com> | 4 * Copyright © 2001 Johannes Erdfelt <johannes@erdfelt.com> |
| 5 * Copyright © 2013 Nathan Hjelm <hjelmn@mac.com> |
| 6 * Copyright © 2012-2013 Hans de Goede <hdegoede@redhat.com> |
5 * | 7 * |
6 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
7 * modify it under the terms of the GNU Lesser General Public | 9 * modify it under the terms of the GNU Lesser General Public |
8 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
9 * version 2.1 of the License, or (at your option) any later version. | 11 * version 2.1 of the License, or (at your option) any later version. |
10 * | 12 * |
11 * This library is distributed in the hope that it will be useful, | 13 * This library is distributed in the hope that it will be useful, |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 * Lesser General Public License for more details. | 16 * Lesser General Public License for more details. |
15 * | 17 * |
16 * You should have received a copy of the GNU Lesser General Public | 18 * You should have received a copy of the GNU Lesser General Public |
17 * License along with this library; if not, write to the Free Software | 19 * License along with this library; if not, write to the Free Software |
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
19 */ | 21 */ |
20 | 22 |
21 #include <config.h> | 23 #include "config.h" |
| 24 |
| 25 #include <assert.h> |
22 #include <ctype.h> | 26 #include <ctype.h> |
23 #include <dirent.h> | 27 #include <dirent.h> |
24 #include <errno.h> | 28 #include <errno.h> |
25 #include <fcntl.h> | 29 #include <fcntl.h> |
26 #include <poll.h> | 30 #include <poll.h> |
27 #include <stdio.h> | 31 #include <stdio.h> |
28 #include <stdlib.h> | 32 #include <stdlib.h> |
29 #include <string.h> | 33 #include <string.h> |
30 #include <sys/ioctl.h> | 34 #include <sys/ioctl.h> |
31 #include <sys/stat.h> | 35 #include <sys/stat.h> |
32 #include <sys/types.h> | 36 #include <sys/types.h> |
33 #include <sys/utsname.h> | 37 #include <sys/utsname.h> |
34 #include <unistd.h> | 38 #include <unistd.h> |
35 | 39 |
36 #include "libusb.h" | 40 #include "libusb.h" |
37 #include "libusbi.h" | 41 #include "libusbi.h" |
38 #include "linux_usbfs.h" | 42 #include "linux_usbfs.h" |
39 | 43 |
40 /* sysfs vs usbfs: | 44 /* sysfs vs usbfs: |
41 * opening a usbfs node causes the device to be resumed, so we attempt to | 45 * opening a usbfs node causes the device to be resumed, so we attempt to |
42 * avoid this during enumeration. | 46 * avoid this during enumeration. |
43 * | 47 * |
44 * sysfs allows us to read the kernel's in-memory copies of device descriptors | 48 * sysfs allows us to read the kernel's in-memory copies of device descriptors |
45 * and so forth, avoiding the need to open the device: | 49 * and so forth, avoiding the need to open the device: |
46 * - The binary "descriptors" file was added in 2.6.23. | 50 * - The binary "descriptors" file contains all config descriptors since |
47 * - The "busnum" file was added in 2.6.22 | 51 * 2.6.26, commit 217a9081d8e69026186067711131b77f0ce219ed |
| 52 * - The binary "descriptors" file was added in 2.6.23, commit |
| 53 * 69d42a78f935d19384d1f6e4f94b65bb162b36df, but it only contains the |
| 54 * active config descriptors |
| 55 * - The "busnum" file was added in 2.6.22, commit |
| 56 * 83f7d958eab2fbc6b159ee92bf1493924e1d0f72 |
48 * - The "devnum" file has been present since pre-2.6.18 | 57 * - The "devnum" file has been present since pre-2.6.18 |
49 * - the "bConfigurationValue" file has been present since pre-2.6.18 | 58 * - the "bConfigurationValue" file has been present since pre-2.6.18 |
50 * | 59 * |
51 * If we have bConfigurationValue, busnum, and devnum, then we can determine | 60 * If we have bConfigurationValue, busnum, and devnum, then we can determine |
52 * the active configuration without having to open the usbfs node in RDWR mode. | 61 * the active configuration without having to open the usbfs node in RDWR mode. |
53 * We assume this is the case if we see the busnum file (indicates 2.6.22+). | |
54 * The busnum file is important as that is the only way we can relate sysfs | 62 * The busnum file is important as that is the only way we can relate sysfs |
55 * devices to usbfs nodes. | 63 * devices to usbfs nodes. |
56 * | 64 * |
57 * If we also have descriptors, we can obtain the device descriptor and active | 65 * If we also have all descriptors, we can obtain the device descriptor and |
58 * configuration without touching usbfs at all. | 66 * configuration without touching usbfs at all. |
59 * | |
60 * The descriptors file originally only contained the active configuration | |
61 * descriptor alongside the device descriptor, but all configurations are | |
62 * included as of Linux 2.6.26. | |
63 */ | 67 */ |
64 | 68 |
65 /* endianness for multi-byte fields: | 69 /* endianness for multi-byte fields: |
66 * | 70 * |
67 * Descriptors exposed by usbfs have the multi-byte fields in the device | 71 * Descriptors exposed by usbfs have the multi-byte fields in the device |
68 * descriptor as host endian. Multi-byte fields in the other descriptors are | 72 * descriptor as host endian. Multi-byte fields in the other descriptors are |
69 * bus-endian. The kernel documentation says otherwise, but it is wrong. | 73 * bus-endian. The kernel documentation says otherwise, but it is wrong. |
| 74 * |
| 75 * In sysfs all descriptors are bus-endian. |
70 */ | 76 */ |
71 | 77 |
72 static const char *usbfs_path = NULL; | 78 static const char *usbfs_path = NULL; |
73 | 79 |
74 /* use usbdev*.* device names in /dev instead of the usbfs bus directories */ | 80 /* use usbdev*.* device names in /dev instead of the usbfs bus directories */ |
75 static int usbdev_names = 0; | 81 static int usbdev_names = 0; |
76 | 82 |
77 /* Linux 2.6.32 adds support for a bulk continuation URB flag. this basically | 83 /* Linux 2.6.32 adds support for a bulk continuation URB flag. this basically |
78 * allows us to mark URBs as being part of a specific logical transfer when | 84 * allows us to mark URBs as being part of a specific logical transfer when |
79 * we submit them to the kernel. then, on any error except a cancellation, all | 85 * we submit them to the kernel. then, on any error except a cancellation, all |
(...skipping 14 matching lines...) Expand all Loading... |
94 /* Linux 2.6.31 fixes support for the zero length packet URB flag. This | 100 /* Linux 2.6.31 fixes support for the zero length packet URB flag. This |
95 * allows us to mark URBs that should be followed by a zero length data | 101 * allows us to mark URBs that should be followed by a zero length data |
96 * packet, which can be required by device- or class-specific protocols. | 102 * packet, which can be required by device- or class-specific protocols. |
97 */ | 103 */ |
98 static int supports_flag_zero_packet = -1; | 104 static int supports_flag_zero_packet = -1; |
99 | 105 |
100 /* clock ID for monotonic clock, as not all clock sources are available on all | 106 /* clock ID for monotonic clock, as not all clock sources are available on all |
101 * systems. appropriate choice made at initialization time. */ | 107 * systems. appropriate choice made at initialization time. */ |
102 static clockid_t monotonic_clkid = -1; | 108 static clockid_t monotonic_clkid = -1; |
103 | 109 |
104 /* do we have a busnum to relate devices? this also implies that we can read | 110 /* Linux 2.6.22 (commit 83f7d958eab2fbc6b159ee92bf1493924e1d0f72) adds a busnum |
| 111 * to sysfs, so we can relate devices. This also implies that we can read |
105 * the active configuration through bConfigurationValue */ | 112 * the active configuration through bConfigurationValue */ |
106 static int sysfs_can_relate_devices = 0; | 113 static int sysfs_can_relate_devices = -1; |
107 | 114 |
108 /* do we have a descriptors file? */ | 115 /* Linux 2.6.26 (commit 217a9081d8e69026186067711131b77f0ce219ed) adds all |
109 static int sysfs_has_descriptors = 0; | 116 * config descriptors (rather then just the active config) to the sysfs |
| 117 * descriptors file, so from then on we can use them. */ |
| 118 static int sysfs_has_descriptors = -1; |
| 119 |
| 120 /* how many times have we initted (and not exited) ? */ |
| 121 static volatile int init_count = 0; |
| 122 |
| 123 /* Serialize hotplug start/stop, scan-devices, event-thread, and poll */ |
| 124 usbi_mutex_static_t linux_hotplug_lock = USBI_MUTEX_INITIALIZER; |
| 125 |
| 126 static int linux_start_event_monitor(void); |
| 127 static int linux_stop_event_monitor(void); |
| 128 static int linux_scan_devices(struct libusb_context *ctx); |
| 129 static int sysfs_scan_device(struct libusb_context *ctx, const char *devname); |
| 130 static int detach_kernel_driver_and_claim(struct libusb_device_handle *, int); |
| 131 |
| 132 #if !defined(USE_UDEV) |
| 133 static int linux_default_scan_devices (struct libusb_context *ctx); |
| 134 #endif |
110 | 135 |
111 struct linux_device_priv { | 136 struct linux_device_priv { |
112 char *sysfs_dir; | 137 char *sysfs_dir; |
113 » unsigned char *dev_descriptor; | 138 » unsigned char *descriptors; |
114 » unsigned char *config_descriptor; | 139 » int descriptors_len; |
| 140 » int active_config; /* cache val for !sysfs_can_relate_devices */ |
115 }; | 141 }; |
116 | 142 |
117 struct linux_device_handle_priv { | 143 struct linux_device_handle_priv { |
118 int fd; | 144 int fd; |
| 145 uint32_t caps; |
119 }; | 146 }; |
120 | 147 |
121 enum reap_action { | 148 enum reap_action { |
122 NORMAL = 0, | 149 NORMAL = 0, |
123 /* submission failed after the first URB, so await cancellation/completi
on | 150 /* submission failed after the first URB, so await cancellation/completi
on |
124 * of all the others */ | 151 * of all the others */ |
125 SUBMIT_FAILED, | 152 SUBMIT_FAILED, |
126 | 153 |
127 /* cancelled by user or timeout */ | 154 /* cancelled by user or timeout */ |
128 CANCELLED, | 155 CANCELLED, |
129 | 156 |
130 /* completed multi-URB transfer in non-final URB */ | 157 /* completed multi-URB transfer in non-final URB */ |
131 COMPLETED_EARLY, | 158 COMPLETED_EARLY, |
132 | 159 |
133 /* one or more urbs encountered a low-level error */ | 160 /* one or more urbs encountered a low-level error */ |
134 ERROR, | 161 ERROR, |
135 }; | 162 }; |
136 | 163 |
137 struct linux_transfer_priv { | 164 struct linux_transfer_priv { |
138 union { | 165 union { |
139 struct usbfs_urb *urbs; | 166 struct usbfs_urb *urbs; |
140 struct usbfs_urb **iso_urbs; | 167 struct usbfs_urb **iso_urbs; |
141 }; | 168 }; |
142 | 169 |
143 enum reap_action reap_action; | 170 enum reap_action reap_action; |
144 int num_urbs; | 171 int num_urbs; |
145 » unsigned int num_retired; | 172 » int num_retired; |
146 enum libusb_transfer_status reap_status; | 173 enum libusb_transfer_status reap_status; |
147 | 174 |
148 /* next iso packet in user-supplied transfer to be populated */ | 175 /* next iso packet in user-supplied transfer to be populated */ |
149 int iso_packet_offset; | 176 int iso_packet_offset; |
150 }; | 177 }; |
151 | 178 |
152 static void _get_usbfs_path(struct libusb_device *dev, char *path) | 179 static int _get_usbfs_fd(struct libusb_device *dev, mode_t mode, int silent) |
153 { | 180 { |
| 181 struct libusb_context *ctx = DEVICE_CTX(dev); |
| 182 char path[PATH_MAX]; |
| 183 int fd; |
| 184 |
154 if (usbdev_names) | 185 if (usbdev_names) |
155 snprintf(path, PATH_MAX, "%s/usbdev%d.%d", | 186 snprintf(path, PATH_MAX, "%s/usbdev%d.%d", |
156 usbfs_path, dev->bus_number, dev->device_address); | 187 usbfs_path, dev->bus_number, dev->device_address); |
157 else | 188 else |
158 snprintf(path, PATH_MAX, "%s/%03d/%03d", | 189 snprintf(path, PATH_MAX, "%s/%03d/%03d", |
159 usbfs_path, dev->bus_number, dev->device_address); | 190 usbfs_path, dev->bus_number, dev->device_address); |
| 191 |
| 192 fd = open(path, mode); |
| 193 if (fd != -1) |
| 194 return fd; /* Success */ |
| 195 |
| 196 if (!silent) { |
| 197 usbi_err(ctx, "libusbx couldn't open USB device %s: %s", |
| 198 path, strerror(errno)); |
| 199 if (errno == EACCES && mode == O_RDWR) |
| 200 usbi_err(ctx, "libusbx requires write access to USB " |
| 201 "device nodes."); |
| 202 } |
| 203 |
| 204 if (errno == EACCES) |
| 205 return LIBUSB_ERROR_ACCESS; |
| 206 if (errno == ENOENT) |
| 207 return LIBUSB_ERROR_NO_DEVICE; |
| 208 return LIBUSB_ERROR_IO; |
160 } | 209 } |
161 | 210 |
162 static struct linux_device_priv *_device_priv(struct libusb_device *dev) | 211 static struct linux_device_priv *_device_priv(struct libusb_device *dev) |
163 { | 212 { |
164 return (struct linux_device_priv *) dev->os_priv; | 213 return (struct linux_device_priv *) dev->os_priv; |
165 } | 214 } |
166 | 215 |
167 static struct linux_device_handle_priv *_device_handle_priv( | 216 static struct linux_device_handle_priv *_device_handle_priv( |
168 struct libusb_device_handle *handle) | 217 struct libusb_device_handle *handle) |
169 { | 218 { |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 if (kminor < minor) | 341 if (kminor < minor) |
293 return 0; | 342 return 0; |
294 | 343 |
295 /* kminor == minor */ | 344 /* kminor == minor */ |
296 if (atoms < 3) | 345 if (atoms < 3) |
297 return 0 == sublevel; | 346 return 0 == sublevel; |
298 | 347 |
299 return ksublevel >= sublevel; | 348 return ksublevel >= sublevel; |
300 } | 349 } |
301 | 350 |
302 /* Return 1 if filename exists inside dirname in sysfs. | |
303 SYSFS_DEVICE_PATH is assumed to be the beginning of the path. */ | |
304 static int sysfs_has_file(const char *dirname, const char *filename) | |
305 { | |
306 struct stat statbuf; | |
307 char path[PATH_MAX]; | |
308 int r; | |
309 | |
310 snprintf(path, PATH_MAX, "%s/%s/%s", SYSFS_DEVICE_PATH, dirname, filenam
e); | |
311 r = stat(path, &statbuf); | |
312 if (r == 0 && S_ISREG(statbuf.st_mode)) | |
313 return 1; | |
314 | |
315 return 0; | |
316 } | |
317 | |
318 static int op_init(struct libusb_context *ctx) | 351 static int op_init(struct libusb_context *ctx) |
319 { | 352 { |
320 struct stat statbuf; | 353 struct stat statbuf; |
321 int r; | 354 int r; |
322 | 355 |
323 usbfs_path = find_usbfs_path(); | 356 usbfs_path = find_usbfs_path(); |
324 if (!usbfs_path) { | 357 if (!usbfs_path) { |
325 usbi_err(ctx, "could not find usbfs"); | 358 usbi_err(ctx, "could not find usbfs"); |
326 return LIBUSB_ERROR_OTHER; | 359 return LIBUSB_ERROR_OTHER; |
327 } | 360 } |
(...skipping 18 matching lines...) Expand all Loading... |
346 supports_flag_zero_packet = kernel_version_ge(2,6,31); | 379 supports_flag_zero_packet = kernel_version_ge(2,6,31); |
347 if (-1 == supports_flag_zero_packet) { | 380 if (-1 == supports_flag_zero_packet) { |
348 usbi_err(ctx, "error checking for zero length packet sup
port"); | 381 usbi_err(ctx, "error checking for zero length packet sup
port"); |
349 return LIBUSB_ERROR_OTHER; | 382 return LIBUSB_ERROR_OTHER; |
350 } | 383 } |
351 } | 384 } |
352 | 385 |
353 if (supports_flag_zero_packet) | 386 if (supports_flag_zero_packet) |
354 usbi_dbg("zero length packet flag supported"); | 387 usbi_dbg("zero length packet flag supported"); |
355 | 388 |
356 » r = stat(SYSFS_DEVICE_PATH, &statbuf); | 389 » if (-1 == sysfs_has_descriptors) { |
357 » if (r == 0 && S_ISDIR(statbuf.st_mode)) { | 390 » » /* sysfs descriptors has all descriptors since Linux 2.6.26 */ |
358 » » DIR *devices = opendir(SYSFS_DEVICE_PATH); | 391 » » sysfs_has_descriptors = kernel_version_ge(2,6,26); |
359 » » struct dirent *entry; | 392 » » if (-1 == sysfs_has_descriptors) { |
360 | 393 » » » usbi_err(ctx, "error checking for sysfs descriptors"); |
361 » » usbi_dbg("found usb devices in sysfs"); | 394 » » » return LIBUSB_ERROR_OTHER; |
362 | |
363 » » if (!devices) { | |
364 » » » usbi_err(ctx, "opendir devices failed errno=%d", errno); | |
365 » » » return LIBUSB_ERROR_IO; | |
366 } | 395 } |
367 | |
368 /* Make sure sysfs supports all the required files. If it | |
369 * does not, then usbfs will be used instead. Determine | |
370 * this by looping through the directories in | |
371 * SYSFS_DEVICE_PATH. With the assumption that there will | |
372 * always be subdirectories of the name usbN (usb1, usb2, | |
373 * etc) representing the root hubs, check the usbN | |
374 * subdirectories to see if they have all the needed files. | |
375 * This algorithm uses the usbN subdirectories (root hubs) | |
376 * because a device disconnection will cause a race | |
377 * condition regarding which files are available, sometimes | |
378 * causing an incorrect result. The root hubs are used | |
379 * because it is assumed that they will always be present. | |
380 * See the "sysfs vs usbfs" comment at the top of this file | |
381 * for more details. */ | |
382 while ((entry = readdir(devices))) { | |
383 int has_busnum=0, has_devnum=0, has_descriptors=0; | |
384 int has_configuration_value=0; | |
385 | |
386 /* Only check the usbN directories. */ | |
387 if (strncmp(entry->d_name, "usb", 3) != 0) | |
388 continue; | |
389 | |
390 /* Check for the files libusb needs from sysfs. */ | |
391 has_busnum = sysfs_has_file(entry->d_name, "busnum"); | |
392 has_devnum = sysfs_has_file(entry->d_name, "devnum"); | |
393 has_descriptors = sysfs_has_file(entry->d_name, "descrip
tors"); | |
394 has_configuration_value = sysfs_has_file(entry->d_name,
"bConfigurationValue"); | |
395 | |
396 if (has_busnum && has_devnum && has_configuration_value) | |
397 sysfs_can_relate_devices = 1; | |
398 if (has_descriptors) | |
399 sysfs_has_descriptors = 1; | |
400 | |
401 /* Only need to check until we've found ONE device which | |
402 has all the attributes. */ | |
403 if (sysfs_has_descriptors && sysfs_can_relate_devices) | |
404 break; | |
405 } | |
406 closedir(devices); | |
407 | |
408 /* Only use sysfs descriptors if the rest of | |
409 sysfs will work for libusb. */ | |
410 if (!sysfs_can_relate_devices) | |
411 sysfs_has_descriptors = 0; | |
412 } else { | |
413 usbi_dbg("sysfs usb info not available"); | |
414 sysfs_has_descriptors = 0; | |
415 sysfs_can_relate_devices = 0; | |
416 } | 396 } |
417 | 397 |
418 » return 0; | 398 » if (-1 == sysfs_can_relate_devices) { |
| 399 » » /* sysfs has busnum since Linux 2.6.22 */ |
| 400 » » sysfs_can_relate_devices = kernel_version_ge(2,6,22); |
| 401 » » if (-1 == sysfs_can_relate_devices) { |
| 402 » » » usbi_err(ctx, "error checking for sysfs busnum"); |
| 403 » » » return LIBUSB_ERROR_OTHER; |
| 404 » » } |
| 405 » } |
| 406 |
| 407 » if (sysfs_can_relate_devices || sysfs_has_descriptors) { |
| 408 » » r = stat(SYSFS_DEVICE_PATH, &statbuf); |
| 409 » » if (r != 0 || !S_ISDIR(statbuf.st_mode)) { |
| 410 » » » usbi_warn(ctx, "sysfs not mounted"); |
| 411 » » » sysfs_can_relate_devices = 0; |
| 412 » » » sysfs_has_descriptors = 0; |
| 413 » » } |
| 414 » } |
| 415 |
| 416 » if (sysfs_can_relate_devices) |
| 417 » » usbi_dbg("sysfs can relate devices"); |
| 418 |
| 419 » if (sysfs_has_descriptors) |
| 420 » » usbi_dbg("sysfs has complete descriptors"); |
| 421 |
| 422 » usbi_mutex_static_lock(&linux_hotplug_lock); |
| 423 » r = LIBUSB_SUCCESS; |
| 424 » if (init_count == 0) { |
| 425 » » /* start up hotplug event handler */ |
| 426 » » r = linux_start_event_monitor(); |
| 427 » } |
| 428 » if (r == LIBUSB_SUCCESS) { |
| 429 » » r = linux_scan_devices(ctx); |
| 430 » » if (r == LIBUSB_SUCCESS) |
| 431 » » » init_count++; |
| 432 » » else if (init_count == 0) |
| 433 » » » linux_stop_event_monitor(); |
| 434 » } else |
| 435 » » usbi_err(ctx, "error starting hotplug event monitor"); |
| 436 » usbi_mutex_static_unlock(&linux_hotplug_lock); |
| 437 |
| 438 » return r; |
419 } | 439 } |
420 | 440 |
421 static int usbfs_get_device_descriptor(struct libusb_device *dev, | 441 static void op_exit(void) |
422 » unsigned char *buffer) | |
423 { | 442 { |
424 » struct linux_device_priv *priv = _device_priv(dev); | 443 » usbi_mutex_static_lock(&linux_hotplug_lock); |
| 444 » assert(init_count != 0); |
| 445 » if (!--init_count) { |
| 446 » » /* tear down event handler */ |
| 447 » » (void)linux_stop_event_monitor(); |
| 448 » } |
| 449 » usbi_mutex_static_unlock(&linux_hotplug_lock); |
| 450 } |
425 | 451 |
426 » /* return cached copy */ | 452 static int linux_start_event_monitor(void) |
427 » memcpy(buffer, priv->dev_descriptor, DEVICE_DESC_LENGTH); | 453 { |
428 » return 0; | 454 #if defined(USE_UDEV) |
| 455 » return linux_udev_start_event_monitor(); |
| 456 #else |
| 457 » return linux_netlink_start_event_monitor(); |
| 458 #endif |
| 459 } |
| 460 |
| 461 static int linux_stop_event_monitor(void) |
| 462 { |
| 463 #if defined(USE_UDEV) |
| 464 » return linux_udev_stop_event_monitor(); |
| 465 #else |
| 466 » return linux_netlink_stop_event_monitor(); |
| 467 #endif |
| 468 } |
| 469 |
| 470 static int linux_scan_devices(struct libusb_context *ctx) |
| 471 { |
| 472 #if defined(USE_UDEV) |
| 473 » return linux_udev_scan_devices(ctx); |
| 474 #else |
| 475 » return linux_default_scan_devices(ctx); |
| 476 #endif |
| 477 } |
| 478 |
| 479 static void op_hotplug_poll(void) |
| 480 { |
| 481 #if defined(USE_UDEV) |
| 482 » linux_udev_hotplug_poll(); |
| 483 #else |
| 484 » linux_netlink_hotplug_poll(); |
| 485 #endif |
429 } | 486 } |
430 | 487 |
431 static int _open_sysfs_attr(struct libusb_device *dev, const char *attr) | 488 static int _open_sysfs_attr(struct libusb_device *dev, const char *attr) |
432 { | 489 { |
433 struct linux_device_priv *priv = _device_priv(dev); | 490 struct linux_device_priv *priv = _device_priv(dev); |
434 char filename[PATH_MAX]; | 491 char filename[PATH_MAX]; |
435 int fd; | 492 int fd; |
436 | 493 |
437 snprintf(filename, PATH_MAX, "%s/%s/%s", | 494 snprintf(filename, PATH_MAX, "%s/%s/%s", |
438 SYSFS_DEVICE_PATH, priv->sysfs_dir, attr); | 495 SYSFS_DEVICE_PATH, priv->sysfs_dir, attr); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
474 return LIBUSB_ERROR_NO_DEVICE; /* For unplug race (trac #70) */ | 531 return LIBUSB_ERROR_NO_DEVICE; /* For unplug race (trac #70) */ |
475 } | 532 } |
476 if (value < 0) { | 533 if (value < 0) { |
477 usbi_err(ctx, "%s contains a negative value", filename); | 534 usbi_err(ctx, "%s contains a negative value", filename); |
478 return LIBUSB_ERROR_IO; | 535 return LIBUSB_ERROR_IO; |
479 } | 536 } |
480 | 537 |
481 return value; | 538 return value; |
482 } | 539 } |
483 | 540 |
484 static int sysfs_get_device_descriptor(struct libusb_device *dev, | |
485 unsigned char *buffer) | |
486 { | |
487 int fd; | |
488 ssize_t r; | |
489 | |
490 /* sysfs provides access to an in-memory copy of the device descriptor, | |
491 * so we use that rather than keeping our own copy */ | |
492 | |
493 fd = _open_sysfs_attr(dev, "descriptors"); | |
494 if (fd < 0) | |
495 return fd; | |
496 | |
497 r = read(fd, buffer, DEVICE_DESC_LENGTH);; | |
498 close(fd); | |
499 if (r < 0) { | |
500 usbi_err(DEVICE_CTX(dev), "read failed, ret=%d errno=%d", fd, er
rno); | |
501 return LIBUSB_ERROR_IO; | |
502 } else if (r < DEVICE_DESC_LENGTH) { | |
503 usbi_err(DEVICE_CTX(dev), "short read %d/%d", r, DEVICE_DESC_LEN
GTH); | |
504 return LIBUSB_ERROR_IO; | |
505 } | |
506 | |
507 return 0; | |
508 } | |
509 | |
510 static int op_get_device_descriptor(struct libusb_device *dev, | 541 static int op_get_device_descriptor(struct libusb_device *dev, |
511 unsigned char *buffer, int *host_endian) | 542 unsigned char *buffer, int *host_endian) |
512 { | 543 { |
513 » if (sysfs_has_descriptors) { | 544 » struct linux_device_priv *priv = _device_priv(dev); |
514 » » return sysfs_get_device_descriptor(dev, buffer); | |
515 » } else { | |
516 » » *host_endian = 1; | |
517 » » return usbfs_get_device_descriptor(dev, buffer); | |
518 » } | |
519 } | |
520 | 545 |
521 static int usbfs_get_active_config_descriptor(struct libusb_device *dev, | 546 » *host_endian = sysfs_has_descriptors ? 0 : 1; |
522 » unsigned char *buffer, size_t len) | 547 » memcpy(buffer, priv->descriptors, DEVICE_DESC_LENGTH); |
523 { | |
524 » struct linux_device_priv *priv = _device_priv(dev); | |
525 » if (!priv->config_descriptor) | |
526 » » return LIBUSB_ERROR_NOT_FOUND; /* device is unconfigured */ | |
527 | 548 |
528 /* retrieve cached copy */ | |
529 memcpy(buffer, priv->config_descriptor, len); | |
530 return 0; | 549 return 0; |
531 } | 550 } |
532 | 551 |
533 /* read the bConfigurationValue for a device */ | 552 /* read the bConfigurationValue for a device */ |
534 static int sysfs_get_active_config(struct libusb_device *dev, int *config) | 553 static int sysfs_get_active_config(struct libusb_device *dev, int *config) |
535 { | 554 { |
536 char *endptr; | 555 char *endptr; |
537 char tmp[4] = {0, 0, 0, 0}; | 556 char tmp[4] = {0, 0, 0, 0}; |
538 long num; | 557 long num; |
539 int fd; | 558 int fd; |
(...skipping 26 matching lines...) Expand all Loading... |
566 num = strtol(tmp, &endptr, 10); | 585 num = strtol(tmp, &endptr, 10); |
567 if (endptr == tmp) { | 586 if (endptr == tmp) { |
568 usbi_err(DEVICE_CTX(dev), "error converting '%s' to integer", tm
p); | 587 usbi_err(DEVICE_CTX(dev), "error converting '%s' to integer", tm
p); |
569 return LIBUSB_ERROR_IO; | 588 return LIBUSB_ERROR_IO; |
570 } | 589 } |
571 | 590 |
572 *config = (int) num; | 591 *config = (int) num; |
573 return 0; | 592 return 0; |
574 } | 593 } |
575 | 594 |
576 /* takes a usbfs/descriptors fd seeked to the start of a configuration, and | 595 int linux_get_device_address (struct libusb_context *ctx, int detached, |
577 * seeks to the next one. */ | 596 » uint8_t *busnum, uint8_t *devaddr,const char *dev_node, |
578 static int seek_to_next_config(struct libusb_context *ctx, int fd, | 597 » const char *sys_name) |
579 » int host_endian) | 598 { |
| 599 » usbi_dbg("getting address for device: %s detached: %d", sys_name, detach
ed); |
| 600 » /* can't use sysfs to read the bus and device number if the |
| 601 » * device has been detached */ |
| 602 » if (!sysfs_can_relate_devices || detached || NULL == sys_name) { |
| 603 » » if (NULL == dev_node) { |
| 604 » » » return LIBUSB_ERROR_OTHER; |
| 605 » » } |
| 606 |
| 607 » » /* will this work with all supported kernel versions? */ |
| 608 » » if (!strncmp(dev_node, "/dev/bus/usb", 12)) { |
| 609 » » » sscanf (dev_node, "/dev/bus/usb/%hhd/%hhd", busnum, deva
ddr); |
| 610 » » } else if (!strncmp(dev_node, "/proc/bus/usb", 13)) { |
| 611 » » » sscanf (dev_node, "/proc/bus/usb/%hhd/%hhd", busnum, dev
addr); |
| 612 » » } |
| 613 |
| 614 » » return LIBUSB_SUCCESS; |
| 615 » } |
| 616 |
| 617 » usbi_dbg("scan %s", sys_name); |
| 618 |
| 619 » *busnum = __read_sysfs_attr(ctx, sys_name, "busnum"); |
| 620 » if (0 > *busnum) |
| 621 » » return *busnum; |
| 622 |
| 623 » *devaddr = __read_sysfs_attr(ctx, sys_name, "devnum"); |
| 624 » if (0 > *devaddr) |
| 625 » » return *devaddr; |
| 626 |
| 627 » usbi_dbg("bus=%d dev=%d", *busnum, *devaddr); |
| 628 » if (*busnum > 255 || *devaddr > 255) |
| 629 » » return LIBUSB_ERROR_INVALID_PARAM; |
| 630 |
| 631 » return LIBUSB_SUCCESS; |
| 632 } |
| 633 |
| 634 /* Return offset of the next descriptor with the given type */ |
| 635 static int seek_to_next_descriptor(struct libusb_context *ctx, |
| 636 » uint8_t descriptor_type, unsigned char *buffer, int size) |
| 637 { |
| 638 » struct usb_descriptor_header header; |
| 639 » int i; |
| 640 |
| 641 » for (i = 0; size >= 0; i += header.bLength, size -= header.bLength) { |
| 642 » » if (size == 0) |
| 643 » » » return LIBUSB_ERROR_NOT_FOUND; |
| 644 |
| 645 » » if (size < 2) { |
| 646 » » » usbi_err(ctx, "short descriptor read %d/2", size); |
| 647 » » » return LIBUSB_ERROR_IO; |
| 648 » » } |
| 649 » » usbi_parse_descriptor(buffer + i, "bb", &header, 0); |
| 650 |
| 651 » » if (i && header.bDescriptorType == descriptor_type) |
| 652 » » » return i; |
| 653 » } |
| 654 » usbi_err(ctx, "bLength overflow by %d bytes", -size); |
| 655 » return LIBUSB_ERROR_IO; |
| 656 } |
| 657 |
| 658 /* Return offset to next config */ |
| 659 static int seek_to_next_config(struct libusb_context *ctx, |
| 660 » unsigned char *buffer, int size) |
580 { | 661 { |
581 struct libusb_config_descriptor config; | 662 struct libusb_config_descriptor config; |
582 » unsigned char tmp[6]; | 663 |
583 » off_t off; | 664 » if (size == 0) |
584 » ssize_t r; | 665 » » return LIBUSB_ERROR_NOT_FOUND; |
585 | 666 |
586 » /* read first 6 bytes of descriptor */ | 667 » if (size < LIBUSB_DT_CONFIG_SIZE) { |
587 » r = read(fd, tmp, sizeof(tmp)); | 668 » » usbi_err(ctx, "short descriptor read %d/%d", |
588 » if (r < 0) { | 669 » » » size, LIBUSB_DT_CONFIG_SIZE); |
589 » » usbi_err(ctx, "read failed ret=%d errno=%d", r, errno); | |
590 return LIBUSB_ERROR_IO; | 670 return LIBUSB_ERROR_IO; |
591 » } else if (r < sizeof(tmp)) { | 671 » } |
592 » » usbi_err(ctx, "short descriptor read %d/%d", r, sizeof(tmp)); | 672 |
| 673 » usbi_parse_descriptor(buffer, "bbwbbbbb", &config, 0); |
| 674 » if (config.bDescriptorType != LIBUSB_DT_CONFIG) { |
| 675 » » usbi_err(ctx, "descriptor is not a config desc (type 0x%02x)", |
| 676 » » » config.bDescriptorType); |
593 return LIBUSB_ERROR_IO; | 677 return LIBUSB_ERROR_IO; |
594 } | 678 } |
595 | 679 |
596 » /* seek forward to end of config */ | 680 » /* |
597 » usbi_parse_descriptor(tmp, "bbwbb", &config, host_endian); | 681 » * In usbfs the config descriptors are config.wTotalLength bytes apart, |
598 » off = lseek(fd, config.wTotalLength - sizeof(tmp), SEEK_CUR); | 682 » * with any short reads from the device appearing as holes in the file. |
599 » if (off < 0) { | 683 » * |
600 » » usbi_err(ctx, "seek failed ret=%d errno=%d", off, errno); | 684 » * In sysfs wTotalLength is ignored, instead the kernel returns a |
601 » » return LIBUSB_ERROR_IO; | 685 » * config descriptor with verified bLength fields, with descriptors |
602 » } | 686 » * with an invalid bLength removed. |
603 | 687 » */ |
604 » return 0; | 688 » if (sysfs_has_descriptors) { |
605 } | 689 » » int next = seek_to_next_descriptor(ctx, LIBUSB_DT_CONFIG, |
606 | 690 » » » » » » buffer, size); |
607 static int sysfs_get_active_config_descriptor(struct libusb_device *dev, | 691 » » if (next == LIBUSB_ERROR_NOT_FOUND) |
608 » unsigned char *buffer, size_t len) | 692 » » » next = size; |
609 { | 693 » » if (next < 0) |
610 » int fd; | 694 » » » return next; |
611 » ssize_t r; | 695 |
612 » off_t off; | 696 » » if (next != config.wTotalLength) |
613 » int to_copy; | 697 » » » usbi_warn(ctx, "config length mismatch wTotalLength " |
614 » int config; | 698 » » » » "%d real %d", config.wTotalLength, next); |
615 » unsigned char tmp[6]; | 699 » » return next; |
616 | 700 » } else { |
617 » r = sysfs_get_active_config(dev, &config); | 701 » » if (config.wTotalLength < LIBUSB_DT_CONFIG_SIZE) { |
| 702 » » » usbi_err(ctx, "invalid wTotalLength %d", |
| 703 » » » » config.wTotalLength); |
| 704 » » » return LIBUSB_ERROR_IO; |
| 705 » » } else if (config.wTotalLength > size) { |
| 706 » » » usbi_warn(ctx, "short descriptor read %d/%d", |
| 707 » » » » size, config.wTotalLength); |
| 708 » » » return size; |
| 709 » » } else |
| 710 » » » return config.wTotalLength; |
| 711 » } |
| 712 } |
| 713 |
| 714 static int op_get_config_descriptor_by_value(struct libusb_device *dev, |
| 715 » uint8_t value, unsigned char **buffer, int *host_endian) |
| 716 { |
| 717 » struct libusb_context *ctx = DEVICE_CTX(dev); |
| 718 » struct linux_device_priv *priv = _device_priv(dev); |
| 719 » unsigned char *descriptors = priv->descriptors; |
| 720 » int size = priv->descriptors_len; |
| 721 » struct libusb_config_descriptor *config; |
| 722 |
| 723 » *buffer = NULL; |
| 724 » /* Unlike the device desc. config descs. are always in raw format */ |
| 725 » *host_endian = 0; |
| 726 |
| 727 » /* Skip device header */ |
| 728 » descriptors += DEVICE_DESC_LENGTH; |
| 729 » size -= DEVICE_DESC_LENGTH; |
| 730 |
| 731 » /* Seek till the config is found, or till "EOF" */ |
| 732 » while (1) { |
| 733 » » int next = seek_to_next_config(ctx, descriptors, size); |
| 734 » » if (next < 0) |
| 735 » » » return next; |
| 736 » » config = (struct libusb_config_descriptor *)descriptors; |
| 737 » » if (config->bConfigurationValue == value) { |
| 738 » » » *buffer = descriptors; |
| 739 » » » return next; |
| 740 » » } |
| 741 » » size -= next; |
| 742 » » descriptors += next; |
| 743 » } |
| 744 } |
| 745 |
| 746 static int op_get_active_config_descriptor(struct libusb_device *dev, |
| 747 » unsigned char *buffer, size_t len, int *host_endian) |
| 748 { |
| 749 » int r, config; |
| 750 » unsigned char *config_desc; |
| 751 |
| 752 » if (sysfs_can_relate_devices) { |
| 753 » » r = sysfs_get_active_config(dev, &config); |
| 754 » » if (r < 0) |
| 755 » » » return r; |
| 756 » } else { |
| 757 » » /* Use cached bConfigurationValue */ |
| 758 » » struct linux_device_priv *priv = _device_priv(dev); |
| 759 » » config = priv->active_config; |
| 760 » } |
| 761 » if (config == -1) |
| 762 » » return LIBUSB_ERROR_NOT_FOUND; |
| 763 |
| 764 » r = op_get_config_descriptor_by_value(dev, config, &config_desc, |
| 765 » » » » » host_endian); |
618 if (r < 0) | 766 if (r < 0) |
619 return r; | 767 return r; |
620 » if (config == -1) | 768 |
621 » » return LIBUSB_ERROR_NOT_FOUND; | 769 » len = MIN(len, r); |
622 | 770 » memcpy(buffer, config_desc, len); |
623 » usbi_dbg("active configuration %d", config); | 771 » return len; |
624 | 772 } |
625 » /* sysfs provides access to an in-memory copy of the device descriptor, | 773 |
626 » * so we use that rather than keeping our own copy */ | 774 static int op_get_config_descriptor(struct libusb_device *dev, |
627 | 775 » uint8_t config_index, unsigned char *buffer, size_t len, int *host_endia
n) |
628 » fd = _open_sysfs_attr(dev, "descriptors"); | 776 { |
629 » if (fd < 0) | 777 » struct linux_device_priv *priv = _device_priv(dev); |
630 » » return fd; | 778 » unsigned char *descriptors = priv->descriptors; |
631 | 779 » int i, r, size = priv->descriptors_len; |
632 » /* device might have been unconfigured since we read bConfigurationValue
, | 780 |
633 » * so first check that there is any config descriptor data at all... */ | 781 » /* Unlike the device desc. config descs. are always in raw format */ |
634 » off = lseek(fd, 0, SEEK_END); | 782 » *host_endian = 0; |
635 » if (off < 1) { | 783 |
636 » » usbi_err(DEVICE_CTX(dev), "end seek failed, ret=%d errno=%d", | 784 » /* Skip device header */ |
637 » » » off, errno); | 785 » descriptors += DEVICE_DESC_LENGTH; |
638 » » close(fd); | 786 » size -= DEVICE_DESC_LENGTH; |
639 » » return LIBUSB_ERROR_IO; | 787 |
640 » } else if (off == DEVICE_DESC_LENGTH) { | 788 » /* Seek till the config is found, or till "EOF" */ |
641 » » close(fd); | 789 » for (i = 0; ; i++) { |
642 » » return LIBUSB_ERROR_NOT_FOUND; | 790 » » r = seek_to_next_config(DEVICE_CTX(dev), descriptors, size); |
643 » } | |
644 | |
645 » off = lseek(fd, DEVICE_DESC_LENGTH, SEEK_SET); | |
646 » if (off < 0) { | |
647 » » usbi_err(DEVICE_CTX(dev), "seek failed, ret=%d errno=%d", off, e
rrno); | |
648 » » close(fd); | |
649 » » return LIBUSB_ERROR_IO; | |
650 » } | |
651 | |
652 » /* unbounded loop: we expect the descriptor to be present under all | |
653 » * circumstances */ | |
654 » while (1) { | |
655 » » r = read(fd, tmp, sizeof(tmp)); | |
656 » » if (r < 0) { | |
657 » » » usbi_err(DEVICE_CTX(dev), "read failed, ret=%d errno=%d"
, | |
658 » » » » fd, errno); | |
659 » » » return LIBUSB_ERROR_IO; | |
660 » » } else if (r < sizeof(tmp)) { | |
661 » » » usbi_err(DEVICE_CTX(dev), "short read %d/%d", r, sizeof(
tmp)); | |
662 » » » return LIBUSB_ERROR_IO; | |
663 » » } | |
664 | |
665 » » /* check bConfigurationValue */ | |
666 » » if (tmp[5] == config) | |
667 » » » break; | |
668 | |
669 » » /* try the next descriptor */ | |
670 » » off = lseek(fd, 0 - sizeof(tmp), SEEK_CUR); | |
671 » » if (off < 0) | |
672 » » » return LIBUSB_ERROR_IO; | |
673 | |
674 » » r = seek_to_next_config(DEVICE_CTX(dev), fd, 0); | |
675 if (r < 0) | 791 if (r < 0) |
676 return r; | 792 return r; |
677 » } | 793 » » if (i == config_index) |
678 | 794 » » » break; |
679 » to_copy = (len < sizeof(tmp)) ? len : sizeof(tmp); | 795 » » size -= r; |
680 » memcpy(buffer, tmp, to_copy); | 796 » » descriptors += r; |
681 » if (len > sizeof(tmp)) { | 797 » } |
682 » » r = read(fd, buffer + sizeof(tmp), len - sizeof(tmp)); | 798 |
683 » » if (r < 0) { | 799 » len = MIN(len, r); |
684 » » » usbi_err(DEVICE_CTX(dev), "read failed, ret=%d errno=%d"
, | 800 » memcpy(buffer, descriptors, len); |
685 » » » » fd, errno); | 801 » return len; |
686 » » » r = LIBUSB_ERROR_IO; | |
687 » » } else if (r == 0) { | |
688 » » » usbi_dbg("device is unconfigured"); | |
689 » » » r = LIBUSB_ERROR_NOT_FOUND; | |
690 » » } else if (r < len - sizeof(tmp)) { | |
691 » » » usbi_err(DEVICE_CTX(dev), "short read %d/%d", r, len); | |
692 » » » r = LIBUSB_ERROR_IO; | |
693 » » } | |
694 » } else { | |
695 » » r = 0; | |
696 » } | |
697 | |
698 » close(fd); | |
699 » return r; | |
700 } | |
701 | |
702 static int op_get_active_config_descriptor(struct libusb_device *dev, | |
703 » unsigned char *buffer, size_t len, int *host_endian) | |
704 { | |
705 » if (sysfs_has_descriptors) { | |
706 » » return sysfs_get_active_config_descriptor(dev, buffer, len); | |
707 » } else { | |
708 » » return usbfs_get_active_config_descriptor(dev, buffer, len); | |
709 » } | |
710 } | |
711 | |
712 /* takes a usbfs fd, attempts to find the requested config and copy a certain | |
713 * amount of it into an output buffer. */ | |
714 static int get_config_descriptor(struct libusb_context *ctx, int fd, | |
715 » uint8_t config_index, unsigned char *buffer, size_t len) | |
716 { | |
717 » off_t off; | |
718 » ssize_t r; | |
719 | |
720 » off = lseek(fd, DEVICE_DESC_LENGTH, SEEK_SET); | |
721 » if (off < 0) { | |
722 » » usbi_err(ctx, "seek failed ret=%d errno=%d", off, errno); | |
723 » » return LIBUSB_ERROR_IO; | |
724 » } | |
725 | |
726 » /* might need to skip some configuration descriptors to reach the | |
727 » * requested configuration */ | |
728 » while (config_index > 0) { | |
729 » » r = seek_to_next_config(ctx, fd, 1); | |
730 » » if (r < 0) | |
731 » » » return r; | |
732 » » config_index--; | |
733 » } | |
734 | |
735 » /* read the rest of the descriptor */ | |
736 » r = read(fd, buffer, len); | |
737 » if (r < 0) { | |
738 » » usbi_err(ctx, "read failed ret=%d errno=%d", r, errno); | |
739 » » return LIBUSB_ERROR_IO; | |
740 » } else if (r < len) { | |
741 » » usbi_err(ctx, "short output read %d/%d", r, len); | |
742 » » return LIBUSB_ERROR_IO; | |
743 » } | |
744 | |
745 » return 0; | |
746 } | |
747 | |
748 static int op_get_config_descriptor(struct libusb_device *dev, | |
749 » uint8_t config_index, unsigned char *buffer, size_t len, int *host_endia
n) | |
750 { | |
751 » char filename[PATH_MAX]; | |
752 » int fd; | |
753 » int r; | |
754 | |
755 » /* always read from usbfs: sysfs only has the active descriptor | |
756 » * this will involve waking the device up, but oh well! */ | |
757 | |
758 » /* FIXME: the above is no longer true, new kernels have all descriptors | |
759 » * in the descriptors file. but its kinda hard to detect if the kernel | |
760 » * is sufficiently new. */ | |
761 | |
762 » _get_usbfs_path(dev, filename); | |
763 » fd = open(filename, O_RDONLY); | |
764 » if (fd < 0) { | |
765 » » usbi_err(DEVICE_CTX(dev), | |
766 » » » "open '%s' failed, ret=%d errno=%d", filename, fd, errno
); | |
767 » » return LIBUSB_ERROR_IO; | |
768 » } | |
769 | |
770 » r = get_config_descriptor(DEVICE_CTX(dev), fd, config_index, buffer, len
); | |
771 » close(fd); | |
772 » return r; | |
773 } | |
774 | |
775 /* cache the active config descriptor in memory. a value of -1 means that | |
776 * we aren't sure which one is active, so just assume the first one. | |
777 * only for usbfs. */ | |
778 static int cache_active_config(struct libusb_device *dev, int fd, | |
779 » int active_config) | |
780 { | |
781 » struct linux_device_priv *priv = _device_priv(dev); | |
782 » struct libusb_config_descriptor config; | |
783 » unsigned char tmp[8]; | |
784 » unsigned char *buf; | |
785 » int idx; | |
786 » int r; | |
787 | |
788 » if (active_config == -1) { | |
789 » » idx = 0; | |
790 » } else { | |
791 » » r = usbi_get_config_index_by_value(dev, active_config, &idx); | |
792 » » if (r < 0) | |
793 » » » return r; | |
794 » » if (idx == -1) | |
795 » » » return LIBUSB_ERROR_NOT_FOUND; | |
796 » } | |
797 | |
798 » r = get_config_descriptor(DEVICE_CTX(dev), fd, idx, tmp, sizeof(tmp)); | |
799 » if (r < 0) { | |
800 » » usbi_err(DEVICE_CTX(dev), "first read error %d", r); | |
801 » » return r; | |
802 » } | |
803 | |
804 » usbi_parse_descriptor(tmp, "bbw", &config, 0); | |
805 » buf = malloc(config.wTotalLength); | |
806 » if (!buf) | |
807 » » return LIBUSB_ERROR_NO_MEM; | |
808 | |
809 » r = get_config_descriptor(DEVICE_CTX(dev), fd, idx, buf, | |
810 » » config.wTotalLength); | |
811 » if (r < 0) { | |
812 » » free(buf); | |
813 » » return r; | |
814 » } | |
815 | |
816 » if (priv->config_descriptor) | |
817 » » free(priv->config_descriptor); | |
818 » priv->config_descriptor = buf; | |
819 » return 0; | |
820 } | 802 } |
821 | 803 |
822 /* send a control message to retrieve active configuration */ | 804 /* send a control message to retrieve active configuration */ |
823 static int usbfs_get_active_config(struct libusb_device *dev, int fd) | 805 static int usbfs_get_active_config(struct libusb_device *dev, int fd) |
824 { | 806 { |
825 unsigned char active_config = 0; | 807 unsigned char active_config = 0; |
826 int r; | 808 int r; |
827 | 809 |
828 struct usbfs_ctrltransfer ctrl = { | 810 struct usbfs_ctrltransfer ctrl = { |
829 .bmRequestType = LIBUSB_ENDPOINT_IN, | 811 .bmRequestType = LIBUSB_ENDPOINT_IN, |
(...skipping 16 matching lines...) Expand all Loading... |
846 return LIBUSB_ERROR_IO; | 828 return LIBUSB_ERROR_IO; |
847 } | 829 } |
848 | 830 |
849 return active_config; | 831 return active_config; |
850 } | 832 } |
851 | 833 |
852 static int initialize_device(struct libusb_device *dev, uint8_t busnum, | 834 static int initialize_device(struct libusb_device *dev, uint8_t busnum, |
853 uint8_t devaddr, const char *sysfs_dir) | 835 uint8_t devaddr, const char *sysfs_dir) |
854 { | 836 { |
855 struct linux_device_priv *priv = _device_priv(dev); | 837 struct linux_device_priv *priv = _device_priv(dev); |
856 » unsigned char *dev_buf; | 838 » struct libusb_context *ctx = DEVICE_CTX(dev); |
857 » char path[PATH_MAX]; | 839 » int descriptors_size = 512; /* Begin with a 1024 byte alloc */ |
858 int fd, speed; | 840 int fd, speed; |
859 int active_config = 0; | |
860 int device_configured = 1; | |
861 ssize_t r; | 841 ssize_t r; |
862 | 842 |
863 dev->bus_number = busnum; | 843 dev->bus_number = busnum; |
864 dev->device_address = devaddr; | 844 dev->device_address = devaddr; |
865 | 845 |
866 if (sysfs_dir) { | 846 if (sysfs_dir) { |
867 priv->sysfs_dir = malloc(strlen(sysfs_dir) + 1); | 847 priv->sysfs_dir = malloc(strlen(sysfs_dir) + 1); |
868 if (!priv->sysfs_dir) | 848 if (!priv->sysfs_dir) |
869 return LIBUSB_ERROR_NO_MEM; | 849 return LIBUSB_ERROR_NO_MEM; |
870 strcpy(priv->sysfs_dir, sysfs_dir); | 850 strcpy(priv->sysfs_dir, sysfs_dir); |
871 | 851 |
872 /* Note speed can contain 1.5, in this case __read_sysfs_attr | 852 /* Note speed can contain 1.5, in this case __read_sysfs_attr |
873 will stop parsing at the '.' and return 1 */ | 853 will stop parsing at the '.' and return 1 */ |
874 speed = __read_sysfs_attr(DEVICE_CTX(dev), sysfs_dir, "speed"); | 854 speed = __read_sysfs_attr(DEVICE_CTX(dev), sysfs_dir, "speed"); |
875 if (speed >= 0) { | 855 if (speed >= 0) { |
876 switch (speed) { | 856 switch (speed) { |
877 case 1: dev->speed = LIBUSB_SPEED_LOW; break; | 857 case 1: dev->speed = LIBUSB_SPEED_LOW; break; |
878 case 12: dev->speed = LIBUSB_SPEED_FULL; break; | 858 case 12: dev->speed = LIBUSB_SPEED_FULL; break; |
879 case 480: dev->speed = LIBUSB_SPEED_HIGH; break; | 859 case 480: dev->speed = LIBUSB_SPEED_HIGH; break; |
880 case 5000: dev->speed = LIBUSB_SPEED_SUPER; break; | 860 case 5000: dev->speed = LIBUSB_SPEED_SUPER; break; |
881 default: | 861 default: |
882 usbi_warn(DEVICE_CTX(dev), "Unknown device speed
: %d Mbps", speed); | 862 usbi_warn(DEVICE_CTX(dev), "Unknown device speed
: %d Mbps", speed); |
883 } | 863 } |
884 } | 864 } |
885 } | 865 } |
886 | 866 |
| 867 /* cache descriptors in memory */ |
887 if (sysfs_has_descriptors) | 868 if (sysfs_has_descriptors) |
888 » » return 0; | 869 » » fd = _open_sysfs_attr(dev, "descriptors"); |
| 870 » else |
| 871 » » fd = _get_usbfs_fd(dev, O_RDONLY, 0); |
| 872 » if (fd < 0) |
| 873 » » return fd; |
889 | 874 |
890 » /* cache device descriptor in memory so that we can retrieve it later | 875 » do { |
891 » * without waking the device up (op_get_device_descriptor) */ | 876 » » descriptors_size *= 2; |
| 877 » » priv->descriptors = usbi_reallocf(priv->descriptors, |
| 878 » » » » » » descriptors_size); |
| 879 » » if (!priv->descriptors) { |
| 880 » » » close(fd); |
| 881 » » » return LIBUSB_ERROR_NO_MEM; |
| 882 » » } |
| 883 » » /* usbfs has holes in the file */ |
| 884 » » if (!sysfs_has_descriptors) { |
| 885 » » » memset(priv->descriptors + priv->descriptors_len, |
| 886 » » » 0, descriptors_size - priv->descriptors_len); |
| 887 » » } |
| 888 » » r = read(fd, priv->descriptors + priv->descriptors_len, |
| 889 » » » descriptors_size - priv->descriptors_len); |
| 890 » » if (r < 0) { |
| 891 » » » usbi_err(ctx, "read descriptor failed ret=%d errno=%d", |
| 892 » » » » fd, errno); |
| 893 » » » close(fd); |
| 894 » » » return LIBUSB_ERROR_IO; |
| 895 » » } |
| 896 » » priv->descriptors_len += r; |
| 897 » } while (priv->descriptors_len == descriptors_size); |
| 898 » |
| 899 » close(fd); |
892 | 900 |
893 » priv->dev_descriptor = NULL; | 901 » if (priv->descriptors_len < DEVICE_DESC_LENGTH) { |
894 » priv->config_descriptor = NULL; | 902 » » usbi_err(ctx, "short descriptor read (%d)", |
895 | 903 » » » priv->descriptors_len); |
896 » if (sysfs_can_relate_devices) { | |
897 » » int tmp = sysfs_get_active_config(dev, &active_config); | |
898 » » if (tmp < 0) | |
899 » » » return tmp; | |
900 » » if (active_config == -1) | |
901 » » » device_configured = 0; | |
902 » } | |
903 | |
904 » _get_usbfs_path(dev, path); | |
905 » fd = open(path, O_RDWR); | |
906 » if (fd < 0 && errno == EACCES) { | |
907 » » fd = open(path, O_RDONLY); | |
908 » » /* if we only have read-only access to the device, we cannot | |
909 » » * send a control message to determine the active config. just | |
910 » » * assume the first one is active. */ | |
911 » » active_config = -1; | |
912 » } | |
913 | |
914 » if (fd < 0) { | |
915 » » usbi_err(DEVICE_CTX(dev), "open failed, ret=%d errno=%d", fd, er
rno); | |
916 return LIBUSB_ERROR_IO; | 904 return LIBUSB_ERROR_IO; |
917 } | 905 } |
918 | 906 |
919 » if (!sysfs_can_relate_devices) { | 907 » if (sysfs_can_relate_devices) |
920 » » if (active_config == -1) { | 908 » » return LIBUSB_SUCCESS; |
921 » » » /* if we only have read-only access to the device, we ca
nnot | 909 |
922 » » » * send a control message to determine the active config
. just | 910 » /* cache active config */ |
923 » » » * assume the first one is active. */ | 911 » fd = _get_usbfs_fd(dev, O_RDWR, 1); |
924 » » » usbi_warn(DEVICE_CTX(dev), "access to %s is read-only; c
annot " | 912 » if (fd < 0) { |
925 » » » » "determine active configuration descriptor", pat
h); | 913 » » /* cannot send a control message to determine the active |
926 » » } else { | 914 » » * config. just assume the first one is active. */ |
927 » » » active_config = usbfs_get_active_config(dev, fd); | 915 » » usbi_warn(ctx, "Missing rw usbfs access; cannot determine " |
928 » » » if (active_config == LIBUSB_ERROR_IO) { | 916 » » » "active configuration descriptor"); |
929 » » » » /* buggy devices sometimes fail to report their
active config. | 917 » » if (priv->descriptors_len >= |
930 » » » » * assume unconfigured and continue the probing
*/ | 918 » » » » (DEVICE_DESC_LENGTH + LIBUSB_DT_CONFIG_SIZE)) { |
931 » » » » usbi_warn(DEVICE_CTX(dev), "couldn't query activ
e " | 919 » » » struct libusb_config_descriptor config; |
932 » » » » » "configuration, assumung unconfigured"); | 920 » » » usbi_parse_descriptor( |
933 » » » » device_configured = 0; | 921 » » » » priv->descriptors + DEVICE_DESC_LENGTH, |
934 » » » } else if (active_config < 0) { | 922 » » » » "bbwbbbbb", &config, 0); |
935 » » » » close(fd); | 923 » » » priv->active_config = config.bConfigurationValue; |
936 » » » » return active_config; | 924 » » } else |
937 » » » } else if (active_config == 0) { | 925 » » » priv->active_config = -1; /* No config dt */ |
938 » » » » /* some buggy devices have a configuration 0, bu
t we're | 926 |
939 » » » » * reaching into the corner of a corner case her
e, so let's | 927 » » return LIBUSB_SUCCESS; |
940 » » » » * not support buggy devices in these circumstan
ces. | 928 » } |
941 » » » » * stick to the specs: a configuration value of
0 means | 929 |
942 » » » » * unconfigured. */ | 930 » r = usbfs_get_active_config(dev, fd); |
943 » » » » usbi_dbg("active cfg 0? assuming unconfigured de
vice"); | 931 » if (r > 0) { |
944 » » » » device_configured = 0; | 932 » » priv->active_config = r; |
945 » » » } | 933 » » r = LIBUSB_SUCCESS; |
| 934 » } else if (r == 0) { |
| 935 » » /* some buggy devices have a configuration 0, but we're |
| 936 » » * reaching into the corner of a corner case here, so let's |
| 937 » » * not support buggy devices in these circumstances. |
| 938 » » * stick to the specs: a configuration value of 0 means |
| 939 » » * unconfigured. */ |
| 940 » » usbi_dbg("active cfg 0? assuming unconfigured device"); |
| 941 » » priv->active_config = -1; |
| 942 » » r = LIBUSB_SUCCESS; |
| 943 » } else if (r == LIBUSB_ERROR_IO) { |
| 944 » » /* buggy devices sometimes fail to report their active config. |
| 945 » » * assume unconfigured and continue the probing */ |
| 946 » » usbi_warn(ctx, "couldn't query active configuration, assuming" |
| 947 » » » " unconfigured"); |
| 948 » » priv->active_config = -1; |
| 949 » » r = LIBUSB_SUCCESS; |
| 950 » } /* else r < 0, just return the error code */ |
| 951 |
| 952 » close(fd); |
| 953 » return r; |
| 954 } |
| 955 |
| 956 static int linux_get_parent_info(struct libusb_device *dev, const char *sysfs_di
r) |
| 957 { |
| 958 » struct libusb_context *ctx = DEVICE_CTX(dev); |
| 959 » struct libusb_device *it; |
| 960 » char *parent_sysfs_dir, *tmp; |
| 961 » int ret, add_parent = 1; |
| 962 |
| 963 » /* XXX -- can we figure out the topology when using usbfs? */ |
| 964 » if (NULL == sysfs_dir || 0 == strncmp(sysfs_dir, "usb", 3)) { |
| 965 » » /* either using usbfs or finding the parent of a root hub */ |
| 966 » » return LIBUSB_SUCCESS; |
| 967 » } |
| 968 |
| 969 » parent_sysfs_dir = strdup(sysfs_dir); |
| 970 » if (NULL != (tmp = strrchr(parent_sysfs_dir, '.')) || |
| 971 » NULL != (tmp = strrchr(parent_sysfs_dir, '-'))) { |
| 972 » dev->port_number = atoi(tmp + 1); |
| 973 » » *tmp = '\0'; |
| 974 » } else { |
| 975 » » usbi_warn(ctx, "Can not parse sysfs_dir: %s, no parent info", |
| 976 » » » parent_sysfs_dir); |
| 977 » » free (parent_sysfs_dir); |
| 978 » » return LIBUSB_SUCCESS; |
| 979 » } |
| 980 |
| 981 » /* is the parent a root hub? */ |
| 982 » if (NULL == strchr(parent_sysfs_dir, '-')) { |
| 983 » » tmp = parent_sysfs_dir; |
| 984 » » ret = asprintf (&parent_sysfs_dir, "usb%s", tmp); |
| 985 » » free (tmp); |
| 986 » » if (0 > ret) { |
| 987 » » » return LIBUSB_ERROR_NO_MEM; |
946 } | 988 } |
947 } | 989 } |
948 | 990 |
949 » dev_buf = malloc(DEVICE_DESC_LENGTH); | 991 retry: |
950 » if (!dev_buf) { | 992 » /* find the parent in the context */ |
951 » » close(fd); | 993 » usbi_mutex_lock(&ctx->usb_devs_lock); |
952 » » return LIBUSB_ERROR_NO_MEM; | 994 » list_for_each_entry(it, &ctx->usb_devs, list, struct libusb_device) { |
| 995 » » struct linux_device_priv *priv = _device_priv(it); |
| 996 » » if (0 == strcmp (priv->sysfs_dir, parent_sysfs_dir)) { |
| 997 » » » dev->parent_dev = libusb_ref_device(it); |
| 998 » » » break; |
| 999 » » } |
| 1000 » } |
| 1001 » usbi_mutex_unlock(&ctx->usb_devs_lock); |
| 1002 |
| 1003 » if (!dev->parent_dev && add_parent) { |
| 1004 » » usbi_dbg("parent_dev %s not enumerated yet, enumerating now", |
| 1005 » » » parent_sysfs_dir); |
| 1006 » » sysfs_scan_device(ctx, parent_sysfs_dir); |
| 1007 » » add_parent = 0; |
| 1008 » » goto retry; |
953 } | 1009 } |
954 | 1010 |
955 » r = read(fd, dev_buf, DEVICE_DESC_LENGTH); | 1011 » usbi_dbg("Dev %p (%s) has parent %p (%s) port %d", dev, sysfs_dir, |
956 » if (r < 0) { | 1012 » » dev->parent_dev, parent_sysfs_dir, dev->port_number); |
957 » » usbi_err(DEVICE_CTX(dev), | |
958 » » » "read descriptor failed ret=%d errno=%d", fd, errno); | |
959 » » free(dev_buf); | |
960 » » close(fd); | |
961 » » return LIBUSB_ERROR_IO; | |
962 » } else if (r < DEVICE_DESC_LENGTH) { | |
963 » » usbi_err(DEVICE_CTX(dev), "short descriptor read (%d)", r); | |
964 » » free(dev_buf); | |
965 » » close(fd); | |
966 » » return LIBUSB_ERROR_IO; | |
967 » } | |
968 | 1013 |
969 » /* bit of a hack: set num_configurations now because cache_active_config
() | 1014 » free (parent_sysfs_dir); |
970 » * calls usbi_get_config_index_by_value() which uses it */ | |
971 » dev->num_configurations = dev_buf[DEVICE_DESC_LENGTH - 1]; | |
972 | 1015 |
973 » if (device_configured) { | 1016 » return LIBUSB_SUCCESS; |
974 » » r = cache_active_config(dev, fd, active_config); | |
975 » » if (r < 0) { | |
976 » » » close(fd); | |
977 » » » free(dev_buf); | |
978 » » » return r; | |
979 » » } | |
980 » } | |
981 | |
982 » close(fd); | |
983 » priv->dev_descriptor = dev_buf; | |
984 » return 0; | |
985 } | 1017 } |
986 | 1018 |
987 static int enumerate_device(struct libusb_context *ctx, | 1019 int linux_enumerate_device(struct libusb_context *ctx, |
988 » struct discovered_devs **_discdevs, uint8_t busnum, uint8_t devaddr, | 1020 » uint8_t busnum, uint8_t devaddr, const char *sysfs_dir) |
989 » const char *sysfs_dir) | |
990 { | 1021 { |
991 struct discovered_devs *discdevs; | |
992 unsigned long session_id; | 1022 unsigned long session_id; |
993 int need_unref = 0; | |
994 struct libusb_device *dev; | 1023 struct libusb_device *dev; |
995 int r = 0; | 1024 int r = 0; |
996 | 1025 |
997 /* FIXME: session ID is not guaranteed unique as addresses can wrap and | 1026 /* FIXME: session ID is not guaranteed unique as addresses can wrap and |
998 * will be reused. instead we should add a simple sysfs attribute with | 1027 * will be reused. instead we should add a simple sysfs attribute with |
999 * a session ID. */ | 1028 * a session ID. */ |
1000 session_id = busnum << 8 | devaddr; | 1029 session_id = busnum << 8 | devaddr; |
1001 usbi_dbg("busnum %d devaddr %d session_id %ld", busnum, devaddr, | 1030 usbi_dbg("busnum %d devaddr %d session_id %ld", busnum, devaddr, |
1002 session_id); | 1031 session_id); |
1003 | 1032 |
1004 » dev = usbi_get_device_by_session_id(ctx, session_id); | 1033 » if (usbi_get_device_by_session_id(ctx, session_id)) { |
1005 » if (dev) { | 1034 » » /* device already exists in the context */ |
1006 » » usbi_dbg("using existing device for %d/%d (session %ld)", | 1035 » » usbi_dbg("session_id %ld already exists", session_id); |
1007 » » » busnum, devaddr, session_id); | 1036 » » return LIBUSB_SUCCESS; |
1008 » } else { | |
1009 » » usbi_dbg("allocating new device for %d/%d (session %ld)", | |
1010 » » » busnum, devaddr, session_id); | |
1011 » » dev = usbi_alloc_device(ctx, session_id); | |
1012 » » if (!dev) | |
1013 » » » return LIBUSB_ERROR_NO_MEM; | |
1014 » » need_unref = 1; | |
1015 » » r = initialize_device(dev, busnum, devaddr, sysfs_dir); | |
1016 » » if (r < 0) | |
1017 » » » goto out; | |
1018 » » r = usbi_sanitize_device(dev); | |
1019 » » if (r < 0) | |
1020 » » » goto out; | |
1021 } | 1037 } |
1022 | 1038 |
1023 » discdevs = discovered_devs_append(*_discdevs, dev); | 1039 » usbi_dbg("allocating new device for %d/%d (session %ld)", |
1024 » if (!discdevs) | 1040 » » busnum, devaddr, session_id); |
1025 » » r = LIBUSB_ERROR_NO_MEM; | 1041 » dev = usbi_alloc_device(ctx, session_id); |
| 1042 » if (!dev) |
| 1043 » » return LIBUSB_ERROR_NO_MEM; |
| 1044 |
| 1045 » r = initialize_device(dev, busnum, devaddr, sysfs_dir); |
| 1046 » if (r < 0) |
| 1047 » » goto out; |
| 1048 » r = usbi_sanitize_device(dev); |
| 1049 » if (r < 0) |
| 1050 » » goto out; |
| 1051 |
| 1052 » r = linux_get_parent_info(dev, sysfs_dir); |
| 1053 » if (r < 0) |
| 1054 » » goto out; |
| 1055 out: |
| 1056 » if (r < 0) |
| 1057 » » libusb_unref_device(dev); |
1026 else | 1058 else |
1027 » » *_discdevs = discdevs; | 1059 » » usbi_connect_device(dev); |
1028 | 1060 |
1029 out: | |
1030 if (need_unref) | |
1031 libusb_unref_device(dev); | |
1032 return r; | 1061 return r; |
1033 } | 1062 } |
1034 | 1063 |
1035 /* open a bus directory and adds all discovered devices to discdevs. on | 1064 void linux_hotplug_enumerate(uint8_t busnum, uint8_t devaddr, const char *sys_na
me) |
1036 * failure (non-zero return) the pre-existing discdevs should be destroyed | 1065 { |
1037 * (and devices freed). on success, the new discdevs pointer should be used | 1066 » struct libusb_context *ctx; |
1038 * as it may have been moved. */ | 1067 |
1039 static int usbfs_scan_busdir(struct libusb_context *ctx, | 1068 » usbi_mutex_static_lock(&active_contexts_lock); |
1040 » struct discovered_devs **_discdevs, uint8_t busnum) | 1069 » list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_cont
ext) { |
| 1070 » » linux_enumerate_device(ctx, busnum, devaddr, sys_name); |
| 1071 » } |
| 1072 » usbi_mutex_static_unlock(&active_contexts_lock); |
| 1073 } |
| 1074 |
| 1075 void linux_hotplug_disconnected(uint8_t busnum, uint8_t devaddr, const char *sys
_name) |
| 1076 { |
| 1077 » struct libusb_context *ctx; |
| 1078 » struct libusb_device *dev; |
| 1079 » unsigned long session_id = busnum << 8 | devaddr; |
| 1080 |
| 1081 » usbi_mutex_static_lock(&active_contexts_lock); |
| 1082 » list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_cont
ext) { |
| 1083 » » dev = usbi_get_device_by_session_id (ctx, session_id); |
| 1084 » » if (NULL != dev) { |
| 1085 » » » usbi_disconnect_device (dev); |
| 1086 » » } else { |
| 1087 » » » usbi_dbg("device not found for session %x", session_id); |
| 1088 » » } |
| 1089 » } |
| 1090 » usbi_mutex_static_unlock(&active_contexts_lock); |
| 1091 } |
| 1092 |
| 1093 #if !defined(USE_UDEV) |
| 1094 /* open a bus directory and adds all discovered devices to the context */ |
| 1095 static int usbfs_scan_busdir(struct libusb_context *ctx, uint8_t busnum) |
1041 { | 1096 { |
1042 DIR *dir; | 1097 DIR *dir; |
1043 char dirpath[PATH_MAX]; | 1098 char dirpath[PATH_MAX]; |
1044 struct dirent *entry; | 1099 struct dirent *entry; |
1045 struct discovered_devs *discdevs = *_discdevs; | |
1046 int r = LIBUSB_ERROR_IO; | 1100 int r = LIBUSB_ERROR_IO; |
1047 | 1101 |
1048 snprintf(dirpath, PATH_MAX, "%s/%03d", usbfs_path, busnum); | 1102 snprintf(dirpath, PATH_MAX, "%s/%03d", usbfs_path, busnum); |
1049 usbi_dbg("%s", dirpath); | 1103 usbi_dbg("%s", dirpath); |
1050 dir = opendir(dirpath); | 1104 dir = opendir(dirpath); |
1051 if (!dir) { | 1105 if (!dir) { |
1052 usbi_err(ctx, "opendir '%s' failed, errno=%d", dirpath, errno); | 1106 usbi_err(ctx, "opendir '%s' failed, errno=%d", dirpath, errno); |
1053 /* FIXME: should handle valid race conditions like hub unplugged | 1107 /* FIXME: should handle valid race conditions like hub unplugged |
1054 * during directory iteration - this is not an error */ | 1108 * during directory iteration - this is not an error */ |
1055 return r; | 1109 return r; |
1056 } | 1110 } |
1057 | 1111 |
1058 while ((entry = readdir(dir))) { | 1112 while ((entry = readdir(dir))) { |
1059 int devaddr; | 1113 int devaddr; |
1060 | 1114 |
1061 if (entry->d_name[0] == '.') | 1115 if (entry->d_name[0] == '.') |
1062 continue; | 1116 continue; |
1063 | 1117 |
1064 devaddr = atoi(entry->d_name); | 1118 devaddr = atoi(entry->d_name); |
1065 if (devaddr == 0) { | 1119 if (devaddr == 0) { |
1066 usbi_dbg("unknown dir entry %s", entry->d_name); | 1120 usbi_dbg("unknown dir entry %s", entry->d_name); |
1067 continue; | 1121 continue; |
1068 } | 1122 } |
1069 | 1123 |
1070 » » if (enumerate_device(ctx, &discdevs, busnum, (uint8_t) devaddr,
NULL)) { | 1124 » » if (linux_enumerate_device(ctx, busnum, (uint8_t) devaddr, NULL)
) { |
1071 usbi_dbg("failed to enumerate dir entry %s", entry->d_na
me); | 1125 usbi_dbg("failed to enumerate dir entry %s", entry->d_na
me); |
1072 continue; | 1126 continue; |
1073 } | 1127 } |
1074 | 1128 |
1075 r = 0; | 1129 r = 0; |
1076 } | 1130 } |
1077 | 1131 |
1078 if (!r) | |
1079 *_discdevs = discdevs; | |
1080 closedir(dir); | 1132 closedir(dir); |
1081 return r; | 1133 return r; |
1082 } | 1134 } |
1083 | 1135 |
1084 static int usbfs_get_device_list(struct libusb_context *ctx, | 1136 static int usbfs_get_device_list(struct libusb_context *ctx) |
1085 » struct discovered_devs **_discdevs) | |
1086 { | 1137 { |
1087 struct dirent *entry; | 1138 struct dirent *entry; |
1088 DIR *buses = opendir(usbfs_path); | 1139 DIR *buses = opendir(usbfs_path); |
1089 struct discovered_devs *discdevs = *_discdevs; | |
1090 int r = 0; | 1140 int r = 0; |
1091 | 1141 |
1092 if (!buses) { | 1142 if (!buses) { |
1093 usbi_err(ctx, "opendir buses failed errno=%d", errno); | 1143 usbi_err(ctx, "opendir buses failed errno=%d", errno); |
1094 return LIBUSB_ERROR_IO; | 1144 return LIBUSB_ERROR_IO; |
1095 } | 1145 } |
1096 | 1146 |
1097 while ((entry = readdir(buses))) { | 1147 while ((entry = readdir(buses))) { |
1098 struct discovered_devs *discdevs_new = discdevs; | |
1099 int busnum; | 1148 int busnum; |
1100 | 1149 |
1101 if (entry->d_name[0] == '.') | 1150 if (entry->d_name[0] == '.') |
1102 continue; | 1151 continue; |
1103 | 1152 |
1104 if (usbdev_names) { | 1153 if (usbdev_names) { |
1105 int devaddr; | 1154 int devaddr; |
1106 if (!_is_usbdev_entry(entry, &busnum, &devaddr)) | 1155 if (!_is_usbdev_entry(entry, &busnum, &devaddr)) |
1107 continue; | 1156 continue; |
1108 | 1157 |
1109 » » » r = enumerate_device(ctx, &discdevs_new, busnum, | 1158 » » » r = linux_enumerate_device(ctx, busnum, (uint8_t) devadd
r, NULL); |
1110 » » » » (uint8_t) devaddr, NULL); | |
1111 if (r < 0) { | 1159 if (r < 0) { |
1112 usbi_dbg("failed to enumerate dir entry %s", ent
ry->d_name); | 1160 usbi_dbg("failed to enumerate dir entry %s", ent
ry->d_name); |
1113 continue; | 1161 continue; |
1114 } | 1162 } |
1115 } else { | 1163 } else { |
1116 busnum = atoi(entry->d_name); | 1164 busnum = atoi(entry->d_name); |
1117 if (busnum == 0) { | 1165 if (busnum == 0) { |
1118 usbi_dbg("unknown dir entry %s", entry->d_name); | 1166 usbi_dbg("unknown dir entry %s", entry->d_name); |
1119 continue; | 1167 continue; |
1120 } | 1168 } |
1121 | 1169 |
1122 » » » r = usbfs_scan_busdir(ctx, &discdevs_new, busnum); | 1170 » » » r = usbfs_scan_busdir(ctx, busnum); |
1123 if (r < 0) | 1171 if (r < 0) |
1124 » » » » goto out; | 1172 » » » » break; |
1125 } | 1173 } |
1126 discdevs = discdevs_new; | |
1127 } | 1174 } |
1128 | 1175 |
1129 out: | |
1130 closedir(buses); | 1176 closedir(buses); |
1131 *_discdevs = discdevs; | |
1132 return r; | 1177 return r; |
1133 | 1178 |
1134 } | 1179 } |
| 1180 #endif |
1135 | 1181 |
1136 static int sysfs_scan_device(struct libusb_context *ctx, | 1182 static int sysfs_scan_device(struct libusb_context *ctx, const char *devname) |
1137 » struct discovered_devs **_discdevs, const char *devname) | |
1138 { | 1183 { |
1139 » int busnum; | 1184 » uint8_t busnum, devaddr; |
1140 » int devaddr; | 1185 » int ret; |
1141 | 1186 |
1142 » usbi_dbg("scan %s", devname); | 1187 » ret = linux_get_device_address (ctx, 0, &busnum, &devaddr, NULL, devname
); |
| 1188 » if (LIBUSB_SUCCESS != ret) { |
| 1189 » » return ret; |
| 1190 » } |
1143 | 1191 |
1144 » busnum = __read_sysfs_attr(ctx, devname, "busnum"); | 1192 » return linux_enumerate_device(ctx, busnum & 0xff, devaddr & 0xff, |
1145 » if (busnum < 0) | |
1146 » » return busnum; | |
1147 | |
1148 » devaddr = __read_sysfs_attr(ctx, devname, "devnum"); | |
1149 » if (devaddr < 0) | |
1150 » » return devaddr; | |
1151 | |
1152 » usbi_dbg("bus=%d dev=%d", busnum, devaddr); | |
1153 » if (busnum > 255 || devaddr > 255) | |
1154 » » return LIBUSB_ERROR_INVALID_PARAM; | |
1155 | |
1156 » return enumerate_device(ctx, _discdevs, busnum & 0xff, devaddr & 0xff, | |
1157 devname); | 1193 devname); |
1158 } | 1194 } |
1159 | 1195 |
1160 static int sysfs_get_device_list(struct libusb_context *ctx, | 1196 #if !defined(USE_UDEV) |
1161 » struct discovered_devs **_discdevs) | 1197 static int sysfs_get_device_list(struct libusb_context *ctx) |
1162 { | 1198 { |
1163 struct discovered_devs *discdevs = *_discdevs; | |
1164 DIR *devices = opendir(SYSFS_DEVICE_PATH); | 1199 DIR *devices = opendir(SYSFS_DEVICE_PATH); |
1165 struct dirent *entry; | 1200 struct dirent *entry; |
1166 int r = LIBUSB_ERROR_IO; | 1201 int r = LIBUSB_ERROR_IO; |
1167 | 1202 |
1168 if (!devices) { | 1203 if (!devices) { |
1169 usbi_err(ctx, "opendir devices failed errno=%d", errno); | 1204 usbi_err(ctx, "opendir devices failed errno=%d", errno); |
1170 return r; | 1205 return r; |
1171 } | 1206 } |
1172 | 1207 |
1173 while ((entry = readdir(devices))) { | 1208 while ((entry = readdir(devices))) { |
1174 struct discovered_devs *discdevs_new = discdevs; | |
1175 | |
1176 if ((!isdigit(entry->d_name[0]) && strncmp(entry->d_name, "usb",
3)) | 1209 if ((!isdigit(entry->d_name[0]) && strncmp(entry->d_name, "usb",
3)) |
1177 || strchr(entry->d_name, ':')) | 1210 || strchr(entry->d_name, ':')) |
1178 continue; | 1211 continue; |
1179 | 1212 |
1180 » » if (sysfs_scan_device(ctx, &discdevs_new, entry->d_name)) { | 1213 » » if (sysfs_scan_device(ctx, entry->d_name)) { |
1181 usbi_dbg("failed to enumerate dir entry %s", entry->d_na
me); | 1214 usbi_dbg("failed to enumerate dir entry %s", entry->d_na
me); |
1182 continue; | 1215 continue; |
1183 } | 1216 } |
1184 | 1217 |
1185 r = 0; | 1218 r = 0; |
1186 discdevs = discdevs_new; | |
1187 } | 1219 } |
1188 | 1220 |
1189 if (!r) | |
1190 *_discdevs = discdevs; | |
1191 closedir(devices); | 1221 closedir(devices); |
1192 return r; | 1222 return r; |
1193 } | 1223 } |
1194 | 1224 |
1195 static int op_get_device_list(struct libusb_context *ctx, | 1225 static int linux_default_scan_devices (struct libusb_context *ctx) |
1196 » struct discovered_devs **_discdevs) | |
1197 { | 1226 { |
1198 /* we can retrieve device list and descriptors from sysfs or usbfs. | 1227 /* we can retrieve device list and descriptors from sysfs or usbfs. |
1199 * sysfs is preferable, because if we use usbfs we end up resuming | 1228 * sysfs is preferable, because if we use usbfs we end up resuming |
1200 * any autosuspended USB devices. however, sysfs is not available | 1229 * any autosuspended USB devices. however, sysfs is not available |
1201 * everywhere, so we need a usbfs fallback too. | 1230 * everywhere, so we need a usbfs fallback too. |
1202 * | 1231 * |
1203 * as described in the "sysfs vs usbfs" comment at the top of this | 1232 * as described in the "sysfs vs usbfs" comment at the top of this |
1204 * file, sometimes we have sysfs but not enough information to | 1233 * file, sometimes we have sysfs but not enough information to |
1205 * relate sysfs devices to usbfs nodes. op_init() determines the | 1234 * relate sysfs devices to usbfs nodes. op_init() determines the |
1206 * adequacy of sysfs and sets sysfs_can_relate_devices. | 1235 * adequacy of sysfs and sets sysfs_can_relate_devices. |
1207 */ | 1236 */ |
1208 if (sysfs_can_relate_devices != 0) | 1237 if (sysfs_can_relate_devices != 0) |
1209 » » return sysfs_get_device_list(ctx, _discdevs); | 1238 » » return sysfs_get_device_list(ctx); |
1210 else | 1239 else |
1211 » » return usbfs_get_device_list(ctx, _discdevs); | 1240 » » return usbfs_get_device_list(ctx); |
1212 } | 1241 } |
| 1242 #endif |
1213 | 1243 |
1214 static int op_open(struct libusb_device_handle *handle) | 1244 static int op_open(struct libusb_device_handle *handle) |
1215 { | 1245 { |
1216 struct linux_device_handle_priv *hpriv = _device_handle_priv(handle); | 1246 struct linux_device_handle_priv *hpriv = _device_handle_priv(handle); |
1217 » char filename[PATH_MAX]; | 1247 » int r; |
1218 | 1248 |
1219 » _get_usbfs_path(handle->dev, filename); | 1249 » hpriv->fd = _get_usbfs_fd(handle->dev, O_RDWR, 0); |
1220 » usbi_dbg("opening %s", filename); | 1250 » if (hpriv->fd < 0) |
1221 » hpriv->fd = open(filename, O_RDWR); | 1251 » » return hpriv->fd; |
1222 » if (hpriv->fd < 0) { | 1252 |
1223 » » if (errno == EACCES) { | 1253 » r = ioctl(hpriv->fd, IOCTL_USBFS_GET_CAPABILITIES, &hpriv->caps); |
1224 » » » usbi_err(HANDLE_CTX(handle), "libusb couldn't open USB d
evice %s: " | 1254 » if (r < 0) { |
1225 » » » » "Permission denied.", filename); | 1255 » » if (errno == ENOTTY) |
1226 » » » usbi_err(HANDLE_CTX(handle), | 1256 » » » usbi_dbg("getcap not available"); |
1227 » » » » "libusb requires write access to USB device node
s."); | 1257 » » else |
1228 » » » return LIBUSB_ERROR_ACCESS; | 1258 » » » usbi_err(HANDLE_CTX(handle), "getcap failed (%d)", errno
); |
1229 » » } else if (errno == ENOENT) { | 1259 » » hpriv->caps = 0; |
1230 » » » usbi_err(HANDLE_CTX(handle), "libusb couldn't open USB d
evice %s: " | 1260 » » if (supports_flag_zero_packet) |
1231 » » » » "No such file or directory.", filename); | 1261 » » » hpriv->caps |= USBFS_CAP_ZERO_PACKET; |
1232 » » » return LIBUSB_ERROR_NO_DEVICE; | 1262 » » if (supports_flag_bulk_continuation) |
1233 » » } else { | 1263 » » » hpriv->caps |= USBFS_CAP_BULK_CONTINUATION; |
1234 » » » usbi_err(HANDLE_CTX(handle), | |
1235 » » » » "open failed, code %d errno %d", hpriv->fd, errn
o); | |
1236 » » » return LIBUSB_ERROR_IO; | |
1237 » » } | |
1238 } | 1264 } |
1239 | 1265 |
1240 return usbi_add_pollfd(HANDLE_CTX(handle), hpriv->fd, POLLOUT); | 1266 return usbi_add_pollfd(HANDLE_CTX(handle), hpriv->fd, POLLOUT); |
1241 } | 1267 } |
1242 | 1268 |
1243 static void op_close(struct libusb_device_handle *dev_handle) | 1269 static void op_close(struct libusb_device_handle *dev_handle) |
1244 { | 1270 { |
1245 int fd = _device_handle_priv(dev_handle)->fd; | 1271 int fd = _device_handle_priv(dev_handle)->fd; |
1246 usbi_remove_pollfd(HANDLE_CTX(dev_handle), fd); | 1272 usbi_remove_pollfd(HANDLE_CTX(dev_handle), fd); |
1247 close(fd); | 1273 close(fd); |
1248 } | 1274 } |
1249 | 1275 |
1250 static int op_get_configuration(struct libusb_device_handle *handle, | 1276 static int op_get_configuration(struct libusb_device_handle *handle, |
1251 int *config) | 1277 int *config) |
1252 { | 1278 { |
1253 int r; | 1279 int r; |
1254 if (sysfs_can_relate_devices != 1) | |
1255 return LIBUSB_ERROR_NOT_SUPPORTED; | |
1256 | 1280 |
1257 » r = sysfs_get_active_config(handle->dev, config); | 1281 » if (sysfs_can_relate_devices) { |
| 1282 » » r = sysfs_get_active_config(handle->dev, config); |
| 1283 » } else { |
| 1284 » » r = usbfs_get_active_config(handle->dev, |
| 1285 » » » » » _device_handle_priv(handle)->fd); |
| 1286 » } |
1258 if (r < 0) | 1287 if (r < 0) |
1259 return r; | 1288 return r; |
1260 | 1289 |
1261 if (*config == -1) { | 1290 if (*config == -1) { |
1262 usbi_err(HANDLE_CTX(handle), "device unconfigured"); | 1291 usbi_err(HANDLE_CTX(handle), "device unconfigured"); |
1263 *config = 0; | 1292 *config = 0; |
1264 } | 1293 } |
1265 | 1294 |
1266 return 0; | 1295 return 0; |
1267 } | 1296 } |
1268 | 1297 |
1269 static int op_set_configuration(struct libusb_device_handle *handle, int config) | 1298 static int op_set_configuration(struct libusb_device_handle *handle, int config) |
1270 { | 1299 { |
1271 struct linux_device_priv *priv = _device_priv(handle->dev); | 1300 struct linux_device_priv *priv = _device_priv(handle->dev); |
1272 int fd = _device_handle_priv(handle)->fd; | 1301 int fd = _device_handle_priv(handle)->fd; |
1273 int r = ioctl(fd, IOCTL_USBFS_SETCONFIG, &config); | 1302 int r = ioctl(fd, IOCTL_USBFS_SETCONFIG, &config); |
1274 if (r) { | 1303 if (r) { |
1275 if (errno == EINVAL) | 1304 if (errno == EINVAL) |
1276 return LIBUSB_ERROR_NOT_FOUND; | 1305 return LIBUSB_ERROR_NOT_FOUND; |
1277 else if (errno == EBUSY) | 1306 else if (errno == EBUSY) |
1278 return LIBUSB_ERROR_BUSY; | 1307 return LIBUSB_ERROR_BUSY; |
1279 else if (errno == ENODEV) | 1308 else if (errno == ENODEV) |
1280 return LIBUSB_ERROR_NO_DEVICE; | 1309 return LIBUSB_ERROR_NO_DEVICE; |
1281 | 1310 |
1282 usbi_err(HANDLE_CTX(handle), "failed, error %d errno %d", r, err
no); | 1311 usbi_err(HANDLE_CTX(handle), "failed, error %d errno %d", r, err
no); |
1283 return LIBUSB_ERROR_OTHER; | 1312 return LIBUSB_ERROR_OTHER; |
1284 } | 1313 } |
1285 | 1314 |
1286 » if (!sysfs_has_descriptors) { | 1315 » /* update our cached active config descriptor */ |
1287 » » /* update our cached active config descriptor */ | 1316 » priv->active_config = config; |
1288 » » if (config == -1) { | |
1289 » » » if (priv->config_descriptor) { | |
1290 » » » » free(priv->config_descriptor); | |
1291 » » » » priv->config_descriptor = NULL; | |
1292 » » » } | |
1293 » » } else { | |
1294 » » » r = cache_active_config(handle->dev, fd, config); | |
1295 » » » if (r < 0) | |
1296 » » » » usbi_warn(HANDLE_CTX(handle), | |
1297 » » » » » "failed to update cached config descript
or, error %d", r); | |
1298 » » } | |
1299 » } | |
1300 | 1317 |
1301 » return 0; | 1318 » return LIBUSB_SUCCESS; |
1302 } | 1319 } |
1303 | 1320 |
1304 static int op_claim_interface(struct libusb_device_handle *handle, int iface) | 1321 static int claim_interface(struct libusb_device_handle *handle, int iface) |
1305 { | 1322 { |
1306 int fd = _device_handle_priv(handle)->fd; | 1323 int fd = _device_handle_priv(handle)->fd; |
1307 int r = ioctl(fd, IOCTL_USBFS_CLAIMINTF, &iface); | 1324 int r = ioctl(fd, IOCTL_USBFS_CLAIMINTF, &iface); |
1308 if (r) { | 1325 if (r) { |
1309 if (errno == ENOENT) | 1326 if (errno == ENOENT) |
1310 return LIBUSB_ERROR_NOT_FOUND; | 1327 return LIBUSB_ERROR_NOT_FOUND; |
1311 else if (errno == EBUSY) | 1328 else if (errno == EBUSY) |
1312 return LIBUSB_ERROR_BUSY; | 1329 return LIBUSB_ERROR_BUSY; |
1313 else if (errno == ENODEV) | 1330 else if (errno == ENODEV) |
1314 return LIBUSB_ERROR_NO_DEVICE; | 1331 return LIBUSB_ERROR_NO_DEVICE; |
1315 | 1332 |
1316 usbi_err(HANDLE_CTX(handle), | 1333 usbi_err(HANDLE_CTX(handle), |
1317 "claim interface failed, error %d errno %d", r, errno); | 1334 "claim interface failed, error %d errno %d", r, errno); |
1318 return LIBUSB_ERROR_OTHER; | 1335 return LIBUSB_ERROR_OTHER; |
1319 } | 1336 } |
1320 return 0; | 1337 return 0; |
1321 } | 1338 } |
1322 | 1339 |
1323 static int op_release_interface(struct libusb_device_handle *handle, int iface) | 1340 static int release_interface(struct libusb_device_handle *handle, int iface) |
1324 { | 1341 { |
1325 int fd = _device_handle_priv(handle)->fd; | 1342 int fd = _device_handle_priv(handle)->fd; |
1326 int r = ioctl(fd, IOCTL_USBFS_RELEASEINTF, &iface); | 1343 int r = ioctl(fd, IOCTL_USBFS_RELEASEINTF, &iface); |
1327 if (r) { | 1344 if (r) { |
1328 if (errno == ENODEV) | 1345 if (errno == ENODEV) |
1329 return LIBUSB_ERROR_NO_DEVICE; | 1346 return LIBUSB_ERROR_NO_DEVICE; |
1330 | 1347 |
1331 usbi_err(HANDLE_CTX(handle), | 1348 usbi_err(HANDLE_CTX(handle), |
1332 "release interface failed, error %d errno %d", r, errno)
; | 1349 "release interface failed, error %d errno %d", r, errno)
; |
1333 return LIBUSB_ERROR_OTHER; | 1350 return LIBUSB_ERROR_OTHER; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1384 int fd = _device_handle_priv(handle)->fd; | 1401 int fd = _device_handle_priv(handle)->fd; |
1385 int i, r, ret = 0; | 1402 int i, r, ret = 0; |
1386 | 1403 |
1387 /* Doing a device reset will cause the usbfs driver to get unbound | 1404 /* Doing a device reset will cause the usbfs driver to get unbound |
1388 from any interfaces it is bound to. By voluntarily unbinding | 1405 from any interfaces it is bound to. By voluntarily unbinding |
1389 the usbfs driver ourself, we stop the kernel from rebinding | 1406 the usbfs driver ourself, we stop the kernel from rebinding |
1390 the interface after reset (which would end up with the interface | 1407 the interface after reset (which would end up with the interface |
1391 getting bound to the in kernel driver if any). */ | 1408 getting bound to the in kernel driver if any). */ |
1392 for (i = 0; i < USB_MAXINTERFACES; i++) { | 1409 for (i = 0; i < USB_MAXINTERFACES; i++) { |
1393 if (handle->claimed_interfaces & (1L << i)) { | 1410 if (handle->claimed_interfaces & (1L << i)) { |
1394 » » » op_release_interface(handle, i); | 1411 » » » release_interface(handle, i); |
1395 } | 1412 } |
1396 } | 1413 } |
1397 | 1414 |
1398 usbi_mutex_lock(&handle->lock); | 1415 usbi_mutex_lock(&handle->lock); |
1399 r = ioctl(fd, IOCTL_USBFS_RESET, NULL); | 1416 r = ioctl(fd, IOCTL_USBFS_RESET, NULL); |
1400 if (r) { | 1417 if (r) { |
1401 if (errno == ENODEV) { | 1418 if (errno == ENODEV) { |
1402 ret = LIBUSB_ERROR_NOT_FOUND; | 1419 ret = LIBUSB_ERROR_NOT_FOUND; |
1403 goto out; | 1420 goto out; |
1404 } | 1421 } |
1405 | 1422 |
1406 usbi_err(HANDLE_CTX(handle), | 1423 usbi_err(HANDLE_CTX(handle), |
1407 "reset failed error %d errno %d", r, errno); | 1424 "reset failed error %d errno %d", r, errno); |
1408 ret = LIBUSB_ERROR_OTHER; | 1425 ret = LIBUSB_ERROR_OTHER; |
1409 goto out; | 1426 goto out; |
1410 } | 1427 } |
1411 | 1428 |
1412 /* And re-claim any interfaces which were claimed before the reset */ | 1429 /* And re-claim any interfaces which were claimed before the reset */ |
1413 for (i = 0; i < USB_MAXINTERFACES; i++) { | 1430 for (i = 0; i < USB_MAXINTERFACES; i++) { |
1414 if (handle->claimed_interfaces & (1L << i)) { | 1431 if (handle->claimed_interfaces & (1L << i)) { |
1415 » » » r = op_claim_interface(handle, i); | 1432 » » » /* |
| 1433 » » » * A driver may have completed modprobing during |
| 1434 » » » * IOCTL_USBFS_RESET, and bound itself as soon as |
| 1435 » » » * IOCTL_USBFS_RESET released the device lock |
| 1436 » » » */ |
| 1437 » » » r = detach_kernel_driver_and_claim(handle, i); |
1416 if (r) { | 1438 if (r) { |
1417 usbi_warn(HANDLE_CTX(handle), | 1439 usbi_warn(HANDLE_CTX(handle), |
1418 » » » » » "failed to re-claim interface %d after r
eset", i); | 1440 » » » » » "failed to re-claim interface %d after r
eset: %s", |
| 1441 » » » » » i, libusb_error_name(r)); |
1419 handle->claimed_interfaces &= ~(1L << i); | 1442 handle->claimed_interfaces &= ~(1L << i); |
| 1443 ret = LIBUSB_ERROR_NOT_FOUND; |
1420 } | 1444 } |
1421 } | 1445 } |
1422 } | 1446 } |
1423 out: | 1447 out: |
1424 usbi_mutex_unlock(&handle->lock); | 1448 usbi_mutex_unlock(&handle->lock); |
1425 return ret; | 1449 return ret; |
1426 } | 1450 } |
1427 | 1451 |
1428 static int op_kernel_driver_active(struct libusb_device_handle *handle, | 1452 static int op_kernel_driver_active(struct libusb_device_handle *handle, |
1429 int interface) | 1453 int interface) |
1430 { | 1454 { |
1431 int fd = _device_handle_priv(handle)->fd; | 1455 int fd = _device_handle_priv(handle)->fd; |
1432 struct usbfs_getdriver getdrv; | 1456 struct usbfs_getdriver getdrv; |
1433 int r; | 1457 int r; |
1434 | 1458 |
1435 getdrv.interface = interface; | 1459 getdrv.interface = interface; |
1436 r = ioctl(fd, IOCTL_USBFS_GETDRIVER, &getdrv); | 1460 r = ioctl(fd, IOCTL_USBFS_GETDRIVER, &getdrv); |
1437 if (r) { | 1461 if (r) { |
1438 if (errno == ENODATA) | 1462 if (errno == ENODATA) |
1439 return 0; | 1463 return 0; |
1440 else if (errno == ENODEV) | 1464 else if (errno == ENODEV) |
1441 return LIBUSB_ERROR_NO_DEVICE; | 1465 return LIBUSB_ERROR_NO_DEVICE; |
1442 | 1466 |
1443 usbi_err(HANDLE_CTX(handle), | 1467 usbi_err(HANDLE_CTX(handle), |
1444 "get driver failed error %d errno %d", r, errno); | 1468 "get driver failed error %d errno %d", r, errno); |
1445 return LIBUSB_ERROR_OTHER; | 1469 return LIBUSB_ERROR_OTHER; |
1446 } | 1470 } |
1447 | 1471 |
1448 » return 1; | 1472 » return (strcmp(getdrv.driver, "usbfs") == 0) ? 0 : 1; |
1449 } | 1473 } |
1450 | 1474 |
1451 static int op_detach_kernel_driver(struct libusb_device_handle *handle, | 1475 static int op_detach_kernel_driver(struct libusb_device_handle *handle, |
1452 int interface) | 1476 int interface) |
1453 { | 1477 { |
1454 int fd = _device_handle_priv(handle)->fd; | 1478 int fd = _device_handle_priv(handle)->fd; |
1455 struct usbfs_ioctl command; | 1479 struct usbfs_ioctl command; |
| 1480 struct usbfs_getdriver getdrv; |
1456 int r; | 1481 int r; |
1457 | 1482 |
1458 command.ifno = interface; | 1483 command.ifno = interface; |
1459 command.ioctl_code = IOCTL_USBFS_DISCONNECT; | 1484 command.ioctl_code = IOCTL_USBFS_DISCONNECT; |
1460 command.data = NULL; | 1485 command.data = NULL; |
1461 | 1486 |
| 1487 getdrv.interface = interface; |
| 1488 r = ioctl(fd, IOCTL_USBFS_GETDRIVER, &getdrv); |
| 1489 if (r == 0 && strcmp(getdrv.driver, "usbfs") == 0) |
| 1490 return LIBUSB_ERROR_NOT_FOUND; |
| 1491 |
1462 r = ioctl(fd, IOCTL_USBFS_IOCTL, &command); | 1492 r = ioctl(fd, IOCTL_USBFS_IOCTL, &command); |
1463 if (r) { | 1493 if (r) { |
1464 if (errno == ENODATA) | 1494 if (errno == ENODATA) |
1465 return LIBUSB_ERROR_NOT_FOUND; | 1495 return LIBUSB_ERROR_NOT_FOUND; |
1466 else if (errno == EINVAL) | 1496 else if (errno == EINVAL) |
1467 return LIBUSB_ERROR_INVALID_PARAM; | 1497 return LIBUSB_ERROR_INVALID_PARAM; |
1468 else if (errno == ENODEV) | 1498 else if (errno == ENODEV) |
1469 return LIBUSB_ERROR_NO_DEVICE; | 1499 return LIBUSB_ERROR_NO_DEVICE; |
1470 | 1500 |
1471 usbi_err(HANDLE_CTX(handle), | 1501 usbi_err(HANDLE_CTX(handle), |
(...skipping 29 matching lines...) Expand all Loading... |
1501 usbi_err(HANDLE_CTX(handle), | 1531 usbi_err(HANDLE_CTX(handle), |
1502 "attach failed error %d errno %d", r, errno); | 1532 "attach failed error %d errno %d", r, errno); |
1503 return LIBUSB_ERROR_OTHER; | 1533 return LIBUSB_ERROR_OTHER; |
1504 } else if (r == 0) { | 1534 } else if (r == 0) { |
1505 return LIBUSB_ERROR_NOT_FOUND; | 1535 return LIBUSB_ERROR_NOT_FOUND; |
1506 } | 1536 } |
1507 | 1537 |
1508 return 0; | 1538 return 0; |
1509 } | 1539 } |
1510 | 1540 |
| 1541 static int detach_kernel_driver_and_claim(struct libusb_device_handle *handle, |
| 1542 int interface) |
| 1543 { |
| 1544 struct usbfs_disconnect_claim dc; |
| 1545 int r, fd = _device_handle_priv(handle)->fd; |
| 1546 |
| 1547 dc.interface = interface; |
| 1548 strcpy(dc.driver, "usbfs"); |
| 1549 dc.flags = USBFS_DISCONNECT_CLAIM_EXCEPT_DRIVER; |
| 1550 r = ioctl(fd, IOCTL_USBFS_DISCONNECT_CLAIM, &dc); |
| 1551 if (r == 0 || (r != 0 && errno != ENOTTY)) { |
| 1552 if (r == 0) |
| 1553 return 0; |
| 1554 |
| 1555 switch (errno) { |
| 1556 case EBUSY: |
| 1557 return LIBUSB_ERROR_BUSY; |
| 1558 case EINVAL: |
| 1559 return LIBUSB_ERROR_INVALID_PARAM; |
| 1560 case ENODEV: |
| 1561 return LIBUSB_ERROR_NO_DEVICE; |
| 1562 } |
| 1563 usbi_err(HANDLE_CTX(handle), |
| 1564 "disconnect-and-claim failed errno %d", errno); |
| 1565 return LIBUSB_ERROR_OTHER; |
| 1566 } |
| 1567 |
| 1568 /* Fallback code for kernels which don't support the |
| 1569 disconnect-and-claim ioctl */ |
| 1570 r = op_detach_kernel_driver(handle, interface); |
| 1571 if (r != 0 && r != LIBUSB_ERROR_NOT_FOUND) |
| 1572 return r; |
| 1573 |
| 1574 return claim_interface(handle, interface); |
| 1575 } |
| 1576 |
| 1577 static int op_claim_interface(struct libusb_device_handle *handle, int iface) |
| 1578 { |
| 1579 if (handle->auto_detach_kernel_driver) |
| 1580 return detach_kernel_driver_and_claim(handle, iface); |
| 1581 else |
| 1582 return claim_interface(handle, iface); |
| 1583 } |
| 1584 |
| 1585 static int op_release_interface(struct libusb_device_handle *handle, int iface) |
| 1586 { |
| 1587 int r; |
| 1588 |
| 1589 r = release_interface(handle, iface); |
| 1590 if (r) |
| 1591 return r; |
| 1592 |
| 1593 if (handle->auto_detach_kernel_driver) |
| 1594 op_attach_kernel_driver(handle, iface); |
| 1595 |
| 1596 return 0; |
| 1597 } |
| 1598 |
1511 static void op_destroy_device(struct libusb_device *dev) | 1599 static void op_destroy_device(struct libusb_device *dev) |
1512 { | 1600 { |
1513 struct linux_device_priv *priv = _device_priv(dev); | 1601 struct linux_device_priv *priv = _device_priv(dev); |
1514 » if (!sysfs_has_descriptors) { | 1602 » if (priv->descriptors) |
1515 » » if (priv->dev_descriptor) | 1603 » » free(priv->descriptors); |
1516 » » » free(priv->dev_descriptor); | |
1517 » » if (priv->config_descriptor) | |
1518 » » » free(priv->config_descriptor); | |
1519 » } | |
1520 if (priv->sysfs_dir) | 1604 if (priv->sysfs_dir) |
1521 free(priv->sysfs_dir); | 1605 free(priv->sysfs_dir); |
1522 } | 1606 } |
1523 | 1607 |
1524 /* URBs are discarded in reverse order of submission to avoid races. */ | 1608 /* URBs are discarded in reverse order of submission to avoid races. */ |
1525 static int discard_urbs(struct usbi_transfer *itransfer, int first, int last_plu
s_one) | 1609 static int discard_urbs(struct usbi_transfer *itransfer, int first, int last_plu
s_one) |
1526 { | 1610 { |
1527 struct libusb_transfer *transfer = | 1611 struct libusb_transfer *transfer = |
1528 USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); | 1612 USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); |
1529 struct linux_transfer_priv *tpriv = | 1613 struct linux_transfer_priv *tpriv = |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1576 unsigned char urb_type) | 1660 unsigned char urb_type) |
1577 { | 1661 { |
1578 struct libusb_transfer *transfer = | 1662 struct libusb_transfer *transfer = |
1579 USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); | 1663 USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); |
1580 struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer)
; | 1664 struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer)
; |
1581 struct linux_device_handle_priv *dpriv = | 1665 struct linux_device_handle_priv *dpriv = |
1582 _device_handle_priv(transfer->dev_handle); | 1666 _device_handle_priv(transfer->dev_handle); |
1583 struct usbfs_urb *urbs; | 1667 struct usbfs_urb *urbs; |
1584 int is_out = (transfer->endpoint & LIBUSB_ENDPOINT_DIR_MASK) | 1668 int is_out = (transfer->endpoint & LIBUSB_ENDPOINT_DIR_MASK) |
1585 == LIBUSB_ENDPOINT_OUT; | 1669 == LIBUSB_ENDPOINT_OUT; |
| 1670 int bulk_buffer_len, use_bulk_continuation; |
1586 int r; | 1671 int r; |
1587 int i; | 1672 int i; |
1588 size_t alloc_size; | 1673 size_t alloc_size; |
1589 | 1674 |
1590 if (tpriv->urbs) | 1675 if (tpriv->urbs) |
1591 return LIBUSB_ERROR_BUSY; | 1676 return LIBUSB_ERROR_BUSY; |
1592 | 1677 |
1593 » if (is_out && transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET && | 1678 » if (is_out && (transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) && |
1594 » !supports_flag_zero_packet) | 1679 » » » !(dpriv->caps & USBFS_CAP_ZERO_PACKET)) |
1595 return LIBUSB_ERROR_NOT_SUPPORTED; | 1680 return LIBUSB_ERROR_NOT_SUPPORTED; |
1596 | 1681 |
1597 » /* usbfs places a 16kb limit on bulk URBs. we divide up larger requests | 1682 » /* |
1598 » * into smaller units to meet such restriction, then fire off all the | 1683 » * Older versions of usbfs place a 16kb limit on bulk URBs. We work |
1599 » * units at once. it would be simpler if we just fired one unit at a tim
e, | 1684 » * around this by splitting large transfers into 16k blocks, and then |
1600 » * but there is a big performance gain through doing it this way. */ | 1685 » * submit all urbs at once. it would be simpler to submit one urb at |
1601 » int num_urbs = transfer->length / MAX_BULK_BUFFER_LENGTH; | 1686 » * a time, but there is a big performance gain doing it this way. |
| 1687 » * |
| 1688 » * Newer versions lift the 16k limit (USBFS_CAP_NO_PACKET_SIZE_LIM), |
| 1689 » * using arbritary large transfers can still be a bad idea though, as |
| 1690 » * the kernel needs to allocate physical contiguous memory for this, |
| 1691 » * which may fail for large buffers. |
| 1692 » * |
| 1693 » * The kernel solves this problem by splitting the transfer into |
| 1694 » * blocks itself when the host-controller is scatter-gather capable |
| 1695 » * (USBFS_CAP_BULK_SCATTER_GATHER), which most controllers are. |
| 1696 » * |
| 1697 » * Last, there is the issue of short-transfers when splitting, for |
| 1698 » * short split-transfers to work reliable USBFS_CAP_BULK_CONTINUATION |
| 1699 » * is needed, but this is not always available. |
| 1700 » */ |
| 1701 » if (dpriv->caps & USBFS_CAP_BULK_SCATTER_GATHER) { |
| 1702 » » /* Good! Just submit everything in one go */ |
| 1703 » » bulk_buffer_len = transfer->length ? transfer->length : 1; |
| 1704 » » use_bulk_continuation = 0; |
| 1705 » } else if (dpriv->caps & USBFS_CAP_BULK_CONTINUATION) { |
| 1706 » » /* Split the transfers and use bulk-continuation to |
| 1707 » » avoid issues with short-transfers */ |
| 1708 » » bulk_buffer_len = MAX_BULK_BUFFER_LENGTH; |
| 1709 » » use_bulk_continuation = 1; |
| 1710 » } else if (dpriv->caps & USBFS_CAP_NO_PACKET_SIZE_LIM) { |
| 1711 » » /* Don't split, assume the kernel can alloc the buffer |
| 1712 » » (otherwise the submit will fail with -ENOMEM) */ |
| 1713 » » bulk_buffer_len = transfer->length ? transfer->length : 1; |
| 1714 » » use_bulk_continuation = 0; |
| 1715 » } else { |
| 1716 » » /* Bad, splitting without bulk-continuation, short transfers |
| 1717 » » which end before the last urb will not work reliable! */ |
| 1718 » » /* Note we don't warn here as this is "normal" on kernels < |
| 1719 » » 2.6.32 and not a problem for most applications */ |
| 1720 » » bulk_buffer_len = MAX_BULK_BUFFER_LENGTH; |
| 1721 » » use_bulk_continuation = 0; |
| 1722 » } |
| 1723 |
| 1724 » int num_urbs = transfer->length / bulk_buffer_len; |
1602 int last_urb_partial = 0; | 1725 int last_urb_partial = 0; |
1603 | 1726 |
1604 if (transfer->length == 0) { | 1727 if (transfer->length == 0) { |
1605 num_urbs = 1; | 1728 num_urbs = 1; |
1606 » } else if ((transfer->length % MAX_BULK_BUFFER_LENGTH) > 0) { | 1729 » } else if ((transfer->length % bulk_buffer_len) > 0) { |
1607 last_urb_partial = 1; | 1730 last_urb_partial = 1; |
1608 num_urbs++; | 1731 num_urbs++; |
1609 } | 1732 } |
1610 usbi_dbg("need %d urbs for new transfer with length %d", num_urbs, | 1733 usbi_dbg("need %d urbs for new transfer with length %d", num_urbs, |
1611 transfer->length); | 1734 transfer->length); |
1612 alloc_size = num_urbs * sizeof(struct usbfs_urb); | 1735 alloc_size = num_urbs * sizeof(struct usbfs_urb); |
1613 » urbs = malloc(alloc_size); | 1736 » urbs = calloc(1, alloc_size); |
1614 if (!urbs) | 1737 if (!urbs) |
1615 return LIBUSB_ERROR_NO_MEM; | 1738 return LIBUSB_ERROR_NO_MEM; |
1616 memset(urbs, 0, alloc_size); | |
1617 tpriv->urbs = urbs; | 1739 tpriv->urbs = urbs; |
1618 tpriv->num_urbs = num_urbs; | 1740 tpriv->num_urbs = num_urbs; |
1619 tpriv->num_retired = 0; | 1741 tpriv->num_retired = 0; |
1620 tpriv->reap_action = NORMAL; | 1742 tpriv->reap_action = NORMAL; |
1621 tpriv->reap_status = LIBUSB_TRANSFER_COMPLETED; | 1743 tpriv->reap_status = LIBUSB_TRANSFER_COMPLETED; |
1622 | 1744 |
1623 for (i = 0; i < num_urbs; i++) { | 1745 for (i = 0; i < num_urbs; i++) { |
1624 struct usbfs_urb *urb = &urbs[i]; | 1746 struct usbfs_urb *urb = &urbs[i]; |
1625 urb->usercontext = itransfer; | 1747 urb->usercontext = itransfer; |
1626 urb->type = urb_type; | 1748 urb->type = urb_type; |
1627 urb->endpoint = transfer->endpoint; | 1749 urb->endpoint = transfer->endpoint; |
1628 » » urb->buffer = transfer->buffer + (i * MAX_BULK_BUFFER_LENGTH); | 1750 » » urb->buffer = transfer->buffer + (i * bulk_buffer_len); |
1629 » » if (supports_flag_bulk_continuation && !is_out) | 1751 » » /* don't set the short not ok flag for the last URB */ |
| 1752 » » if (use_bulk_continuation && !is_out && (i < num_urbs - 1)) |
1630 urb->flags = USBFS_URB_SHORT_NOT_OK; | 1753 urb->flags = USBFS_URB_SHORT_NOT_OK; |
1631 if (i == num_urbs - 1 && last_urb_partial) | 1754 if (i == num_urbs - 1 && last_urb_partial) |
1632 » » » urb->buffer_length = transfer->length % MAX_BULK_BUFFER_
LENGTH; | 1755 » » » urb->buffer_length = transfer->length % bulk_buffer_len; |
1633 else if (transfer->length == 0) | 1756 else if (transfer->length == 0) |
1634 urb->buffer_length = 0; | 1757 urb->buffer_length = 0; |
1635 else | 1758 else |
1636 » » » urb->buffer_length = MAX_BULK_BUFFER_LENGTH; | 1759 » » » urb->buffer_length = bulk_buffer_len; |
1637 | 1760 |
1638 » » if (i > 0 && supports_flag_bulk_continuation) | 1761 » » if (i > 0 && use_bulk_continuation) |
1639 urb->flags |= USBFS_URB_BULK_CONTINUATION; | 1762 urb->flags |= USBFS_URB_BULK_CONTINUATION; |
1640 | 1763 |
1641 /* we have already checked that the flag is supported */ | 1764 /* we have already checked that the flag is supported */ |
1642 if (is_out && i == num_urbs - 1 && | 1765 if (is_out && i == num_urbs - 1 && |
1643 transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) | 1766 transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) |
1644 urb->flags |= USBFS_URB_ZERO_PACKET; | 1767 urb->flags |= USBFS_URB_ZERO_PACKET; |
1645 | 1768 |
1646 r = ioctl(dpriv->fd, IOCTL_USBFS_SUBMITURB, urb); | 1769 r = ioctl(dpriv->fd, IOCTL_USBFS_SUBMITURB, urb); |
1647 if (r < 0) { | 1770 if (r < 0) { |
1648 if (errno == ENODEV) { | 1771 if (errno == ENODEV) { |
(...skipping 11 matching lines...) Expand all Loading... |
1660 free(urbs); | 1783 free(urbs); |
1661 tpriv->urbs = NULL; | 1784 tpriv->urbs = NULL; |
1662 return r; | 1785 return r; |
1663 } | 1786 } |
1664 | 1787 |
1665 /* if it's not the first URB that failed, the situation
is a bit | 1788 /* if it's not the first URB that failed, the situation
is a bit |
1666 * tricky. we may need to discard all previous URBs. the
re are | 1789 * tricky. we may need to discard all previous URBs. the
re are |
1667 * complications: | 1790 * complications: |
1668 * - discarding is asynchronous - discarded urbs will b
e reaped | 1791 * - discarding is asynchronous - discarded urbs will b
e reaped |
1669 * later. the user must not have freed the transfer w
hen the | 1792 * later. the user must not have freed the transfer w
hen the |
1670 » » » * discarded URBs are reaped, otherwise libusb will b
e using | 1793 » » » * discarded URBs are reaped, otherwise libusbx will
be using |
1671 * freed memory. | 1794 * freed memory. |
1672 * - the earlier URBs may have completed successfully a
nd we do | 1795 * - the earlier URBs may have completed successfully a
nd we do |
1673 * not want to throw away any data. | 1796 * not want to throw away any data. |
1674 * - this URB failing may be no error; EREMOTEIO means
that | 1797 * - this URB failing may be no error; EREMOTEIO means
that |
1675 * this transfer simply didn't need all the URBs we s
ubmitted | 1798 * this transfer simply didn't need all the URBs we s
ubmitted |
1676 * so, we report that the transfer was submitted success
fully and | 1799 * so, we report that the transfer was submitted success
fully and |
1677 * in case of error we discard all previous URBs. later
when | 1800 * in case of error we discard all previous URBs. later
when |
1678 * the final reap completes we can report error to the u
ser, | 1801 * the final reap completes we can report error to the u
ser, |
1679 * or success if an earlier URB was completed successful
ly. | 1802 * or success if an earlier URB was completed successful
ly. |
1680 */ | 1803 */ |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1715 int packet_offset = 0; | 1838 int packet_offset = 0; |
1716 unsigned int packet_len; | 1839 unsigned int packet_len; |
1717 unsigned char *urb_buffer = transfer->buffer; | 1840 unsigned char *urb_buffer = transfer->buffer; |
1718 | 1841 |
1719 if (tpriv->iso_urbs) | 1842 if (tpriv->iso_urbs) |
1720 return LIBUSB_ERROR_BUSY; | 1843 return LIBUSB_ERROR_BUSY; |
1721 | 1844 |
1722 /* usbfs places a 32kb limit on iso URBs. we divide up larger requests | 1845 /* usbfs places a 32kb limit on iso URBs. we divide up larger requests |
1723 * into smaller units to meet such restriction, then fire off all the | 1846 * into smaller units to meet such restriction, then fire off all the |
1724 * units at once. it would be simpler if we just fired one unit at a tim
e, | 1847 * units at once. it would be simpler if we just fired one unit at a tim
e, |
1725 » * but there is a big performance gain through doing it this way. */ | 1848 » * but there is a big performance gain through doing it this way. |
| 1849 » * |
| 1850 » * Newer kernels lift the 32k limit (USBFS_CAP_NO_PACKET_SIZE_LIM), |
| 1851 » * using arbritary large transfers is still be a bad idea though, as |
| 1852 » * the kernel needs to allocate physical contiguous memory for this, |
| 1853 » * which may fail for large buffers. |
| 1854 » */ |
1726 | 1855 |
1727 /* calculate how many URBs we need */ | 1856 /* calculate how many URBs we need */ |
1728 for (i = 0; i < num_packets; i++) { | 1857 for (i = 0; i < num_packets; i++) { |
1729 » » int space_remaining = MAX_ISO_BUFFER_LENGTH - this_urb_len; | 1858 » » unsigned int space_remaining = MAX_ISO_BUFFER_LENGTH - this_urb_
len; |
1730 packet_len = transfer->iso_packet_desc[i].length; | 1859 packet_len = transfer->iso_packet_desc[i].length; |
1731 | 1860 |
1732 if (packet_len > space_remaining) { | 1861 if (packet_len > space_remaining) { |
1733 num_urbs++; | 1862 num_urbs++; |
1734 this_urb_len = packet_len; | 1863 this_urb_len = packet_len; |
1735 } else { | 1864 } else { |
1736 this_urb_len += packet_len; | 1865 this_urb_len += packet_len; |
1737 } | 1866 } |
1738 } | 1867 } |
1739 usbi_dbg("need %d 32k URBs for transfer", num_urbs); | 1868 usbi_dbg("need %d 32k URBs for transfer", num_urbs); |
1740 | 1869 |
1741 alloc_size = num_urbs * sizeof(*urbs); | 1870 alloc_size = num_urbs * sizeof(*urbs); |
1742 » urbs = malloc(alloc_size); | 1871 » urbs = calloc(1, alloc_size); |
1743 if (!urbs) | 1872 if (!urbs) |
1744 return LIBUSB_ERROR_NO_MEM; | 1873 return LIBUSB_ERROR_NO_MEM; |
1745 memset(urbs, 0, alloc_size); | |
1746 | 1874 |
1747 tpriv->iso_urbs = urbs; | 1875 tpriv->iso_urbs = urbs; |
1748 tpriv->num_urbs = num_urbs; | 1876 tpriv->num_urbs = num_urbs; |
1749 tpriv->num_retired = 0; | 1877 tpriv->num_retired = 0; |
1750 tpriv->reap_action = NORMAL; | 1878 tpriv->reap_action = NORMAL; |
1751 tpriv->iso_packet_offset = 0; | 1879 tpriv->iso_packet_offset = 0; |
1752 | 1880 |
1753 /* allocate + initialize each URB with the correct number of packets */ | 1881 /* allocate + initialize each URB with the correct number of packets */ |
1754 for (i = 0; i < num_urbs; i++) { | 1882 for (i = 0; i < num_urbs; i++) { |
1755 struct usbfs_urb *urb; | 1883 struct usbfs_urb *urb; |
1756 » » int space_remaining_in_urb = MAX_ISO_BUFFER_LENGTH; | 1884 » » unsigned int space_remaining_in_urb = MAX_ISO_BUFFER_LENGTH; |
1757 int urb_packet_offset = 0; | 1885 int urb_packet_offset = 0; |
1758 unsigned char *urb_buffer_orig = urb_buffer; | 1886 unsigned char *urb_buffer_orig = urb_buffer; |
1759 int j; | 1887 int j; |
1760 int k; | 1888 int k; |
1761 | 1889 |
1762 /* swallow up all the packets we can fit into this URB */ | 1890 /* swallow up all the packets we can fit into this URB */ |
1763 while (packet_offset < transfer->num_iso_packets) { | 1891 while (packet_offset < transfer->num_iso_packets) { |
1764 packet_len = transfer->iso_packet_desc[packet_offset].le
ngth; | 1892 packet_len = transfer->iso_packet_desc[packet_offset].le
ngth; |
1765 if (packet_len <= space_remaining_in_urb) { | 1893 if (packet_len <= space_remaining_in_urb) { |
1766 /* throw it in */ | 1894 /* throw it in */ |
1767 urb_packet_offset++; | 1895 urb_packet_offset++; |
1768 packet_offset++; | 1896 packet_offset++; |
1769 space_remaining_in_urb -= packet_len; | 1897 space_remaining_in_urb -= packet_len; |
1770 urb_buffer += packet_len; | 1898 urb_buffer += packet_len; |
1771 } else { | 1899 } else { |
1772 /* it can't fit, save it for the next URB */ | 1900 /* it can't fit, save it for the next URB */ |
1773 break; | 1901 break; |
1774 } | 1902 } |
1775 } | 1903 } |
1776 | 1904 |
1777 alloc_size = sizeof(*urb) | 1905 alloc_size = sizeof(*urb) |
1778 + (urb_packet_offset * sizeof(struct usbfs_iso_packet_de
sc)); | 1906 + (urb_packet_offset * sizeof(struct usbfs_iso_packet_de
sc)); |
1779 » » urb = malloc(alloc_size); | 1907 » » urb = calloc(1, alloc_size); |
1780 if (!urb) { | 1908 if (!urb) { |
1781 free_iso_urbs(tpriv); | 1909 free_iso_urbs(tpriv); |
1782 return LIBUSB_ERROR_NO_MEM; | 1910 return LIBUSB_ERROR_NO_MEM; |
1783 } | 1911 } |
1784 memset(urb, 0, alloc_size); | |
1785 urbs[i] = urb; | 1912 urbs[i] = urb; |
1786 | 1913 |
1787 /* populate packet lengths */ | 1914 /* populate packet lengths */ |
1788 for (j = 0, k = packet_offset - urb_packet_offset; | 1915 for (j = 0, k = packet_offset - urb_packet_offset; |
1789 k < packet_offset; k++, j++) { | 1916 k < packet_offset; k++, j++) { |
1790 packet_len = transfer->iso_packet_desc[k].length; | 1917 packet_len = transfer->iso_packet_desc[k].length; |
1791 urb->iso_frame_desc[j].length = packet_len; | 1918 urb->iso_frame_desc[j].length = packet_len; |
1792 } | 1919 } |
1793 | 1920 |
1794 urb->usercontext = itransfer; | 1921 urb->usercontext = itransfer; |
(...skipping 23 matching lines...) Expand all Loading... |
1818 usbi_dbg("first URB failed, easy peasy"); | 1945 usbi_dbg("first URB failed, easy peasy"); |
1819 free_iso_urbs(tpriv); | 1946 free_iso_urbs(tpriv); |
1820 return r; | 1947 return r; |
1821 } | 1948 } |
1822 | 1949 |
1823 /* if it's not the first URB that failed, the situation
is a bit | 1950 /* if it's not the first URB that failed, the situation
is a bit |
1824 * tricky. we must discard all previous URBs. there are | 1951 * tricky. we must discard all previous URBs. there are |
1825 * complications: | 1952 * complications: |
1826 * - discarding is asynchronous - discarded urbs will b
e reaped | 1953 * - discarding is asynchronous - discarded urbs will b
e reaped |
1827 * later. the user must not have freed the transfer w
hen the | 1954 * later. the user must not have freed the transfer w
hen the |
1828 » » » * discarded URBs are reaped, otherwise libusb will b
e using | 1955 » » » * discarded URBs are reaped, otherwise libusbx will
be using |
1829 * freed memory. | 1956 * freed memory. |
1830 * - the earlier URBs may have completed successfully a
nd we do | 1957 * - the earlier URBs may have completed successfully a
nd we do |
1831 * not want to throw away any data. | 1958 * not want to throw away any data. |
1832 * so, in this case we discard all the previous URBs BUT
we report | 1959 * so, in this case we discard all the previous URBs BUT
we report |
1833 * that the transfer was submitted successfully. then la
ter when | 1960 * that the transfer was submitted successfully. then la
ter when |
1834 * the final discard completes we can report error to th
e user. | 1961 * the final discard completes we can report error to th
e user. |
1835 */ | 1962 */ |
1836 tpriv->reap_action = SUBMIT_FAILED; | 1963 tpriv->reap_action = SUBMIT_FAILED; |
1837 | 1964 |
1838 /* The URBs we haven't submitted yet we count as already | 1965 /* The URBs we haven't submitted yet we count as already |
(...skipping 19 matching lines...) Expand all Loading... |
1858 _device_handle_priv(transfer->dev_handle); | 1985 _device_handle_priv(transfer->dev_handle); |
1859 struct usbfs_urb *urb; | 1986 struct usbfs_urb *urb; |
1860 int r; | 1987 int r; |
1861 | 1988 |
1862 if (tpriv->urbs) | 1989 if (tpriv->urbs) |
1863 return LIBUSB_ERROR_BUSY; | 1990 return LIBUSB_ERROR_BUSY; |
1864 | 1991 |
1865 if (transfer->length - LIBUSB_CONTROL_SETUP_SIZE > MAX_CTRL_BUFFER_LENGT
H) | 1992 if (transfer->length - LIBUSB_CONTROL_SETUP_SIZE > MAX_CTRL_BUFFER_LENGT
H) |
1866 return LIBUSB_ERROR_INVALID_PARAM; | 1993 return LIBUSB_ERROR_INVALID_PARAM; |
1867 | 1994 |
1868 » urb = malloc(sizeof(struct usbfs_urb)); | 1995 » urb = calloc(1, sizeof(struct usbfs_urb)); |
1869 if (!urb) | 1996 if (!urb) |
1870 return LIBUSB_ERROR_NO_MEM; | 1997 return LIBUSB_ERROR_NO_MEM; |
1871 memset(urb, 0, sizeof(struct usbfs_urb)); | |
1872 tpriv->urbs = urb; | 1998 tpriv->urbs = urb; |
1873 tpriv->num_urbs = 1; | 1999 tpriv->num_urbs = 1; |
1874 tpriv->reap_action = NORMAL; | 2000 tpriv->reap_action = NORMAL; |
1875 | 2001 |
1876 urb->usercontext = itransfer; | 2002 urb->usercontext = itransfer; |
1877 urb->type = USBFS_URB_TYPE_CONTROL; | 2003 urb->type = USBFS_URB_TYPE_CONTROL; |
1878 urb->endpoint = transfer->endpoint; | 2004 urb->endpoint = transfer->endpoint; |
1879 urb->buffer = transfer->buffer; | 2005 urb->buffer = transfer->buffer; |
1880 urb->buffer_length = transfer->length; | 2006 urb->buffer_length = transfer->length; |
1881 | 2007 |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1994 * 1. while the kernel is cancelling all the packets that make u
p an | 2120 * 1. while the kernel is cancelling all the packets that make u
p an |
1995 * URB, a few of them might complete. so we get back a succes
sful | 2121 * URB, a few of them might complete. so we get back a succes
sful |
1996 * cancellation *and* some data. | 2122 * cancellation *and* some data. |
1997 * 2. we receive a short URB which marks the early completion co
ndition, | 2123 * 2. we receive a short URB which marks the early completion co
ndition, |
1998 * so we start cancelling the remaining URBs. however, we're
too | 2124 * so we start cancelling the remaining URBs. however, we're
too |
1999 * slow and another URB completes (or at least completes part
ially). | 2125 * slow and another URB completes (or at least completes part
ially). |
2000 * (this can't happen since we always use BULK_CONTINUATION.) | 2126 * (this can't happen since we always use BULK_CONTINUATION.) |
2001 * | 2127 * |
2002 * When this happens, our objectives are not to lose any "surplu
s" data, | 2128 * When this happens, our objectives are not to lose any "surplu
s" data, |
2003 * and also to stick it at the end of the previously-received da
ta | 2129 * and also to stick it at the end of the previously-received da
ta |
2004 » » * (closing any holes), so that libusb reports the total amount
of | 2130 » » * (closing any holes), so that libusbx reports the total amount
of |
2005 * transferred data and presents it in a contiguous chunk. | 2131 * transferred data and presents it in a contiguous chunk. |
2006 */ | 2132 */ |
2007 if (urb->actual_length > 0) { | 2133 if (urb->actual_length > 0) { |
2008 unsigned char *target = transfer->buffer + itransfer->tr
ansferred; | 2134 unsigned char *target = transfer->buffer + itransfer->tr
ansferred; |
2009 usbi_dbg("received %d bytes of surplus data", urb->actua
l_length); | 2135 usbi_dbg("received %d bytes of surplus data", urb->actua
l_length); |
2010 if (urb->buffer != target) { | 2136 if (urb->buffer != target) { |
2011 usbi_dbg("moving surplus data from offset %d to
offset %d", | 2137 usbi_dbg("moving surplus data from offset %d to
offset %d", |
2012 (unsigned char *) urb->buffer - transfer
->buffer, | 2138 (unsigned char *) urb->buffer - transfer
->buffer, |
2013 target - transfer->buffer); | 2139 target - transfer->buffer); |
2014 memmove(target, urb->buffer, urb->actual_length)
; | 2140 memmove(target, urb->buffer, urb->actual_length)
; |
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2328 usbi_err(HANDLE_CTX(handle), "unrecognised endpoint type %x", | 2454 usbi_err(HANDLE_CTX(handle), "unrecognised endpoint type %x", |
2329 transfer->type); | 2455 transfer->type); |
2330 return LIBUSB_ERROR_OTHER; | 2456 return LIBUSB_ERROR_OTHER; |
2331 } | 2457 } |
2332 } | 2458 } |
2333 | 2459 |
2334 static int op_handle_events(struct libusb_context *ctx, | 2460 static int op_handle_events(struct libusb_context *ctx, |
2335 struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) | 2461 struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) |
2336 { | 2462 { |
2337 int r; | 2463 int r; |
2338 » int i = 0; | 2464 » unsigned int i = 0; |
2339 | 2465 |
2340 usbi_mutex_lock(&ctx->open_devs_lock); | 2466 usbi_mutex_lock(&ctx->open_devs_lock); |
2341 for (i = 0; i < nfds && num_ready > 0; i++) { | 2467 for (i = 0; i < nfds && num_ready > 0; i++) { |
2342 struct pollfd *pollfd = &fds[i]; | 2468 struct pollfd *pollfd = &fds[i]; |
2343 struct libusb_device_handle *handle; | 2469 struct libusb_device_handle *handle; |
2344 struct linux_device_handle_priv *hpriv = NULL; | 2470 struct linux_device_handle_priv *hpriv = NULL; |
2345 | 2471 |
2346 if (!pollfd->revents) | 2472 if (!pollfd->revents) |
2347 continue; | 2473 continue; |
2348 | 2474 |
2349 num_ready--; | 2475 num_ready--; |
2350 list_for_each_entry(handle, &ctx->open_devs, list, struct libusb
_device_handle) { | 2476 list_for_each_entry(handle, &ctx->open_devs, list, struct libusb
_device_handle) { |
2351 hpriv = _device_handle_priv(handle); | 2477 hpriv = _device_handle_priv(handle); |
2352 if (hpriv->fd == pollfd->fd) | 2478 if (hpriv->fd == pollfd->fd) |
2353 break; | 2479 break; |
2354 } | 2480 } |
2355 | 2481 |
2356 if (pollfd->revents & POLLERR) { | 2482 if (pollfd->revents & POLLERR) { |
2357 usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->fd); | 2483 usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->fd); |
2358 usbi_handle_disconnect(handle); | 2484 usbi_handle_disconnect(handle); |
2359 continue; | 2485 continue; |
2360 } | 2486 } |
2361 | 2487 |
2362 » » r = reap_for_handle(handle); | 2488 » » do { |
| 2489 » » » r = reap_for_handle(handle); |
| 2490 » » } while (r == 0); |
2363 if (r == 1 || r == LIBUSB_ERROR_NO_DEVICE) | 2491 if (r == 1 || r == LIBUSB_ERROR_NO_DEVICE) |
2364 continue; | 2492 continue; |
2365 else if (r < 0) | 2493 else if (r < 0) |
2366 goto out; | 2494 goto out; |
2367 } | 2495 } |
2368 | 2496 |
2369 r = 0; | 2497 r = 0; |
2370 out: | 2498 out: |
2371 usbi_mutex_unlock(&ctx->open_devs_lock); | 2499 usbi_mutex_unlock(&ctx->open_devs_lock); |
2372 return r; | 2500 return r; |
(...skipping 14 matching lines...) Expand all Loading... |
2387 #ifdef USBI_TIMERFD_AVAILABLE | 2515 #ifdef USBI_TIMERFD_AVAILABLE |
2388 static clockid_t op_get_timerfd_clockid(void) | 2516 static clockid_t op_get_timerfd_clockid(void) |
2389 { | 2517 { |
2390 return monotonic_clkid; | 2518 return monotonic_clkid; |
2391 | 2519 |
2392 } | 2520 } |
2393 #endif | 2521 #endif |
2394 | 2522 |
2395 const struct usbi_os_backend linux_usbfs_backend = { | 2523 const struct usbi_os_backend linux_usbfs_backend = { |
2396 .name = "Linux usbfs", | 2524 .name = "Linux usbfs", |
| 2525 .caps = USBI_CAP_HAS_HID_ACCESS|USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER, |
2397 .init = op_init, | 2526 .init = op_init, |
2398 » .exit = NULL, | 2527 » .exit = op_exit, |
2399 » .get_device_list = op_get_device_list, | 2528 » .get_device_list = NULL, |
| 2529 » .hotplug_poll = op_hotplug_poll, |
2400 .get_device_descriptor = op_get_device_descriptor, | 2530 .get_device_descriptor = op_get_device_descriptor, |
2401 .get_active_config_descriptor = op_get_active_config_descriptor, | 2531 .get_active_config_descriptor = op_get_active_config_descriptor, |
2402 .get_config_descriptor = op_get_config_descriptor, | 2532 .get_config_descriptor = op_get_config_descriptor, |
| 2533 .get_config_descriptor_by_value = op_get_config_descriptor_by_value, |
2403 | 2534 |
2404 .open = op_open, | 2535 .open = op_open, |
2405 .close = op_close, | 2536 .close = op_close, |
2406 .get_configuration = op_get_configuration, | 2537 .get_configuration = op_get_configuration, |
2407 .set_configuration = op_set_configuration, | 2538 .set_configuration = op_set_configuration, |
2408 .claim_interface = op_claim_interface, | 2539 .claim_interface = op_claim_interface, |
2409 .release_interface = op_release_interface, | 2540 .release_interface = op_release_interface, |
2410 | 2541 |
2411 .set_interface_altsetting = op_set_interface, | 2542 .set_interface_altsetting = op_set_interface, |
2412 .clear_halt = op_clear_halt, | 2543 .clear_halt = op_clear_halt, |
(...skipping 15 matching lines...) Expand all Loading... |
2428 | 2559 |
2429 #ifdef USBI_TIMERFD_AVAILABLE | 2560 #ifdef USBI_TIMERFD_AVAILABLE |
2430 .get_timerfd_clockid = op_get_timerfd_clockid, | 2561 .get_timerfd_clockid = op_get_timerfd_clockid, |
2431 #endif | 2562 #endif |
2432 | 2563 |
2433 .device_priv_size = sizeof(struct linux_device_priv), | 2564 .device_priv_size = sizeof(struct linux_device_priv), |
2434 .device_handle_priv_size = sizeof(struct linux_device_handle_priv), | 2565 .device_handle_priv_size = sizeof(struct linux_device_handle_priv), |
2435 .transfer_priv_size = sizeof(struct linux_transfer_priv), | 2566 .transfer_priv_size = sizeof(struct linux_transfer_priv), |
2436 .add_iso_packet_size = 0, | 2567 .add_iso_packet_size = 0, |
2437 }; | 2568 }; |
2438 | |
OLD | NEW |