libusb 0.3.4 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (136) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/Gemfile +1 -0
  5. data/History.md +10 -0
  6. data/README.md +19 -6
  7. data/Rakefile +1 -1
  8. data/ext/extconf.rb +17 -1
  9. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/AUTHORS +18 -6
  10. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/COPYING +0 -0
  11. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/ChangeLog +58 -1
  12. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/INSTALL +0 -0
  13. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/Makefile.am +6 -1
  14. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/Makefile.in +248 -174
  15. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/NEWS +2 -2
  16. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/PORTING +0 -0
  17. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/README +2 -1
  18. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/TODO +0 -0
  19. data/ext/libusbx-1.0.17/Xcode/common.xcconfig +40 -0
  20. data/ext/libusbx-1.0.17/Xcode/config.h +28 -0
  21. data/ext/libusbx-1.0.17/Xcode/debug.xcconfig +29 -0
  22. data/ext/libusbx-1.0.17/Xcode/libusbx.xcconfig +21 -0
  23. data/ext/libusbx-1.0.17/Xcode/libusbx.xcodeproj/project.pbxproj +864 -0
  24. data/ext/libusbx-1.0.17/Xcode/libusbx_debug.xcconfig +21 -0
  25. data/ext/libusbx-1.0.17/Xcode/libusbx_release.xcconfig +21 -0
  26. data/ext/libusbx-1.0.17/Xcode/release.xcconfig +29 -0
  27. data/ext/libusbx-1.0.17/aclocal.m4 +1112 -0
  28. data/ext/libusbx-1.0.17/android/README +114 -0
  29. data/ext/libusbx-1.0.17/android/config.h +90 -0
  30. data/ext/libusbx-1.0.17/android/jni/Android.mk +23 -0
  31. data/ext/libusbx-1.0.17/android/jni/Application.mk +19 -0
  32. data/ext/libusbx-1.0.17/android/jni/examples.mk +134 -0
  33. data/ext/libusbx-1.0.17/android/jni/libusb.mk +54 -0
  34. data/ext/libusbx-1.0.17/android/jni/tests.mk +56 -0
  35. data/ext/libusbx-1.0.17/compile +347 -0
  36. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/config.guess +164 -130
  37. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/config.h.in +37 -1
  38. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/config.sub +174 -89
  39. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/configure +723 -302
  40. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/configure.ac +71 -20
  41. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/depcomp +345 -185
  42. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/doc/Makefile.am +0 -0
  43. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/doc/Makefile.in +95 -32
  44. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/doc/doxygen.cfg.in +1 -1
  45. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/examples/Makefile.am +5 -4
  46. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/examples/Makefile.in +208 -104
  47. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/examples/dpfp.c +1 -1
  48. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/examples/dpfp_threaded.c +1 -1
  49. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/examples/ezusb.c +188 -8
  50. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/examples/ezusb.h +18 -5
  51. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/examples/fxload.c +90 -64
  52. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/examples/getopt/getopt.c +0 -0
  53. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/examples/getopt/getopt.h +0 -0
  54. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/examples/getopt/getopt1.c +0 -0
  55. data/ext/libusbx-1.0.17/examples/hotplugtest.c +97 -0
  56. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/examples/listdevs.c +12 -4
  57. data/ext/libusbx-1.0.17/examples/sam3u_benchmark.c +193 -0
  58. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/examples/xusb.c +106 -49
  59. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/install-sh +21 -14
  60. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb-1.0.pc.in +1 -1
  61. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/Makefile.am +29 -10
  62. data/ext/libusbx-1.0.17/libusb/Makefile.in +914 -0
  63. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/core.c +378 -87
  64. data/ext/libusbx-1.0.17/libusb/descriptor.c +1199 -0
  65. data/ext/libusbx-1.0.17/libusb/hotplug.c +322 -0
  66. data/ext/libusbx-1.0.17/libusb/hotplug.h +82 -0
  67. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/io.c +182 -62
  68. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/libusb-1.0.def +32 -0
  69. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/libusb-1.0.rc +2 -0
  70. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/libusb.h +481 -32
  71. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/libusbi.h +135 -38
  72. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/os/darwin_usb.c +591 -496
  73. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/os/darwin_usb.h +39 -46
  74. data/ext/libusbx-1.0.17/libusb/os/linux_netlink.c +345 -0
  75. data/ext/libusbx-1.0.17/libusb/os/linux_udev.c +306 -0
  76. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/os/linux_usbfs.c +653 -617
  77. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/os/linux_usbfs.h +32 -0
  78. data/ext/{libusbx-1.0.14/libusb/os/openbsd_usb.c → libusbx-1.0.17/libusb/os/netbsd_usb.c} +70 -63
  79. data/ext/libusbx-1.0.17/libusb/os/openbsd_usb.c +823 -0
  80. data/ext/libusbx-1.0.17/libusb/os/poll_posix.c +51 -0
  81. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/os/poll_posix.h +2 -1
  82. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/os/poll_windows.c +85 -106
  83. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/os/poll_windows.h +14 -3
  84. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/os/threads_posix.c +3 -1
  85. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/os/threads_posix.h +0 -0
  86. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/os/threads_windows.c +6 -5
  87. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/os/threads_windows.h +0 -0
  88. data/ext/libusbx-1.0.17/libusb/os/wince_usb.c +1026 -0
  89. data/ext/libusbx-1.0.17/libusb/os/wince_usb.h +131 -0
  90. data/ext/libusbx-1.0.17/libusb/os/windows_common.h +108 -0
  91. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/os/windows_usb.c +92 -57
  92. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/os/windows_usb.h +2 -63
  93. data/ext/libusbx-1.0.17/libusb/strerror.c +184 -0
  94. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/sync.c +24 -38
  95. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/libusb/version.h +1 -1
  96. data/ext/libusbx-1.0.17/libusb/version_nano.h +1 -0
  97. data/ext/{libusbx-1.0.14 → libusbx-1.0.17}/ltmain.sh +60 -41
  98. data/ext/{libusbx-1.0.14/aclocal.m4 → libusbx-1.0.17/m4/libtool.m4} +229 -1723
  99. data/ext/libusbx-1.0.17/m4/ltoptions.m4 +384 -0
  100. data/ext/libusbx-1.0.17/m4/ltsugar.m4 +123 -0
  101. data/ext/libusbx-1.0.17/m4/ltversion.m4 +23 -0
  102. data/ext/libusbx-1.0.17/m4/lt~obsolete.m4 +98 -0
  103. data/ext/libusbx-1.0.17/missing +215 -0
  104. data/ext/libusbx-1.0.17/tests/Makefile.am +6 -0
  105. data/ext/libusbx-1.0.17/tests/Makefile.in +583 -0
  106. data/ext/libusbx-1.0.17/tests/libusbx_testlib.h +107 -0
  107. data/ext/libusbx-1.0.17/tests/stress.c +160 -0
  108. data/ext/libusbx-1.0.17/tests/testlib.c +276 -0
  109. data/lib/libusb.rb +4 -0
  110. data/lib/libusb/call.rb +43 -1
  111. data/lib/libusb/constants.rb +5 -0
  112. data/lib/libusb/context.rb +100 -0
  113. data/lib/libusb/dev_handle.rb +27 -0
  114. data/lib/libusb/device.rb +10 -4
  115. data/lib/libusb/version_gem.rb +1 -1
  116. data/test/test_libusb_capability.rb +2 -2
  117. data/test/test_libusb_compat.rb +2 -2
  118. data/test/test_libusb_compat_mass_storage.rb +2 -2
  119. data/test/test_libusb_descriptors.rb +4 -2
  120. data/test/test_libusb_event_machine.rb +2 -2
  121. data/test/test_libusb_gc.rb +2 -2
  122. data/test/test_libusb_hotplug.rb +115 -0
  123. data/test/test_libusb_iso_transfer.rb +3 -3
  124. data/test/test_libusb_mass_storage.rb +6 -16
  125. data/test/test_libusb_mass_storage2.rb +26 -3
  126. data/test/test_libusb_structs.rb +2 -2
  127. data/test/test_libusb_threads.rb +2 -2
  128. data/test/test_libusb_version.rb +2 -2
  129. metadata +127 -68
  130. metadata.gz.sig +0 -0
  131. data/ext/libusbx-1.0.14/THANKS +0 -7
  132. data/ext/libusbx-1.0.14/compile +0 -143
  133. data/ext/libusbx-1.0.14/libusb/Makefile.in +0 -721
  134. data/ext/libusbx-1.0.14/libusb/descriptor.c +0 -731
  135. data/ext/libusbx-1.0.14/libusb/version_nano.h +0 -1
  136. data/ext/libusbx-1.0.14/missing +0 -376
