diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /drivers/usb/core/hub.c |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'drivers/usb/core/hub.c')
-rw-r--r-- | drivers/usb/core/hub.c | 3057 |
1 files changed, 3057 insertions, 0 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c new file mode 100644 index 000000000000..fa0dc4f6de47 --- /dev/null +++ b/drivers/usb/core/hub.c | |||
@@ -0,0 +1,3057 @@ | |||
1 | /* | ||
2 | * USB hub driver. | ||
3 | * | ||
4 | * (C) Copyright 1999 Linus Torvalds | ||
5 | * (C) Copyright 1999 Johannes Erdfelt | ||
6 | * (C) Copyright 1999 Gregory P. Smith | ||
7 | * (C) Copyright 2001 Brad Hards (bhards@bigpond.net.au) | ||
8 | * | ||
9 | */ | ||
10 | |||
11 | #include <linux/config.h> | ||
12 | #ifdef CONFIG_USB_DEBUG | ||
13 | #define DEBUG | ||
14 | #else | ||
15 | #undef DEBUG | ||
16 | #endif | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/errno.h> | ||
19 | #include <linux/module.h> | ||
20 | #include <linux/moduleparam.h> | ||
21 | #include <linux/completion.h> | ||
22 | #include <linux/sched.h> | ||
23 | #include <linux/list.h> | ||
24 | #include <linux/slab.h> | ||
25 | #include <linux/smp_lock.h> | ||
26 | #include <linux/ioctl.h> | ||
27 | #include <linux/usb.h> | ||
28 | #include <linux/usbdevice_fs.h> | ||
29 | |||
30 | #include <asm/semaphore.h> | ||
31 | #include <asm/uaccess.h> | ||
32 | #include <asm/byteorder.h> | ||
33 | |||
34 | #include "usb.h" | ||
35 | #include "hcd.h" | ||
36 | #include "hub.h" | ||
37 | |||
38 | /* Protect struct usb_device->state and ->children members | ||
39 | * Note: Both are also protected by ->serialize, except that ->state can | ||
40 | * change to USB_STATE_NOTATTACHED even when the semaphore isn't held. */ | ||
41 | static DEFINE_SPINLOCK(device_state_lock); | ||
42 | |||
43 | /* khubd's worklist and its lock */ | ||
44 | static DEFINE_SPINLOCK(hub_event_lock); | ||
45 | static LIST_HEAD(hub_event_list); /* List of hubs needing servicing */ | ||
46 | |||
47 | /* Wakes up khubd */ | ||
48 | static DECLARE_WAIT_QUEUE_HEAD(khubd_wait); | ||
49 | |||
50 | static pid_t khubd_pid = 0; /* PID of khubd */ | ||
51 | static DECLARE_COMPLETION(khubd_exited); | ||
52 | |||
53 | /* cycle leds on hubs that aren't blinking for attention */ | ||
54 | static int blinkenlights = 0; | ||
55 | module_param (blinkenlights, bool, S_IRUGO); | ||
56 | MODULE_PARM_DESC (blinkenlights, "true to cycle leds on hubs"); | ||
57 | |||
58 | /* | ||
59 | * As of 2.6.10 we introduce a new USB device initialization scheme which | ||
60 | * closely resembles the way Windows works. Hopefully it will be compatible | ||
61 | * with a wider range of devices than the old scheme. However some previously | ||
62 | * working devices may start giving rise to "device not accepting address" | ||
63 | * errors; if that happens the user can try the old scheme by adjusting the | ||
64 | * following module parameters. | ||
65 | * | ||
66 | * For maximum flexibility there are two boolean parameters to control the | ||
67 | * hub driver's behavior. On the first initialization attempt, if the | ||
68 | * "old_scheme_first" parameter is set then the old scheme will be used, | ||
69 | * otherwise the new scheme is used. If that fails and "use_both_schemes" | ||
70 | * is set, then the driver will make another attempt, using the other scheme. | ||
71 | */ | ||
72 | static int old_scheme_first = 0; | ||
73 | module_param(old_scheme_first, bool, S_IRUGO | S_IWUSR); | ||
74 | MODULE_PARM_DESC(old_scheme_first, | ||
75 | "start with the old device initialization scheme"); | ||
76 | |||
77 | static int use_both_schemes = 1; | ||
78 | module_param(use_both_schemes, bool, S_IRUGO | S_IWUSR); | ||
79 | MODULE_PARM_DESC(use_both_schemes, | ||
80 | "try the other device initialization scheme if the " | ||
81 | "first one fails"); | ||
82 | |||
83 | |||
84 | #ifdef DEBUG | ||
85 | static inline char *portspeed (int portstatus) | ||
86 | { | ||
87 | if (portstatus & (1 << USB_PORT_FEAT_HIGHSPEED)) | ||
88 | return "480 Mb/s"; | ||
89 | else if (portstatus & (1 << USB_PORT_FEAT_LOWSPEED)) | ||
90 | return "1.5 Mb/s"; | ||
91 | else | ||
92 | return "12 Mb/s"; | ||
93 | } | ||
94 | #endif | ||
95 | |||
96 | /* Note that hdev or one of its children must be locked! */ | ||
97 | static inline struct usb_hub *hdev_to_hub(struct usb_device *hdev) | ||
98 | { | ||
99 | return usb_get_intfdata(hdev->actconfig->interface[0]); | ||
100 | } | ||
101 | |||
102 | /* USB 2.0 spec Section 11.24.4.5 */ | ||
103 | static int get_hub_descriptor(struct usb_device *hdev, void *data, int size) | ||
104 | { | ||
105 | int i, ret; | ||
106 | |||
107 | for (i = 0; i < 3; i++) { | ||
108 | ret = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0), | ||
109 | USB_REQ_GET_DESCRIPTOR, USB_DIR_IN | USB_RT_HUB, | ||
110 | USB_DT_HUB << 8, 0, data, size, | ||
111 | USB_CTRL_GET_TIMEOUT); | ||
112 | if (ret >= (USB_DT_HUB_NONVAR_SIZE + 2)) | ||
113 | return ret; | ||
114 | } | ||
115 | return -EINVAL; | ||
116 | } | ||
117 | |||
118 | /* | ||
119 | * USB 2.0 spec Section 11.24.2.1 | ||
120 | */ | ||
121 | static int clear_hub_feature(struct usb_device *hdev, int feature) | ||
122 | { | ||
123 | return usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0), | ||
124 | USB_REQ_CLEAR_FEATURE, USB_RT_HUB, feature, 0, NULL, 0, 1000); | ||
125 | } | ||
126 | |||
127 | /* | ||
128 | * USB 2.0 spec Section 11.24.2.2 | ||
129 | */ | ||
130 | static int clear_port_feature(struct usb_device *hdev, int port1, int feature) | ||
131 | { | ||
132 | return usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0), | ||
133 | USB_REQ_CLEAR_FEATURE, USB_RT_PORT, feature, port1, | ||
134 | NULL, 0, 1000); | ||
135 | } | ||
136 | |||
137 | /* | ||
138 | * USB 2.0 spec Section 11.24.2.13 | ||
139 | */ | ||
140 | static int set_port_feature(struct usb_device *hdev, int port1, int feature) | ||
141 | { | ||
142 | return usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0), | ||
143 | USB_REQ_SET_FEATURE, USB_RT_PORT, feature, port1, | ||
144 | NULL, 0, 1000); | ||
145 | } | ||
146 | |||
147 | /* | ||
148 | * USB 2.0 spec Section 11.24.2.7.1.10 and table 11-7 | ||
149 | * for info about using port indicators | ||
150 | */ | ||
151 | static void set_port_led( | ||
152 | struct usb_hub *hub, | ||
153 | int port1, | ||
154 | int selector | ||
155 | ) | ||
156 | { | ||
157 | int status = set_port_feature(hub->hdev, (selector << 8) | port1, | ||
158 | USB_PORT_FEAT_INDICATOR); | ||
159 | if (status < 0) | ||
160 | dev_dbg (hub->intfdev, | ||
161 | "port %d indicator %s status %d\n", | ||
162 | port1, | ||
163 | ({ char *s; switch (selector) { | ||
164 | case HUB_LED_AMBER: s = "amber"; break; | ||
165 | case HUB_LED_GREEN: s = "green"; break; | ||
166 | case HUB_LED_OFF: s = "off"; break; | ||
167 | case HUB_LED_AUTO: s = "auto"; break; | ||
168 | default: s = "??"; break; | ||
169 | }; s; }), | ||
170 | status); | ||
171 | } | ||
172 | |||
173 | #define LED_CYCLE_PERIOD ((2*HZ)/3) | ||
174 | |||
175 | static void led_work (void *__hub) | ||
176 | { | ||
177 | struct usb_hub *hub = __hub; | ||
178 | struct usb_device *hdev = hub->hdev; | ||
179 | unsigned i; | ||
180 | unsigned changed = 0; | ||
181 | int cursor = -1; | ||
182 | |||
183 | if (hdev->state != USB_STATE_CONFIGURED || hub->quiescing) | ||
184 | return; | ||
185 | |||
186 | for (i = 0; i < hub->descriptor->bNbrPorts; i++) { | ||
187 | unsigned selector, mode; | ||
188 | |||
189 | /* 30%-50% duty cycle */ | ||
190 | |||
191 | switch (hub->indicator[i]) { | ||
192 | /* cycle marker */ | ||
193 | case INDICATOR_CYCLE: | ||
194 | cursor = i; | ||
195 | selector = HUB_LED_AUTO; | ||
196 | mode = INDICATOR_AUTO; | ||
197 | break; | ||
198 | /* blinking green = sw attention */ | ||
199 | case INDICATOR_GREEN_BLINK: | ||
200 | selector = HUB_LED_GREEN; | ||
201 | mode = INDICATOR_GREEN_BLINK_OFF; | ||
202 | break; | ||
203 | case INDICATOR_GREEN_BLINK_OFF: | ||
204 | selector = HUB_LED_OFF; | ||
205 | mode = INDICATOR_GREEN_BLINK; | ||
206 | break; | ||
207 | /* blinking amber = hw attention */ | ||
208 | case INDICATOR_AMBER_BLINK: | ||
209 | selector = HUB_LED_AMBER; | ||
210 | mode = INDICATOR_AMBER_BLINK_OFF; | ||
211 | break; | ||
212 | case INDICATOR_AMBER_BLINK_OFF: | ||
213 | selector = HUB_LED_OFF; | ||
214 | mode = INDICATOR_AMBER_BLINK; | ||
215 | break; | ||
216 | /* blink green/amber = reserved */ | ||
217 | case INDICATOR_ALT_BLINK: | ||
218 | selector = HUB_LED_GREEN; | ||
219 | mode = INDICATOR_ALT_BLINK_OFF; | ||
220 | break; | ||
221 | case INDICATOR_ALT_BLINK_OFF: | ||
222 | selector = HUB_LED_AMBER; | ||
223 | mode = INDICATOR_ALT_BLINK; | ||
224 | break; | ||
225 | default: | ||
226 | continue; | ||
227 | } | ||
228 | if (selector != HUB_LED_AUTO) | ||
229 | changed = 1; | ||
230 | set_port_led(hub, i + 1, selector); | ||
231 | hub->indicator[i] = mode; | ||
232 | } | ||
233 | if (!changed && blinkenlights) { | ||
234 | cursor++; | ||
235 | cursor %= hub->descriptor->bNbrPorts; | ||
236 | set_port_led(hub, cursor + 1, HUB_LED_GREEN); | ||
237 | hub->indicator[cursor] = INDICATOR_CYCLE; | ||
238 | changed++; | ||
239 | } | ||
240 | if (changed) | ||
241 | schedule_delayed_work(&hub->leds, LED_CYCLE_PERIOD); | ||
242 | } | ||
243 | |||
244 | /* use a short timeout for hub/port status fetches */ | ||
245 | #define USB_STS_TIMEOUT 1000 | ||
246 | #define USB_STS_RETRIES 5 | ||
247 | |||
248 | /* | ||
249 | * USB 2.0 spec Section 11.24.2.6 | ||
250 | */ | ||
251 | static int get_hub_status(struct usb_device *hdev, | ||
252 | struct usb_hub_status *data) | ||
253 | { | ||
254 | int i, status = -ETIMEDOUT; | ||
255 | |||
256 | for (i = 0; i < USB_STS_RETRIES && status == -ETIMEDOUT; i++) { | ||
257 | status = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0), | ||
258 | USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_HUB, 0, 0, | ||
259 | data, sizeof(*data), USB_STS_TIMEOUT); | ||
260 | } | ||
261 | return status; | ||
262 | } | ||
263 | |||
264 | /* | ||
265 | * USB 2.0 spec Section 11.24.2.7 | ||
266 | */ | ||
267 | static int get_port_status(struct usb_device *hdev, int port1, | ||
268 | struct usb_port_status *data) | ||
269 | { | ||
270 | int i, status = -ETIMEDOUT; | ||
271 | |||
272 | for (i = 0; i < USB_STS_RETRIES && status == -ETIMEDOUT; i++) { | ||
273 | status = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0), | ||
274 | USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_PORT, 0, port1, | ||
275 | data, sizeof(*data), USB_STS_TIMEOUT); | ||
276 | } | ||
277 | return status; | ||
278 | } | ||
279 | |||
280 | static void kick_khubd(struct usb_hub *hub) | ||
281 | { | ||
282 | unsigned long flags; | ||
283 | |||
284 | spin_lock_irqsave(&hub_event_lock, flags); | ||
285 | if (list_empty(&hub->event_list)) { | ||
286 | list_add_tail(&hub->event_list, &hub_event_list); | ||
287 | wake_up(&khubd_wait); | ||
288 | } | ||
289 | spin_unlock_irqrestore(&hub_event_lock, flags); | ||
290 | } | ||
291 | |||
292 | void usb_kick_khubd(struct usb_device *hdev) | ||
293 | { | ||
294 | kick_khubd(hdev_to_hub(hdev)); | ||
295 | } | ||
296 | |||
297 | |||
298 | /* completion function, fires on port status changes and various faults */ | ||
299 | static void hub_irq(struct urb *urb, struct pt_regs *regs) | ||
300 | { | ||
301 | struct usb_hub *hub = (struct usb_hub *)urb->context; | ||
302 | int status; | ||
303 | int i; | ||
304 | unsigned long bits; | ||
305 | |||
306 | switch (urb->status) { | ||
307 | case -ENOENT: /* synchronous unlink */ | ||
308 | case -ECONNRESET: /* async unlink */ | ||
309 | case -ESHUTDOWN: /* hardware going away */ | ||
310 | return; | ||
311 | |||
312 | default: /* presumably an error */ | ||
313 | /* Cause a hub reset after 10 consecutive errors */ | ||
314 | dev_dbg (hub->intfdev, "transfer --> %d\n", urb->status); | ||
315 | if ((++hub->nerrors < 10) || hub->error) | ||
316 | goto resubmit; | ||
317 | hub->error = urb->status; | ||
318 | /* FALL THROUGH */ | ||
319 | |||
320 | /* let khubd handle things */ | ||
321 | case 0: /* we got data: port status changed */ | ||
322 | bits = 0; | ||
323 | for (i = 0; i < urb->actual_length; ++i) | ||
324 | bits |= ((unsigned long) ((*hub->buffer)[i])) | ||
325 | << (i*8); | ||
326 | hub->event_bits[0] = bits; | ||
327 | break; | ||
328 | } | ||
329 | |||
330 | hub->nerrors = 0; | ||
331 | |||
332 | /* Something happened, let khubd figure it out */ | ||
333 | kick_khubd(hub); | ||
334 | |||
335 | resubmit: | ||
336 | if (hub->quiescing) | ||
337 | return; | ||
338 | |||
339 | if ((status = usb_submit_urb (hub->urb, GFP_ATOMIC)) != 0 | ||
340 | && status != -ENODEV && status != -EPERM) | ||
341 | dev_err (hub->intfdev, "resubmit --> %d\n", status); | ||
342 | } | ||
343 | |||
344 | /* USB 2.0 spec Section 11.24.2.3 */ | ||
345 | static inline int | ||
346 | hub_clear_tt_buffer (struct usb_device *hdev, u16 devinfo, u16 tt) | ||
347 | { | ||
348 | return usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0), | ||
349 | HUB_CLEAR_TT_BUFFER, USB_RT_PORT, devinfo, | ||
350 | tt, NULL, 0, 1000); | ||
351 | } | ||
352 | |||
353 | /* | ||
354 | * enumeration blocks khubd for a long time. we use keventd instead, since | ||
355 | * long blocking there is the exception, not the rule. accordingly, HCDs | ||
356 | * talking to TTs must queue control transfers (not just bulk and iso), so | ||
357 | * both can talk to the same hub concurrently. | ||
358 | */ | ||
359 | static void hub_tt_kevent (void *arg) | ||
360 | { | ||
361 | struct usb_hub *hub = arg; | ||
362 | unsigned long flags; | ||
363 | |||
364 | spin_lock_irqsave (&hub->tt.lock, flags); | ||
365 | while (!list_empty (&hub->tt.clear_list)) { | ||
366 | struct list_head *temp; | ||
367 | struct usb_tt_clear *clear; | ||
368 | struct usb_device *hdev = hub->hdev; | ||
369 | int status; | ||
370 | |||
371 | temp = hub->tt.clear_list.next; | ||
372 | clear = list_entry (temp, struct usb_tt_clear, clear_list); | ||
373 | list_del (&clear->clear_list); | ||
374 | |||
375 | /* drop lock so HCD can concurrently report other TT errors */ | ||
376 | spin_unlock_irqrestore (&hub->tt.lock, flags); | ||
377 | status = hub_clear_tt_buffer (hdev, clear->devinfo, clear->tt); | ||
378 | spin_lock_irqsave (&hub->tt.lock, flags); | ||
379 | |||
380 | if (status) | ||
381 | dev_err (&hdev->dev, | ||
382 | "clear tt %d (%04x) error %d\n", | ||
383 | clear->tt, clear->devinfo, status); | ||
384 | kfree (clear); | ||
385 | } | ||
386 | spin_unlock_irqrestore (&hub->tt.lock, flags); | ||
387 | } | ||
388 | |||
389 | /** | ||
390 | * usb_hub_tt_clear_buffer - clear control/bulk TT state in high speed hub | ||
391 | * @udev: the device whose split transaction failed | ||
392 | * @pipe: identifies the endpoint of the failed transaction | ||
393 | * | ||
394 | * High speed HCDs use this to tell the hub driver that some split control or | ||
395 | * bulk transaction failed in a way that requires clearing internal state of | ||
396 | * a transaction translator. This is normally detected (and reported) from | ||
397 | * interrupt context. | ||
398 | * | ||
399 | * It may not be possible for that hub to handle additional full (or low) | ||
400 | * speed transactions until that state is fully cleared out. | ||
401 | */ | ||
402 | void usb_hub_tt_clear_buffer (struct usb_device *udev, int pipe) | ||
403 | { | ||
404 | struct usb_tt *tt = udev->tt; | ||
405 | unsigned long flags; | ||
406 | struct usb_tt_clear *clear; | ||
407 | |||
408 | /* we've got to cope with an arbitrary number of pending TT clears, | ||
409 | * since each TT has "at least two" buffers that can need it (and | ||
410 | * there can be many TTs per hub). even if they're uncommon. | ||
411 | */ | ||
412 | if ((clear = kmalloc (sizeof *clear, SLAB_ATOMIC)) == NULL) { | ||
413 | dev_err (&udev->dev, "can't save CLEAR_TT_BUFFER state\n"); | ||
414 | /* FIXME recover somehow ... RESET_TT? */ | ||
415 | return; | ||
416 | } | ||
417 | |||
418 | /* info that CLEAR_TT_BUFFER needs */ | ||
419 | clear->tt = tt->multi ? udev->ttport : 1; | ||
420 | clear->devinfo = usb_pipeendpoint (pipe); | ||
421 | clear->devinfo |= udev->devnum << 4; | ||
422 | clear->devinfo |= usb_pipecontrol (pipe) | ||
423 | ? (USB_ENDPOINT_XFER_CONTROL << 11) | ||
424 | : (USB_ENDPOINT_XFER_BULK << 11); | ||
425 | if (usb_pipein (pipe)) | ||
426 | clear->devinfo |= 1 << 15; | ||
427 | |||
428 | /* tell keventd to clear state for this TT */ | ||
429 | spin_lock_irqsave (&tt->lock, flags); | ||
430 | list_add_tail (&clear->clear_list, &tt->clear_list); | ||
431 | schedule_work (&tt->kevent); | ||
432 | spin_unlock_irqrestore (&tt->lock, flags); | ||
433 | } | ||
434 | |||
435 | static void hub_power_on(struct usb_hub *hub) | ||
436 | { | ||
437 | int port1; | ||
438 | |||
439 | /* if hub supports power switching, enable power on each port */ | ||
440 | if ((hub->descriptor->wHubCharacteristics & HUB_CHAR_LPSM) < 2) { | ||
441 | dev_dbg(hub->intfdev, "enabling power on all ports\n"); | ||
442 | for (port1 = 1; port1 <= hub->descriptor->bNbrPorts; port1++) | ||
443 | set_port_feature(hub->hdev, port1, | ||
444 | USB_PORT_FEAT_POWER); | ||
445 | } | ||
446 | |||
447 | /* Wait for power to be enabled */ | ||
448 | msleep(hub->descriptor->bPwrOn2PwrGood * 2); | ||
449 | } | ||
450 | |||
451 | static void hub_quiesce(struct usb_hub *hub) | ||
452 | { | ||
453 | /* stop khubd and related activity */ | ||
454 | hub->quiescing = 1; | ||
455 | usb_kill_urb(hub->urb); | ||
456 | if (hub->has_indicators) | ||
457 | cancel_delayed_work(&hub->leds); | ||
458 | if (hub->has_indicators || hub->tt.hub) | ||
459 | flush_scheduled_work(); | ||
460 | } | ||
461 | |||
462 | static void hub_activate(struct usb_hub *hub) | ||
463 | { | ||
464 | int status; | ||
465 | |||
466 | hub->quiescing = 0; | ||
467 | hub->activating = 1; | ||
468 | status = usb_submit_urb(hub->urb, GFP_NOIO); | ||
469 | if (status < 0) | ||
470 | dev_err(hub->intfdev, "activate --> %d\n", status); | ||
471 | if (hub->has_indicators && blinkenlights) | ||
472 | schedule_delayed_work(&hub->leds, LED_CYCLE_PERIOD); | ||
473 | |||
474 | /* scan all ports ASAP */ | ||
475 | kick_khubd(hub); | ||
476 | } | ||
477 | |||
478 | static int hub_hub_status(struct usb_hub *hub, | ||
479 | u16 *status, u16 *change) | ||
480 | { | ||
481 | int ret; | ||
482 | |||
483 | ret = get_hub_status(hub->hdev, &hub->status->hub); | ||
484 | if (ret < 0) | ||
485 | dev_err (hub->intfdev, | ||
486 | "%s failed (err = %d)\n", __FUNCTION__, ret); | ||
487 | else { | ||
488 | *status = le16_to_cpu(hub->status->hub.wHubStatus); | ||
489 | *change = le16_to_cpu(hub->status->hub.wHubChange); | ||
490 | ret = 0; | ||
491 | } | ||
492 | return ret; | ||
493 | } | ||
494 | |||
495 | static int hub_configure(struct usb_hub *hub, | ||
496 | struct usb_endpoint_descriptor *endpoint) | ||
497 | { | ||
498 | struct usb_device *hdev = hub->hdev; | ||
499 | struct device *hub_dev = hub->intfdev; | ||
500 | u16 hubstatus, hubchange; | ||
501 | unsigned int pipe; | ||
502 | int maxp, ret; | ||
503 | char *message; | ||
504 | |||
505 | hub->buffer = usb_buffer_alloc(hdev, sizeof(*hub->buffer), GFP_KERNEL, | ||
506 | &hub->buffer_dma); | ||
507 | if (!hub->buffer) { | ||
508 | message = "can't allocate hub irq buffer"; | ||
509 | ret = -ENOMEM; | ||
510 | goto fail; | ||
511 | } | ||
512 | |||
513 | hub->status = kmalloc(sizeof(*hub->status), GFP_KERNEL); | ||
514 | if (!hub->status) { | ||
515 | message = "can't kmalloc hub status buffer"; | ||
516 | ret = -ENOMEM; | ||
517 | goto fail; | ||
518 | } | ||
519 | |||
520 | hub->descriptor = kmalloc(sizeof(*hub->descriptor), GFP_KERNEL); | ||
521 | if (!hub->descriptor) { | ||
522 | message = "can't kmalloc hub descriptor"; | ||
523 | ret = -ENOMEM; | ||
524 | goto fail; | ||
525 | } | ||
526 | |||
527 | /* Request the entire hub descriptor. | ||
528 | * hub->descriptor can handle USB_MAXCHILDREN ports, | ||
529 | * but the hub can/will return fewer bytes here. | ||
530 | */ | ||
531 | ret = get_hub_descriptor(hdev, hub->descriptor, | ||
532 | sizeof(*hub->descriptor)); | ||
533 | if (ret < 0) { | ||
534 | message = "can't read hub descriptor"; | ||
535 | goto fail; | ||
536 | } else if (hub->descriptor->bNbrPorts > USB_MAXCHILDREN) { | ||
537 | message = "hub has too many ports!"; | ||
538 | ret = -ENODEV; | ||
539 | goto fail; | ||
540 | } | ||
541 | |||
542 | hdev->maxchild = hub->descriptor->bNbrPorts; | ||
543 | dev_info (hub_dev, "%d port%s detected\n", hdev->maxchild, | ||
544 | (hdev->maxchild == 1) ? "" : "s"); | ||
545 | |||
546 | le16_to_cpus(&hub->descriptor->wHubCharacteristics); | ||
547 | |||
548 | if (hub->descriptor->wHubCharacteristics & HUB_CHAR_COMPOUND) { | ||
549 | int i; | ||
550 | char portstr [USB_MAXCHILDREN + 1]; | ||
551 | |||
552 | for (i = 0; i < hdev->maxchild; i++) | ||
553 | portstr[i] = hub->descriptor->DeviceRemovable | ||
554 | [((i + 1) / 8)] & (1 << ((i + 1) % 8)) | ||
555 | ? 'F' : 'R'; | ||
556 | portstr[hdev->maxchild] = 0; | ||
557 | dev_dbg(hub_dev, "compound device; port removable status: %s\n", portstr); | ||
558 | } else | ||
559 | dev_dbg(hub_dev, "standalone hub\n"); | ||
560 | |||
561 | switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_LPSM) { | ||
562 | case 0x00: | ||
563 | dev_dbg(hub_dev, "ganged power switching\n"); | ||
564 | break; | ||
565 | case 0x01: | ||
566 | dev_dbg(hub_dev, "individual port power switching\n"); | ||
567 | break; | ||
568 | case 0x02: | ||
569 | case 0x03: | ||
570 | dev_dbg(hub_dev, "no power switching (usb 1.0)\n"); | ||
571 | break; | ||
572 | } | ||
573 | |||
574 | switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_OCPM) { | ||
575 | case 0x00: | ||
576 | dev_dbg(hub_dev, "global over-current protection\n"); | ||
577 | break; | ||
578 | case 0x08: | ||
579 | dev_dbg(hub_dev, "individual port over-current protection\n"); | ||
580 | break; | ||
581 | case 0x10: | ||
582 | case 0x18: | ||
583 | dev_dbg(hub_dev, "no over-current protection\n"); | ||
584 | break; | ||
585 | } | ||
586 | |||
587 | spin_lock_init (&hub->tt.lock); | ||
588 | INIT_LIST_HEAD (&hub->tt.clear_list); | ||
589 | INIT_WORK (&hub->tt.kevent, hub_tt_kevent, hub); | ||
590 | switch (hdev->descriptor.bDeviceProtocol) { | ||
591 | case 0: | ||
592 | break; | ||
593 | case 1: | ||
594 | dev_dbg(hub_dev, "Single TT\n"); | ||
595 | hub->tt.hub = hdev; | ||
596 | break; | ||
597 | case 2: | ||
598 | ret = usb_set_interface(hdev, 0, 1); | ||
599 | if (ret == 0) { | ||
600 | dev_dbg(hub_dev, "TT per port\n"); | ||
601 | hub->tt.multi = 1; | ||
602 | } else | ||
603 | dev_err(hub_dev, "Using single TT (err %d)\n", | ||
604 | ret); | ||
605 | hub->tt.hub = hdev; | ||
606 | break; | ||
607 | default: | ||
608 | dev_dbg(hub_dev, "Unrecognized hub protocol %d\n", | ||
609 | hdev->descriptor.bDeviceProtocol); | ||
610 | break; | ||
611 | } | ||
612 | |||
613 | switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_TTTT) { | ||
614 | case 0x00: | ||
615 | if (hdev->descriptor.bDeviceProtocol != 0) | ||
616 | dev_dbg(hub_dev, "TT requires at most 8 FS bit times\n"); | ||
617 | break; | ||
618 | case 0x20: | ||
619 | dev_dbg(hub_dev, "TT requires at most 16 FS bit times\n"); | ||
620 | break; | ||
621 | case 0x40: | ||
622 | dev_dbg(hub_dev, "TT requires at most 24 FS bit times\n"); | ||
623 | break; | ||
624 | case 0x60: | ||
625 | dev_dbg(hub_dev, "TT requires at most 32 FS bit times\n"); | ||
626 | break; | ||
627 | } | ||
628 | |||
629 | /* probe() zeroes hub->indicator[] */ | ||
630 | if (hub->descriptor->wHubCharacteristics & HUB_CHAR_PORTIND) { | ||
631 | hub->has_indicators = 1; | ||
632 | dev_dbg(hub_dev, "Port indicators are supported\n"); | ||
633 | } | ||
634 | |||
635 | dev_dbg(hub_dev, "power on to power good time: %dms\n", | ||
636 | hub->descriptor->bPwrOn2PwrGood * 2); | ||
637 | |||
638 | /* power budgeting mostly matters with bus-powered hubs, | ||
639 | * and battery-powered root hubs (may provide just 8 mA). | ||
640 | */ | ||
641 | ret = usb_get_status(hdev, USB_RECIP_DEVICE, 0, &hubstatus); | ||
642 | if (ret < 0) { | ||
643 | message = "can't get hub status"; | ||
644 | goto fail; | ||
645 | } | ||
646 | cpu_to_le16s(&hubstatus); | ||
647 | if ((hubstatus & (1 << USB_DEVICE_SELF_POWERED)) == 0) { | ||
648 | dev_dbg(hub_dev, "hub controller current requirement: %dmA\n", | ||
649 | hub->descriptor->bHubContrCurrent); | ||
650 | hub->power_budget = (501 - hub->descriptor->bHubContrCurrent) | ||
651 | / 2; | ||
652 | dev_dbg(hub_dev, "%dmA bus power budget for children\n", | ||
653 | hub->power_budget * 2); | ||
654 | } | ||
655 | |||
656 | |||
657 | ret = hub_hub_status(hub, &hubstatus, &hubchange); | ||
658 | if (ret < 0) { | ||
659 | message = "can't get hub status"; | ||
660 | goto fail; | ||
661 | } | ||
662 | |||
663 | /* local power status reports aren't always correct */ | ||
664 | if (hdev->actconfig->desc.bmAttributes & USB_CONFIG_ATT_SELFPOWER) | ||
665 | dev_dbg(hub_dev, "local power source is %s\n", | ||
666 | (hubstatus & HUB_STATUS_LOCAL_POWER) | ||
667 | ? "lost (inactive)" : "good"); | ||
668 | |||
669 | if ((hub->descriptor->wHubCharacteristics & HUB_CHAR_OCPM) == 0) | ||
670 | dev_dbg(hub_dev, "%sover-current condition exists\n", | ||
671 | (hubstatus & HUB_STATUS_OVERCURRENT) ? "" : "no "); | ||
672 | |||
673 | /* set up the interrupt endpoint */ | ||
674 | pipe = usb_rcvintpipe(hdev, endpoint->bEndpointAddress); | ||
675 | maxp = usb_maxpacket(hdev, pipe, usb_pipeout(pipe)); | ||
676 | |||
677 | if (maxp > sizeof(*hub->buffer)) | ||
678 | maxp = sizeof(*hub->buffer); | ||
679 | |||
680 | hub->urb = usb_alloc_urb(0, GFP_KERNEL); | ||
681 | if (!hub->urb) { | ||
682 | message = "couldn't allocate interrupt urb"; | ||
683 | ret = -ENOMEM; | ||
684 | goto fail; | ||
685 | } | ||
686 | |||
687 | usb_fill_int_urb(hub->urb, hdev, pipe, *hub->buffer, maxp, hub_irq, | ||
688 | hub, endpoint->bInterval); | ||
689 | hub->urb->transfer_dma = hub->buffer_dma; | ||
690 | hub->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | ||
691 | |||
692 | /* maybe cycle the hub leds */ | ||
693 | if (hub->has_indicators && blinkenlights) | ||
694 | hub->indicator [0] = INDICATOR_CYCLE; | ||
695 | |||
696 | hub_power_on(hub); | ||
697 | hub_activate(hub); | ||
698 | return 0; | ||
699 | |||
700 | fail: | ||
701 | dev_err (hub_dev, "config failed, %s (err %d)\n", | ||
702 | message, ret); | ||
703 | /* hub_disconnect() frees urb and descriptor */ | ||
704 | return ret; | ||
705 | } | ||
706 | |||
707 | static unsigned highspeed_hubs; | ||
708 | |||
709 | static void hub_disconnect(struct usb_interface *intf) | ||
710 | { | ||
711 | struct usb_hub *hub = usb_get_intfdata (intf); | ||
712 | struct usb_device *hdev; | ||
713 | |||
714 | if (!hub) | ||
715 | return; | ||
716 | hdev = hub->hdev; | ||
717 | |||
718 | if (hdev->speed == USB_SPEED_HIGH) | ||
719 | highspeed_hubs--; | ||
720 | |||
721 | usb_set_intfdata (intf, NULL); | ||
722 | |||
723 | hub_quiesce(hub); | ||
724 | usb_free_urb(hub->urb); | ||
725 | hub->urb = NULL; | ||
726 | |||
727 | spin_lock_irq(&hub_event_lock); | ||
728 | list_del_init(&hub->event_list); | ||
729 | spin_unlock_irq(&hub_event_lock); | ||
730 | |||
731 | if (hub->descriptor) { | ||
732 | kfree(hub->descriptor); | ||
733 | hub->descriptor = NULL; | ||
734 | } | ||
735 | |||
736 | if (hub->status) { | ||
737 | kfree(hub->status); | ||
738 | hub->status = NULL; | ||
739 | } | ||
740 | |||
741 | if (hub->buffer) { | ||
742 | usb_buffer_free(hdev, sizeof(*hub->buffer), hub->buffer, | ||
743 | hub->buffer_dma); | ||
744 | hub->buffer = NULL; | ||
745 | } | ||
746 | |||
747 | /* Free the memory */ | ||
748 | kfree(hub); | ||
749 | } | ||
750 | |||
751 | static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id) | ||
752 | { | ||
753 | struct usb_host_interface *desc; | ||
754 | struct usb_endpoint_descriptor *endpoint; | ||
755 | struct usb_device *hdev; | ||
756 | struct usb_hub *hub; | ||
757 | |||
758 | desc = intf->cur_altsetting; | ||
759 | hdev = interface_to_usbdev(intf); | ||
760 | |||
761 | /* Some hubs have a subclass of 1, which AFAICT according to the */ | ||
762 | /* specs is not defined, but it works */ | ||
763 | if ((desc->desc.bInterfaceSubClass != 0) && | ||
764 | (desc->desc.bInterfaceSubClass != 1)) { | ||
765 | descriptor_error: | ||
766 | dev_err (&intf->dev, "bad descriptor, ignoring hub\n"); | ||
767 | return -EIO; | ||
768 | } | ||
769 | |||
770 | /* Multiple endpoints? What kind of mutant ninja-hub is this? */ | ||
771 | if (desc->desc.bNumEndpoints != 1) | ||
772 | goto descriptor_error; | ||
773 | |||
774 | endpoint = &desc->endpoint[0].desc; | ||
775 | |||
776 | /* Output endpoint? Curiouser and curiouser.. */ | ||
777 | if (!(endpoint->bEndpointAddress & USB_DIR_IN)) | ||
778 | goto descriptor_error; | ||
779 | |||
780 | /* If it's not an interrupt endpoint, we'd better punt! */ | ||
781 | if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) | ||
782 | != USB_ENDPOINT_XFER_INT) | ||
783 | goto descriptor_error; | ||
784 | |||
785 | /* We found a hub */ | ||
786 | dev_info (&intf->dev, "USB hub found\n"); | ||
787 | |||
788 | hub = kmalloc(sizeof(*hub), GFP_KERNEL); | ||
789 | if (!hub) { | ||
790 | dev_dbg (&intf->dev, "couldn't kmalloc hub struct\n"); | ||
791 | return -ENOMEM; | ||
792 | } | ||
793 | |||
794 | memset(hub, 0, sizeof(*hub)); | ||
795 | |||
796 | INIT_LIST_HEAD(&hub->event_list); | ||
797 | hub->intfdev = &intf->dev; | ||
798 | hub->hdev = hdev; | ||
799 | INIT_WORK(&hub->leds, led_work, hub); | ||
800 | |||
801 | usb_set_intfdata (intf, hub); | ||
802 | |||
803 | if (hdev->speed == USB_SPEED_HIGH) | ||
804 | highspeed_hubs++; | ||
805 | |||
806 | if (hub_configure(hub, endpoint) >= 0) | ||
807 | return 0; | ||
808 | |||
809 | hub_disconnect (intf); | ||
810 | return -ENODEV; | ||
811 | } | ||
812 | |||
813 | static int | ||
814 | hub_ioctl(struct usb_interface *intf, unsigned int code, void *user_data) | ||
815 | { | ||
816 | struct usb_device *hdev = interface_to_usbdev (intf); | ||
817 | |||
818 | /* assert ifno == 0 (part of hub spec) */ | ||
819 | switch (code) { | ||
820 | case USBDEVFS_HUB_PORTINFO: { | ||
821 | struct usbdevfs_hub_portinfo *info = user_data; | ||
822 | int i; | ||
823 | |||
824 | spin_lock_irq(&device_state_lock); | ||
825 | if (hdev->devnum <= 0) | ||
826 | info->nports = 0; | ||
827 | else { | ||
828 | info->nports = hdev->maxchild; | ||
829 | for (i = 0; i < info->nports; i++) { | ||
830 | if (hdev->children[i] == NULL) | ||
831 | info->port[i] = 0; | ||
832 | else | ||
833 | info->port[i] = | ||
834 | hdev->children[i]->devnum; | ||
835 | } | ||
836 | } | ||
837 | spin_unlock_irq(&device_state_lock); | ||
838 | |||
839 | return info->nports + 1; | ||
840 | } | ||
841 | |||
842 | default: | ||
843 | return -ENOSYS; | ||
844 | } | ||
845 | } | ||
846 | |||
847 | /* caller has locked the hub device */ | ||
848 | static void hub_pre_reset(struct usb_hub *hub) | ||
849 | { | ||
850 | struct usb_device *hdev = hub->hdev; | ||
851 | int i; | ||
852 | |||
853 | for (i = 0; i < hdev->maxchild; ++i) { | ||
854 | if (hdev->children[i]) | ||
855 | usb_disconnect(&hdev->children[i]); | ||
856 | } | ||
857 | hub_quiesce(hub); | ||
858 | } | ||
859 | |||
860 | /* caller has locked the hub device */ | ||
861 | static void hub_post_reset(struct usb_hub *hub) | ||
862 | { | ||
863 | hub_activate(hub); | ||
864 | hub_power_on(hub); | ||
865 | } | ||
866 | |||
867 | |||
868 | /* grab device/port lock, returning index of that port (zero based). | ||
869 | * protects the upstream link used by this device from concurrent | ||
870 | * tree operations like suspend, resume, reset, and disconnect, which | ||
871 | * apply to everything downstream of a given port. | ||
872 | */ | ||
873 | static int locktree(struct usb_device *udev) | ||
874 | { | ||
875 | int t; | ||
876 | struct usb_device *hdev; | ||
877 | |||
878 | if (!udev) | ||
879 | return -ENODEV; | ||
880 | |||
881 | /* root hub is always the first lock in the series */ | ||
882 | hdev = udev->parent; | ||
883 | if (!hdev) { | ||
884 | usb_lock_device(udev); | ||
885 | return 0; | ||
886 | } | ||
887 | |||
888 | /* on the path from root to us, lock everything from | ||
889 | * top down, dropping parent locks when not needed | ||
890 | */ | ||
891 | t = locktree(hdev); | ||
892 | if (t < 0) | ||
893 | return t; | ||
894 | for (t = 0; t < hdev->maxchild; t++) { | ||
895 | if (hdev->children[t] == udev) { | ||
896 | /* everything is fail-fast once disconnect | ||
897 | * processing starts | ||
898 | */ | ||
899 | if (udev->state == USB_STATE_NOTATTACHED) | ||
900 | break; | ||
901 | |||
902 | /* when everyone grabs locks top->bottom, | ||
903 | * non-overlapping work may be concurrent | ||
904 | */ | ||
905 | down(&udev->serialize); | ||
906 | up(&hdev->serialize); | ||
907 | return t + 1; | ||
908 | } | ||
909 | } | ||
910 | usb_unlock_device(hdev); | ||
911 | return -ENODEV; | ||
912 | } | ||
913 | |||
914 | static void recursively_mark_NOTATTACHED(struct usb_device *udev) | ||
915 | { | ||
916 | int i; | ||
917 | |||
918 | for (i = 0; i < udev->maxchild; ++i) { | ||
919 | if (udev->children[i]) | ||
920 | recursively_mark_NOTATTACHED(udev->children[i]); | ||
921 | } | ||
922 | udev->state = USB_STATE_NOTATTACHED; | ||
923 | } | ||
924 | |||
925 | /** | ||
926 | * usb_set_device_state - change a device's current state (usbcore, hcds) | ||
927 | * @udev: pointer to device whose state should be changed | ||
928 | * @new_state: new state value to be stored | ||
929 | * | ||
930 | * udev->state is _not_ fully protected by the device lock. Although | ||
931 | * most transitions are made only while holding the lock, the state can | ||
932 | * can change to USB_STATE_NOTATTACHED at almost any time. This | ||
933 | * is so that devices can be marked as disconnected as soon as possible, | ||
934 | * without having to wait for any semaphores to be released. As a result, | ||
935 | * all changes to any device's state must be protected by the | ||
936 | * device_state_lock spinlock. | ||
937 | * | ||
938 | * Once a device has been added to the device tree, all changes to its state | ||
939 | * should be made using this routine. The state should _not_ be set directly. | ||
940 | * | ||
941 | * If udev->state is already USB_STATE_NOTATTACHED then no change is made. | ||
942 | * Otherwise udev->state is set to new_state, and if new_state is | ||
943 | * USB_STATE_NOTATTACHED then all of udev's descendants' states are also set | ||
944 | * to USB_STATE_NOTATTACHED. | ||
945 | */ | ||
946 | void usb_set_device_state(struct usb_device *udev, | ||
947 | enum usb_device_state new_state) | ||
948 | { | ||
949 | unsigned long flags; | ||
950 | |||
951 | spin_lock_irqsave(&device_state_lock, flags); | ||
952 | if (udev->state == USB_STATE_NOTATTACHED) | ||
953 | ; /* do nothing */ | ||
954 | else if (new_state != USB_STATE_NOTATTACHED) | ||
955 | udev->state = new_state; | ||
956 | else | ||
957 | recursively_mark_NOTATTACHED(udev); | ||
958 | spin_unlock_irqrestore(&device_state_lock, flags); | ||
959 | } | ||
960 | EXPORT_SYMBOL(usb_set_device_state); | ||
961 | |||
962 | |||
963 | static void choose_address(struct usb_device *udev) | ||
964 | { | ||
965 | int devnum; | ||
966 | struct usb_bus *bus = udev->bus; | ||
967 | |||
968 | /* If khubd ever becomes multithreaded, this will need a lock */ | ||
969 | |||
970 | /* Try to allocate the next devnum beginning at bus->devnum_next. */ | ||
971 | devnum = find_next_zero_bit(bus->devmap.devicemap, 128, | ||
972 | bus->devnum_next); | ||
973 | if (devnum >= 128) | ||
974 | devnum = find_next_zero_bit(bus->devmap.devicemap, 128, 1); | ||
975 | |||
976 | bus->devnum_next = ( devnum >= 127 ? 1 : devnum + 1); | ||
977 | |||
978 | if (devnum < 128) { | ||
979 | set_bit(devnum, bus->devmap.devicemap); | ||
980 | udev->devnum = devnum; | ||
981 | } | ||
982 | } | ||
983 | |||
984 | static void release_address(struct usb_device *udev) | ||
985 | { | ||
986 | if (udev->devnum > 0) { | ||
987 | clear_bit(udev->devnum, udev->bus->devmap.devicemap); | ||
988 | udev->devnum = -1; | ||
989 | } | ||
990 | } | ||
991 | |||
992 | /** | ||
993 | * usb_disconnect - disconnect a device (usbcore-internal) | ||
994 | * @pdev: pointer to device being disconnected | ||
995 | * Context: !in_interrupt () | ||
996 | * | ||
997 | * Something got disconnected. Get rid of it and all of its children. | ||
998 | * | ||
999 | * If *pdev is a normal device then the parent hub must already be locked. | ||
1000 | * If *pdev is a root hub then this routine will acquire the | ||
1001 | * usb_bus_list_lock on behalf of the caller. | ||
1002 | * | ||
1003 | * Only hub drivers (including virtual root hub drivers for host | ||
1004 | * controllers) should ever call this. | ||
1005 | * | ||
1006 | * This call is synchronous, and may not be used in an interrupt context. | ||
1007 | */ | ||
1008 | void usb_disconnect(struct usb_device **pdev) | ||
1009 | { | ||
1010 | struct usb_device *udev = *pdev; | ||
1011 | int i; | ||
1012 | |||
1013 | if (!udev) { | ||
1014 | pr_debug ("%s nodev\n", __FUNCTION__); | ||
1015 | return; | ||
1016 | } | ||
1017 | |||
1018 | /* mark the device as inactive, so any further urb submissions for | ||
1019 | * this device (and any of its children) will fail immediately. | ||
1020 | * this quiesces everyting except pending urbs. | ||
1021 | */ | ||
1022 | usb_set_device_state(udev, USB_STATE_NOTATTACHED); | ||
1023 | |||
1024 | /* lock the bus list on behalf of HCDs unregistering their root hubs */ | ||
1025 | if (!udev->parent) { | ||
1026 | down(&usb_bus_list_lock); | ||
1027 | usb_lock_device(udev); | ||
1028 | } else | ||
1029 | down(&udev->serialize); | ||
1030 | |||
1031 | dev_info (&udev->dev, "USB disconnect, address %d\n", udev->devnum); | ||
1032 | |||
1033 | /* Free up all the children before we remove this device */ | ||
1034 | for (i = 0; i < USB_MAXCHILDREN; i++) { | ||
1035 | if (udev->children[i]) | ||
1036 | usb_disconnect(&udev->children[i]); | ||
1037 | } | ||
1038 | |||
1039 | /* deallocate hcd/hardware state ... nuking all pending urbs and | ||
1040 | * cleaning up all state associated with the current configuration | ||
1041 | * so that the hardware is now fully quiesced. | ||
1042 | */ | ||
1043 | usb_disable_device(udev, 0); | ||
1044 | |||
1045 | /* Free the device number, remove the /proc/bus/usb entry and | ||
1046 | * the sysfs attributes, and delete the parent's children[] | ||
1047 | * (or root_hub) pointer. | ||
1048 | */ | ||
1049 | dev_dbg (&udev->dev, "unregistering device\n"); | ||
1050 | release_address(udev); | ||
1051 | usbfs_remove_device(udev); | ||
1052 | usb_remove_sysfs_dev_files(udev); | ||
1053 | |||
1054 | /* Avoid races with recursively_mark_NOTATTACHED() */ | ||
1055 | spin_lock_irq(&device_state_lock); | ||
1056 | *pdev = NULL; | ||
1057 | spin_unlock_irq(&device_state_lock); | ||
1058 | |||
1059 | if (!udev->parent) { | ||
1060 | usb_unlock_device(udev); | ||
1061 | up(&usb_bus_list_lock); | ||
1062 | } else | ||
1063 | up(&udev->serialize); | ||
1064 | |||
1065 | device_unregister(&udev->dev); | ||
1066 | } | ||
1067 | |||
1068 | static int choose_configuration(struct usb_device *udev) | ||
1069 | { | ||
1070 | int c, i; | ||
1071 | |||
1072 | /* NOTE: this should interact with hub power budgeting */ | ||
1073 | |||
1074 | c = udev->config[0].desc.bConfigurationValue; | ||
1075 | if (udev->descriptor.bNumConfigurations != 1) { | ||
1076 | for (i = 0; i < udev->descriptor.bNumConfigurations; i++) { | ||
1077 | struct usb_interface_descriptor *desc; | ||
1078 | |||
1079 | /* heuristic: Linux is more likely to have class | ||
1080 | * drivers, so avoid vendor-specific interfaces. | ||
1081 | */ | ||
1082 | desc = &udev->config[i].intf_cache[0] | ||
1083 | ->altsetting->desc; | ||
1084 | if (desc->bInterfaceClass == USB_CLASS_VENDOR_SPEC) | ||
1085 | continue; | ||
1086 | /* COMM/2/all is CDC ACM, except 0xff is MSFT RNDIS. | ||
1087 | * MSFT needs this to be the first config; never use | ||
1088 | * it as the default unless Linux has host-side RNDIS. | ||
1089 | * A second config would ideally be CDC-Ethernet, but | ||
1090 | * may instead be the "vendor specific" CDC subset | ||
1091 | * long used by ARM Linux for sa1100 or pxa255. | ||
1092 | */ | ||
1093 | if (desc->bInterfaceClass == USB_CLASS_COMM | ||
1094 | && desc->bInterfaceSubClass == 2 | ||
1095 | && desc->bInterfaceProtocol == 0xff) { | ||
1096 | c = udev->config[1].desc.bConfigurationValue; | ||
1097 | continue; | ||
1098 | } | ||
1099 | c = udev->config[i].desc.bConfigurationValue; | ||
1100 | break; | ||
1101 | } | ||
1102 | dev_info(&udev->dev, | ||
1103 | "configuration #%d chosen from %d choices\n", | ||
1104 | c, udev->descriptor.bNumConfigurations); | ||
1105 | } | ||
1106 | return c; | ||
1107 | } | ||
1108 | |||
1109 | #ifdef DEBUG | ||
1110 | static void show_string(struct usb_device *udev, char *id, char *string) | ||
1111 | { | ||
1112 | if (!string) | ||
1113 | return; | ||
1114 | dev_printk(KERN_INFO, &udev->dev, "%s: %s\n", id, string); | ||
1115 | } | ||
1116 | |||
1117 | #else | ||
1118 | static inline void show_string(struct usb_device *udev, char *id, char *string) | ||
1119 | {} | ||
1120 | #endif | ||
1121 | |||
1122 | static void get_string(struct usb_device *udev, char **string, int index) | ||
1123 | { | ||
1124 | char *buf; | ||
1125 | |||
1126 | if (!index) | ||
1127 | return; | ||
1128 | buf = kmalloc(256, GFP_KERNEL); | ||
1129 | if (!buf) | ||
1130 | return; | ||
1131 | if (usb_string(udev, index, buf, 256) > 0) | ||
1132 | *string = buf; | ||
1133 | else | ||
1134 | kfree(buf); | ||
1135 | } | ||
1136 | |||
1137 | |||
1138 | #ifdef CONFIG_USB_OTG | ||
1139 | #include "otg_whitelist.h" | ||
1140 | #endif | ||
1141 | |||
1142 | /** | ||
1143 | * usb_new_device - perform initial device setup (usbcore-internal) | ||
1144 | * @udev: newly addressed device (in ADDRESS state) | ||
1145 | * | ||
1146 | * This is called with devices which have been enumerated, but not yet | ||
1147 | * configured. The device descriptor is available, but not descriptors | ||
1148 | * for any device configuration. The caller must have locked udev and | ||
1149 | * either the parent hub (if udev is a normal device) or else the | ||
1150 | * usb_bus_list_lock (if udev is a root hub). The parent's pointer to | ||
1151 | * udev has already been installed, but udev is not yet visible through | ||
1152 | * sysfs or other filesystem code. | ||
1153 | * | ||
1154 | * Returns 0 for success (device is configured and listed, with its | ||
1155 | * interfaces, in sysfs); else a negative errno value. | ||
1156 | * | ||
1157 | * This call is synchronous, and may not be used in an interrupt context. | ||
1158 | * | ||
1159 | * Only the hub driver should ever call this; root hub registration | ||
1160 | * uses it indirectly. | ||
1161 | */ | ||
1162 | int usb_new_device(struct usb_device *udev) | ||
1163 | { | ||
1164 | int err; | ||
1165 | int c; | ||
1166 | |||
1167 | err = usb_get_configuration(udev); | ||
1168 | if (err < 0) { | ||
1169 | dev_err(&udev->dev, "can't read configurations, error %d\n", | ||
1170 | err); | ||
1171 | goto fail; | ||
1172 | } | ||
1173 | |||
1174 | /* read the standard strings and cache them if present */ | ||
1175 | get_string(udev, &udev->product, udev->descriptor.iProduct); | ||
1176 | get_string(udev, &udev->manufacturer, udev->descriptor.iManufacturer); | ||
1177 | get_string(udev, &udev->serial, udev->descriptor.iSerialNumber); | ||
1178 | |||
1179 | /* Tell the world! */ | ||
1180 | dev_dbg(&udev->dev, "new device strings: Mfr=%d, Product=%d, " | ||
1181 | "SerialNumber=%d\n", | ||
1182 | udev->descriptor.iManufacturer, | ||
1183 | udev->descriptor.iProduct, | ||
1184 | udev->descriptor.iSerialNumber); | ||
1185 | show_string(udev, "Product", udev->product); | ||
1186 | show_string(udev, "Manufacturer", udev->manufacturer); | ||
1187 | show_string(udev, "SerialNumber", udev->serial); | ||
1188 | |||
1189 | #ifdef CONFIG_USB_OTG | ||
1190 | /* | ||
1191 | * OTG-aware devices on OTG-capable root hubs may be able to use SRP, | ||
1192 | * to wake us after we've powered off VBUS; and HNP, switching roles | ||
1193 | * "host" to "peripheral". The OTG descriptor helps figure this out. | ||
1194 | */ | ||
1195 | if (!udev->bus->is_b_host | ||
1196 | && udev->config | ||
1197 | && udev->parent == udev->bus->root_hub) { | ||
1198 | struct usb_otg_descriptor *desc = 0; | ||
1199 | struct usb_bus *bus = udev->bus; | ||
1200 | |||
1201 | /* descriptor may appear anywhere in config */ | ||
1202 | if (__usb_get_extra_descriptor (udev->rawdescriptors[0], | ||
1203 | le16_to_cpu(udev->config[0].desc.wTotalLength), | ||
1204 | USB_DT_OTG, (void **) &desc) == 0) { | ||
1205 | if (desc->bmAttributes & USB_OTG_HNP) { | ||
1206 | unsigned port1; | ||
1207 | struct usb_device *root = udev->parent; | ||
1208 | |||
1209 | for (port1 = 1; port1 <= root->maxchild; | ||
1210 | port1++) { | ||
1211 | if (root->children[port1-1] == udev) | ||
1212 | break; | ||
1213 | } | ||
1214 | |||
1215 | dev_info(&udev->dev, | ||
1216 | "Dual-Role OTG device on %sHNP port\n", | ||
1217 | (port1 == bus->otg_port) | ||
1218 | ? "" : "non-"); | ||
1219 | |||
1220 | /* enable HNP before suspend, it's simpler */ | ||
1221 | if (port1 == bus->otg_port) | ||
1222 | bus->b_hnp_enable = 1; | ||
1223 | err = usb_control_msg(udev, | ||
1224 | usb_sndctrlpipe(udev, 0), | ||
1225 | USB_REQ_SET_FEATURE, 0, | ||
1226 | bus->b_hnp_enable | ||
1227 | ? USB_DEVICE_B_HNP_ENABLE | ||
1228 | : USB_DEVICE_A_ALT_HNP_SUPPORT, | ||
1229 | 0, NULL, 0, USB_CTRL_SET_TIMEOUT); | ||
1230 | if (err < 0) { | ||
1231 | /* OTG MESSAGE: report errors here, | ||
1232 | * customize to match your product. | ||
1233 | */ | ||
1234 | dev_info(&udev->dev, | ||
1235 | "can't set HNP mode; %d\n", | ||
1236 | err); | ||
1237 | bus->b_hnp_enable = 0; | ||
1238 | } | ||
1239 | } | ||
1240 | } | ||
1241 | } | ||
1242 | |||
1243 | if (!is_targeted(udev)) { | ||
1244 | |||
1245 | /* Maybe it can talk to us, though we can't talk to it. | ||
1246 | * (Includes HNP test device.) | ||
1247 | */ | ||
1248 | if (udev->bus->b_hnp_enable || udev->bus->is_b_host) { | ||
1249 | static int __usb_suspend_device (struct usb_device *, | ||
1250 | int port1, pm_message_t state); | ||
1251 | err = __usb_suspend_device(udev, | ||
1252 | udev->bus->otg_port, | ||
1253 | PMSG_SUSPEND); | ||
1254 | if (err < 0) | ||
1255 | dev_dbg(&udev->dev, "HNP fail, %d\n", err); | ||
1256 | } | ||
1257 | err = -ENODEV; | ||
1258 | goto fail; | ||
1259 | } | ||
1260 | #endif | ||
1261 | |||
1262 | /* put device-specific files into sysfs */ | ||
1263 | err = device_add (&udev->dev); | ||
1264 | if (err) { | ||
1265 | dev_err(&udev->dev, "can't device_add, error %d\n", err); | ||
1266 | goto fail; | ||
1267 | } | ||
1268 | usb_create_sysfs_dev_files (udev); | ||
1269 | |||
1270 | /* choose and set the configuration. that registers the interfaces | ||
1271 | * with the driver core, and lets usb device drivers bind to them. | ||
1272 | */ | ||
1273 | c = choose_configuration(udev); | ||
1274 | if (c < 0) | ||
1275 | dev_warn(&udev->dev, | ||
1276 | "can't choose an initial configuration\n"); | ||
1277 | else { | ||
1278 | err = usb_set_configuration(udev, c); | ||
1279 | if (err) { | ||
1280 | dev_err(&udev->dev, "can't set config #%d, error %d\n", | ||
1281 | c, err); | ||
1282 | usb_remove_sysfs_dev_files(udev); | ||
1283 | device_del(&udev->dev); | ||
1284 | goto fail; | ||
1285 | } | ||
1286 | } | ||
1287 | |||
1288 | /* USB device state == configured ... usable */ | ||
1289 | |||
1290 | /* add a /proc/bus/usb entry */ | ||
1291 | usbfs_add_device(udev); | ||
1292 | return 0; | ||
1293 | |||
1294 | fail: | ||
1295 | usb_set_device_state(udev, USB_STATE_NOTATTACHED); | ||
1296 | return err; | ||
1297 | } | ||
1298 | |||
1299 | |||
1300 | static int hub_port_status(struct usb_hub *hub, int port1, | ||
1301 | u16 *status, u16 *change) | ||
1302 | { | ||
1303 | int ret; | ||
1304 | |||
1305 | ret = get_port_status(hub->hdev, port1, &hub->status->port); | ||
1306 | if (ret < 0) | ||
1307 | dev_err (hub->intfdev, | ||
1308 | "%s failed (err = %d)\n", __FUNCTION__, ret); | ||
1309 | else { | ||
1310 | *status = le16_to_cpu(hub->status->port.wPortStatus); | ||
1311 | *change = le16_to_cpu(hub->status->port.wPortChange); | ||
1312 | ret = 0; | ||
1313 | } | ||
1314 | return ret; | ||
1315 | } | ||
1316 | |||
1317 | #define PORT_RESET_TRIES 5 | ||
1318 | #define SET_ADDRESS_TRIES 2 | ||
1319 | #define GET_DESCRIPTOR_TRIES 2 | ||
1320 | #define SET_CONFIG_TRIES (2 * (use_both_schemes + 1)) | ||
1321 | #define USE_NEW_SCHEME(i) ((i) / 2 == old_scheme_first) | ||
1322 | |||
1323 | #define HUB_ROOT_RESET_TIME 50 /* times are in msec */ | ||
1324 | #define HUB_SHORT_RESET_TIME 10 | ||
1325 | #define HUB_LONG_RESET_TIME 200 | ||
1326 | #define HUB_RESET_TIMEOUT 500 | ||
1327 | |||
1328 | static int hub_port_wait_reset(struct usb_hub *hub, int port1, | ||
1329 | struct usb_device *udev, unsigned int delay) | ||
1330 | { | ||
1331 | int delay_time, ret; | ||
1332 | u16 portstatus; | ||
1333 | u16 portchange; | ||
1334 | |||
1335 | for (delay_time = 0; | ||
1336 | delay_time < HUB_RESET_TIMEOUT; | ||
1337 | delay_time += delay) { | ||
1338 | /* wait to give the device a chance to reset */ | ||
1339 | msleep(delay); | ||
1340 | |||
1341 | /* read and decode port status */ | ||
1342 | ret = hub_port_status(hub, port1, &portstatus, &portchange); | ||
1343 | if (ret < 0) | ||
1344 | return ret; | ||
1345 | |||
1346 | /* Device went away? */ | ||
1347 | if (!(portstatus & USB_PORT_STAT_CONNECTION)) | ||
1348 | return -ENOTCONN; | ||
1349 | |||
1350 | /* bomb out completely if something weird happened */ | ||
1351 | if ((portchange & USB_PORT_STAT_C_CONNECTION)) | ||
1352 | return -EINVAL; | ||
1353 | |||
1354 | /* if we`ve finished resetting, then break out of the loop */ | ||
1355 | if (!(portstatus & USB_PORT_STAT_RESET) && | ||
1356 | (portstatus & USB_PORT_STAT_ENABLE)) { | ||
1357 | if (portstatus & USB_PORT_STAT_HIGH_SPEED) | ||
1358 | udev->speed = USB_SPEED_HIGH; | ||
1359 | else if (portstatus & USB_PORT_STAT_LOW_SPEED) | ||
1360 | udev->speed = USB_SPEED_LOW; | ||
1361 | else | ||
1362 | udev->speed = USB_SPEED_FULL; | ||
1363 | return 0; | ||
1364 | } | ||
1365 | |||
1366 | /* switch to the long delay after two short delay failures */ | ||
1367 | if (delay_time >= 2 * HUB_SHORT_RESET_TIME) | ||
1368 | delay = HUB_LONG_RESET_TIME; | ||
1369 | |||
1370 | dev_dbg (hub->intfdev, | ||
1371 | "port %d not reset yet, waiting %dms\n", | ||
1372 | port1, delay); | ||
1373 | } | ||
1374 | |||
1375 | return -EBUSY; | ||
1376 | } | ||
1377 | |||
1378 | static int hub_port_reset(struct usb_hub *hub, int port1, | ||
1379 | struct usb_device *udev, unsigned int delay) | ||
1380 | { | ||
1381 | int i, status; | ||
1382 | |||
1383 | /* Reset the port */ | ||
1384 | for (i = 0; i < PORT_RESET_TRIES; i++) { | ||
1385 | status = set_port_feature(hub->hdev, | ||
1386 | port1, USB_PORT_FEAT_RESET); | ||
1387 | if (status) | ||
1388 | dev_err(hub->intfdev, | ||
1389 | "cannot reset port %d (err = %d)\n", | ||
1390 | port1, status); | ||
1391 | else { | ||
1392 | status = hub_port_wait_reset(hub, port1, udev, delay); | ||
1393 | if (status) | ||
1394 | dev_dbg(hub->intfdev, | ||
1395 | "port_wait_reset: err = %d\n", | ||
1396 | status); | ||
1397 | } | ||
1398 | |||
1399 | /* return on disconnect or reset */ | ||
1400 | switch (status) { | ||
1401 | case 0: | ||
1402 | /* TRSTRCY = 10 ms */ | ||
1403 | msleep(10); | ||
1404 | /* FALL THROUGH */ | ||
1405 | case -ENOTCONN: | ||
1406 | case -ENODEV: | ||
1407 | clear_port_feature(hub->hdev, | ||
1408 | port1, USB_PORT_FEAT_C_RESET); | ||
1409 | /* FIXME need disconnect() for NOTATTACHED device */ | ||
1410 | usb_set_device_state(udev, status | ||
1411 | ? USB_STATE_NOTATTACHED | ||
1412 | : USB_STATE_DEFAULT); | ||
1413 | return status; | ||
1414 | } | ||
1415 | |||
1416 | dev_dbg (hub->intfdev, | ||
1417 | "port %d not enabled, trying reset again...\n", | ||
1418 | port1); | ||
1419 | delay = HUB_LONG_RESET_TIME; | ||
1420 | } | ||
1421 | |||
1422 | dev_err (hub->intfdev, | ||
1423 | "Cannot enable port %i. Maybe the USB cable is bad?\n", | ||
1424 | port1); | ||
1425 | |||
1426 | return status; | ||
1427 | } | ||
1428 | |||
1429 | static int hub_port_disable(struct usb_hub *hub, int port1, int set_state) | ||
1430 | { | ||
1431 | struct usb_device *hdev = hub->hdev; | ||
1432 | int ret; | ||
1433 | |||
1434 | if (hdev->children[port1-1] && set_state) { | ||
1435 | usb_set_device_state(hdev->children[port1-1], | ||
1436 | USB_STATE_NOTATTACHED); | ||
1437 | } | ||
1438 | ret = clear_port_feature(hdev, port1, USB_PORT_FEAT_ENABLE); | ||
1439 | if (ret) | ||
1440 | dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n", | ||
1441 | port1, ret); | ||
1442 | |||
1443 | return ret; | ||
1444 | } | ||
1445 | |||
1446 | /* | ||
1447 | * Disable a port and mark a logical connnect-change event, so that some | ||
1448 | * time later khubd will disconnect() any existing usb_device on the port | ||
1449 | * and will re-enumerate if there actually is a device attached. | ||
1450 | */ | ||
1451 | static void hub_port_logical_disconnect(struct usb_hub *hub, int port1) | ||
1452 | { | ||
1453 | dev_dbg(hub->intfdev, "logical disconnect on port %d\n", port1); | ||
1454 | hub_port_disable(hub, port1, 1); | ||
1455 | |||
1456 | /* FIXME let caller ask to power down the port: | ||
1457 | * - some devices won't enumerate without a VBUS power cycle | ||
1458 | * - SRP saves power that way | ||
1459 | * - usb_suspend_device(dev,PM_SUSPEND_DISK) | ||
1460 | * That's easy if this hub can switch power per-port, and | ||
1461 | * khubd reactivates the port later (timer, SRP, etc). | ||
1462 | * Powerdown must be optional, because of reset/DFU. | ||
1463 | */ | ||
1464 | |||
1465 | set_bit(port1, hub->change_bits); | ||
1466 | kick_khubd(hub); | ||
1467 | } | ||
1468 | |||
1469 | |||
1470 | #ifdef CONFIG_USB_SUSPEND | ||
1471 | |||
1472 | /* | ||
1473 | * Selective port suspend reduces power; most suspended devices draw | ||
1474 | * less than 500 uA. It's also used in OTG, along with remote wakeup. | ||
1475 | * All devices below the suspended port are also suspended. | ||
1476 | * | ||
1477 | * Devices leave suspend state when the host wakes them up. Some devices | ||
1478 | * also support "remote wakeup", where the device can activate the USB | ||
1479 | * tree above them to deliver data, such as a keypress or packet. In | ||
1480 | * some cases, this wakes the USB host. | ||
1481 | */ | ||
1482 | static int hub_port_suspend(struct usb_hub *hub, int port1, | ||
1483 | struct usb_device *udev) | ||
1484 | { | ||
1485 | int status; | ||
1486 | |||
1487 | // dev_dbg(hub->intfdev, "suspend port %d\n", port1); | ||
1488 | |||
1489 | /* enable remote wakeup when appropriate; this lets the device | ||
1490 | * wake up the upstream hub (including maybe the root hub). | ||
1491 | * | ||
1492 | * NOTE: OTG devices may issue remote wakeup (or SRP) even when | ||
1493 | * we don't explicitly enable it here. | ||
1494 | */ | ||
1495 | if (udev->actconfig | ||
1496 | // && FIXME (remote wakeup enabled on this bus) | ||
1497 | // ... currently assuming it's always appropriate | ||
1498 | && (udev->actconfig->desc.bmAttributes | ||
1499 | & USB_CONFIG_ATT_WAKEUP) != 0) { | ||
1500 | status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | ||
1501 | USB_REQ_SET_FEATURE, USB_RECIP_DEVICE, | ||
1502 | USB_DEVICE_REMOTE_WAKEUP, 0, | ||
1503 | NULL, 0, | ||
1504 | USB_CTRL_SET_TIMEOUT); | ||
1505 | if (status) | ||
1506 | dev_dbg(&udev->dev, | ||
1507 | "won't remote wakeup, status %d\n", | ||
1508 | status); | ||
1509 | } | ||
1510 | |||
1511 | /* see 7.1.7.6 */ | ||
1512 | status = set_port_feature(hub->hdev, port1, USB_PORT_FEAT_SUSPEND); | ||
1513 | if (status) { | ||
1514 | dev_dbg(hub->intfdev, | ||
1515 | "can't suspend port %d, status %d\n", | ||
1516 | port1, status); | ||
1517 | /* paranoia: "should not happen" */ | ||
1518 | (void) usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | ||
1519 | USB_REQ_CLEAR_FEATURE, USB_RECIP_DEVICE, | ||
1520 | USB_DEVICE_REMOTE_WAKEUP, 0, | ||
1521 | NULL, 0, | ||
1522 | USB_CTRL_SET_TIMEOUT); | ||
1523 | } else { | ||
1524 | /* device has up to 10 msec to fully suspend */ | ||
1525 | dev_dbg(&udev->dev, "usb suspend\n"); | ||
1526 | usb_set_device_state(udev, USB_STATE_SUSPENDED); | ||
1527 | msleep(10); | ||
1528 | } | ||
1529 | return status; | ||
1530 | } | ||
1531 | |||
1532 | /* | ||
1533 | * Devices on USB hub ports have only one "suspend" state, corresponding | ||
1534 | * to ACPI D2 (PM_SUSPEND_MEM), "may cause the device to lose some context". | ||
1535 | * State transitions include: | ||
1536 | * | ||
1537 | * - suspend, resume ... when the VBUS power link stays live | ||
1538 | * - suspend, disconnect ... VBUS lost | ||
1539 | * | ||
1540 | * Once VBUS drop breaks the circuit, the port it's using has to go through | ||
1541 | * normal re-enumeration procedures, starting with enabling VBUS power. | ||
1542 | * Other than re-initializing the hub (plug/unplug, except for root hubs), | ||
1543 | * Linux (2.6) currently has NO mechanisms to initiate that: no khubd | ||
1544 | * timer, no SRP, no requests through sysfs. | ||
1545 | */ | ||
1546 | static int __usb_suspend_device (struct usb_device *udev, int port1, | ||
1547 | pm_message_t state) | ||
1548 | { | ||
1549 | int status; | ||
1550 | |||
1551 | /* caller owns the udev device lock */ | ||
1552 | if (port1 < 0) | ||
1553 | return port1; | ||
1554 | |||
1555 | if (udev->state == USB_STATE_SUSPENDED | ||
1556 | || udev->state == USB_STATE_NOTATTACHED) { | ||
1557 | return 0; | ||
1558 | } | ||
1559 | |||
1560 | /* suspend interface drivers; if this is a hub, it | ||
1561 | * suspends the child devices | ||
1562 | */ | ||
1563 | if (udev->actconfig) { | ||
1564 | int i; | ||
1565 | |||
1566 | for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { | ||
1567 | struct usb_interface *intf; | ||
1568 | struct usb_driver *driver; | ||
1569 | |||
1570 | intf = udev->actconfig->interface[i]; | ||
1571 | if (state <= intf->dev.power.power_state) | ||
1572 | continue; | ||
1573 | if (!intf->dev.driver) | ||
1574 | continue; | ||
1575 | driver = to_usb_driver(intf->dev.driver); | ||
1576 | |||
1577 | if (driver->suspend) { | ||
1578 | status = driver->suspend(intf, state); | ||
1579 | if (intf->dev.power.power_state != state | ||
1580 | || status) | ||
1581 | dev_err(&intf->dev, | ||
1582 | "suspend %d fail, code %d\n", | ||
1583 | state, status); | ||
1584 | } | ||
1585 | |||
1586 | /* only drivers with suspend() can ever resume(); | ||
1587 | * and after power loss, even they won't. | ||
1588 | * bus_rescan_devices() can rebind drivers later. | ||
1589 | * | ||
1590 | * FIXME the PM core self-deadlocks when unbinding | ||
1591 | * drivers during suspend/resume ... everything grabs | ||
1592 | * dpm_sem (not a spinlock, ugh). we want to unbind, | ||
1593 | * since we know every driver's probe/disconnect works | ||
1594 | * even for drivers that can't suspend. | ||
1595 | */ | ||
1596 | if (!driver->suspend || state > PM_SUSPEND_MEM) { | ||
1597 | #if 1 | ||
1598 | dev_warn(&intf->dev, "resume is unsafe!\n"); | ||
1599 | #else | ||
1600 | down_write(&usb_bus_type.rwsem); | ||
1601 | device_release_driver(&intf->dev); | ||
1602 | up_write(&usb_bus_type.rwsem); | ||
1603 | #endif | ||
1604 | } | ||
1605 | } | ||
1606 | } | ||
1607 | |||
1608 | /* | ||
1609 | * FIXME this needs port power off call paths too, to help force | ||
1610 | * USB into the "generic" PM model. At least for devices on | ||
1611 | * ports that aren't using ganged switching (usually root hubs). | ||
1612 | * | ||
1613 | * NOTE: SRP-capable links should adopt more aggressive poweroff | ||
1614 | * policies (when HNP doesn't apply) once we have mechanisms to | ||
1615 | * turn power back on! (Likely not before 2.7...) | ||
1616 | */ | ||
1617 | if (state > PM_SUSPEND_MEM) { | ||
1618 | dev_warn(&udev->dev, "no poweroff yet, suspending instead\n"); | ||
1619 | } | ||
1620 | |||
1621 | /* "global suspend" of the HC-to-USB interface (root hub), or | ||
1622 | * "selective suspend" of just one hub-device link. | ||
1623 | */ | ||
1624 | if (!udev->parent) { | ||
1625 | struct usb_bus *bus = udev->bus; | ||
1626 | if (bus && bus->op->hub_suspend) { | ||
1627 | status = bus->op->hub_suspend (bus); | ||
1628 | if (status == 0) { | ||
1629 | dev_dbg(&udev->dev, "usb suspend\n"); | ||
1630 | usb_set_device_state(udev, | ||
1631 | USB_STATE_SUSPENDED); | ||
1632 | } | ||
1633 | } else | ||
1634 | status = -EOPNOTSUPP; | ||
1635 | } else | ||
1636 | status = hub_port_suspend(hdev_to_hub(udev->parent), port1, | ||
1637 | udev); | ||
1638 | |||
1639 | if (status == 0) | ||
1640 | udev->dev.power.power_state = state; | ||
1641 | return status; | ||
1642 | } | ||
1643 | |||
1644 | /** | ||
1645 | * usb_suspend_device - suspend a usb device | ||
1646 | * @udev: device that's no longer in active use | ||
1647 | * @state: PMSG_SUSPEND to suspend | ||
1648 | * Context: must be able to sleep; device not locked | ||
1649 | * | ||
1650 | * Suspends a USB device that isn't in active use, conserving power. | ||
1651 | * Devices may wake out of a suspend, if anything important happens, | ||
1652 | * using the remote wakeup mechanism. They may also be taken out of | ||
1653 | * suspend by the host, using usb_resume_device(). It's also routine | ||
1654 | * to disconnect devices while they are suspended. | ||
1655 | * | ||
1656 | * Suspending OTG devices may trigger HNP, if that's been enabled | ||
1657 | * between a pair of dual-role devices. That will change roles, such | ||
1658 | * as from A-Host to A-Peripheral or from B-Host back to B-Peripheral. | ||
1659 | * | ||
1660 | * Returns 0 on success, else negative errno. | ||
1661 | */ | ||
1662 | int usb_suspend_device(struct usb_device *udev, pm_message_t state) | ||
1663 | { | ||
1664 | int port1, status; | ||
1665 | |||
1666 | port1 = locktree(udev); | ||
1667 | if (port1 < 0) | ||
1668 | return port1; | ||
1669 | |||
1670 | status = __usb_suspend_device(udev, port1, state); | ||
1671 | usb_unlock_device(udev); | ||
1672 | return status; | ||
1673 | } | ||
1674 | |||
1675 | /* | ||
1676 | * hardware resume signaling is finished, either because of selective | ||
1677 | * resume (by host) or remote wakeup (by device) ... now see what changed | ||
1678 | * in the tree that's rooted at this device. | ||
1679 | */ | ||
1680 | static int finish_port_resume(struct usb_device *udev) | ||
1681 | { | ||
1682 | int status; | ||
1683 | u16 devstatus; | ||
1684 | |||
1685 | /* caller owns the udev device lock */ | ||
1686 | dev_dbg(&udev->dev, "usb resume\n"); | ||
1687 | |||
1688 | /* usb ch9 identifies four variants of SUSPENDED, based on what | ||
1689 | * state the device resumes to. Linux currently won't see the | ||
1690 | * first two on the host side; they'd be inside hub_port_init() | ||
1691 | * during many timeouts, but khubd can't suspend until later. | ||
1692 | */ | ||
1693 | usb_set_device_state(udev, udev->actconfig | ||
1694 | ? USB_STATE_CONFIGURED | ||
1695 | : USB_STATE_ADDRESS); | ||
1696 | udev->dev.power.power_state = PMSG_ON; | ||
1697 | |||
1698 | /* 10.5.4.5 says be sure devices in the tree are still there. | ||
1699 | * For now let's assume the device didn't go crazy on resume, | ||
1700 | * and device drivers will know about any resume quirks. | ||
1701 | */ | ||
1702 | status = usb_get_status(udev, USB_RECIP_DEVICE, 0, &devstatus); | ||
1703 | if (status < 0) | ||
1704 | dev_dbg(&udev->dev, | ||
1705 | "gone after usb resume? status %d\n", | ||
1706 | status); | ||
1707 | else if (udev->actconfig) { | ||
1708 | unsigned i; | ||
1709 | |||
1710 | le16_to_cpus(&devstatus); | ||
1711 | if (devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP)) { | ||
1712 | status = usb_control_msg(udev, | ||
1713 | usb_sndctrlpipe(udev, 0), | ||
1714 | USB_REQ_CLEAR_FEATURE, | ||
1715 | USB_RECIP_DEVICE, | ||
1716 | USB_DEVICE_REMOTE_WAKEUP, 0, | ||
1717 | NULL, 0, | ||
1718 | USB_CTRL_SET_TIMEOUT); | ||
1719 | if (status) { | ||
1720 | dev_dbg(&udev->dev, "disable remote " | ||
1721 | "wakeup, status %d\n", status); | ||
1722 | status = 0; | ||
1723 | } | ||
1724 | } | ||
1725 | |||
1726 | /* resume interface drivers; if this is a hub, it | ||
1727 | * resumes the child devices | ||
1728 | */ | ||
1729 | for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { | ||
1730 | struct usb_interface *intf; | ||
1731 | struct usb_driver *driver; | ||
1732 | |||
1733 | intf = udev->actconfig->interface[i]; | ||
1734 | if (intf->dev.power.power_state == PM_SUSPEND_ON) | ||
1735 | continue; | ||
1736 | if (!intf->dev.driver) { | ||
1737 | /* FIXME maybe force to alt 0 */ | ||
1738 | continue; | ||
1739 | } | ||
1740 | driver = to_usb_driver(intf->dev.driver); | ||
1741 | |||
1742 | /* bus_rescan_devices() may rebind drivers */ | ||
1743 | if (!driver->resume) | ||
1744 | continue; | ||
1745 | |||
1746 | /* can we do better than just logging errors? */ | ||
1747 | status = driver->resume(intf); | ||
1748 | if (intf->dev.power.power_state != PM_SUSPEND_ON | ||
1749 | || status) | ||
1750 | dev_dbg(&intf->dev, | ||
1751 | "resume fail, state %d code %d\n", | ||
1752 | intf->dev.power.power_state, status); | ||
1753 | } | ||
1754 | status = 0; | ||
1755 | |||
1756 | } else if (udev->devnum <= 0) { | ||
1757 | dev_dbg(&udev->dev, "bogus resume!\n"); | ||
1758 | status = -EINVAL; | ||
1759 | } | ||
1760 | return status; | ||
1761 | } | ||
1762 | |||
1763 | static int | ||
1764 | hub_port_resume(struct usb_hub *hub, int port1, struct usb_device *udev) | ||
1765 | { | ||
1766 | int status; | ||
1767 | |||
1768 | // dev_dbg(hub->intfdev, "resume port %d\n", port1); | ||
1769 | |||
1770 | /* see 7.1.7.7; affects power usage, but not budgeting */ | ||
1771 | status = clear_port_feature(hub->hdev, | ||
1772 | port1, USB_PORT_FEAT_SUSPEND); | ||
1773 | if (status) { | ||
1774 | dev_dbg(hub->intfdev, | ||
1775 | "can't resume port %d, status %d\n", | ||
1776 | port1, status); | ||
1777 | } else { | ||
1778 | u16 devstatus; | ||
1779 | u16 portchange; | ||
1780 | |||
1781 | /* drive resume for at least 20 msec */ | ||
1782 | if (udev) | ||
1783 | dev_dbg(&udev->dev, "RESUME\n"); | ||
1784 | msleep(25); | ||
1785 | |||
1786 | #define LIVE_FLAGS ( USB_PORT_STAT_POWER \ | ||
1787 | | USB_PORT_STAT_ENABLE \ | ||
1788 | | USB_PORT_STAT_CONNECTION) | ||
1789 | |||
1790 | /* Virtual root hubs can trigger on GET_PORT_STATUS to | ||
1791 | * stop resume signaling. Then finish the resume | ||
1792 | * sequence. | ||
1793 | */ | ||
1794 | devstatus = portchange = 0; | ||
1795 | status = hub_port_status(hub, port1, | ||
1796 | &devstatus, &portchange); | ||
1797 | if (status < 0 | ||
1798 | || (devstatus & LIVE_FLAGS) != LIVE_FLAGS | ||
1799 | || (devstatus & USB_PORT_STAT_SUSPEND) != 0 | ||
1800 | ) { | ||
1801 | dev_dbg(hub->intfdev, | ||
1802 | "port %d status %04x.%04x after resume, %d\n", | ||
1803 | port1, portchange, devstatus, status); | ||
1804 | } else { | ||
1805 | /* TRSMRCY = 10 msec */ | ||
1806 | msleep(10); | ||
1807 | if (udev) | ||
1808 | status = finish_port_resume(udev); | ||
1809 | } | ||
1810 | } | ||
1811 | if (status < 0) | ||
1812 | hub_port_logical_disconnect(hub, port1); | ||
1813 | |||
1814 | return status; | ||
1815 | } | ||
1816 | |||
1817 | static int hub_resume (struct usb_interface *intf); | ||
1818 | |||
1819 | /** | ||
1820 | * usb_resume_device - re-activate a suspended usb device | ||
1821 | * @udev: device to re-activate | ||
1822 | * Context: must be able to sleep; device not locked | ||
1823 | * | ||
1824 | * This will re-activate the suspended device, increasing power usage | ||
1825 | * while letting drivers communicate again with its endpoints. | ||
1826 | * USB resume explicitly guarantees that the power session between | ||
1827 | * the host and the device is the same as it was when the device | ||
1828 | * suspended. | ||
1829 | * | ||
1830 | * Returns 0 on success, else negative errno. | ||
1831 | */ | ||
1832 | int usb_resume_device(struct usb_device *udev) | ||
1833 | { | ||
1834 | int port1, status; | ||
1835 | |||
1836 | port1 = locktree(udev); | ||
1837 | if (port1 < 0) | ||
1838 | return port1; | ||
1839 | |||
1840 | /* "global resume" of the HC-to-USB interface (root hub), or | ||
1841 | * selective resume of one hub-to-device port | ||
1842 | */ | ||
1843 | if (!udev->parent) { | ||
1844 | struct usb_bus *bus = udev->bus; | ||
1845 | if (bus && bus->op->hub_resume) { | ||
1846 | status = bus->op->hub_resume (bus); | ||
1847 | } else | ||
1848 | status = -EOPNOTSUPP; | ||
1849 | if (status == 0) { | ||
1850 | dev_dbg(&udev->dev, "usb resume\n"); | ||
1851 | /* TRSMRCY = 10 msec */ | ||
1852 | msleep(10); | ||
1853 | usb_set_device_state (udev, USB_STATE_CONFIGURED); | ||
1854 | udev->dev.power.power_state = PMSG_ON; | ||
1855 | status = hub_resume (udev | ||
1856 | ->actconfig->interface[0]); | ||
1857 | } | ||
1858 | } else if (udev->state == USB_STATE_SUSPENDED) { | ||
1859 | // NOTE this fails if parent is also suspended... | ||
1860 | status = hub_port_resume(hdev_to_hub(udev->parent), | ||
1861 | port1, udev); | ||
1862 | } else { | ||
1863 | status = 0; | ||
1864 | } | ||
1865 | if (status < 0) { | ||
1866 | dev_dbg(&udev->dev, "can't resume, status %d\n", | ||
1867 | status); | ||
1868 | } | ||
1869 | |||
1870 | usb_unlock_device(udev); | ||
1871 | |||
1872 | /* rebind drivers that had no suspend() */ | ||
1873 | if (status == 0) { | ||
1874 | usb_lock_all_devices(); | ||
1875 | bus_rescan_devices(&usb_bus_type); | ||
1876 | usb_unlock_all_devices(); | ||
1877 | } | ||
1878 | return status; | ||
1879 | } | ||
1880 | |||
1881 | static int remote_wakeup(struct usb_device *udev) | ||
1882 | { | ||
1883 | int status = 0; | ||
1884 | |||
1885 | /* don't repeat RESUME sequence if this device | ||
1886 | * was already woken up by some other task | ||
1887 | */ | ||
1888 | down(&udev->serialize); | ||
1889 | if (udev->state == USB_STATE_SUSPENDED) { | ||
1890 | dev_dbg(&udev->dev, "RESUME (wakeup)\n"); | ||
1891 | /* TRSMRCY = 10 msec */ | ||
1892 | msleep(10); | ||
1893 | status = finish_port_resume(udev); | ||
1894 | } | ||
1895 | up(&udev->serialize); | ||
1896 | return status; | ||
1897 | } | ||
1898 | |||
1899 | static int hub_suspend(struct usb_interface *intf, pm_message_t state) | ||
1900 | { | ||
1901 | struct usb_hub *hub = usb_get_intfdata (intf); | ||
1902 | struct usb_device *hdev = hub->hdev; | ||
1903 | unsigned port1; | ||
1904 | int status; | ||
1905 | |||
1906 | /* stop khubd and related activity */ | ||
1907 | hub_quiesce(hub); | ||
1908 | |||
1909 | /* then suspend every port */ | ||
1910 | for (port1 = 1; port1 <= hdev->maxchild; port1++) { | ||
1911 | struct usb_device *udev; | ||
1912 | |||
1913 | udev = hdev->children [port1-1]; | ||
1914 | if (!udev) | ||
1915 | continue; | ||
1916 | down(&udev->serialize); | ||
1917 | status = __usb_suspend_device(udev, port1, state); | ||
1918 | up(&udev->serialize); | ||
1919 | if (status < 0) | ||
1920 | dev_dbg(&intf->dev, "suspend port %d --> %d\n", | ||
1921 | port1, status); | ||
1922 | } | ||
1923 | |||
1924 | intf->dev.power.power_state = state; | ||
1925 | return 0; | ||
1926 | } | ||
1927 | |||
1928 | static int hub_resume(struct usb_interface *intf) | ||
1929 | { | ||
1930 | struct usb_device *hdev = interface_to_usbdev(intf); | ||
1931 | struct usb_hub *hub = usb_get_intfdata (intf); | ||
1932 | unsigned port1; | ||
1933 | int status; | ||
1934 | |||
1935 | if (intf->dev.power.power_state == PM_SUSPEND_ON) | ||
1936 | return 0; | ||
1937 | |||
1938 | for (port1 = 1; port1 <= hdev->maxchild; port1++) { | ||
1939 | struct usb_device *udev; | ||
1940 | u16 portstat, portchange; | ||
1941 | |||
1942 | udev = hdev->children [port1-1]; | ||
1943 | status = hub_port_status(hub, port1, &portstat, &portchange); | ||
1944 | if (status == 0) { | ||
1945 | if (portchange & USB_PORT_STAT_C_SUSPEND) { | ||
1946 | clear_port_feature(hdev, port1, | ||
1947 | USB_PORT_FEAT_C_SUSPEND); | ||
1948 | portchange &= ~USB_PORT_STAT_C_SUSPEND; | ||
1949 | } | ||
1950 | |||
1951 | /* let khubd handle disconnects etc */ | ||
1952 | if (portchange) | ||
1953 | continue; | ||
1954 | } | ||
1955 | |||
1956 | if (!udev || status < 0) | ||
1957 | continue; | ||
1958 | down (&udev->serialize); | ||
1959 | if (portstat & USB_PORT_STAT_SUSPEND) | ||
1960 | status = hub_port_resume(hub, port1, udev); | ||
1961 | else { | ||
1962 | status = finish_port_resume(udev); | ||
1963 | if (status < 0) { | ||
1964 | dev_dbg(&intf->dev, "resume port %d --> %d\n", | ||
1965 | port1, status); | ||
1966 | hub_port_logical_disconnect(hub, port1); | ||
1967 | } | ||
1968 | } | ||
1969 | up(&udev->serialize); | ||
1970 | } | ||
1971 | intf->dev.power.power_state = PMSG_ON; | ||
1972 | |||
1973 | hub->resume_root_hub = 0; | ||
1974 | hub_activate(hub); | ||
1975 | return 0; | ||
1976 | } | ||
1977 | |||
1978 | void usb_resume_root_hub(struct usb_device *hdev) | ||
1979 | { | ||
1980 | struct usb_hub *hub = hdev_to_hub(hdev); | ||
1981 | |||
1982 | hub->resume_root_hub = 1; | ||
1983 | kick_khubd(hub); | ||
1984 | } | ||
1985 | |||
1986 | #else /* !CONFIG_USB_SUSPEND */ | ||
1987 | |||
1988 | int usb_suspend_device(struct usb_device *udev, pm_message_t state) | ||
1989 | { | ||
1990 | return 0; | ||
1991 | } | ||
1992 | |||
1993 | int usb_resume_device(struct usb_device *udev) | ||
1994 | { | ||
1995 | return 0; | ||
1996 | } | ||
1997 | |||
1998 | #define hub_suspend NULL | ||
1999 | #define hub_resume NULL | ||
2000 | #define remote_wakeup(x) 0 | ||
2001 | |||
2002 | #endif /* CONFIG_USB_SUSPEND */ | ||
2003 | |||
2004 | EXPORT_SYMBOL(usb_suspend_device); | ||
2005 | EXPORT_SYMBOL(usb_resume_device); | ||
2006 | |||
2007 | |||
2008 | |||
2009 | /* USB 2.0 spec, 7.1.7.3 / fig 7-29: | ||
2010 | * | ||
2011 | * Between connect detection and reset signaling there must be a delay | ||
2012 | * of 100ms at least for debounce and power-settling. The corresponding | ||
2013 | * timer shall restart whenever the downstream port detects a disconnect. | ||
2014 | * | ||
2015 | * Apparently there are some bluetooth and irda-dongles and a number of | ||
2016 | * low-speed devices for which this debounce period may last over a second. | ||
2017 | * Not covered by the spec - but easy to deal with. | ||
2018 | * | ||
2019 | * This implementation uses a 1500ms total debounce timeout; if the | ||
2020 | * connection isn't stable by then it returns -ETIMEDOUT. It checks | ||
2021 | * every 25ms for transient disconnects. When the port status has been | ||
2022 | * unchanged for 100ms it returns the port status. | ||
2023 | */ | ||
2024 | |||
2025 | #define HUB_DEBOUNCE_TIMEOUT 1500 | ||
2026 | #define HUB_DEBOUNCE_STEP 25 | ||
2027 | #define HUB_DEBOUNCE_STABLE 100 | ||
2028 | |||
2029 | static int hub_port_debounce(struct usb_hub *hub, int port1) | ||
2030 | { | ||
2031 | int ret; | ||
2032 | int total_time, stable_time = 0; | ||
2033 | u16 portchange, portstatus; | ||
2034 | unsigned connection = 0xffff; | ||
2035 | |||
2036 | for (total_time = 0; ; total_time += HUB_DEBOUNCE_STEP) { | ||
2037 | ret = hub_port_status(hub, port1, &portstatus, &portchange); | ||
2038 | if (ret < 0) | ||
2039 | return ret; | ||
2040 | |||
2041 | if (!(portchange & USB_PORT_STAT_C_CONNECTION) && | ||
2042 | (portstatus & USB_PORT_STAT_CONNECTION) == connection) { | ||
2043 | stable_time += HUB_DEBOUNCE_STEP; | ||
2044 | if (stable_time >= HUB_DEBOUNCE_STABLE) | ||
2045 | break; | ||
2046 | } else { | ||
2047 | stable_time = 0; | ||
2048 | connection = portstatus & USB_PORT_STAT_CONNECTION; | ||
2049 | } | ||
2050 | |||
2051 | if (portchange & USB_PORT_STAT_C_CONNECTION) { | ||
2052 | clear_port_feature(hub->hdev, port1, | ||
2053 | USB_PORT_FEAT_C_CONNECTION); | ||
2054 | } | ||
2055 | |||
2056 | if (total_time >= HUB_DEBOUNCE_TIMEOUT) | ||
2057 | break; | ||
2058 | msleep(HUB_DEBOUNCE_STEP); | ||
2059 | } | ||
2060 | |||
2061 | dev_dbg (hub->intfdev, | ||
2062 | "debounce: port %d: total %dms stable %dms status 0x%x\n", | ||
2063 | port1, total_time, stable_time, portstatus); | ||
2064 | |||
2065 | if (stable_time < HUB_DEBOUNCE_STABLE) | ||
2066 | return -ETIMEDOUT; | ||
2067 | return portstatus; | ||
2068 | } | ||
2069 | |||
2070 | static void ep0_reinit(struct usb_device *udev) | ||
2071 | { | ||
2072 | usb_disable_endpoint(udev, 0 + USB_DIR_IN); | ||
2073 | usb_disable_endpoint(udev, 0 + USB_DIR_OUT); | ||
2074 | udev->ep_in[0] = udev->ep_out[0] = &udev->ep0; | ||
2075 | } | ||
2076 | |||
2077 | #define usb_sndaddr0pipe() (PIPE_CONTROL << 30) | ||
2078 | #define usb_rcvaddr0pipe() ((PIPE_CONTROL << 30) | USB_DIR_IN) | ||
2079 | |||
2080 | static int hub_set_address(struct usb_device *udev) | ||
2081 | { | ||
2082 | int retval; | ||
2083 | |||
2084 | if (udev->devnum == 0) | ||
2085 | return -EINVAL; | ||
2086 | if (udev->state == USB_STATE_ADDRESS) | ||
2087 | return 0; | ||
2088 | if (udev->state != USB_STATE_DEFAULT) | ||
2089 | return -EINVAL; | ||
2090 | retval = usb_control_msg(udev, usb_sndaddr0pipe(), | ||
2091 | USB_REQ_SET_ADDRESS, 0, udev->devnum, 0, | ||
2092 | NULL, 0, USB_CTRL_SET_TIMEOUT); | ||
2093 | if (retval == 0) { | ||
2094 | usb_set_device_state(udev, USB_STATE_ADDRESS); | ||
2095 | ep0_reinit(udev); | ||
2096 | } | ||
2097 | return retval; | ||
2098 | } | ||
2099 | |||
2100 | /* Reset device, (re)assign address, get device descriptor. | ||
2101 | * Device connection must be stable, no more debouncing needed. | ||
2102 | * Returns device in USB_STATE_ADDRESS, except on error. | ||
2103 | * | ||
2104 | * If this is called for an already-existing device (as part of | ||
2105 | * usb_reset_device), the caller must own the device lock. For a | ||
2106 | * newly detected device that is not accessible through any global | ||
2107 | * pointers, it's not necessary to lock the device. | ||
2108 | */ | ||
2109 | static int | ||
2110 | hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, | ||
2111 | int retry_counter) | ||
2112 | { | ||
2113 | static DECLARE_MUTEX(usb_address0_sem); | ||
2114 | |||
2115 | struct usb_device *hdev = hub->hdev; | ||
2116 | int i, j, retval; | ||
2117 | unsigned delay = HUB_SHORT_RESET_TIME; | ||
2118 | enum usb_device_speed oldspeed = udev->speed; | ||
2119 | |||
2120 | /* root hub ports have a slightly longer reset period | ||
2121 | * (from USB 2.0 spec, section 7.1.7.5) | ||
2122 | */ | ||
2123 | if (!hdev->parent) { | ||
2124 | delay = HUB_ROOT_RESET_TIME; | ||
2125 | if (port1 == hdev->bus->otg_port) | ||
2126 | hdev->bus->b_hnp_enable = 0; | ||
2127 | } | ||
2128 | |||
2129 | /* Some low speed devices have problems with the quick delay, so */ | ||
2130 | /* be a bit pessimistic with those devices. RHbug #23670 */ | ||
2131 | if (oldspeed == USB_SPEED_LOW) | ||
2132 | delay = HUB_LONG_RESET_TIME; | ||
2133 | |||
2134 | down(&usb_address0_sem); | ||
2135 | |||
2136 | /* Reset the device; full speed may morph to high speed */ | ||
2137 | retval = hub_port_reset(hub, port1, udev, delay); | ||
2138 | if (retval < 0) /* error or disconnect */ | ||
2139 | goto fail; | ||
2140 | /* success, speed is known */ | ||
2141 | retval = -ENODEV; | ||
2142 | |||
2143 | if (oldspeed != USB_SPEED_UNKNOWN && oldspeed != udev->speed) { | ||
2144 | dev_dbg(&udev->dev, "device reset changed speed!\n"); | ||
2145 | goto fail; | ||
2146 | } | ||
2147 | oldspeed = udev->speed; | ||
2148 | |||
2149 | /* USB 2.0 section 5.5.3 talks about ep0 maxpacket ... | ||
2150 | * it's fixed size except for full speed devices. | ||
2151 | */ | ||
2152 | switch (udev->speed) { | ||
2153 | case USB_SPEED_HIGH: /* fixed at 64 */ | ||
2154 | udev->ep0.desc.wMaxPacketSize = __constant_cpu_to_le16(64); | ||
2155 | break; | ||
2156 | case USB_SPEED_FULL: /* 8, 16, 32, or 64 */ | ||
2157 | /* to determine the ep0 maxpacket size, try to read | ||
2158 | * the device descriptor to get bMaxPacketSize0 and | ||
2159 | * then correct our initial guess. | ||
2160 | */ | ||
2161 | udev->ep0.desc.wMaxPacketSize = __constant_cpu_to_le16(64); | ||
2162 | break; | ||
2163 | case USB_SPEED_LOW: /* fixed at 8 */ | ||
2164 | udev->ep0.desc.wMaxPacketSize = __constant_cpu_to_le16(8); | ||
2165 | break; | ||
2166 | default: | ||
2167 | goto fail; | ||
2168 | } | ||
2169 | |||
2170 | dev_info (&udev->dev, | ||
2171 | "%s %s speed USB device using %s and address %d\n", | ||
2172 | (udev->config) ? "reset" : "new", | ||
2173 | ({ char *speed; switch (udev->speed) { | ||
2174 | case USB_SPEED_LOW: speed = "low"; break; | ||
2175 | case USB_SPEED_FULL: speed = "full"; break; | ||
2176 | case USB_SPEED_HIGH: speed = "high"; break; | ||
2177 | default: speed = "?"; break; | ||
2178 | }; speed;}), | ||
2179 | udev->bus->controller->driver->name, | ||
2180 | udev->devnum); | ||
2181 | |||
2182 | /* Set up TT records, if needed */ | ||
2183 | if (hdev->tt) { | ||
2184 | udev->tt = hdev->tt; | ||
2185 | udev->ttport = hdev->ttport; | ||
2186 | } else if (udev->speed != USB_SPEED_HIGH | ||
2187 | && hdev->speed == USB_SPEED_HIGH) { | ||
2188 | udev->tt = &hub->tt; | ||
2189 | udev->ttport = port1; | ||
2190 | } | ||
2191 | |||
2192 | /* Why interleave GET_DESCRIPTOR and SET_ADDRESS this way? | ||
2193 | * Because device hardware and firmware is sometimes buggy in | ||
2194 | * this area, and this is how Linux has done it for ages. | ||
2195 | * Change it cautiously. | ||
2196 | * | ||
2197 | * NOTE: If USE_NEW_SCHEME() is true we will start by issuing | ||
2198 | * a 64-byte GET_DESCRIPTOR request. This is what Windows does, | ||
2199 | * so it may help with some non-standards-compliant devices. | ||
2200 | * Otherwise we start with SET_ADDRESS and then try to read the | ||
2201 | * first 8 bytes of the device descriptor to get the ep0 maxpacket | ||
2202 | * value. | ||
2203 | */ | ||
2204 | for (i = 0; i < GET_DESCRIPTOR_TRIES; (++i, msleep(100))) { | ||
2205 | if (USE_NEW_SCHEME(retry_counter)) { | ||
2206 | struct usb_device_descriptor *buf; | ||
2207 | int r = 0; | ||
2208 | |||
2209 | #define GET_DESCRIPTOR_BUFSIZE 64 | ||
2210 | buf = kmalloc(GET_DESCRIPTOR_BUFSIZE, GFP_NOIO); | ||
2211 | if (!buf) { | ||
2212 | retval = -ENOMEM; | ||
2213 | continue; | ||
2214 | } | ||
2215 | |||
2216 | /* Use a short timeout the first time through, | ||
2217 | * so that recalcitrant full-speed devices with | ||
2218 | * 8- or 16-byte ep0-maxpackets won't slow things | ||
2219 | * down tremendously by NAKing the unexpectedly | ||
2220 | * early status stage. Also, retry on all errors; | ||
2221 | * some devices are flakey. | ||
2222 | */ | ||
2223 | for (j = 0; j < 3; ++j) { | ||
2224 | buf->bMaxPacketSize0 = 0; | ||
2225 | r = usb_control_msg(udev, usb_rcvaddr0pipe(), | ||
2226 | USB_REQ_GET_DESCRIPTOR, USB_DIR_IN, | ||
2227 | USB_DT_DEVICE << 8, 0, | ||
2228 | buf, GET_DESCRIPTOR_BUFSIZE, | ||
2229 | (i ? USB_CTRL_GET_TIMEOUT : 1000)); | ||
2230 | switch (buf->bMaxPacketSize0) { | ||
2231 | case 8: case 16: case 32: case 64: | ||
2232 | if (buf->bDescriptorType == | ||
2233 | USB_DT_DEVICE) { | ||
2234 | r = 0; | ||
2235 | break; | ||
2236 | } | ||
2237 | /* FALL THROUGH */ | ||
2238 | default: | ||
2239 | if (r == 0) | ||
2240 | r = -EPROTO; | ||
2241 | break; | ||
2242 | } | ||
2243 | if (r == 0) | ||
2244 | break; | ||
2245 | } | ||
2246 | udev->descriptor.bMaxPacketSize0 = | ||
2247 | buf->bMaxPacketSize0; | ||
2248 | kfree(buf); | ||
2249 | |||
2250 | retval = hub_port_reset(hub, port1, udev, delay); | ||
2251 | if (retval < 0) /* error or disconnect */ | ||
2252 | goto fail; | ||
2253 | if (oldspeed != udev->speed) { | ||
2254 | dev_dbg(&udev->dev, | ||
2255 | "device reset changed speed!\n"); | ||
2256 | retval = -ENODEV; | ||
2257 | goto fail; | ||
2258 | } | ||
2259 | if (r) { | ||
2260 | dev_err(&udev->dev, "device descriptor " | ||
2261 | "read/%s, error %d\n", | ||
2262 | "64", r); | ||
2263 | retval = -EMSGSIZE; | ||
2264 | continue; | ||
2265 | } | ||
2266 | #undef GET_DESCRIPTOR_BUFSIZE | ||
2267 | } | ||
2268 | |||
2269 | for (j = 0; j < SET_ADDRESS_TRIES; ++j) { | ||
2270 | retval = hub_set_address(udev); | ||
2271 | if (retval >= 0) | ||
2272 | break; | ||
2273 | msleep(200); | ||
2274 | } | ||
2275 | if (retval < 0) { | ||
2276 | dev_err(&udev->dev, | ||
2277 | "device not accepting address %d, error %d\n", | ||
2278 | udev->devnum, retval); | ||
2279 | goto fail; | ||
2280 | } | ||
2281 | |||
2282 | /* cope with hardware quirkiness: | ||
2283 | * - let SET_ADDRESS settle, some device hardware wants it | ||
2284 | * - read ep0 maxpacket even for high and low speed, | ||
2285 | */ | ||
2286 | msleep(10); | ||
2287 | if (USE_NEW_SCHEME(retry_counter)) | ||
2288 | break; | ||
2289 | |||
2290 | retval = usb_get_device_descriptor(udev, 8); | ||
2291 | if (retval < 8) { | ||
2292 | dev_err(&udev->dev, "device descriptor " | ||
2293 | "read/%s, error %d\n", | ||
2294 | "8", retval); | ||
2295 | if (retval >= 0) | ||
2296 | retval = -EMSGSIZE; | ||
2297 | } else { | ||
2298 | retval = 0; | ||
2299 | break; | ||
2300 | } | ||
2301 | } | ||
2302 | if (retval) | ||
2303 | goto fail; | ||
2304 | |||
2305 | i = udev->descriptor.bMaxPacketSize0; | ||
2306 | if (le16_to_cpu(udev->ep0.desc.wMaxPacketSize) != i) { | ||
2307 | if (udev->speed != USB_SPEED_FULL || | ||
2308 | !(i == 8 || i == 16 || i == 32 || i == 64)) { | ||
2309 | dev_err(&udev->dev, "ep0 maxpacket = %d\n", i); | ||
2310 | retval = -EMSGSIZE; | ||
2311 | goto fail; | ||
2312 | } | ||
2313 | dev_dbg(&udev->dev, "ep0 maxpacket = %d\n", i); | ||
2314 | udev->ep0.desc.wMaxPacketSize = cpu_to_le16(i); | ||
2315 | ep0_reinit(udev); | ||
2316 | } | ||
2317 | |||
2318 | retval = usb_get_device_descriptor(udev, USB_DT_DEVICE_SIZE); | ||
2319 | if (retval < (signed)sizeof(udev->descriptor)) { | ||
2320 | dev_err(&udev->dev, "device descriptor read/%s, error %d\n", | ||
2321 | "all", retval); | ||
2322 | if (retval >= 0) | ||
2323 | retval = -ENOMSG; | ||
2324 | goto fail; | ||
2325 | } | ||
2326 | |||
2327 | retval = 0; | ||
2328 | |||
2329 | fail: | ||
2330 | if (retval) | ||
2331 | hub_port_disable(hub, port1, 0); | ||
2332 | up(&usb_address0_sem); | ||
2333 | return retval; | ||
2334 | } | ||
2335 | |||
2336 | static void | ||
2337 | check_highspeed (struct usb_hub *hub, struct usb_device *udev, int port1) | ||
2338 | { | ||
2339 | struct usb_qualifier_descriptor *qual; | ||
2340 | int status; | ||
2341 | |||
2342 | qual = kmalloc (sizeof *qual, SLAB_KERNEL); | ||
2343 | if (qual == NULL) | ||
2344 | return; | ||
2345 | |||
2346 | status = usb_get_descriptor (udev, USB_DT_DEVICE_QUALIFIER, 0, | ||
2347 | qual, sizeof *qual); | ||
2348 | if (status == sizeof *qual) { | ||
2349 | dev_info(&udev->dev, "not running at top speed; " | ||
2350 | "connect to a high speed hub\n"); | ||
2351 | /* hub LEDs are probably harder to miss than syslog */ | ||
2352 | if (hub->has_indicators) { | ||
2353 | hub->indicator[port1-1] = INDICATOR_GREEN_BLINK; | ||
2354 | schedule_work (&hub->leds); | ||
2355 | } | ||
2356 | } | ||
2357 | kfree (qual); | ||
2358 | } | ||
2359 | |||
2360 | static unsigned | ||
2361 | hub_power_remaining (struct usb_hub *hub) | ||
2362 | { | ||
2363 | struct usb_device *hdev = hub->hdev; | ||
2364 | int remaining; | ||
2365 | unsigned i; | ||
2366 | |||
2367 | remaining = hub->power_budget; | ||
2368 | if (!remaining) /* self-powered */ | ||
2369 | return 0; | ||
2370 | |||
2371 | for (i = 0; i < hdev->maxchild; i++) { | ||
2372 | struct usb_device *udev = hdev->children[i]; | ||
2373 | int delta, ceiling; | ||
2374 | |||
2375 | if (!udev) | ||
2376 | continue; | ||
2377 | |||
2378 | /* 100mA per-port ceiling, or 8mA for OTG ports */ | ||
2379 | if (i != (udev->bus->otg_port - 1) || hdev->parent) | ||
2380 | ceiling = 50; | ||
2381 | else | ||
2382 | ceiling = 4; | ||
2383 | |||
2384 | if (udev->actconfig) | ||
2385 | delta = udev->actconfig->desc.bMaxPower; | ||
2386 | else | ||
2387 | delta = ceiling; | ||
2388 | // dev_dbg(&udev->dev, "budgeted %dmA\n", 2 * delta); | ||
2389 | if (delta > ceiling) | ||
2390 | dev_warn(&udev->dev, "%dmA over %dmA budget!\n", | ||
2391 | 2 * (delta - ceiling), 2 * ceiling); | ||
2392 | remaining -= delta; | ||
2393 | } | ||
2394 | if (remaining < 0) { | ||
2395 | dev_warn(hub->intfdev, | ||
2396 | "%dmA over power budget!\n", | ||
2397 | -2 * remaining); | ||
2398 | remaining = 0; | ||
2399 | } | ||
2400 | return remaining; | ||
2401 | } | ||
2402 | |||
2403 | /* Handle physical or logical connection change events. | ||
2404 | * This routine is called when: | ||
2405 | * a port connection-change occurs; | ||
2406 | * a port enable-change occurs (often caused by EMI); | ||
2407 | * usb_reset_device() encounters changed descriptors (as from | ||
2408 | * a firmware download) | ||
2409 | * caller already locked the hub | ||
2410 | */ | ||
2411 | static void hub_port_connect_change(struct usb_hub *hub, int port1, | ||
2412 | u16 portstatus, u16 portchange) | ||
2413 | { | ||
2414 | struct usb_device *hdev = hub->hdev; | ||
2415 | struct device *hub_dev = hub->intfdev; | ||
2416 | int status, i; | ||
2417 | |||
2418 | dev_dbg (hub_dev, | ||
2419 | "port %d, status %04x, change %04x, %s\n", | ||
2420 | port1, portstatus, portchange, portspeed (portstatus)); | ||
2421 | |||
2422 | if (hub->has_indicators) { | ||
2423 | set_port_led(hub, port1, HUB_LED_AUTO); | ||
2424 | hub->indicator[port1-1] = INDICATOR_AUTO; | ||
2425 | } | ||
2426 | |||
2427 | /* Disconnect any existing devices under this port */ | ||
2428 | if (hdev->children[port1-1]) | ||
2429 | usb_disconnect(&hdev->children[port1-1]); | ||
2430 | clear_bit(port1, hub->change_bits); | ||
2431 | |||
2432 | #ifdef CONFIG_USB_OTG | ||
2433 | /* during HNP, don't repeat the debounce */ | ||
2434 | if (hdev->bus->is_b_host) | ||
2435 | portchange &= ~USB_PORT_STAT_C_CONNECTION; | ||
2436 | #endif | ||
2437 | |||
2438 | if (portchange & USB_PORT_STAT_C_CONNECTION) { | ||
2439 | status = hub_port_debounce(hub, port1); | ||
2440 | if (status < 0) { | ||
2441 | dev_err (hub_dev, | ||
2442 | "connect-debounce failed, port %d disabled\n", | ||
2443 | port1); | ||
2444 | goto done; | ||
2445 | } | ||
2446 | portstatus = status; | ||
2447 | } | ||
2448 | |||
2449 | /* Return now if nothing is connected */ | ||
2450 | if (!(portstatus & USB_PORT_STAT_CONNECTION)) { | ||
2451 | |||
2452 | /* maybe switch power back on (e.g. root hub was reset) */ | ||
2453 | if ((hub->descriptor->wHubCharacteristics | ||
2454 | & HUB_CHAR_LPSM) < 2 | ||
2455 | && !(portstatus & (1 << USB_PORT_FEAT_POWER))) | ||
2456 | set_port_feature(hdev, port1, USB_PORT_FEAT_POWER); | ||
2457 | |||
2458 | if (portstatus & USB_PORT_STAT_ENABLE) | ||
2459 | goto done; | ||
2460 | return; | ||
2461 | } | ||
2462 | |||
2463 | #ifdef CONFIG_USB_SUSPEND | ||
2464 | /* If something is connected, but the port is suspended, wake it up. */ | ||
2465 | if (portstatus & USB_PORT_STAT_SUSPEND) { | ||
2466 | status = hub_port_resume(hub, port1, NULL); | ||
2467 | if (status < 0) { | ||
2468 | dev_dbg(hub_dev, | ||
2469 | "can't clear suspend on port %d; %d\n", | ||
2470 | port1, status); | ||
2471 | goto done; | ||
2472 | } | ||
2473 | } | ||
2474 | #endif | ||
2475 | |||
2476 | for (i = 0; i < SET_CONFIG_TRIES; i++) { | ||
2477 | struct usb_device *udev; | ||
2478 | |||
2479 | /* reallocate for each attempt, since references | ||
2480 | * to the previous one can escape in various ways | ||
2481 | */ | ||
2482 | udev = usb_alloc_dev(hdev, hdev->bus, port1); | ||
2483 | if (!udev) { | ||
2484 | dev_err (hub_dev, | ||
2485 | "couldn't allocate port %d usb_device\n", | ||
2486 | port1); | ||
2487 | goto done; | ||
2488 | } | ||
2489 | |||
2490 | usb_set_device_state(udev, USB_STATE_POWERED); | ||
2491 | udev->speed = USB_SPEED_UNKNOWN; | ||
2492 | |||
2493 | /* set the address */ | ||
2494 | choose_address(udev); | ||
2495 | if (udev->devnum <= 0) { | ||
2496 | status = -ENOTCONN; /* Don't retry */ | ||
2497 | goto loop; | ||
2498 | } | ||
2499 | |||
2500 | /* reset and get descriptor */ | ||
2501 | status = hub_port_init(hub, udev, port1, i); | ||
2502 | if (status < 0) | ||
2503 | goto loop; | ||
2504 | |||
2505 | /* consecutive bus-powered hubs aren't reliable; they can | ||
2506 | * violate the voltage drop budget. if the new child has | ||
2507 | * a "powered" LED, users should notice we didn't enable it | ||
2508 | * (without reading syslog), even without per-port LEDs | ||
2509 | * on the parent. | ||
2510 | */ | ||
2511 | if (udev->descriptor.bDeviceClass == USB_CLASS_HUB | ||
2512 | && hub->power_budget) { | ||
2513 | u16 devstat; | ||
2514 | |||
2515 | status = usb_get_status(udev, USB_RECIP_DEVICE, 0, | ||
2516 | &devstat); | ||
2517 | if (status < 0) { | ||
2518 | dev_dbg(&udev->dev, "get status %d ?\n", status); | ||
2519 | goto loop_disable; | ||
2520 | } | ||
2521 | cpu_to_le16s(&devstat); | ||
2522 | if ((devstat & (1 << USB_DEVICE_SELF_POWERED)) == 0) { | ||
2523 | dev_err(&udev->dev, | ||
2524 | "can't connect bus-powered hub " | ||
2525 | "to this port\n"); | ||
2526 | if (hub->has_indicators) { | ||
2527 | hub->indicator[port1-1] = | ||
2528 | INDICATOR_AMBER_BLINK; | ||
2529 | schedule_work (&hub->leds); | ||
2530 | } | ||
2531 | status = -ENOTCONN; /* Don't retry */ | ||
2532 | goto loop_disable; | ||
2533 | } | ||
2534 | } | ||
2535 | |||
2536 | /* check for devices running slower than they could */ | ||
2537 | if (le16_to_cpu(udev->descriptor.bcdUSB) >= 0x0200 | ||
2538 | && udev->speed == USB_SPEED_FULL | ||
2539 | && highspeed_hubs != 0) | ||
2540 | check_highspeed (hub, udev, port1); | ||
2541 | |||
2542 | /* Store the parent's children[] pointer. At this point | ||
2543 | * udev becomes globally accessible, although presumably | ||
2544 | * no one will look at it until hdev is unlocked. | ||
2545 | */ | ||
2546 | down (&udev->serialize); | ||
2547 | status = 0; | ||
2548 | |||
2549 | /* We mustn't add new devices if the parent hub has | ||
2550 | * been disconnected; we would race with the | ||
2551 | * recursively_mark_NOTATTACHED() routine. | ||
2552 | */ | ||
2553 | spin_lock_irq(&device_state_lock); | ||
2554 | if (hdev->state == USB_STATE_NOTATTACHED) | ||
2555 | status = -ENOTCONN; | ||
2556 | else | ||
2557 | hdev->children[port1-1] = udev; | ||
2558 | spin_unlock_irq(&device_state_lock); | ||
2559 | |||
2560 | /* Run it through the hoops (find a driver, etc) */ | ||
2561 | if (!status) { | ||
2562 | status = usb_new_device(udev); | ||
2563 | if (status) { | ||
2564 | spin_lock_irq(&device_state_lock); | ||
2565 | hdev->children[port1-1] = NULL; | ||
2566 | spin_unlock_irq(&device_state_lock); | ||
2567 | } | ||
2568 | } | ||
2569 | |||
2570 | up (&udev->serialize); | ||
2571 | if (status) | ||
2572 | goto loop_disable; | ||
2573 | |||
2574 | status = hub_power_remaining(hub); | ||
2575 | if (status) | ||
2576 | dev_dbg(hub_dev, | ||
2577 | "%dmA power budget left\n", | ||
2578 | 2 * status); | ||
2579 | |||
2580 | return; | ||
2581 | |||
2582 | loop_disable: | ||
2583 | hub_port_disable(hub, port1, 1); | ||
2584 | loop: | ||
2585 | ep0_reinit(udev); | ||
2586 | release_address(udev); | ||
2587 | usb_put_dev(udev); | ||
2588 | if (status == -ENOTCONN) | ||
2589 | break; | ||
2590 | } | ||
2591 | |||
2592 | done: | ||
2593 | hub_port_disable(hub, port1, 1); | ||
2594 | } | ||
2595 | |||
2596 | static void hub_events(void) | ||
2597 | { | ||
2598 | struct list_head *tmp; | ||
2599 | struct usb_device *hdev; | ||
2600 | struct usb_interface *intf; | ||
2601 | struct usb_hub *hub; | ||
2602 | struct device *hub_dev; | ||
2603 | u16 hubstatus; | ||
2604 | u16 hubchange; | ||
2605 | u16 portstatus; | ||
2606 | u16 portchange; | ||
2607 | int i, ret; | ||
2608 | int connect_change; | ||
2609 | |||
2610 | /* | ||
2611 | * We restart the list every time to avoid a deadlock with | ||
2612 | * deleting hubs downstream from this one. This should be | ||
2613 | * safe since we delete the hub from the event list. | ||
2614 | * Not the most efficient, but avoids deadlocks. | ||
2615 | */ | ||
2616 | while (1) { | ||
2617 | |||
2618 | /* Grab the first entry at the beginning of the list */ | ||
2619 | spin_lock_irq(&hub_event_lock); | ||
2620 | if (list_empty(&hub_event_list)) { | ||
2621 | spin_unlock_irq(&hub_event_lock); | ||
2622 | break; | ||
2623 | } | ||
2624 | |||
2625 | tmp = hub_event_list.next; | ||
2626 | list_del_init(tmp); | ||
2627 | |||
2628 | hub = list_entry(tmp, struct usb_hub, event_list); | ||
2629 | hdev = hub->hdev; | ||
2630 | intf = to_usb_interface(hub->intfdev); | ||
2631 | hub_dev = &intf->dev; | ||
2632 | |||
2633 | dev_dbg(hub_dev, "state %d ports %d chg %04x evt %04x\n", | ||
2634 | hdev->state, hub->descriptor | ||
2635 | ? hub->descriptor->bNbrPorts | ||
2636 | : 0, | ||
2637 | /* NOTE: expects max 15 ports... */ | ||
2638 | (u16) hub->change_bits[0], | ||
2639 | (u16) hub->event_bits[0]); | ||
2640 | |||
2641 | usb_get_intf(intf); | ||
2642 | i = hub->resume_root_hub; | ||
2643 | spin_unlock_irq(&hub_event_lock); | ||
2644 | |||
2645 | /* Is this is a root hub wanting to be resumed? */ | ||
2646 | if (i) | ||
2647 | usb_resume_device(hdev); | ||
2648 | |||
2649 | /* Lock the device, then check to see if we were | ||
2650 | * disconnected while waiting for the lock to succeed. */ | ||
2651 | if (locktree(hdev) < 0) { | ||
2652 | usb_put_intf(intf); | ||
2653 | continue; | ||
2654 | } | ||
2655 | if (hub != usb_get_intfdata(intf)) | ||
2656 | goto loop; | ||
2657 | |||
2658 | /* If the hub has died, clean up after it */ | ||
2659 | if (hdev->state == USB_STATE_NOTATTACHED) { | ||
2660 | hub_pre_reset(hub); | ||
2661 | goto loop; | ||
2662 | } | ||
2663 | |||
2664 | /* If this is an inactive or suspended hub, do nothing */ | ||
2665 | if (hub->quiescing) | ||
2666 | goto loop; | ||
2667 | |||
2668 | if (hub->error) { | ||
2669 | dev_dbg (hub_dev, "resetting for error %d\n", | ||
2670 | hub->error); | ||
2671 | |||
2672 | ret = usb_reset_device(hdev); | ||
2673 | if (ret) { | ||
2674 | dev_dbg (hub_dev, | ||
2675 | "error resetting hub: %d\n", ret); | ||
2676 | goto loop; | ||
2677 | } | ||
2678 | |||
2679 | hub->nerrors = 0; | ||
2680 | hub->error = 0; | ||
2681 | } | ||
2682 | |||
2683 | /* deal with port status changes */ | ||
2684 | for (i = 1; i <= hub->descriptor->bNbrPorts; i++) { | ||
2685 | if (test_bit(i, hub->busy_bits)) | ||
2686 | continue; | ||
2687 | connect_change = test_bit(i, hub->change_bits); | ||
2688 | if (!test_and_clear_bit(i, hub->event_bits) && | ||
2689 | !connect_change && !hub->activating) | ||
2690 | continue; | ||
2691 | |||
2692 | ret = hub_port_status(hub, i, | ||
2693 | &portstatus, &portchange); | ||
2694 | if (ret < 0) | ||
2695 | continue; | ||
2696 | |||
2697 | if (hub->activating && !hdev->children[i-1] && | ||
2698 | (portstatus & | ||
2699 | USB_PORT_STAT_CONNECTION)) | ||
2700 | connect_change = 1; | ||
2701 | |||
2702 | if (portchange & USB_PORT_STAT_C_CONNECTION) { | ||
2703 | clear_port_feature(hdev, i, | ||
2704 | USB_PORT_FEAT_C_CONNECTION); | ||
2705 | connect_change = 1; | ||
2706 | } | ||
2707 | |||
2708 | if (portchange & USB_PORT_STAT_C_ENABLE) { | ||
2709 | if (!connect_change) | ||
2710 | dev_dbg (hub_dev, | ||
2711 | "port %d enable change, " | ||
2712 | "status %08x\n", | ||
2713 | i, portstatus); | ||
2714 | clear_port_feature(hdev, i, | ||
2715 | USB_PORT_FEAT_C_ENABLE); | ||
2716 | |||
2717 | /* | ||
2718 | * EM interference sometimes causes badly | ||
2719 | * shielded USB devices to be shutdown by | ||
2720 | * the hub, this hack enables them again. | ||
2721 | * Works at least with mouse driver. | ||
2722 | */ | ||
2723 | if (!(portstatus & USB_PORT_STAT_ENABLE) | ||
2724 | && !connect_change | ||
2725 | && hdev->children[i-1]) { | ||
2726 | dev_err (hub_dev, | ||
2727 | "port %i " | ||
2728 | "disabled by hub (EMI?), " | ||
2729 | "re-enabling...\n", | ||
2730 | i); | ||
2731 | connect_change = 1; | ||
2732 | } | ||
2733 | } | ||
2734 | |||
2735 | if (portchange & USB_PORT_STAT_C_SUSPEND) { | ||
2736 | clear_port_feature(hdev, i, | ||
2737 | USB_PORT_FEAT_C_SUSPEND); | ||
2738 | if (hdev->children[i-1]) { | ||
2739 | ret = remote_wakeup(hdev-> | ||
2740 | children[i-1]); | ||
2741 | if (ret < 0) | ||
2742 | connect_change = 1; | ||
2743 | } else { | ||
2744 | ret = -ENODEV; | ||
2745 | hub_port_disable(hub, i, 1); | ||
2746 | } | ||
2747 | dev_dbg (hub_dev, | ||
2748 | "resume on port %d, status %d\n", | ||
2749 | i, ret); | ||
2750 | } | ||
2751 | |||
2752 | if (portchange & USB_PORT_STAT_C_OVERCURRENT) { | ||
2753 | dev_err (hub_dev, | ||
2754 | "over-current change on port %d\n", | ||
2755 | i); | ||
2756 | clear_port_feature(hdev, i, | ||
2757 | USB_PORT_FEAT_C_OVER_CURRENT); | ||
2758 | hub_power_on(hub); | ||
2759 | } | ||
2760 | |||
2761 | if (portchange & USB_PORT_STAT_C_RESET) { | ||
2762 | dev_dbg (hub_dev, | ||
2763 | "reset change on port %d\n", | ||
2764 | i); | ||
2765 | clear_port_feature(hdev, i, | ||
2766 | USB_PORT_FEAT_C_RESET); | ||
2767 | } | ||
2768 | |||
2769 | if (connect_change) | ||
2770 | hub_port_connect_change(hub, i, | ||
2771 | portstatus, portchange); | ||
2772 | } /* end for i */ | ||
2773 | |||
2774 | /* deal with hub status changes */ | ||
2775 | if (test_and_clear_bit(0, hub->event_bits) == 0) | ||
2776 | ; /* do nothing */ | ||
2777 | else if (hub_hub_status(hub, &hubstatus, &hubchange) < 0) | ||
2778 | dev_err (hub_dev, "get_hub_status failed\n"); | ||
2779 | else { | ||
2780 | if (hubchange & HUB_CHANGE_LOCAL_POWER) { | ||
2781 | dev_dbg (hub_dev, "power change\n"); | ||
2782 | clear_hub_feature(hdev, C_HUB_LOCAL_POWER); | ||
2783 | } | ||
2784 | if (hubchange & HUB_CHANGE_OVERCURRENT) { | ||
2785 | dev_dbg (hub_dev, "overcurrent change\n"); | ||
2786 | msleep(500); /* Cool down */ | ||
2787 | clear_hub_feature(hdev, C_HUB_OVER_CURRENT); | ||
2788 | hub_power_on(hub); | ||
2789 | } | ||
2790 | } | ||
2791 | |||
2792 | hub->activating = 0; | ||
2793 | |||
2794 | loop: | ||
2795 | usb_unlock_device(hdev); | ||
2796 | usb_put_intf(intf); | ||
2797 | |||
2798 | } /* end while (1) */ | ||
2799 | } | ||
2800 | |||
2801 | static int hub_thread(void *__unused) | ||
2802 | { | ||
2803 | /* | ||
2804 | * This thread doesn't need any user-level access, | ||
2805 | * so get rid of all our resources | ||
2806 | */ | ||
2807 | |||
2808 | daemonize("khubd"); | ||
2809 | allow_signal(SIGKILL); | ||
2810 | |||
2811 | /* Send me a signal to get me die (for debugging) */ | ||
2812 | do { | ||
2813 | hub_events(); | ||
2814 | wait_event_interruptible(khubd_wait, !list_empty(&hub_event_list)); | ||
2815 | try_to_freeze(PF_FREEZE); | ||
2816 | } while (!signal_pending(current)); | ||
2817 | |||
2818 | pr_debug ("%s: khubd exiting\n", usbcore_name); | ||
2819 | complete_and_exit(&khubd_exited, 0); | ||
2820 | } | ||
2821 | |||
2822 | static struct usb_device_id hub_id_table [] = { | ||
2823 | { .match_flags = USB_DEVICE_ID_MATCH_DEV_CLASS, | ||
2824 | .bDeviceClass = USB_CLASS_HUB}, | ||
2825 | { .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS, | ||
2826 | .bInterfaceClass = USB_CLASS_HUB}, | ||
2827 | { } /* Terminating entry */ | ||
2828 | }; | ||
2829 | |||
2830 | MODULE_DEVICE_TABLE (usb, hub_id_table); | ||
2831 | |||
2832 | static struct usb_driver hub_driver = { | ||
2833 | .owner = THIS_MODULE, | ||
2834 | .name = "hub", | ||
2835 | .probe = hub_probe, | ||
2836 | .disconnect = hub_disconnect, | ||
2837 | .suspend = hub_suspend, | ||
2838 | .resume = hub_resume, | ||
2839 | .ioctl = hub_ioctl, | ||
2840 | .id_table = hub_id_table, | ||
2841 | }; | ||
2842 | |||
2843 | int usb_hub_init(void) | ||
2844 | { | ||
2845 | pid_t pid; | ||
2846 | |||
2847 | if (usb_register(&hub_driver) < 0) { | ||
2848 | printk(KERN_ERR "%s: can't register hub driver\n", | ||
2849 | usbcore_name); | ||
2850 | return -1; | ||
2851 | } | ||
2852 | |||
2853 | pid = kernel_thread(hub_thread, NULL, CLONE_KERNEL); | ||
2854 | if (pid >= 0) { | ||
2855 | khubd_pid = pid; | ||
2856 | |||
2857 | return 0; | ||
2858 | } | ||
2859 | |||
2860 | /* Fall through if kernel_thread failed */ | ||
2861 | usb_deregister(&hub_driver); | ||
2862 | printk(KERN_ERR "%s: can't start khubd\n", usbcore_name); | ||
2863 | |||
2864 | return -1; | ||
2865 | } | ||
2866 | |||
2867 | void usb_hub_cleanup(void) | ||
2868 | { | ||
2869 | int ret; | ||
2870 | |||
2871 | /* Kill the thread */ | ||
2872 | ret = kill_proc(khubd_pid, SIGKILL, 1); | ||
2873 | |||
2874 | wait_for_completion(&khubd_exited); | ||
2875 | |||
2876 | /* | ||
2877 | * Hub resources are freed for us by usb_deregister. It calls | ||
2878 | * usb_driver_purge on every device which in turn calls that | ||
2879 | * devices disconnect function if it is using this driver. | ||
2880 | * The hub_disconnect function takes care of releasing the | ||
2881 | * individual hub resources. -greg | ||
2882 | */ | ||
2883 | usb_deregister(&hub_driver); | ||
2884 | } /* usb_hub_cleanup() */ | ||
2885 | |||
2886 | |||
2887 | static int config_descriptors_changed(struct usb_device *udev) | ||
2888 | { | ||
2889 | unsigned index; | ||
2890 | unsigned len = 0; | ||
2891 | struct usb_config_descriptor *buf; | ||
2892 | |||
2893 | for (index = 0; index < udev->descriptor.bNumConfigurations; index++) { | ||
2894 | if (len < le16_to_cpu(udev->config[index].desc.wTotalLength)) | ||
2895 | len = le16_to_cpu(udev->config[index].desc.wTotalLength); | ||
2896 | } | ||
2897 | buf = kmalloc (len, SLAB_KERNEL); | ||
2898 | if (buf == NULL) { | ||
2899 | dev_err(&udev->dev, "no mem to re-read configs after reset\n"); | ||
2900 | /* assume the worst */ | ||
2901 | return 1; | ||
2902 | } | ||
2903 | for (index = 0; index < udev->descriptor.bNumConfigurations; index++) { | ||
2904 | int length; | ||
2905 | int old_length = le16_to_cpu(udev->config[index].desc.wTotalLength); | ||
2906 | |||
2907 | length = usb_get_descriptor(udev, USB_DT_CONFIG, index, buf, | ||
2908 | old_length); | ||
2909 | if (length < old_length) { | ||
2910 | dev_dbg(&udev->dev, "config index %d, error %d\n", | ||
2911 | index, length); | ||
2912 | break; | ||
2913 | } | ||
2914 | if (memcmp (buf, udev->rawdescriptors[index], old_length) | ||
2915 | != 0) { | ||
2916 | dev_dbg(&udev->dev, "config index %d changed (#%d)\n", | ||
2917 | index, buf->bConfigurationValue); | ||
2918 | break; | ||
2919 | } | ||
2920 | } | ||
2921 | kfree(buf); | ||
2922 | return index != udev->descriptor.bNumConfigurations; | ||
2923 | } | ||
2924 | |||
2925 | /** | ||
2926 | * usb_reset_device - perform a USB port reset to reinitialize a device | ||
2927 | * @udev: device to reset (not in SUSPENDED or NOTATTACHED state) | ||
2928 | * | ||
2929 | * WARNING - don't reset any device unless drivers for all of its | ||
2930 | * interfaces are expecting that reset! Maybe some driver->reset() | ||
2931 | * method should eventually help ensure sufficient cooperation. | ||
2932 | * | ||
2933 | * Do a port reset, reassign the device's address, and establish its | ||
2934 | * former operating configuration. If the reset fails, or the device's | ||
2935 | * descriptors change from their values before the reset, or the original | ||
2936 | * configuration and altsettings cannot be restored, a flag will be set | ||
2937 | * telling khubd to pretend the device has been disconnected and then | ||
2938 | * re-connected. All drivers will be unbound, and the device will be | ||
2939 | * re-enumerated and probed all over again. | ||
2940 | * | ||
2941 | * Returns 0 if the reset succeeded, -ENODEV if the device has been | ||
2942 | * flagged for logical disconnection, or some other negative error code | ||
2943 | * if the reset wasn't even attempted. | ||
2944 | * | ||
2945 | * The caller must own the device lock. For example, it's safe to use | ||
2946 | * this from a driver probe() routine after downloading new firmware. | ||
2947 | * For calls that might not occur during probe(), drivers should lock | ||
2948 | * the device using usb_lock_device_for_reset(). | ||
2949 | */ | ||
2950 | int usb_reset_device(struct usb_device *udev) | ||
2951 | { | ||
2952 | struct usb_device *parent_hdev = udev->parent; | ||
2953 | struct usb_hub *parent_hub; | ||
2954 | struct usb_device_descriptor descriptor = udev->descriptor; | ||
2955 | struct usb_hub *hub = NULL; | ||
2956 | int i, ret = 0, port1 = -1; | ||
2957 | |||
2958 | if (udev->state == USB_STATE_NOTATTACHED || | ||
2959 | udev->state == USB_STATE_SUSPENDED) { | ||
2960 | dev_dbg(&udev->dev, "device reset not allowed in state %d\n", | ||
2961 | udev->state); | ||
2962 | return -EINVAL; | ||
2963 | } | ||
2964 | |||
2965 | if (!parent_hdev) { | ||
2966 | /* this requires hcd-specific logic; see OHCI hc_restart() */ | ||
2967 | dev_dbg(&udev->dev, "%s for root hub!\n", __FUNCTION__); | ||
2968 | return -EISDIR; | ||
2969 | } | ||
2970 | |||
2971 | for (i = 0; i < parent_hdev->maxchild; i++) | ||
2972 | if (parent_hdev->children[i] == udev) { | ||
2973 | port1 = i + 1; | ||
2974 | break; | ||
2975 | } | ||
2976 | |||
2977 | if (port1 < 0) { | ||
2978 | /* If this ever happens, it's very bad */ | ||
2979 | dev_err(&udev->dev, "Can't locate device's port!\n"); | ||
2980 | return -ENOENT; | ||
2981 | } | ||
2982 | parent_hub = hdev_to_hub(parent_hdev); | ||
2983 | |||
2984 | /* If we're resetting an active hub, take some special actions */ | ||
2985 | if (udev->actconfig && | ||
2986 | udev->actconfig->interface[0]->dev.driver == | ||
2987 | &hub_driver.driver && | ||
2988 | (hub = hdev_to_hub(udev)) != NULL) { | ||
2989 | hub_pre_reset(hub); | ||
2990 | } | ||
2991 | |||
2992 | set_bit(port1, parent_hub->busy_bits); | ||
2993 | for (i = 0; i < SET_CONFIG_TRIES; ++i) { | ||
2994 | |||
2995 | /* ep0 maxpacket size may change; let the HCD know about it. | ||
2996 | * Other endpoints will be handled by re-enumeration. */ | ||
2997 | ep0_reinit(udev); | ||
2998 | ret = hub_port_init(parent_hub, udev, port1, i); | ||
2999 | if (ret >= 0) | ||
3000 | break; | ||
3001 | } | ||
3002 | clear_bit(port1, parent_hub->busy_bits); | ||
3003 | if (ret < 0) | ||
3004 | goto re_enumerate; | ||
3005 | |||
3006 | /* Device might have changed firmware (DFU or similar) */ | ||
3007 | if (memcmp(&udev->descriptor, &descriptor, sizeof descriptor) | ||
3008 | || config_descriptors_changed (udev)) { | ||
3009 | dev_info(&udev->dev, "device firmware changed\n"); | ||
3010 | udev->descriptor = descriptor; /* for disconnect() calls */ | ||
3011 | goto re_enumerate; | ||
3012 | } | ||
3013 | |||
3014 | if (!udev->actconfig) | ||
3015 | goto done; | ||
3016 | |||
3017 | ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | ||
3018 | USB_REQ_SET_CONFIGURATION, 0, | ||
3019 | udev->actconfig->desc.bConfigurationValue, 0, | ||
3020 | NULL, 0, USB_CTRL_SET_TIMEOUT); | ||
3021 | if (ret < 0) { | ||
3022 | dev_err(&udev->dev, | ||
3023 | "can't restore configuration #%d (error=%d)\n", | ||
3024 | udev->actconfig->desc.bConfigurationValue, ret); | ||
3025 | goto re_enumerate; | ||
3026 | } | ||
3027 | usb_set_device_state(udev, USB_STATE_CONFIGURED); | ||
3028 | |||
3029 | for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { | ||
3030 | struct usb_interface *intf = udev->actconfig->interface[i]; | ||
3031 | struct usb_interface_descriptor *desc; | ||
3032 | |||
3033 | /* set_interface resets host side toggle even | ||
3034 | * for altsetting zero. the interface may have no driver. | ||
3035 | */ | ||
3036 | desc = &intf->cur_altsetting->desc; | ||
3037 | ret = usb_set_interface(udev, desc->bInterfaceNumber, | ||
3038 | desc->bAlternateSetting); | ||
3039 | if (ret < 0) { | ||
3040 | dev_err(&udev->dev, "failed to restore interface %d " | ||
3041 | "altsetting %d (error=%d)\n", | ||
3042 | desc->bInterfaceNumber, | ||
3043 | desc->bAlternateSetting, | ||
3044 | ret); | ||
3045 | goto re_enumerate; | ||
3046 | } | ||
3047 | } | ||
3048 | |||
3049 | done: | ||
3050 | if (hub) | ||
3051 | hub_post_reset(hub); | ||
3052 | return 0; | ||
3053 | |||
3054 | re_enumerate: | ||
3055 | hub_port_logical_disconnect(parent_hub, port1); | ||
3056 | return -ENODEV; | ||
3057 | } | ||