@@ -0,0 +1,306 @@
1
+ /* -*- Mode: C; c-basic-offset:8 ; indent-tabs-mode:t -*- */
2
+ /*
3
+ * Linux usbfs backend for libusb
4
+ * Copyright (C) 2007-2009 Daniel Drake <dsd@gentoo.org>
5
+ * Copyright (c) 2001 Johannes Erdfelt <johannes@erdfelt.com>
6
+ * Copyright (c) 2012-2013 Nathan Hjelm <hjelmn@mac.com>
7
+ *
8
+ * This library is free software; you can redistribute it and/or
9
+ * modify it under the terms of the GNU Lesser General Public
10
+ * License as published by the Free Software Foundation; either
11
+ * version 2.1 of the License, or (at your option) any later version.
12
+ *
13
+ * This library is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
+ * Lesser General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU Lesser General Public
19
+ * License along with this library; if not, write to the Free Software
20
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
+ */
22
+
23
+ #include "config.h"
24
+
25
+ #include <assert.h>
26
+ #include <ctype.h>
27
+ #include <dirent.h>
28
+ #include <errno.h>
29
+ #include <fcntl.h>
30
+ #include <poll.h>
31
+ #include <stdio.h>
32
+ #include <stdlib.h>
33
+ #include <string.h>
34
+ #include <sys/ioctl.h>
35
+ #include <sys/stat.h>
36
+ #include <sys/types.h>
37
+ #include <sys/utsname.h>
38
+ #include <sys/socket.h>
39
+ #include <unistd.h>
40
+ #include <libudev.h>
41
+
42
+ #include "libusb.h"
43
+ #include "libusbi.h"
44
+ #include "linux_usbfs.h"
45
+
46
+ /* udev context */
47
+ static struct udev *udev_ctx = NULL;
48
+ static int udev_monitor_fd = -1;
49
+ static int udev_control_pipe[2] = {-1, -1};
50
+ static struct udev_monitor *udev_monitor = NULL;
51
+ static pthread_t linux_event_thread;
52
+
53
+ static void udev_hotplug_event(struct udev_device* udev_dev);
54
+ static void *linux_udev_event_thread_main(void *arg);
55
+
56
+ int linux_udev_start_event_monitor(void)
57
+ {
58
+ int r;
59
+
60
+ assert(udev_ctx == NULL);
61
+ udev_ctx = udev_new();
62
+ if (!udev_ctx) {
63
+ usbi_err(NULL, "could not create udev context");
64
+ return LIBUSB_ERROR_OTHER;
65
+ }
66
+
67
+ udev_monitor = udev_monitor_new_from_netlink(udev_ctx, "udev");
68
+ if (!udev_monitor) {
69
+ usbi_err(NULL, "could not initialize udev monitor");
70
+ goto err_free_ctx;
71
+ }
72
+
73
+ r = udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "usb", 0);
74
+ if (r) {
75
+ usbi_err(NULL, "could not initialize udev monitor filter for \"usb\" subsystem");
76
+ goto err_free_monitor;
77
+ }
78
+
79
+ if (udev_monitor_enable_receiving(udev_monitor)) {
80
+ usbi_err(NULL, "failed to enable the udev monitor");
81
+ goto err_free_monitor;
82
+ }
83
+
84
+ udev_monitor_fd = udev_monitor_get_fd(udev_monitor);
85
+
86
+ /* Some older versions of udev are not non-blocking by default,
87
+ * so make sure this is set */
88
+ r = fcntl(udev_monitor_fd, F_GETFL);
89
+ if (r == -1) {
90
+ usbi_err(NULL, "getting udev monitor fd flags (%d)", errno);
91
+ goto err_free_monitor;
92
+ }
93
+ r = fcntl(udev_monitor_fd, F_SETFL, r | O_NONBLOCK);
94
+ if (r) {
95
+ usbi_err(NULL, "setting udev monitor fd flags (%d)", errno);
96
+ goto err_free_monitor;
97
+ }
98
+
99
+ r = usbi_pipe(udev_control_pipe);
100
+ if (r) {
101
+ usbi_err(NULL, "could not create udev control pipe");
102
+ goto err_free_monitor;
103
+ }
104
+
105
+ r = pthread_create(&linux_event_thread, NULL, linux_udev_event_thread_main, NULL);
106
+ if (r) {
107
+ usbi_err(NULL, "creating hotplug event thread (%d)", r);
108
+ goto err_close_pipe;
109
+ }
110
+
111
+ return LIBUSB_SUCCESS;
112
+
113
+ err_close_pipe:
114
+ close(udev_control_pipe[0]);
115
+ close(udev_control_pipe[1]);
116
+ err_free_monitor:
117
+ udev_monitor_unref(udev_monitor);
118
+ udev_monitor = NULL;
119
+ udev_monitor_fd = -1;
120
+ err_free_ctx:
121
+ udev_unref(udev_ctx);
122
+ udev_ctx = NULL;
123
+ return LIBUSB_ERROR_OTHER;
124
+ }
125
+
126
+ int linux_udev_stop_event_monitor(void)
127
+ {
128
+ char dummy = 1;
129
+ int r;
130
+
131
+ assert(udev_ctx != NULL);
132
+ assert(udev_monitor != NULL);
133
+ assert(udev_monitor_fd != -1);
134
+
135
+ /* Write some dummy data to the control pipe and
136
+ * wait for the thread to exit */
137
+ r = usbi_write(udev_control_pipe[1], &dummy, sizeof(dummy));
138
+ if (r <= 0) {
139
+ usbi_warn(NULL, "udev control pipe signal failed");
140
+ }
141
+ pthread_join(linux_event_thread, NULL);
142
+
143
+ /* Release the udev monitor */
144
+ udev_monitor_unref(udev_monitor);
145
+ udev_monitor = NULL;
146
+ udev_monitor_fd = -1;
147
+
148
+ /* Clean up the udev context */
149
+ udev_unref(udev_ctx);
150
+ udev_ctx = NULL;
151
+
152
+ /* close and reset control pipe */
153
+ close(udev_control_pipe[0]);
154
+ close(udev_control_pipe[1]);
155
+ udev_control_pipe[0] = -1;
156
+ udev_control_pipe[1] = -1;
157
+
158
+ return LIBUSB_SUCCESS;
159
+ }
160
+
161
+ static void *linux_udev_event_thread_main(void *arg)
162
+ {
163
+ char dummy;
164
+ int r;
165
+ struct udev_device* udev_dev;
166
+ struct pollfd fds[] = {
167
+ {.fd = udev_control_pipe[0],
168
+ .events = POLLIN},
169
+ {.fd = udev_monitor_fd,
170
+ .events = POLLIN},
171
+ };
172
+
173
+ usbi_dbg("udev event thread entering.");
174
+
175
+ while (poll(fds, 2, -1) >= 0) {
176
+ if (fds[0].revents & POLLIN) {
177
+ /* activity on control pipe, read the byte and exit */
178
+ r = usbi_read(udev_control_pipe[0], &dummy, sizeof(dummy));
179
+ if (r <= 0) {
180
+ usbi_warn(NULL, "udev control pipe read failed");
181
+ }
182
+ break;
183
+ }
184
+ if (fds[1].revents & POLLIN) {
185
+ usbi_mutex_static_lock(&linux_hotplug_lock);
186
+ udev_dev = udev_monitor_receive_device(udev_monitor);
187
+ if (udev_dev)
188
+ udev_hotplug_event(udev_dev);
189
+ usbi_mutex_static_unlock(&linux_hotplug_lock);
190
+ }
191
+ }
192
+
193
+ usbi_dbg("udev event thread exiting");
194
+
195
+ return NULL;
196
+ }
197
+
198
+ static int udev_device_info(struct libusb_context *ctx, int detached,
199
+ struct udev_device *udev_dev, uint8_t *busnum,
200
+ uint8_t *devaddr, const char **sys_name) {
201
+ const char *dev_node;
202
+
203
+ dev_node = udev_device_get_devnode(udev_dev);
204
+ if (!dev_node) {
205
+ return LIBUSB_ERROR_OTHER;
206
+ }
207
+
208
+ *sys_name = udev_device_get_sysname(udev_dev);
209
+ if (!*sys_name) {
210
+ return LIBUSB_ERROR_OTHER;
211
+ }
212
+
213
+ return linux_get_device_address(ctx, detached, busnum, devaddr,
214
+ dev_node, *sys_name);
215
+ }
216
+
217
+ static void udev_hotplug_event(struct udev_device* udev_dev)
218
+ {
219
+ const char* udev_action;
220
+ const char* sys_name = NULL;
221
+ uint8_t busnum = 0, devaddr = 0;
222
+ int detached;
223
+ int r;
224
+
225
+ do {
226
+ udev_action = udev_device_get_action(udev_dev);
227
+ if (!udev_action) {
228
+ break;
229
+ }
230
+
231
+ detached = !strncmp(udev_action, "remove", 6);
232
+
233
+ r = udev_device_info(NULL, detached, udev_dev, &busnum, &devaddr, &sys_name);
234
+ if (LIBUSB_SUCCESS != r) {
235
+ break;
236
+ }
237
+
238
+ usbi_dbg("udev hotplug event. action: %s.", udev_action);
239
+
240
+ if (strncmp(udev_action, "add", 3) == 0) {
241
+ linux_hotplug_enumerate(busnum, devaddr, sys_name);
242
+ } else if (detached) {
243
+ linux_device_disconnected(busnum, devaddr, sys_name);
244
+ } else {
245
+ usbi_err(NULL, "ignoring udev action %s", udev_action);
246
+ }
247
+ } while (0);
248
+
249
+ udev_device_unref(udev_dev);
250
+ }
251
+
252
+ int linux_udev_scan_devices(struct libusb_context *ctx)
253
+ {
254
+ struct udev_enumerate *enumerator;
255
+ struct udev_list_entry *devices, *entry;
256
+ struct udev_device *udev_dev;
257
+ const char *sys_name;
258
+ int r;
259
+
260
+ assert(udev_ctx != NULL);
261
+
262
+ enumerator = udev_enumerate_new(udev_ctx);
263
+ if (NULL == enumerator) {
264
+ usbi_err(ctx, "error creating udev enumerator");
265
+ return LIBUSB_ERROR_OTHER;
266
+ }
267
+
268
+ udev_enumerate_add_match_subsystem(enumerator, "usb");
269
+ udev_enumerate_scan_devices(enumerator);
270
+ devices = udev_enumerate_get_list_entry(enumerator);
271
+
272
+ udev_list_entry_foreach(entry, devices) {
273
+ const char *path = udev_list_entry_get_name(entry);
274
+ uint8_t busnum = 0, devaddr = 0;
275
+
276
+ udev_dev = udev_device_new_from_syspath(udev_ctx, path);
277
+
278
+ r = udev_device_info(ctx, 0, udev_dev, &busnum, &devaddr, &sys_name);
279
+ if (r) {
280
+ udev_device_unref(udev_dev);
281
+ continue;
282
+ }
283
+
284
+ linux_enumerate_device(ctx, busnum, devaddr, sys_name);
285
+ udev_device_unref(udev_dev);
286
+ }
287
+
288
+ udev_enumerate_unref(enumerator);
289
+
290
+ return LIBUSB_SUCCESS;
291
+ }
292
+
293
+ void linux_udev_hotplug_poll(void)
294
+ {
295
+ struct udev_device* udev_dev;
296
+
297
+ usbi_mutex_static_lock(&linux_hotplug_lock);
298
+ do {
299
+ udev_dev = udev_monitor_receive_device(udev_monitor);
300
+ if (udev_dev) {
301
+ usbi_dbg("Handling hotplug event from hotplug_poll");
302
+ udev_hotplug_event(udev_dev);
303
+ }
304
+ } while (udev_dev);
305
+ usbi_mutex_static_unlock(&linux_hotplug_lock);
306
+ }
@@ -1,7 +1,10 @@
1
+ /* -*- Mode: C; c-basic-offset:8 ; indent-tabs-mode:t -*- */
1
2
  /*
2
3
  * Linux usbfs backend for libusbx
3
4
  * Copyright © 2007-2009 Daniel Drake <dsd@gentoo.org>
4
5
  * Copyright © 2001 Johannes Erdfelt <johannes@erdfelt.com>
6
+ * Copyright © 2013 Nathan Hjelm <hjelmn@mac.com>
7
+ * Copyright © 2012-2013 Hans de Goede <hdegoede@redhat.com>
5
8
  *
6
9
  * This library is free software; you can redistribute it and/or
7
10
  * modify it under the terms of the GNU Lesser General Public
@@ -18,7 +21,9 @@
18
21
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
22
  */
20
23
 
21
- #include <config.h>
24
+ #include "config.h"
25
+
26
+ #include <assert.h>
22
27
  #include <ctype.h>
23
28
  #include <dirent.h>
24
29
  #include <errno.h>
@@ -43,23 +48,23 @@
43
48
  *
44
49
  * sysfs allows us to read the kernel's in-memory copies of device descriptors
45
50
  * and so forth, avoiding the need to open the device:
46
- * - The binary "descriptors" file was added in 2.6.23.
47
- * - The "busnum" file was added in 2.6.22
51
+ * - The binary "descriptors" file contains all config descriptors since
52
+ * 2.6.26, commit 217a9081d8e69026186067711131b77f0ce219ed
53
+ * - The binary "descriptors" file was added in 2.6.23, commit
54
+ * 69d42a78f935d19384d1f6e4f94b65bb162b36df, but it only contains the
55
+ * active config descriptors
56
+ * - The "busnum" file was added in 2.6.22, commit
57
+ * 83f7d958eab2fbc6b159ee92bf1493924e1d0f72
48
58
  * - The "devnum" file has been present since pre-2.6.18
49
59
  * - the "bConfigurationValue" file has been present since pre-2.6.18
50
60
  *
51
61
  * If we have bConfigurationValue, busnum, and devnum, then we can determine
52
62
  * 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
63
  * The busnum file is important as that is the only way we can relate sysfs
55
64
  * devices to usbfs nodes.
56
65
  *
57
- * If we also have descriptors, we can obtain the device descriptor and active
66
+ * If we also have all descriptors, we can obtain the device descriptor and
58
67
  * 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
68
  */
64
69
 
65
70
  /* endianness for multi-byte fields:
@@ -67,6 +72,8 @@
67
72
  * Descriptors exposed by usbfs have the multi-byte fields in the device
68
73
  * descriptor as host endian. Multi-byte fields in the other descriptors are
69
74
  * bus-endian. The kernel documentation says otherwise, but it is wrong.
75
+ *
76
+ * In sysfs all descriptors are bus-endian.
70
77
  */
71
78
 
72
79
  static const char *usbfs_path = NULL;
@@ -101,17 +108,39 @@ static int supports_flag_zero_packet = -1;
101
108
  * systems. appropriate choice made at initialization time. */
102
109
  static clockid_t monotonic_clkid = -1;
103
110
 
104
- /* do we have a busnum to relate devices? this also implies that we can read
111
+ /* Linux 2.6.22 (commit 83f7d958eab2fbc6b159ee92bf1493924e1d0f72) adds a busnum
112
+ * to sysfs, so we can relate devices. This also implies that we can read
105
113
  * the active configuration through bConfigurationValue */
106
- static int sysfs_can_relate_devices = 0;
114
+ static int sysfs_can_relate_devices = -1;
115
+
116
+ /* Linux 2.6.26 (commit 217a9081d8e69026186067711131b77f0ce219ed) adds all
117
+ * config descriptors (rather then just the active config) to the sysfs
118
+ * descriptors file, so from then on we can use them. */
119
+ static int sysfs_has_descriptors = -1;
120
+
121
+ /* how many times have we initted (and not exited) ? */
122
+ static volatile int init_count = 0;
123
+
124
+ /* Serialize hotplug start/stop */
125
+ usbi_mutex_static_t linux_hotplug_startstop_lock = USBI_MUTEX_INITIALIZER;
126
+ /* Serialize scan-devices, event-thread, and poll */
127
+ usbi_mutex_static_t linux_hotplug_lock = USBI_MUTEX_INITIALIZER;
107
128
 
108
- /* do we have a descriptors file? */
109
- static int sysfs_has_descriptors = 0;
129
+ static int linux_start_event_monitor(void);
130
+ static int linux_stop_event_monitor(void);
131
+ static int linux_scan_devices(struct libusb_context *ctx);
132
+ static int sysfs_scan_device(struct libusb_context *ctx, const char *devname);
133
+ static int detach_kernel_driver_and_claim(struct libusb_device_handle *, int);
134
+
135
+ #if !defined(USE_UDEV)
136
+ static int linux_default_scan_devices (struct libusb_context *ctx);
137
+ #endif
110
138
 
111
139
  struct linux_device_priv {
112
140
  char *sysfs_dir;
113
- unsigned char *dev_descriptor;
114
- unsigned char *config_descriptor;
141
+ unsigned char *descriptors;
142
+ int descriptors_len;
143
+ int active_config; /* cache val for !sysfs_can_relate_devices */
115
144
  };
116
145
 
117
146
  struct linux_device_handle_priv {
@@ -150,14 +179,36 @@ struct linux_transfer_priv {
150
179
  int iso_packet_offset;
151
180
  };
152
181
 
153
- static void _get_usbfs_path(struct libusb_device *dev, char *path)
182
+ static int _get_usbfs_fd(struct libusb_device *dev, mode_t mode, int silent)
154
183
  {
184
+ struct libusb_context *ctx = DEVICE_CTX(dev);
185
+ char path[PATH_MAX];
186
+ int fd;
187
+
155
188
  if (usbdev_names)
156
189
  snprintf(path, PATH_MAX, "%s/usbdev%d.%d",
157
190
  usbfs_path, dev->bus_number, dev->device_address);
158
191
  else
159
192
  snprintf(path, PATH_MAX, "%s/%03d/%03d",
160
193
  usbfs_path, dev->bus_number, dev->device_address);
194
+
195
+ fd = open(path, mode);
196
+ if (fd != -1)
197
+ return fd; /* Success */
198
+
199
+ if (!silent) {
200
+ usbi_err(ctx, "libusbx couldn't open USB device %s: %s",
201
+ path, strerror(errno));
202
+ if (errno == EACCES && mode == O_RDWR)
203
+ usbi_err(ctx, "libusbx requires write access to USB "
204
+ "device nodes.");
205
+ }
206
+
207
+ if (errno == EACCES)
208
+ return LIBUSB_ERROR_ACCESS;
209
+ if (errno == ENOENT)
210
+ return LIBUSB_ERROR_NO_DEVICE;
211
+ return LIBUSB_ERROR_IO;
161
212
  }
162
213
 
163
214
  static struct linux_device_priv *_device_priv(struct libusb_device *dev)
@@ -300,22 +351,6 @@ static int kernel_version_ge(int major, int minor, int sublevel)
300
351
  return ksublevel >= sublevel;
301
352
  }
302
353
 
303
- /* Return 1 if filename exists inside dirname in sysfs.
304
- SYSFS_DEVICE_PATH is assumed to be the beginning of the path. */
305
- static int sysfs_has_file(const char *dirname, const char *filename)
306
- {
307
- struct stat statbuf;
308
- char path[PATH_MAX];
309
- int r;
310
-
311
- snprintf(path, PATH_MAX, "%s/%s/%s", SYSFS_DEVICE_PATH, dirname, filename);
312
- r = stat(path, &statbuf);
313
- if (r == 0 && S_ISREG(statbuf.st_mode))
314
- return 1;
315
-
316
- return 0;
317
- }
318
-
319
354
  static int op_init(struct libusb_context *ctx)
320
355
  {
321
356
  struct stat statbuf;
@@ -354,79 +389,111 @@ static int op_init(struct libusb_context *ctx)
354
389
  if (supports_flag_zero_packet)
355
390
  usbi_dbg("zero length packet flag supported");
356
391
 
357
- r = stat(SYSFS_DEVICE_PATH, &statbuf);
358
- if (r == 0 && S_ISDIR(statbuf.st_mode)) {
359
- DIR *devices = opendir(SYSFS_DEVICE_PATH);
360
- struct dirent *entry;
361
-
362
- usbi_dbg("found usb devices in sysfs");
392
+ if (-1 == sysfs_has_descriptors) {
393
+ /* sysfs descriptors has all descriptors since Linux 2.6.26 */
394
+ sysfs_has_descriptors = kernel_version_ge(2,6,26);
395
+ if (-1 == sysfs_has_descriptors) {
396
+ usbi_err(ctx, "error checking for sysfs descriptors");
397
+ return LIBUSB_ERROR_OTHER;
398
+ }
399
+ }
363
400
 
364
- if (!devices) {
365
- usbi_err(ctx, "opendir devices failed errno=%d", errno);
366
- return LIBUSB_ERROR_IO;
401
+ if (-1 == sysfs_can_relate_devices) {
402
+ /* sysfs has busnum since Linux 2.6.22 */
403
+ sysfs_can_relate_devices = kernel_version_ge(2,6,22);
404
+ if (-1 == sysfs_can_relate_devices) {
405
+ usbi_err(ctx, "error checking for sysfs busnum");
406
+ return LIBUSB_ERROR_OTHER;
367
407
  }
408
+ }
368
409
 
369
- /* Make sure sysfs supports all the required files. If it
370
- * does not, then usbfs will be used instead. Determine
371
- * this by looping through the directories in
372
- * SYSFS_DEVICE_PATH. With the assumption that there will
373
- * always be subdirectories of the name usbN (usb1, usb2,
374
- * etc) representing the root hubs, check the usbN
375
- * subdirectories to see if they have all the needed files.
376
- * This algorithm uses the usbN subdirectories (root hubs)
377
- * because a device disconnection will cause a race
378
- * condition regarding which files are available, sometimes
379
- * causing an incorrect result. The root hubs are used
380
- * because it is assumed that they will always be present.
381
- * See the "sysfs vs usbfs" comment at the top of this file
382
- * for more details. */
383
- while ((entry = readdir(devices))) {
384
- int has_busnum=0, has_devnum=0, has_descriptors=0;
385
- int has_configuration_value=0;
386
-
387
- /* Only check the usbN directories. */
388
- if (strncmp(entry->d_name, "usb", 3) != 0)
389
- continue;
410
+ if (sysfs_can_relate_devices || sysfs_has_descriptors) {
411
+ r = stat(SYSFS_DEVICE_PATH, &statbuf);
412
+ if (r != 0 || !S_ISDIR(statbuf.st_mode)) {
413
+ usbi_warn(ctx, "sysfs not mounted");
414
+ sysfs_can_relate_devices = 0;
415
+ sysfs_has_descriptors = 0;
416
+ }
417
+ }
390
418
 
391
- /* Check for the files libusbx needs from sysfs. */
392
- has_busnum = sysfs_has_file(entry->d_name, "busnum");
393
- has_devnum = sysfs_has_file(entry->d_name, "devnum");
394
- has_descriptors = sysfs_has_file(entry->d_name, "descriptors");
395
- has_configuration_value = sysfs_has_file(entry->d_name, "bConfigurationValue");
419
+ if (sysfs_can_relate_devices)
420
+ usbi_dbg("sysfs can relate devices");
396
421
 
397
- if (has_busnum && has_devnum && has_configuration_value)
398
- sysfs_can_relate_devices = 1;
399
- if (has_descriptors)
400
- sysfs_has_descriptors = 1;
422
+ if (sysfs_has_descriptors)
423
+ usbi_dbg("sysfs has complete descriptors");
424
+
425
+ usbi_mutex_static_lock(&linux_hotplug_startstop_lock);
426
+ r = LIBUSB_SUCCESS;
427
+ if (init_count == 0) {
428
+ /* start up hotplug event handler */
429
+ r = linux_start_event_monitor();
430
+ }
431
+ if (r == LIBUSB_SUCCESS) {
432
+ r = linux_scan_devices(ctx);
433
+ if (r == LIBUSB_SUCCESS)
434
+ init_count++;
435
+ else if (init_count == 0)
436
+ linux_stop_event_monitor();
437
+ } else
438
+ usbi_err(ctx, "error starting hotplug event monitor");
439
+ usbi_mutex_static_unlock(&linux_hotplug_startstop_lock);
401
440
 
402
- /* Only need to check until we've found ONE device which
403
- has all the attributes. */
404
- if (sysfs_has_descriptors && sysfs_can_relate_devices)
405
- break;
406
- }
407
- closedir(devices);
441
+ return r;
442
+ }
408
443
 
409
- /* Only use sysfs descriptors if the rest of
410
- sysfs will work for libusb. */
411
- if (!sysfs_can_relate_devices)
412
- sysfs_has_descriptors = 0;
413
- } else {
414
- usbi_dbg("sysfs usb info not available");
415
- sysfs_has_descriptors = 0;
416
- sysfs_can_relate_devices = 0;
444
+ static void op_exit(void)
445
+ {
446
+ usbi_mutex_static_lock(&linux_hotplug_startstop_lock);
447
+ assert(init_count != 0);
448
+ if (!--init_count) {
449
+ /* tear down event handler */
450
+ (void)linux_stop_event_monitor();
417
451
  }
452
+ usbi_mutex_static_unlock(&linux_hotplug_startstop_lock);
453
+ }
418
454
 
419
- return 0;
455
+ static int linux_start_event_monitor(void)
456
+ {
457
+ #if defined(USE_UDEV)
458
+ return linux_udev_start_event_monitor();
459
+ #else
460
+ return linux_netlink_start_event_monitor();
461
+ #endif
420
462
  }
421
463
 
422
- static int usbfs_get_device_descriptor(struct libusb_device *dev,
423
- unsigned char *buffer)
464
+ static int linux_stop_event_monitor(void)
424
465
  {
425
- struct linux_device_priv *priv = _device_priv(dev);
466
+ #if defined(USE_UDEV)
467
+ return linux_udev_stop_event_monitor();
468
+ #else
469
+ return linux_netlink_stop_event_monitor();
470
+ #endif
471
+ }
426
472
 
427
- /* return cached copy */
428
- memcpy(buffer, priv->dev_descriptor, DEVICE_DESC_LENGTH);
429
- return 0;
473
+ static int linux_scan_devices(struct libusb_context *ctx)
474
+ {
475
+ int ret;
476
+
477
+ usbi_mutex_static_lock(&linux_hotplug_lock);
478
+
479
+ #if defined(USE_UDEV)
480
+ ret = linux_udev_scan_devices(ctx);
481
+ #else
482
+ ret = linux_default_scan_devices(ctx);
483
+ #endif
484
+
485
+ usbi_mutex_static_unlock(&linux_hotplug_lock);
486
+
487
+ return ret;
488
+ }
489
+
490
+ static void op_hotplug_poll(void)
491
+ {
492
+ #if defined(USE_UDEV)
493
+ linux_udev_hotplug_poll();
494
+ #else
495
+ linux_netlink_hotplug_poll();
496
+ #endif
430
497
  }
431
498
 
432
499
  static int _open_sysfs_attr(struct libusb_device *dev, const char *attr)
@@ -482,52 +549,14 @@ static int __read_sysfs_attr(struct libusb_context *ctx,
482
549
  return value;
483
550
  }
484
551
 
485
- static int sysfs_get_device_descriptor(struct libusb_device *dev,
486
- unsigned char *buffer)
487
- {
488
- int fd;
489
- ssize_t r;
490
-
491
- /* sysfs provides access to an in-memory copy of the device descriptor,
492
- * so we use that rather than keeping our own copy */
493
-
494
- fd = _open_sysfs_attr(dev, "descriptors");
495
- if (fd < 0)
496
- return fd;
497
-
498
- r = read(fd, buffer, DEVICE_DESC_LENGTH);;
499
- close(fd);
500
- if (r < 0) {
501
- usbi_err(DEVICE_CTX(dev), "read failed, ret=%d errno=%d", fd, errno);
502
- return LIBUSB_ERROR_IO;
503
- } else if (r < DEVICE_DESC_LENGTH) {
504
- usbi_err(DEVICE_CTX(dev), "short read %d/%d", r, DEVICE_DESC_LENGTH);
505
- return LIBUSB_ERROR_IO;
506
- }
507
-
508
- return 0;
509
- }
510
-
511
552
  static int op_get_device_descriptor(struct libusb_device *dev,
512
553
  unsigned char *buffer, int *host_endian)
513
- {
514
- if (sysfs_has_descriptors) {
515
- return sysfs_get_device_descriptor(dev, buffer);
516
- } else {
517
- *host_endian = 1;
518
- return usbfs_get_device_descriptor(dev, buffer);
519
- }
520
- }
521
-
522
- static int usbfs_get_active_config_descriptor(struct libusb_device *dev,
523
- unsigned char *buffer, size_t len)
524
554
  {
525
555
  struct linux_device_priv *priv = _device_priv(dev);
526
- if (!priv->config_descriptor)
527
- return LIBUSB_ERROR_NOT_FOUND; /* device is unconfigured */
528
556
 
529
- /* retrieve cached copy */
530
- memcpy(buffer, priv->config_descriptor, len);
557
+ *host_endian = sysfs_has_descriptors ? 0 : 1;
558
+ memcpy(buffer, priv->descriptors, DEVICE_DESC_LENGTH);
559
+
531
560
  return 0;
532
561
  }
533
562
 
@@ -574,250 +603,220 @@ static int sysfs_get_active_config(struct libusb_device *dev, int *config)
574
603
  return 0;
575
604
  }
576
605
 
577
- /* takes a usbfs/descriptors fd seeked to the start of a configuration, and
578
- * seeks to the next one. */
579
- static int seek_to_next_config(struct libusb_context *ctx, int fd,
580
- int host_endian)
606
+ int linux_get_device_address (struct libusb_context *ctx, int detached,
607
+ uint8_t *busnum, uint8_t *devaddr,const char *dev_node,
608
+ const char *sys_name)
581
609
  {
582
- struct libusb_config_descriptor config;
583
- unsigned char tmp[6];
584
- off_t off;
585
- ssize_t r;
610
+ int sysfs_attr;
586
611
 
587
- /* read first 6 bytes of descriptor */
588
- r = read(fd, tmp, sizeof(tmp));
589
- if (r < 0) {
590
- usbi_err(ctx, "read failed ret=%d errno=%d", r, errno);
591
- return LIBUSB_ERROR_IO;
592
- } else if (r < sizeof(tmp)) {
593
- usbi_err(ctx, "short descriptor read %d/%d", r, sizeof(tmp));
594
- return LIBUSB_ERROR_IO;
595
- }
612
+ usbi_dbg("getting address for device: %s detached: %d", sys_name, detached);
613
+ /* can't use sysfs to read the bus and device number if the
614
+ * device has been detached */
615
+ if (!sysfs_can_relate_devices || detached || NULL == sys_name) {
616
+ if (NULL == dev_node) {
617
+ return LIBUSB_ERROR_OTHER;
618
+ }
596
619
 
597
- /* seek forward to end of config */
598
- usbi_parse_descriptor(tmp, "bbwbb", &config, host_endian);
599
- off = lseek(fd, config.wTotalLength - sizeof(tmp), SEEK_CUR);
600
- if (off < 0) {
601
- usbi_err(ctx, "seek failed ret=%d errno=%d", off, errno);
602
- return LIBUSB_ERROR_IO;
620
+ /* will this work with all supported kernel versions? */
621
+ if (!strncmp(dev_node, "/dev/bus/usb", 12)) {
622
+ sscanf (dev_node, "/dev/bus/usb/%hhd/%hhd", busnum, devaddr);
623
+ } else if (!strncmp(dev_node, "/proc/bus/usb", 13)) {
624
+ sscanf (dev_node, "/proc/bus/usb/%hhd/%hhd", busnum, devaddr);
625
+ }
626
+
627
+ return LIBUSB_SUCCESS;
603
628
  }
604
629
 
605
- return 0;
630
+ usbi_dbg("scan %s", sys_name);
631
+
632
+ sysfs_attr = __read_sysfs_attr(ctx, sys_name, "busnum");
633
+ if (0 > sysfs_attr)
634
+ return sysfs_attr;
635
+ if (sysfs_attr > 255)
636
+ return LIBUSB_ERROR_INVALID_PARAM;
637
+ *busnum = (uint8_t) sysfs_attr;
638
+
639
+ sysfs_attr = __read_sysfs_attr(ctx, sys_name, "devnum");
640
+ if (0 > sysfs_attr)
641
+ return sysfs_attr;
642
+ if (sysfs_attr > 255)
643
+ return LIBUSB_ERROR_INVALID_PARAM;
644
+
645
+ *devaddr = (uint8_t) sysfs_attr;
646
+
647
+ usbi_dbg("bus=%d dev=%d", *busnum, *devaddr);
648
+
649
+ return LIBUSB_SUCCESS;
606
650
  }
607
651
 
608
- static int sysfs_get_active_config_descriptor(struct libusb_device *dev,
609
- unsigned char *buffer, size_t len)
652
+ /* Return offset of the next descriptor with the given type */
653
+ static int seek_to_next_descriptor(struct libusb_context *ctx,
654
+ uint8_t descriptor_type, unsigned char *buffer, int size)
610
655
  {
611
- int fd;
612
- ssize_t r;
613
- off_t off;
614
- int to_copy;
615
- int config;
616
- unsigned char tmp[6];
656
+ struct usb_descriptor_header header;
657
+ int i;
617
658
 
618
- r = sysfs_get_active_config(dev, &config);
619
- if (r < 0)
620
- return r;
621
- if (config == -1)
622
- return LIBUSB_ERROR_NOT_FOUND;
659
+ for (i = 0; size >= 0; i += header.bLength, size -= header.bLength) {
660
+ if (size == 0)
661
+ return LIBUSB_ERROR_NOT_FOUND;
623
662
 
624
- usbi_dbg("active configuration %d", config);
663
+ if (size < 2) {
664
+ usbi_err(ctx, "short descriptor read %d/2", size);
665
+ return LIBUSB_ERROR_IO;
666
+ }
667
+ usbi_parse_descriptor(buffer + i, "bb", &header, 0);
625
668
 
626
- /* sysfs provides access to an in-memory copy of the device descriptor,
627
- * so we use that rather than keeping our own copy */
669
+ if (i && header.bDescriptorType == descriptor_type)
670
+ return i;
671
+ }
672
+ usbi_err(ctx, "bLength overflow by %d bytes", -size);
673
+ return LIBUSB_ERROR_IO;
674
+ }
628
675
 
629
- fd = _open_sysfs_attr(dev, "descriptors");
630
- if (fd < 0)
631
- return fd;
676
+ /* Return offset to next config */
677
+ static int seek_to_next_config(struct libusb_context *ctx,
678
+ unsigned char *buffer, int size)
679
+ {
680
+ struct libusb_config_descriptor config;
632
681
 
633
- /* device might have been unconfigured since we read bConfigurationValue,
634
- * so first check that there is any config descriptor data at all... */
635
- off = lseek(fd, 0, SEEK_END);
636
- if (off < 1) {
637
- usbi_err(DEVICE_CTX(dev), "end seek failed, ret=%d errno=%d",
638
- off, errno);
639
- close(fd);
640
- return LIBUSB_ERROR_IO;
641
- } else if (off == DEVICE_DESC_LENGTH) {
642
- close(fd);
682
+ if (size == 0)
643
683
  return LIBUSB_ERROR_NOT_FOUND;
684
+
685
+ if (size < LIBUSB_DT_CONFIG_SIZE) {
686
+ usbi_err(ctx, "short descriptor read %d/%d",
687
+ size, LIBUSB_DT_CONFIG_SIZE);
688
+ return LIBUSB_ERROR_IO;
644
689
  }
645
690
 
646
- off = lseek(fd, DEVICE_DESC_LENGTH, SEEK_SET);
647
- if (off < 0) {
648
- usbi_err(DEVICE_CTX(dev), "seek failed, ret=%d errno=%d", off, errno);
649
- close(fd);
691
+ usbi_parse_descriptor(buffer, "bbwbbbbb", &config, 0);
692
+ if (config.bDescriptorType != LIBUSB_DT_CONFIG) {
693
+ usbi_err(ctx, "descriptor is not a config desc (type 0x%02x)",
694
+ config.bDescriptorType);
650
695
  return LIBUSB_ERROR_IO;
651
696
  }
652
697
 
653
- /* unbounded loop: we expect the descriptor to be present under all
654
- * circumstances */
655
- while (1) {
656
- r = read(fd, tmp, sizeof(tmp));
657
- if (r < 0) {
658
- usbi_err(DEVICE_CTX(dev), "read failed, ret=%d errno=%d",
659
- fd, errno);
660
- return LIBUSB_ERROR_IO;
661
- } else if (r < sizeof(tmp)) {
662
- usbi_err(DEVICE_CTX(dev), "short read %d/%d", r, sizeof(tmp));
698
+ /*
699
+ * In usbfs the config descriptors are config.wTotalLength bytes apart,
700
+ * with any short reads from the device appearing as holes in the file.
701
+ *
702
+ * In sysfs wTotalLength is ignored, instead the kernel returns a
703
+ * config descriptor with verified bLength fields, with descriptors
704
+ * with an invalid bLength removed.
705
+ */
706
+ if (sysfs_has_descriptors) {
707
+ int next = seek_to_next_descriptor(ctx, LIBUSB_DT_CONFIG,
708
+ buffer, size);
709
+ if (next == LIBUSB_ERROR_NOT_FOUND)
710
+ next = size;
711
+ if (next < 0)
712
+ return next;
713
+
714
+ if (next != config.wTotalLength)
715
+ usbi_warn(ctx, "config length mismatch wTotalLength "
716
+ "%d real %d", config.wTotalLength, next);
717
+ return next;
718
+ } else {
719
+ if (config.wTotalLength < LIBUSB_DT_CONFIG_SIZE) {
720
+ usbi_err(ctx, "invalid wTotalLength %d",
721
+ config.wTotalLength);
663
722
  return LIBUSB_ERROR_IO;
664
- }
723
+ } else if (config.wTotalLength > size) {
724
+ usbi_warn(ctx, "short descriptor read %d/%d",
725
+ size, config.wTotalLength);
726
+ return size;
727
+ } else
728
+ return config.wTotalLength;
729
+ }
730
+ }
665
731
 
666
- /* check bConfigurationValue */
667
- if (tmp[5] == config)
668
- break;
732
+ static int op_get_config_descriptor_by_value(struct libusb_device *dev,
733
+ uint8_t value, unsigned char **buffer, int *host_endian)
734
+ {
735
+ struct libusb_context *ctx = DEVICE_CTX(dev);
736
+ struct linux_device_priv *priv = _device_priv(dev);
737
+ unsigned char *descriptors = priv->descriptors;
738
+ int size = priv->descriptors_len;
739
+ struct libusb_config_descriptor *config;
669
740
 
670
- /* try the next descriptor */
671
- off = lseek(fd, 0 - sizeof(tmp), SEEK_CUR);
672
- if (off < 0)
673
- return LIBUSB_ERROR_IO;
741
+ *buffer = NULL;
742
+ /* Unlike the device desc. config descs. are always in raw format */
743
+ *host_endian = 0;
674
744
 
675
- r = seek_to_next_config(DEVICE_CTX(dev), fd, 0);
676
- if (r < 0)
677
- return r;
678
- }
745
+ /* Skip device header */
746
+ descriptors += DEVICE_DESC_LENGTH;
747
+ size -= DEVICE_DESC_LENGTH;
679
748
 
680
- to_copy = (len < sizeof(tmp)) ? len : sizeof(tmp);
681
- memcpy(buffer, tmp, to_copy);
682
- if (len > sizeof(tmp)) {
683
- r = read(fd, buffer + sizeof(tmp), len - sizeof(tmp));
684
- if (r < 0) {
685
- usbi_err(DEVICE_CTX(dev), "read failed, ret=%d errno=%d",
686
- fd, errno);
687
- r = LIBUSB_ERROR_IO;
688
- } else if (r == 0) {
689
- usbi_dbg("device is unconfigured");
690
- r = LIBUSB_ERROR_NOT_FOUND;
691
- } else if (r < len - sizeof(tmp)) {
692
- usbi_err(DEVICE_CTX(dev), "short read %d/%d", r, len);
693
- r = LIBUSB_ERROR_IO;
749
+ /* Seek till the config is found, or till "EOF" */
750
+ while (1) {
751
+ int next = seek_to_next_config(ctx, descriptors, size);
752
+ if (next < 0)
753
+ return next;
754
+ config = (struct libusb_config_descriptor *)descriptors;
755
+ if (config->bConfigurationValue == value) {
756
+ *buffer = descriptors;
757
+ return next;
694
758
  }
695
- } else {
696
- r = 0;
759
+ size -= next;
760
+ descriptors += next;
697
761
  }
698
-
699
- close(fd);
700
- return r;
701
762
  }
702
763
 
703
764
  static int op_get_active_config_descriptor(struct libusb_device *dev,
704
765
  unsigned char *buffer, size_t len, int *host_endian)
705
766
  {
706
- if (sysfs_has_descriptors) {
707
- return sysfs_get_active_config_descriptor(dev, buffer, len);
708
- } else {
709
- return usbfs_get_active_config_descriptor(dev, buffer, len);
710
- }
711
- }
767
+ int r, config;
768
+ unsigned char *config_desc;
712
769
 
713
- /* takes a usbfs fd, attempts to find the requested config and copy a certain
714
- * amount of it into an output buffer. */
715
- static int get_config_descriptor(struct libusb_context *ctx, int fd,
716
- uint8_t config_index, unsigned char *buffer, size_t len)
717
- {
718
- off_t off;
719
- ssize_t r;
720
-
721
- off = lseek(fd, DEVICE_DESC_LENGTH, SEEK_SET);
722
- if (off < 0) {
723
- usbi_err(ctx, "seek failed ret=%d errno=%d", off, errno);
724
- return LIBUSB_ERROR_IO;
725
- }
726
-
727
- /* might need to skip some configuration descriptors to reach the
728
- * requested configuration */
729
- while (config_index > 0) {
730
- r = seek_to_next_config(ctx, fd, 1);
770
+ if (sysfs_can_relate_devices) {
771
+ r = sysfs_get_active_config(dev, &config);
731
772
  if (r < 0)
732
773
  return r;
733
- config_index--;
774
+ } else {
775
+ /* Use cached bConfigurationValue */
776
+ struct linux_device_priv *priv = _device_priv(dev);
777
+ config = priv->active_config;
734
778
  }
779
+ if (config == -1)
780
+ return LIBUSB_ERROR_NOT_FOUND;
735
781
 
736
- /* read the rest of the descriptor */
737
- r = read(fd, buffer, len);
738
- if (r < 0) {
739
- usbi_err(ctx, "read failed ret=%d errno=%d", r, errno);
740
- return LIBUSB_ERROR_IO;
741
- } else if (r < len) {
742
- usbi_err(ctx, "short output read %d/%d", r, len);
743
- return LIBUSB_ERROR_IO;
744
- }
782
+ r = op_get_config_descriptor_by_value(dev, config, &config_desc,
783
+ host_endian);
784
+ if (r < 0)
785
+ return r;
745
786
 
746
- return 0;
787
+ len = MIN(len, r);
788
+ memcpy(buffer, config_desc, len);
789
+ return len;
747
790
  }
748
791
 
749
792
  static int op_get_config_descriptor(struct libusb_device *dev,
750
793
  uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian)
751
794
  {
752
- char filename[PATH_MAX];
753
- int fd;
754
- int r;
755
-
756
- /* always read from usbfs: sysfs only has the active descriptor
757
- * this will involve waking the device up, but oh well! */
758
-
759
- /* FIXME: the above is no longer true, new kernels have all descriptors
760
- * in the descriptors file. but its kinda hard to detect if the kernel
761
- * is sufficiently new. */
762
-
763
- _get_usbfs_path(dev, filename);
764
- fd = open(filename, O_RDONLY);
765
- if (fd < 0) {
766
- usbi_err(DEVICE_CTX(dev),
767
- "open '%s' failed, ret=%d errno=%d", filename, fd, errno);
768
- return LIBUSB_ERROR_IO;
769
- }
795
+ struct linux_device_priv *priv = _device_priv(dev);
796
+ unsigned char *descriptors = priv->descriptors;
797
+ int i, r, size = priv->descriptors_len;
770
798
 
771
- r = get_config_descriptor(DEVICE_CTX(dev), fd, config_index, buffer, len);
772
- close(fd);
773
- return r;
774
- }
799
+ /* Unlike the device desc. config descs. are always in raw format */
800
+ *host_endian = 0;
775
801
 
776
- /* cache the active config descriptor in memory. a value of -1 means that
777
- * we aren't sure which one is active, so just assume the first one.
778
- * only for usbfs. */
779
- static int cache_active_config(struct libusb_device *dev, int fd,
780
- int active_config)
781
- {
782
- struct linux_device_priv *priv = _device_priv(dev);
783
- struct libusb_config_descriptor config;
784
- unsigned char tmp[8];
785
- unsigned char *buf;
786
- int idx;
787
- int r;
802
+ /* Skip device header */
803
+ descriptors += DEVICE_DESC_LENGTH;
804
+ size -= DEVICE_DESC_LENGTH;
788
805
 
789
- if (active_config == -1) {
790
- idx = 0;
791
- } else {
792
- r = usbi_get_config_index_by_value(dev, active_config, &idx);
806
+ /* Seek till the config is found, or till "EOF" */
807
+ for (i = 0; ; i++) {
808
+ r = seek_to_next_config(DEVICE_CTX(dev), descriptors, size);
793
809
  if (r < 0)
794
810
  return r;
795
- if (idx == -1)
796
- return LIBUSB_ERROR_NOT_FOUND;
797
- }
798
-
799
- r = get_config_descriptor(DEVICE_CTX(dev), fd, idx, tmp, sizeof(tmp));
800
- if (r < 0) {
801
- usbi_err(DEVICE_CTX(dev), "first read error %d", r);
802
- return r;
803
- }
804
-
805
- usbi_parse_descriptor(tmp, "bbw", &config, 0);
806
- buf = malloc(config.wTotalLength);
807
- if (!buf)
808
- return LIBUSB_ERROR_NO_MEM;
809
-
810
- r = get_config_descriptor(DEVICE_CTX(dev), fd, idx, buf,
811
- config.wTotalLength);
812
- if (r < 0) {
813
- free(buf);
814
- return r;
811
+ if (i == config_index)
812
+ break;
813
+ size -= r;
814
+ descriptors += r;
815
815
  }
816
816
 
817
- if (priv->config_descriptor)
818
- free(priv->config_descriptor);
819
- priv->config_descriptor = buf;
820
- return 0;
817
+ len = MIN(len, r);
818
+ memcpy(buffer, descriptors, len);
819
+ return len;
821
820
  }
822
821
 
823
822
  /* send a control message to retrieve active configuration */
@@ -854,11 +853,9 @@ static int initialize_device(struct libusb_device *dev, uint8_t busnum,
854
853
  uint8_t devaddr, const char *sysfs_dir)
855
854
  {
856
855
  struct linux_device_priv *priv = _device_priv(dev);
857
- unsigned char *dev_buf;
858
- char path[PATH_MAX];
856
+ struct libusb_context *ctx = DEVICE_CTX(dev);
857
+ int descriptors_size = 512; /* Begin with a 1024 byte alloc */
859
858
  int fd, speed;
860
- int active_config = 0;
861
- int device_configured = 1;
862
859
  ssize_t r;
863
860
 
864
861
  dev->bus_number = busnum;
@@ -885,113 +882,162 @@ static int initialize_device(struct libusb_device *dev, uint8_t busnum,
885
882
  }
886
883
  }
887
884
 
885
+ /* cache descriptors in memory */
888
886
  if (sysfs_has_descriptors)
889
- return 0;
890
-
891
- /* cache device descriptor in memory so that we can retrieve it later
892
- * without waking the device up (op_get_device_descriptor) */
887
+ fd = _open_sysfs_attr(dev, "descriptors");
888
+ else
889
+ fd = _get_usbfs_fd(dev, O_RDONLY, 0);
890
+ if (fd < 0)
891
+ return fd;
893
892
 
894
- priv->dev_descriptor = NULL;
895
- priv->config_descriptor = NULL;
893
+ do {
894
+ descriptors_size *= 2;
895
+ priv->descriptors = usbi_reallocf(priv->descriptors,
896
+ descriptors_size);
897
+ if (!priv->descriptors) {
898
+ close(fd);
899
+ return LIBUSB_ERROR_NO_MEM;
900
+ }
901
+ /* usbfs has holes in the file */
902
+ if (!sysfs_has_descriptors) {
903
+ memset(priv->descriptors + priv->descriptors_len,
904
+ 0, descriptors_size - priv->descriptors_len);
905
+ }
906
+ r = read(fd, priv->descriptors + priv->descriptors_len,
907
+ descriptors_size - priv->descriptors_len);
908
+ if (r < 0) {
909
+ usbi_err(ctx, "read descriptor failed ret=%d errno=%d",
910
+ fd, errno);
911
+ close(fd);
912
+ return LIBUSB_ERROR_IO;
913
+ }
914
+ priv->descriptors_len += r;
915
+ } while (priv->descriptors_len == descriptors_size);
916
+
917
+ close(fd);
896
918
 
897
- if (sysfs_can_relate_devices) {
898
- int tmp = sysfs_get_active_config(dev, &active_config);
899
- if (tmp < 0)
900
- return tmp;
901
- if (active_config == -1)
902
- device_configured = 0;
919
+ if (priv->descriptors_len < DEVICE_DESC_LENGTH) {
920
+ usbi_err(ctx, "short descriptor read (%d)",
921
+ priv->descriptors_len);
922
+ return LIBUSB_ERROR_IO;
903
923
  }
904
924
 
905
- _get_usbfs_path(dev, path);
906
- fd = open(path, O_RDWR);
907
- if (fd < 0 && errno == EACCES) {
908
- fd = open(path, O_RDONLY);
909
- /* if we only have read-only access to the device, we cannot
910
- * send a control message to determine the active config. just
911
- * assume the first one is active. */
912
- active_config = -1;
913
- }
925
+ if (sysfs_can_relate_devices)
926
+ return LIBUSB_SUCCESS;
914
927
 
928
+ /* cache active config */
929
+ fd = _get_usbfs_fd(dev, O_RDWR, 1);
915
930
  if (fd < 0) {
916
- usbi_err(DEVICE_CTX(dev), "open failed, ret=%d errno=%d", fd, errno);
917
- return LIBUSB_ERROR_IO;
918
- }
931
+ /* cannot send a control message to determine the active
932
+ * config. just assume the first one is active. */
933
+ usbi_warn(ctx, "Missing rw usbfs access; cannot determine "
934
+ "active configuration descriptor");
935
+ if (priv->descriptors_len >=
936
+ (DEVICE_DESC_LENGTH + LIBUSB_DT_CONFIG_SIZE)) {
937
+ struct libusb_config_descriptor config;
938
+ usbi_parse_descriptor(
939
+ priv->descriptors + DEVICE_DESC_LENGTH,
940
+ "bbwbbbbb", &config, 0);
941
+ priv->active_config = config.bConfigurationValue;
942
+ } else
943
+ priv->active_config = -1; /* No config dt */
944
+
945
+ return LIBUSB_SUCCESS;
946
+ }
947
+
948
+ r = usbfs_get_active_config(dev, fd);
949
+ if (r > 0) {
950
+ priv->active_config = r;
951
+ r = LIBUSB_SUCCESS;
952
+ } else if (r == 0) {
953
+ /* some buggy devices have a configuration 0, but we're
954
+ * reaching into the corner of a corner case here, so let's
955
+ * not support buggy devices in these circumstances.
956
+ * stick to the specs: a configuration value of 0 means
957
+ * unconfigured. */
958
+ usbi_dbg("active cfg 0? assuming unconfigured device");
959
+ priv->active_config = -1;
960
+ r = LIBUSB_SUCCESS;
961
+ } else if (r == LIBUSB_ERROR_IO) {
962
+ /* buggy devices sometimes fail to report their active config.
963
+ * assume unconfigured and continue the probing */
964
+ usbi_warn(ctx, "couldn't query active configuration, assuming"
965
+ " unconfigured");
966
+ priv->active_config = -1;
967
+ r = LIBUSB_SUCCESS;
968
+ } /* else r < 0, just return the error code */
919
969
 
920
- if (!sysfs_can_relate_devices) {
921
- if (active_config == -1) {
922
- /* if we only have read-only access to the device, we cannot
923
- * send a control message to determine the active config. just
924
- * assume the first one is active. */
925
- usbi_warn(DEVICE_CTX(dev), "access to %s is read-only; cannot "
926
- "determine active configuration descriptor", path);
927
- } else {
928
- active_config = usbfs_get_active_config(dev, fd);
929
- if (active_config == LIBUSB_ERROR_IO) {
930
- /* buggy devices sometimes fail to report their active config.
931
- * assume unconfigured and continue the probing */
932
- usbi_warn(DEVICE_CTX(dev), "couldn't query active "
933
- "configuration, assumung unconfigured");
934
- device_configured = 0;
935
- } else if (active_config < 0) {
936
- close(fd);
937
- return active_config;
938
- } else if (active_config == 0) {
939
- /* some buggy devices have a configuration 0, but we're
940
- * reaching into the corner of a corner case here, so let's
941
- * not support buggy devices in these circumstances.
942
- * stick to the specs: a configuration value of 0 means
943
- * unconfigured. */
944
- usbi_dbg("active cfg 0? assuming unconfigured device");
945
- device_configured = 0;
946
- }
970
+ close(fd);
971
+ return r;
972
+ }
973
+
974
+ static int linux_get_parent_info(struct libusb_device *dev, const char *sysfs_dir)
975
+ {
976
+ struct libusb_context *ctx = DEVICE_CTX(dev);
977
+ struct libusb_device *it;
978
+ char *parent_sysfs_dir, *tmp;
979
+ int ret, add_parent = 1;
980
+
981
+ /* XXX -- can we figure out the topology when using usbfs? */
982
+ if (NULL == sysfs_dir || 0 == strncmp(sysfs_dir, "usb", 3)) {
983
+ /* either using usbfs or finding the parent of a root hub */
984
+ return LIBUSB_SUCCESS;
985
+ }
986
+
987
+ parent_sysfs_dir = strdup(sysfs_dir);
988
+ if (NULL != (tmp = strrchr(parent_sysfs_dir, '.')) ||
989
+ NULL != (tmp = strrchr(parent_sysfs_dir, '-'))) {
990
+ dev->port_number = atoi(tmp + 1);
991
+ *tmp = '\0';
992
+ } else {
993
+ usbi_warn(ctx, "Can not parse sysfs_dir: %s, no parent info",
994
+ parent_sysfs_dir);
995
+ free (parent_sysfs_dir);
996
+ return LIBUSB_SUCCESS;
997
+ }
998
+
999
+ /* is the parent a root hub? */
1000
+ if (NULL == strchr(parent_sysfs_dir, '-')) {
1001
+ tmp = parent_sysfs_dir;
1002
+ ret = asprintf (&parent_sysfs_dir, "usb%s", tmp);
1003
+ free (tmp);
1004
+ if (0 > ret) {
1005
+ return LIBUSB_ERROR_NO_MEM;
947
1006
  }
948
1007
  }
949
1008
 
950
- dev_buf = malloc(DEVICE_DESC_LENGTH);
951
- if (!dev_buf) {
952
- close(fd);
953
- return LIBUSB_ERROR_NO_MEM;
1009
+ retry:
1010
+ /* find the parent in the context */
1011
+ usbi_mutex_lock(&ctx->usb_devs_lock);
1012
+ list_for_each_entry(it, &ctx->usb_devs, list, struct libusb_device) {
1013
+ struct linux_device_priv *priv = _device_priv(it);
1014
+ if (0 == strcmp (priv->sysfs_dir, parent_sysfs_dir)) {
1015
+ dev->parent_dev = libusb_ref_device(it);
1016
+ break;
1017
+ }
954
1018
  }
1019
+ usbi_mutex_unlock(&ctx->usb_devs_lock);
955
1020
 
956
- r = read(fd, dev_buf, DEVICE_DESC_LENGTH);
957
- if (r < 0) {
958
- usbi_err(DEVICE_CTX(dev),
959
- "read descriptor failed ret=%d errno=%d", fd, errno);
960
- free(dev_buf);
961
- close(fd);
962
- return LIBUSB_ERROR_IO;
963
- } else if (r < DEVICE_DESC_LENGTH) {
964
- usbi_err(DEVICE_CTX(dev), "short descriptor read (%d)", r);
965
- free(dev_buf);
966
- close(fd);
967
- return LIBUSB_ERROR_IO;
1021
+ if (!dev->parent_dev && add_parent) {
1022
+ usbi_dbg("parent_dev %s not enumerated yet, enumerating now",
1023
+ parent_sysfs_dir);
1024
+ sysfs_scan_device(ctx, parent_sysfs_dir);
1025
+ add_parent = 0;
1026
+ goto retry;
968
1027
  }
969
1028
 
970
- /* bit of a hack: set num_configurations now because cache_active_config()
971
- * calls usbi_get_config_index_by_value() which uses it */
972
- dev->num_configurations = dev_buf[DEVICE_DESC_LENGTH - 1];
1029
+ usbi_dbg("Dev %p (%s) has parent %p (%s) port %d", dev, sysfs_dir,
1030
+ dev->parent_dev, parent_sysfs_dir, dev->port_number);
973
1031
 
974
- if (device_configured) {
975
- r = cache_active_config(dev, fd, active_config);
976
- if (r < 0) {
977
- close(fd);
978
- free(dev_buf);
979
- return r;
980
- }
981
- }
1032
+ free (parent_sysfs_dir);
982
1033
 
983
- close(fd);
984
- priv->dev_descriptor = dev_buf;
985
- return 0;
1034
+ return LIBUSB_SUCCESS;
986
1035
  }
987
1036
 
988
- static int enumerate_device(struct libusb_context *ctx,
989
- struct discovered_devs **_discdevs, uint8_t busnum, uint8_t devaddr,
990
- const char *sysfs_dir)
1037
+ int linux_enumerate_device(struct libusb_context *ctx,
1038
+ uint8_t busnum, uint8_t devaddr, const char *sysfs_dir)
991
1039
  {
992
- struct discovered_devs *discdevs;
993
1040
  unsigned long session_id;
994
- int need_unref = 0;
995
1041
  struct libusb_device *dev;
996
1042
  int r = 0;
997
1043
 
@@ -1002,48 +1048,73 @@ static int enumerate_device(struct libusb_context *ctx,
1002
1048
  usbi_dbg("busnum %d devaddr %d session_id %ld", busnum, devaddr,
1003
1049
  session_id);
1004
1050
 
1005
- dev = usbi_get_device_by_session_id(ctx, session_id);
1006
- if (dev) {
1007
- usbi_dbg("using existing device for %d/%d (session %ld)",
1008
- busnum, devaddr, session_id);
1009
- } else {
1010
- usbi_dbg("allocating new device for %d/%d (session %ld)",
1011
- busnum, devaddr, session_id);
1012
- dev = usbi_alloc_device(ctx, session_id);
1013
- if (!dev)
1014
- return LIBUSB_ERROR_NO_MEM;
1015
- need_unref = 1;
1016
- r = initialize_device(dev, busnum, devaddr, sysfs_dir);
1017
- if (r < 0)
1018
- goto out;
1019
- r = usbi_sanitize_device(dev);
1020
- if (r < 0)
1021
- goto out;
1051
+ if (usbi_get_device_by_session_id(ctx, session_id)) {
1052
+ /* device already exists in the context */
1053
+ usbi_dbg("session_id %ld already exists", session_id);
1054
+ return LIBUSB_SUCCESS;
1022
1055
  }
1023
1056
 
1024
- discdevs = discovered_devs_append(*_discdevs, dev);
1025
- if (!discdevs)
1026
- r = LIBUSB_ERROR_NO_MEM;
1027
- else
1028
- *_discdevs = discdevs;
1057
+ usbi_dbg("allocating new device for %d/%d (session %ld)",
1058
+ busnum, devaddr, session_id);
1059
+ dev = usbi_alloc_device(ctx, session_id);
1060
+ if (!dev)
1061
+ return LIBUSB_ERROR_NO_MEM;
1029
1062
 
1063
+ r = initialize_device(dev, busnum, devaddr, sysfs_dir);
1064
+ if (r < 0)
1065
+ goto out;
1066
+ r = usbi_sanitize_device(dev);
1067
+ if (r < 0)
1068
+ goto out;
1069
+
1070
+ r = linux_get_parent_info(dev, sysfs_dir);
1071
+ if (r < 0)
1072
+ goto out;
1030
1073
  out:
1031
- if (need_unref)
1074
+ if (r < 0)
1032
1075
  libusb_unref_device(dev);
1076
+ else
1077
+ usbi_connect_device(dev);
1078
+
1033
1079
  return r;
1034
1080
  }
1035
1081
 
1036
- /* open a bus directory and adds all discovered devices to discdevs. on
1037
- * failure (non-zero return) the pre-existing discdevs should be destroyed
1038
- * (and devices freed). on success, the new discdevs pointer should be used
1039
- * as it may have been moved. */
1040
- static int usbfs_scan_busdir(struct libusb_context *ctx,
1041
- struct discovered_devs **_discdevs, uint8_t busnum)
1082
+ void linux_hotplug_enumerate(uint8_t busnum, uint8_t devaddr, const char *sys_name)
1083
+ {
1084
+ struct libusb_context *ctx;
1085
+
1086
+ usbi_mutex_static_lock(&active_contexts_lock);
1087
+ list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) {
1088
+ linux_enumerate_device(ctx, busnum, devaddr, sys_name);
1089
+ }
1090
+ usbi_mutex_static_unlock(&active_contexts_lock);
1091
+ }
1092
+
1093
+ void linux_device_disconnected(uint8_t busnum, uint8_t devaddr, const char *sys_name)
1094
+ {
1095
+ struct libusb_context *ctx;
1096
+ struct libusb_device *dev;
1097
+ unsigned long session_id = busnum << 8 | devaddr;
1098
+
1099
+ usbi_mutex_static_lock(&active_contexts_lock);
1100
+ list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) {
1101
+ dev = usbi_get_device_by_session_id (ctx, session_id);
1102
+ if (NULL != dev) {
1103
+ usbi_disconnect_device (dev);
1104
+ } else {
1105
+ usbi_dbg("device not found for session %x", session_id);
1106
+ }
1107
+ }
1108
+ usbi_mutex_static_unlock(&active_contexts_lock);
1109
+ }
1110
+
1111
+ #if !defined(USE_UDEV)
1112
+ /* open a bus directory and adds all discovered devices to the context */
1113
+ static int usbfs_scan_busdir(struct libusb_context *ctx, uint8_t busnum)
1042
1114
  {
1043
1115
  DIR *dir;
1044
1116
  char dirpath[PATH_MAX];
1045
1117
  struct dirent *entry;
1046
- struct discovered_devs *discdevs = *_discdevs;
1047
1118
  int r = LIBUSB_ERROR_IO;
1048
1119
 
1049
1120
  snprintf(dirpath, PATH_MAX, "%s/%03d", usbfs_path, busnum);
@@ -1068,7 +1139,7 @@ static int usbfs_scan_busdir(struct libusb_context *ctx,
1068
1139
  continue;
1069
1140
  }
1070
1141
 
1071
- if (enumerate_device(ctx, &discdevs, busnum, (uint8_t) devaddr, NULL)) {
1142
+ if (linux_enumerate_device(ctx, busnum, (uint8_t) devaddr, NULL)) {
1072
1143
  usbi_dbg("failed to enumerate dir entry %s", entry->d_name);
1073
1144
  continue;
1074
1145
  }
@@ -1076,18 +1147,14 @@ static int usbfs_scan_busdir(struct libusb_context *ctx,
1076
1147
  r = 0;
1077
1148
  }
1078
1149
 
1079
- if (!r)
1080
- *_discdevs = discdevs;
1081
1150
  closedir(dir);
1082
1151
  return r;
1083
1152
  }
1084
1153
 
1085
- static int usbfs_get_device_list(struct libusb_context *ctx,
1086
- struct discovered_devs **_discdevs)
1154
+ static int usbfs_get_device_list(struct libusb_context *ctx)
1087
1155
  {
1088
1156
  struct dirent *entry;
1089
1157
  DIR *buses = opendir(usbfs_path);
1090
- struct discovered_devs *discdevs = *_discdevs;
1091
1158
  int r = 0;
1092
1159
 
1093
1160
  if (!buses) {
@@ -1096,7 +1163,6 @@ static int usbfs_get_device_list(struct libusb_context *ctx,
1096
1163
  }
1097
1164
 
1098
1165
  while ((entry = readdir(buses))) {
1099
- struct discovered_devs *discdevs_new = discdevs;
1100
1166
  int busnum;
1101
1167
 
1102
1168
  if (entry->d_name[0] == '.')
@@ -1107,8 +1173,7 @@ static int usbfs_get_device_list(struct libusb_context *ctx,
1107
1173
  if (!_is_usbdev_entry(entry, &busnum, &devaddr))
1108
1174
  continue;
1109
1175
 
1110
- r = enumerate_device(ctx, &discdevs_new, busnum,
1111
- (uint8_t) devaddr, NULL);
1176
+ r = linux_enumerate_device(ctx, busnum, (uint8_t) devaddr, NULL);
1112
1177
  if (r < 0) {
1113
1178
  usbi_dbg("failed to enumerate dir entry %s", entry->d_name);
1114
1179
  continue;
@@ -1120,116 +1185,35 @@ static int usbfs_get_device_list(struct libusb_context *ctx,
1120
1185
  continue;
1121
1186
  }
1122
1187
 
1123
- r = usbfs_scan_busdir(ctx, &discdevs_new, busnum);
1188
+ r = usbfs_scan_busdir(ctx, busnum);
1124
1189
  if (r < 0)
1125
- goto out;
1190
+ break;
1126
1191
  }
1127
- discdevs = discdevs_new;
1128
1192
  }
1129
1193
 
1130
- out:
1131
1194
  closedir(buses);
1132
- *_discdevs = discdevs;
1133
1195
  return r;
1134
1196
 
1135
1197
  }
1198
+ #endif
1136
1199
 
1137
- static int sysfs_scan_device(struct libusb_context *ctx,
1138
- struct discovered_devs **_discdevs, const char *devname)
1200
+ static int sysfs_scan_device(struct libusb_context *ctx, const char *devname)
1139
1201
  {
1140
- int busnum;
1141
- int devaddr;
1142
-
1143
- usbi_dbg("scan %s", devname);
1202
+ uint8_t busnum, devaddr;
1203
+ int ret;
1144
1204
 
1145
- busnum = __read_sysfs_attr(ctx, devname, "busnum");
1146
- if (busnum < 0)
1147
- return busnum;
1148
-
1149
- devaddr = __read_sysfs_attr(ctx, devname, "devnum");
1150
- if (devaddr < 0)
1151
- return devaddr;
1152
-
1153
- usbi_dbg("bus=%d dev=%d", busnum, devaddr);
1154
- if (busnum > 255 || devaddr > 255)
1155
- return LIBUSB_ERROR_INVALID_PARAM;
1205
+ ret = linux_get_device_address (ctx, 0, &busnum, &devaddr, NULL, devname);
1206
+ if (LIBUSB_SUCCESS != ret) {
1207
+ return ret;
1208
+ }
1156
1209
 
1157
- return enumerate_device(ctx, _discdevs, busnum & 0xff, devaddr & 0xff,
1210
+ return linux_enumerate_device(ctx, busnum & 0xff, devaddr & 0xff,
1158
1211
  devname);
1159
1212
  }
1160
1213
 
1161
- static void sysfs_analyze_topology(struct discovered_devs *discdevs)
1162
- {
1163
- struct linux_device_priv *priv;
1164
- int i, j;
1165
- struct libusb_device *dev1, *dev2;
1166
- const char *sysfs_dir1, *sysfs_dir2;
1167
- const char *p;
1168
- int n, boundary_char;
1169
-
1170
- /* Fill in the port_number and parent_dev fields for each device */
1171
-
1172
- for (i = 0; i < discdevs->len; ++i) {
1173
- dev1 = discdevs->devices[i];
1174
- priv = _device_priv(dev1);
1175
- if (!priv)
1176
- continue;
1177
- sysfs_dir1 = priv->sysfs_dir;
1178
-
1179
- /* Root hubs have sysfs_dir names of the form "usbB",
1180
- * where B is the bus number. All other devices have
1181
- * sysfs_dir names of the form "B-P[.P ...]", where the
1182
- * P values are port numbers leading from the root hub
1183
- * to the device.
1184
- */
1185
-
1186
- /* Root hubs don't have parents or port numbers */
1187
- if (sysfs_dir1[0] == 'u')
1188
- continue;
1189
-
1190
- /* The rightmost component is the device's port number */
1191
- p = strrchr(sysfs_dir1, '.');
1192
- if (!p) {
1193
- p = strchr(sysfs_dir1, '-');
1194
- if (!p)
1195
- continue; /* Should never happen */
1196
- }
1197
- dev1->port_number = atoi(p + 1);
1198
-
1199
- /* Search for the parent device */
1200
- boundary_char = *p;
1201
- n = p - sysfs_dir1;
1202
- for (j = 0; j < discdevs->len; ++j) {
1203
- dev2 = discdevs->devices[j];
1204
- priv = _device_priv(dev2);
1205
- if (!priv)
1206
- continue;
1207
- sysfs_dir2 = priv->sysfs_dir;
1208
-
1209
- if (boundary_char == '-') {
1210
- /* The parent's name must begin with 'usb';
1211
- * skip past that part of sysfs_dir2.
1212
- */
1213
- if (sysfs_dir2[0] != 'u')
1214
- continue;
1215
- sysfs_dir2 += 3;
1216
- }
1217
-
1218
- /* The remainder of the parent's name must be equal to
1219
- * the first n bytes of sysfs_dir1.
1220
- */
1221
- if (memcmp(sysfs_dir1, sysfs_dir2, n) == 0 && !sysfs_dir2[n]) {
1222
- dev1->parent_dev = dev2;
1223
- break;
1224
- }
1225
- }
1226
- }
1227
- }
1228
-
1229
- static int sysfs_get_device_list(struct libusb_context *ctx,
1230
- struct discovered_devs **_discdevs)
1214
+ #if !defined(USE_UDEV)
1215
+ static int sysfs_get_device_list(struct libusb_context *ctx)
1231
1216
  {
1232
- struct discovered_devs *discdevs = *_discdevs;
1233
1217
  DIR *devices = opendir(SYSFS_DEVICE_PATH);
1234
1218
  struct dirent *entry;
1235
1219
  int r = LIBUSB_ERROR_IO;
@@ -1240,30 +1224,23 @@ static int sysfs_get_device_list(struct libusb_context *ctx,
1240
1224
  }
1241
1225
 
1242
1226
  while ((entry = readdir(devices))) {
1243
- struct discovered_devs *discdevs_new = discdevs;
1244
-
1245
1227
  if ((!isdigit(entry->d_name[0]) && strncmp(entry->d_name, "usb", 3))
1246
1228
  || strchr(entry->d_name, ':'))
1247
1229
  continue;
1248
1230
 
1249
- if (sysfs_scan_device(ctx, &discdevs_new, entry->d_name)) {
1231
+ if (sysfs_scan_device(ctx, entry->d_name)) {
1250
1232
  usbi_dbg("failed to enumerate dir entry %s", entry->d_name);
1251
1233
  continue;
1252
1234
  }
1253
1235
 
1254
1236
  r = 0;
1255
- discdevs = discdevs_new;
1256
1237
  }
1257
1238
 
1258
- if (!r)
1259
- *_discdevs = discdevs;
1260
1239
  closedir(devices);
1261
- sysfs_analyze_topology(discdevs);
1262
1240
  return r;
1263
1241
  }
1264
1242
 
1265
- static int op_get_device_list(struct libusb_context *ctx,
1266
- struct discovered_devs **_discdevs)
1243
+ static int linux_default_scan_devices (struct libusb_context *ctx)
1267
1244
  {
1268
1245
  /* we can retrieve device list and descriptors from sysfs or usbfs.
1269
1246
  * sysfs is preferable, because if we use usbfs we end up resuming
@@ -1276,45 +1253,39 @@ static int op_get_device_list(struct libusb_context *ctx,
1276
1253
  * adequacy of sysfs and sets sysfs_can_relate_devices.
1277
1254
  */
1278
1255
  if (sysfs_can_relate_devices != 0)
1279
- return sysfs_get_device_list(ctx, _discdevs);
1256
+ return sysfs_get_device_list(ctx);
1280
1257
  else
1281
- return usbfs_get_device_list(ctx, _discdevs);
1258
+ return usbfs_get_device_list(ctx);
1282
1259
  }
1260
+ #endif
1283
1261
 
1284
1262
  static int op_open(struct libusb_device_handle *handle)
1285
1263
  {
1286
1264
  struct linux_device_handle_priv *hpriv = _device_handle_priv(handle);
1287
- char filename[PATH_MAX];
1288
1265
  int r;
1289
1266
 
1290
- _get_usbfs_path(handle->dev, filename);
1291
- usbi_dbg("opening %s", filename);
1292
- hpriv->fd = open(filename, O_RDWR);
1267
+ hpriv->fd = _get_usbfs_fd(handle->dev, O_RDWR, 0);
1293
1268
  if (hpriv->fd < 0) {
1294
- if (errno == EACCES) {
1295
- usbi_err(HANDLE_CTX(handle), "libusbx couldn't open USB device %s: "
1296
- "Permission denied.", filename);
1297
- usbi_err(HANDLE_CTX(handle),
1298
- "libusbx requires write access to USB device nodes.");
1299
- return LIBUSB_ERROR_ACCESS;
1300
- } else if (errno == ENOENT) {
1301
- usbi_err(HANDLE_CTX(handle), "libusbx couldn't open USB device %s: "
1302
- "No such file or directory.", filename);
1303
- return LIBUSB_ERROR_NO_DEVICE;
1304
- } else {
1305
- usbi_err(HANDLE_CTX(handle),
1306
- "open failed, code %d errno %d", hpriv->fd, errno);
1307
- return LIBUSB_ERROR_IO;
1269
+ if (hpriv->fd == LIBUSB_ERROR_NO_DEVICE) {
1270
+ /* device will still be marked as attached if hotplug monitor thread
1271
+ * hasn't processed remove event yet */
1272
+ usbi_mutex_static_lock(&linux_hotplug_lock);
1273
+ if (handle->dev->attached) {
1274
+ usbi_dbg("open failed with no device, but device still attached");
1275
+ linux_device_disconnected(handle->dev->bus_number,
1276
+ handle->dev->device_address, NULL);
1277
+ }
1278
+ usbi_mutex_static_unlock(&linux_hotplug_lock);
1308
1279
  }
1280
+ return hpriv->fd;
1309
1281
  }
1310
1282
 
1311
1283
  r = ioctl(hpriv->fd, IOCTL_USBFS_GET_CAPABILITIES, &hpriv->caps);
1312
1284
  if (r < 0) {
1313
1285
  if (errno == ENOTTY)
1314
- usbi_dbg("%s: getcap not available", filename);
1286
+ usbi_dbg("getcap not available");
1315
1287
  else
1316
- usbi_err(HANDLE_CTX(handle),
1317
- "%s: getcap failed (%d)", filename, errno);
1288
+ usbi_err(HANDLE_CTX(handle), "getcap failed (%d)", errno);
1318
1289
  hpriv->caps = 0;
1319
1290
  if (supports_flag_zero_packet)
1320
1291
  hpriv->caps |= USBFS_CAP_ZERO_PACKET;
@@ -1336,10 +1307,13 @@ static int op_get_configuration(struct libusb_device_handle *handle,
1336
1307
  int *config)
1337
1308
  {
1338
1309
  int r;
1339
- if (sysfs_can_relate_devices != 1)
1340
- return LIBUSB_ERROR_NOT_SUPPORTED;
1341
1310
 
1342
- r = sysfs_get_active_config(handle->dev, config);
1311
+ if (sysfs_can_relate_devices) {
1312
+ r = sysfs_get_active_config(handle->dev, config);
1313
+ } else {
1314
+ r = usbfs_get_active_config(handle->dev,
1315
+ _device_handle_priv(handle)->fd);
1316
+ }
1343
1317
  if (r < 0)
1344
1318
  return r;
1345
1319
 
@@ -1368,25 +1342,13 @@ static int op_set_configuration(struct libusb_device_handle *handle, int config)
1368
1342
  return LIBUSB_ERROR_OTHER;
1369
1343
  }
1370
1344
 
1371
- if (!sysfs_has_descriptors) {
1372
- /* update our cached active config descriptor */
1373
- if (config == -1) {
1374
- if (priv->config_descriptor) {
1375
- free(priv->config_descriptor);
1376
- priv->config_descriptor = NULL;
1377
- }
1378
- } else {
1379
- r = cache_active_config(handle->dev, fd, config);
1380
- if (r < 0)
1381
- usbi_warn(HANDLE_CTX(handle),
1382
- "failed to update cached config descriptor, error %d", r);
1383
- }
1384
- }
1345
+ /* update our cached active config descriptor */
1346
+ priv->active_config = config;
1385
1347
 
1386
- return 0;
1348
+ return LIBUSB_SUCCESS;
1387
1349
  }
1388
1350
 
1389
- static int op_claim_interface(struct libusb_device_handle *handle, int iface)
1351
+ static int claim_interface(struct libusb_device_handle *handle, int iface)
1390
1352
  {
1391
1353
  int fd = _device_handle_priv(handle)->fd;
1392
1354
  int r = ioctl(fd, IOCTL_USBFS_CLAIMINTF, &iface);
@@ -1405,7 +1367,7 @@ static int op_claim_interface(struct libusb_device_handle *handle, int iface)
1405
1367
  return 0;
1406
1368
  }
1407
1369
 
1408
- static int op_release_interface(struct libusb_device_handle *handle, int iface)
1370
+ static int release_interface(struct libusb_device_handle *handle, int iface)
1409
1371
  {
1410
1372
  int fd = _device_handle_priv(handle)->fd;
1411
1373
  int r = ioctl(fd, IOCTL_USBFS_RELEASEINTF, &iface);
@@ -1476,7 +1438,7 @@ static int op_reset_device(struct libusb_device_handle *handle)
1476
1438
  getting bound to the in kernel driver if any). */
1477
1439
  for (i = 0; i < USB_MAXINTERFACES; i++) {
1478
1440
  if (handle->claimed_interfaces & (1L << i)) {
1479
- op_release_interface(handle, i);
1441
+ release_interface(handle, i);
1480
1442
  }
1481
1443
  }
1482
1444
 
@@ -1497,11 +1459,18 @@ static int op_reset_device(struct libusb_device_handle *handle)
1497
1459
  /* And re-claim any interfaces which were claimed before the reset */
1498
1460
  for (i = 0; i < USB_MAXINTERFACES; i++) {
1499
1461
  if (handle->claimed_interfaces & (1L << i)) {
1500
- r = op_claim_interface(handle, i);
1462
+ /*
1463
+ * A driver may have completed modprobing during
1464
+ * IOCTL_USBFS_RESET, and bound itself as soon as
1465
+ * IOCTL_USBFS_RESET released the device lock
1466
+ */
1467
+ r = detach_kernel_driver_and_claim(handle, i);
1501
1468
  if (r) {
1502
1469
  usbi_warn(HANDLE_CTX(handle),
1503
- "failed to re-claim interface %d after reset", i);
1470
+ "failed to re-claim interface %d after reset: %s",
1471
+ i, libusb_error_name(r));
1504
1472
  handle->claimed_interfaces &= ~(1L << i);
1473
+ ret = LIBUSB_ERROR_NOT_FOUND;
1505
1474
  }
1506
1475
  }
1507
1476
  }
@@ -1530,7 +1499,7 @@ static int op_kernel_driver_active(struct libusb_device_handle *handle,
1530
1499
  return LIBUSB_ERROR_OTHER;
1531
1500
  }
1532
1501
 
1533
- return 1;
1502
+ return (strcmp(getdrv.driver, "usbfs") == 0) ? 0 : 1;
1534
1503
  }
1535
1504
 
1536
1505
  static int op_detach_kernel_driver(struct libusb_device_handle *handle,
@@ -1599,15 +1568,69 @@ static int op_attach_kernel_driver(struct libusb_device_handle *handle,
1599
1568
  return 0;
1600
1569
  }
1601
1570
 
1571
+ static int detach_kernel_driver_and_claim(struct libusb_device_handle *handle,
1572
+ int interface)
1573
+ {
1574
+ struct usbfs_disconnect_claim dc;
1575
+ int r, fd = _device_handle_priv(handle)->fd;
1576
+
1577
+ dc.interface = interface;
1578
+ strcpy(dc.driver, "usbfs");
1579
+ dc.flags = USBFS_DISCONNECT_CLAIM_EXCEPT_DRIVER;
1580
+ r = ioctl(fd, IOCTL_USBFS_DISCONNECT_CLAIM, &dc);
1581
+ if (r == 0 || (r != 0 && errno != ENOTTY)) {
1582
+ if (r == 0)
1583
+ return 0;
1584
+
1585
+ switch (errno) {
1586
+ case EBUSY:
1587
+ return LIBUSB_ERROR_BUSY;
1588
+ case EINVAL:
1589
+ return LIBUSB_ERROR_INVALID_PARAM;
1590
+ case ENODEV:
1591
+ return LIBUSB_ERROR_NO_DEVICE;
1592
+ }
1593
+ usbi_err(HANDLE_CTX(handle),
1594
+ "disconnect-and-claim failed errno %d", errno);
1595
+ return LIBUSB_ERROR_OTHER;
1596
+ }
1597
+
1598
+ /* Fallback code for kernels which don't support the
1599
+ disconnect-and-claim ioctl */
1600
+ r = op_detach_kernel_driver(handle, interface);
1601
+ if (r != 0 && r != LIBUSB_ERROR_NOT_FOUND)
1602
+ return r;
1603
+
1604
+ return claim_interface(handle, interface);
1605
+ }
1606
+
1607
+ static int op_claim_interface(struct libusb_device_handle *handle, int iface)
1608
+ {
1609
+ if (handle->auto_detach_kernel_driver)
1610
+ return detach_kernel_driver_and_claim(handle, iface);
1611
+ else
1612
+ return claim_interface(handle, iface);
1613
+ }
1614
+
1615
+ static int op_release_interface(struct libusb_device_handle *handle, int iface)
1616
+ {
1617
+ int r;
1618
+
1619
+ r = release_interface(handle, iface);
1620
+ if (r)
1621
+ return r;
1622
+
1623
+ if (handle->auto_detach_kernel_driver)
1624
+ op_attach_kernel_driver(handle, iface);
1625
+
1626
+ return 0;
1627
+ }
1628
+
1602
1629
  static void op_destroy_device(struct libusb_device *dev)
1603
1630
  {
1604
1631
  struct linux_device_priv *priv = _device_priv(dev);
1605
- if (!sysfs_has_descriptors) {
1606
- if (priv->dev_descriptor)
1607
- free(priv->dev_descriptor);
1608
- if (priv->config_descriptor)
1609
- free(priv->config_descriptor);
1610
- }
1632
+ if (priv->descriptors)
1633
+ free(priv->descriptors);
1611
1634
  if (priv->sysfs_dir)
1612
1635
  free(priv->sysfs_dir);
1613
1636
  }
@@ -1755,7 +1778,8 @@ static int submit_bulk_transfer(struct usbi_transfer *itransfer,
1755
1778
  urb->type = urb_type;
1756
1779
  urb->endpoint = transfer->endpoint;
1757
1780
  urb->buffer = transfer->buffer + (i * bulk_buffer_len);
1758
- if (use_bulk_continuation && !is_out)
1781
+ /* don't set the short not ok flag for the last URB */
1782
+ if (use_bulk_continuation && !is_out && (i < num_urbs - 1))
1759
1783
  urb->flags = USBFS_URB_SHORT_NOT_OK;
1760
1784
  if (i == num_urbs - 1 && last_urb_partial)
1761
1785
  urb->buffer_length = transfer->length % bulk_buffer_len;
@@ -2488,10 +2512,19 @@ static int op_handle_events(struct libusb_context *ctx,
2488
2512
  if (pollfd->revents & POLLERR) {
2489
2513
  usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->fd);
2490
2514
  usbi_handle_disconnect(handle);
2515
+ /* device will still be marked as attached if hotplug monitor thread
2516
+ * hasn't processed remove event yet */
2517
+ usbi_mutex_static_lock(&linux_hotplug_lock);
2518
+ if (handle->dev->attached)
2519
+ linux_device_disconnected(handle->dev->bus_number,
2520
+ handle->dev->device_address, NULL);
2521
+ usbi_mutex_static_unlock(&linux_hotplug_lock);
2491
2522
  continue;
2492
2523
  }
2493
2524
 
2494
- r = reap_for_handle(handle);
2525
+ do {
2526
+ r = reap_for_handle(handle);
2527
+ } while (r == 0);
2495
2528
  if (r == 1 || r == LIBUSB_ERROR_NO_DEVICE)
2496
2529
  continue;
2497
2530
  else if (r < 0)
@@ -2526,12 +2559,15 @@ static clockid_t op_get_timerfd_clockid(void)
2526
2559
 
2527
2560
  const struct usbi_os_backend linux_usbfs_backend = {
2528
2561
  .name = "Linux usbfs",
2562
+ .caps = USBI_CAP_HAS_HID_ACCESS|USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER,
2529
2563
  .init = op_init,
2530
- .exit = NULL,
2531
- .get_device_list = op_get_device_list,
2564
+ .exit = op_exit,
2565
+ .get_device_list = NULL,
2566
+ .hotplug_poll = op_hotplug_poll,
2532
2567
  .get_device_descriptor = op_get_device_descriptor,
2533
2568
  .get_active_config_descriptor = op_get_active_config_descriptor,
2534
2569
  .get_config_descriptor = op_get_config_descriptor,
2570
+ .get_config_descriptor_by_value = op_get_config_descriptor_by_value,
2535
2571
 
2536
2572
  .open = op_open,
2537
2573
  .close = op_close,