This source file includes following definitions.
- dump_port_status_diff
- rh_port_connect
- rh_port_disconnect
- vhci_hub_status
- ss_hub_descriptor
- hub_descriptor
- vhci_hub_control
- vhci_tx_urb
- vhci_urb_enqueue
- vhci_urb_dequeue
- vhci_device_unlink_cleanup
- vhci_shutdown_connection
- vhci_device_reset
- vhci_device_unusable
- vhci_device_init
- hcd_name_to_id
- vhci_setup
- vhci_start
- vhci_stop
- vhci_get_frame_number
- vhci_bus_suspend
- vhci_bus_resume
- vhci_alloc_streams
- vhci_free_streams
- vhci_hcd_probe
- vhci_hcd_remove
- vhci_hcd_suspend
- vhci_hcd_resume
- del_platform_devices
- vhci_hcd_init
- vhci_hcd_exit
1
2
3
4
5
6
7 #include <linux/init.h>
8 #include <linux/file.h>
9 #include <linux/kernel.h>
10 #include <linux/kthread.h>
11 #include <linux/module.h>
12 #include <linux/platform_device.h>
13 #include <linux/slab.h>
14
15 #include "usbip_common.h"
16 #include "vhci.h"
17
18 #define DRIVER_AUTHOR "Takahiro Hirofuchi"
19 #define DRIVER_DESC "USB/IP 'Virtual' Host Controller (VHCI) Driver"
20
21
22
23
24
25
26
27
28
29
30
31
32
33 static int vhci_hub_status(struct usb_hcd *hcd, char *buff);
34 static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
35 u16 wIndex, char *buff, u16 wLength);
36 static int vhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
37 gfp_t mem_flags);
38 static int vhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status);
39 static int vhci_start(struct usb_hcd *vhci_hcd);
40 static void vhci_stop(struct usb_hcd *hcd);
41 static int vhci_get_frame_number(struct usb_hcd *hcd);
42
43 static const char driver_name[] = "vhci_hcd";
44 static const char driver_desc[] = "USB/IP Virtual Host Controller";
45
46 int vhci_num_controllers = VHCI_NR_HCS;
47 struct vhci *vhcis;
48
49 static const char * const bit_desc[] = {
50 "CONNECTION",
51 "ENABLE",
52 "SUSPEND",
53 "OVER_CURRENT",
54 "RESET",
55 "L1",
56 "R6",
57 "R7",
58 "POWER",
59 "LOWSPEED",
60 "HIGHSPEED",
61 "PORT_TEST",
62 "INDICATOR",
63 "R13",
64 "R14",
65 "R15",
66 "C_CONNECTION",
67 "C_ENABLE",
68 "C_SUSPEND",
69 "C_OVER_CURRENT",
70 "C_RESET",
71 "C_L1",
72 "R22",
73 "R23",
74 "R24",
75 "R25",
76 "R26",
77 "R27",
78 "R28",
79 "R29",
80 "R30",
81 "R31",
82 };
83
84 static const char * const bit_desc_ss[] = {
85 "CONNECTION",
86 "ENABLE",
87 "SUSPEND",
88 "OVER_CURRENT",
89 "RESET",
90 "L1",
91 "R6",
92 "R7",
93 "R8",
94 "POWER",
95 "HIGHSPEED",
96 "PORT_TEST",
97 "INDICATOR",
98 "R13",
99 "R14",
100 "R15",
101 "C_CONNECTION",
102 "C_ENABLE",
103 "C_SUSPEND",
104 "C_OVER_CURRENT",
105 "C_RESET",
106 "C_BH_RESET",
107 "C_LINK_STATE",
108 "C_CONFIG_ERROR",
109 "R24",
110 "R25",
111 "R26",
112 "R27",
113 "R28",
114 "R29",
115 "R30",
116 "R31",
117 };
118
119 static void dump_port_status_diff(u32 prev_status, u32 new_status, bool usb3)
120 {
121 int i = 0;
122 u32 bit = 1;
123 const char * const *desc = bit_desc;
124
125 if (usb3)
126 desc = bit_desc_ss;
127
128 pr_debug("status prev -> new: %08x -> %08x\n", prev_status, new_status);
129 while (bit) {
130 u32 prev = prev_status & bit;
131 u32 new = new_status & bit;
132 char change;
133
134 if (!prev && new)
135 change = '+';
136 else if (prev && !new)
137 change = '-';
138 else
139 change = ' ';
140
141 if (prev || new) {
142 pr_debug(" %c%s\n", change, desc[i]);
143
144 if (bit == 1)
145 pr_debug(" %c%s\n", change, "USB_PORT_STAT_SPEED_5GBPS");
146 }
147 bit <<= 1;
148 i++;
149 }
150 pr_debug("\n");
151 }
152
153 void rh_port_connect(struct vhci_device *vdev, enum usb_device_speed speed)
154 {
155 struct vhci_hcd *vhci_hcd = vdev_to_vhci_hcd(vdev);
156 struct vhci *vhci = vhci_hcd->vhci;
157 int rhport = vdev->rhport;
158 u32 status;
159 unsigned long flags;
160
161 usbip_dbg_vhci_rh("rh_port_connect %d\n", rhport);
162
163 spin_lock_irqsave(&vhci->lock, flags);
164
165 status = vhci_hcd->port_status[rhport];
166
167 status |= USB_PORT_STAT_CONNECTION | (1 << USB_PORT_FEAT_C_CONNECTION);
168
169 switch (speed) {
170 case USB_SPEED_HIGH:
171 status |= USB_PORT_STAT_HIGH_SPEED;
172 break;
173 case USB_SPEED_LOW:
174 status |= USB_PORT_STAT_LOW_SPEED;
175 break;
176 default:
177 break;
178 }
179
180 vhci_hcd->port_status[rhport] = status;
181
182 spin_unlock_irqrestore(&vhci->lock, flags);
183
184 usb_hcd_poll_rh_status(vhci_hcd_to_hcd(vhci_hcd));
185 }
186
187 static void rh_port_disconnect(struct vhci_device *vdev)
188 {
189 struct vhci_hcd *vhci_hcd = vdev_to_vhci_hcd(vdev);
190 struct vhci *vhci = vhci_hcd->vhci;
191 int rhport = vdev->rhport;
192 u32 status;
193 unsigned long flags;
194
195 usbip_dbg_vhci_rh("rh_port_disconnect %d\n", rhport);
196
197 spin_lock_irqsave(&vhci->lock, flags);
198
199 status = vhci_hcd->port_status[rhport];
200
201 status &= ~USB_PORT_STAT_CONNECTION;
202 status |= (1 << USB_PORT_FEAT_C_CONNECTION);
203
204 vhci_hcd->port_status[rhport] = status;
205
206 spin_unlock_irqrestore(&vhci->lock, flags);
207 usb_hcd_poll_rh_status(vhci_hcd_to_hcd(vhci_hcd));
208 }
209
210 #define PORT_C_MASK \
211 ((USB_PORT_STAT_C_CONNECTION \
212 | USB_PORT_STAT_C_ENABLE \
213 | USB_PORT_STAT_C_SUSPEND \
214 | USB_PORT_STAT_C_OVERCURRENT \
215 | USB_PORT_STAT_C_RESET) << 16)
216
217
218
219
220
221
222
223
224
225
226
227
228 static int vhci_hub_status(struct usb_hcd *hcd, char *buf)
229 {
230 struct vhci_hcd *vhci_hcd = hcd_to_vhci_hcd(hcd);
231 struct vhci *vhci = vhci_hcd->vhci;
232 int retval = DIV_ROUND_UP(VHCI_HC_PORTS + 1, 8);
233 int rhport;
234 int changed = 0;
235 unsigned long flags;
236
237 memset(buf, 0, retval);
238
239 spin_lock_irqsave(&vhci->lock, flags);
240 if (!HCD_HW_ACCESSIBLE(hcd)) {
241 usbip_dbg_vhci_rh("hw accessible flag not on?\n");
242 goto done;
243 }
244
245
246 for (rhport = 0; rhport < VHCI_HC_PORTS; rhport++) {
247 if ((vhci_hcd->port_status[rhport] & PORT_C_MASK)) {
248
249 usbip_dbg_vhci_rh("port %d status changed\n", rhport);
250
251 buf[(rhport + 1) / 8] |= 1 << (rhport + 1) % 8;
252 changed = 1;
253 }
254 }
255
256 if ((hcd->state == HC_STATE_SUSPENDED) && (changed == 1))
257 usb_hcd_resume_root_hub(hcd);
258
259 done:
260 spin_unlock_irqrestore(&vhci->lock, flags);
261 return changed ? retval : 0;
262 }
263
264
265 static struct {
266 struct usb_bos_descriptor bos;
267 struct usb_ss_cap_descriptor ss_cap;
268 } __packed usb3_bos_desc = {
269
270 .bos = {
271 .bLength = USB_DT_BOS_SIZE,
272 .bDescriptorType = USB_DT_BOS,
273 .wTotalLength = cpu_to_le16(sizeof(usb3_bos_desc)),
274 .bNumDeviceCaps = 1,
275 },
276 .ss_cap = {
277 .bLength = USB_DT_USB_SS_CAP_SIZE,
278 .bDescriptorType = USB_DT_DEVICE_CAPABILITY,
279 .bDevCapabilityType = USB_SS_CAP_TYPE,
280 .wSpeedSupported = cpu_to_le16(USB_5GBPS_OPERATION),
281 .bFunctionalitySupport = ilog2(USB_5GBPS_OPERATION),
282 },
283 };
284
285 static inline void
286 ss_hub_descriptor(struct usb_hub_descriptor *desc)
287 {
288 memset(desc, 0, sizeof *desc);
289 desc->bDescriptorType = USB_DT_SS_HUB;
290 desc->bDescLength = 12;
291 desc->wHubCharacteristics = cpu_to_le16(
292 HUB_CHAR_INDV_PORT_LPSM | HUB_CHAR_COMMON_OCPM);
293 desc->bNbrPorts = VHCI_HC_PORTS;
294 desc->u.ss.bHubHdrDecLat = 0x04;
295 desc->u.ss.DeviceRemovable = 0xffff;
296 }
297
298 static inline void hub_descriptor(struct usb_hub_descriptor *desc)
299 {
300 int width;
301
302 memset(desc, 0, sizeof(*desc));
303 desc->bDescriptorType = USB_DT_HUB;
304 desc->wHubCharacteristics = cpu_to_le16(
305 HUB_CHAR_INDV_PORT_LPSM | HUB_CHAR_COMMON_OCPM);
306
307 desc->bNbrPorts = VHCI_HC_PORTS;
308 BUILD_BUG_ON(VHCI_HC_PORTS > USB_MAXCHILDREN);
309 width = desc->bNbrPorts / 8 + 1;
310 desc->bDescLength = USB_DT_HUB_NONVAR_SIZE + 2 * width;
311 memset(&desc->u.hs.DeviceRemovable[0], 0, width);
312 memset(&desc->u.hs.DeviceRemovable[width], 0xff, width);
313 }
314
315 static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
316 u16 wIndex, char *buf, u16 wLength)
317 {
318 struct vhci_hcd *vhci_hcd;
319 struct vhci *vhci;
320 int retval = 0;
321 int rhport = -1;
322 unsigned long flags;
323 bool invalid_rhport = false;
324
325 u32 prev_port_status[VHCI_HC_PORTS];
326
327 if (!HCD_HW_ACCESSIBLE(hcd))
328 return -ETIMEDOUT;
329
330
331
332
333
334 wIndex = ((__u8)(wIndex & 0x00ff));
335 usbip_dbg_vhci_rh("typeReq %x wValue %x wIndex %x\n", typeReq, wValue,
336 wIndex);
337
338
339
340
341
342
343
344
345 if (wIndex < 1 || wIndex > VHCI_HC_PORTS) {
346 invalid_rhport = true;
347 if (wIndex > VHCI_HC_PORTS)
348 pr_err("invalid port number %d\n", wIndex);
349 } else
350 rhport = wIndex - 1;
351
352 vhci_hcd = hcd_to_vhci_hcd(hcd);
353 vhci = vhci_hcd->vhci;
354
355 spin_lock_irqsave(&vhci->lock, flags);
356
357
358 if (usbip_dbg_flag_vhci_rh) {
359 if (!invalid_rhport)
360 memcpy(prev_port_status, vhci_hcd->port_status,
361 sizeof(prev_port_status));
362 }
363
364 switch (typeReq) {
365 case ClearHubFeature:
366 usbip_dbg_vhci_rh(" ClearHubFeature\n");
367 break;
368 case ClearPortFeature:
369 if (invalid_rhport) {
370 pr_err("invalid port number %d\n", wIndex);
371 goto error;
372 }
373 switch (wValue) {
374 case USB_PORT_FEAT_SUSPEND:
375 if (hcd->speed == HCD_USB3) {
376 pr_err(" ClearPortFeature: USB_PORT_FEAT_SUSPEND req not "
377 "supported for USB 3.0 roothub\n");
378 goto error;
379 }
380 usbip_dbg_vhci_rh(
381 " ClearPortFeature: USB_PORT_FEAT_SUSPEND\n");
382 if (vhci_hcd->port_status[rhport] & USB_PORT_STAT_SUSPEND) {
383
384 vhci_hcd->resuming = 1;
385 vhci_hcd->re_timeout = jiffies + msecs_to_jiffies(20);
386 }
387 break;
388 case USB_PORT_FEAT_POWER:
389 usbip_dbg_vhci_rh(
390 " ClearPortFeature: USB_PORT_FEAT_POWER\n");
391 if (hcd->speed == HCD_USB3)
392 vhci_hcd->port_status[rhport] &= ~USB_SS_PORT_STAT_POWER;
393 else
394 vhci_hcd->port_status[rhport] &= ~USB_PORT_STAT_POWER;
395 break;
396 default:
397 usbip_dbg_vhci_rh(" ClearPortFeature: default %x\n",
398 wValue);
399 vhci_hcd->port_status[rhport] &= ~(1 << wValue);
400 break;
401 }
402 break;
403 case GetHubDescriptor:
404 usbip_dbg_vhci_rh(" GetHubDescriptor\n");
405 if (hcd->speed == HCD_USB3 &&
406 (wLength < USB_DT_SS_HUB_SIZE ||
407 wValue != (USB_DT_SS_HUB << 8))) {
408 pr_err("Wrong hub descriptor type for USB 3.0 roothub.\n");
409 goto error;
410 }
411 if (hcd->speed == HCD_USB3)
412 ss_hub_descriptor((struct usb_hub_descriptor *) buf);
413 else
414 hub_descriptor((struct usb_hub_descriptor *) buf);
415 break;
416 case DeviceRequest | USB_REQ_GET_DESCRIPTOR:
417 if (hcd->speed != HCD_USB3)
418 goto error;
419
420 if ((wValue >> 8) != USB_DT_BOS)
421 goto error;
422
423 memcpy(buf, &usb3_bos_desc, sizeof(usb3_bos_desc));
424 retval = sizeof(usb3_bos_desc);
425 break;
426 case GetHubStatus:
427 usbip_dbg_vhci_rh(" GetHubStatus\n");
428 *(__le32 *) buf = cpu_to_le32(0);
429 break;
430 case GetPortStatus:
431 usbip_dbg_vhci_rh(" GetPortStatus port %x\n", wIndex);
432 if (invalid_rhport) {
433 pr_err("invalid port number %d\n", wIndex);
434 retval = -EPIPE;
435 goto error;
436 }
437
438
439
440
441
442
443 if (vhci_hcd->resuming && time_after(jiffies, vhci_hcd->re_timeout)) {
444 vhci_hcd->port_status[rhport] |= (1 << USB_PORT_FEAT_C_SUSPEND);
445 vhci_hcd->port_status[rhport] &= ~(1 << USB_PORT_FEAT_SUSPEND);
446 vhci_hcd->resuming = 0;
447 vhci_hcd->re_timeout = 0;
448 }
449
450 if ((vhci_hcd->port_status[rhport] & (1 << USB_PORT_FEAT_RESET)) !=
451 0 && time_after(jiffies, vhci_hcd->re_timeout)) {
452 vhci_hcd->port_status[rhport] |= (1 << USB_PORT_FEAT_C_RESET);
453 vhci_hcd->port_status[rhport] &= ~(1 << USB_PORT_FEAT_RESET);
454 vhci_hcd->re_timeout = 0;
455
456 if (vhci_hcd->vdev[rhport].ud.status ==
457 VDEV_ST_NOTASSIGNED) {
458 usbip_dbg_vhci_rh(
459 " enable rhport %d (status %u)\n",
460 rhport,
461 vhci_hcd->vdev[rhport].ud.status);
462 vhci_hcd->port_status[rhport] |=
463 USB_PORT_STAT_ENABLE;
464 }
465
466 if (hcd->speed < HCD_USB3) {
467 switch (vhci_hcd->vdev[rhport].speed) {
468 case USB_SPEED_HIGH:
469 vhci_hcd->port_status[rhport] |=
470 USB_PORT_STAT_HIGH_SPEED;
471 break;
472 case USB_SPEED_LOW:
473 vhci_hcd->port_status[rhport] |=
474 USB_PORT_STAT_LOW_SPEED;
475 break;
476 default:
477 pr_err("vhci_device speed not set\n");
478 break;
479 }
480 }
481 }
482 ((__le16 *) buf)[0] = cpu_to_le16(vhci_hcd->port_status[rhport]);
483 ((__le16 *) buf)[1] =
484 cpu_to_le16(vhci_hcd->port_status[rhport] >> 16);
485
486 usbip_dbg_vhci_rh(" GetPortStatus bye %x %x\n", ((u16 *)buf)[0],
487 ((u16 *)buf)[1]);
488 break;
489 case SetHubFeature:
490 usbip_dbg_vhci_rh(" SetHubFeature\n");
491 retval = -EPIPE;
492 break;
493 case SetPortFeature:
494 switch (wValue) {
495 case USB_PORT_FEAT_LINK_STATE:
496 usbip_dbg_vhci_rh(
497 " SetPortFeature: USB_PORT_FEAT_LINK_STATE\n");
498 if (hcd->speed != HCD_USB3) {
499 pr_err("USB_PORT_FEAT_LINK_STATE req not "
500 "supported for USB 2.0 roothub\n");
501 goto error;
502 }
503
504
505
506
507 break;
508 case USB_PORT_FEAT_U1_TIMEOUT:
509 usbip_dbg_vhci_rh(
510 " SetPortFeature: USB_PORT_FEAT_U1_TIMEOUT\n");
511
512 case USB_PORT_FEAT_U2_TIMEOUT:
513 usbip_dbg_vhci_rh(
514 " SetPortFeature: USB_PORT_FEAT_U2_TIMEOUT\n");
515
516 if (hcd->speed != HCD_USB3) {
517 pr_err("USB_PORT_FEAT_U1/2_TIMEOUT req not "
518 "supported for USB 2.0 roothub\n");
519 goto error;
520 }
521 break;
522 case USB_PORT_FEAT_SUSPEND:
523 usbip_dbg_vhci_rh(
524 " SetPortFeature: USB_PORT_FEAT_SUSPEND\n");
525
526 if (hcd->speed == HCD_USB3) {
527 pr_err("USB_PORT_FEAT_SUSPEND req not "
528 "supported for USB 3.0 roothub\n");
529 goto error;
530 }
531
532 if (invalid_rhport) {
533 pr_err("invalid port number %d\n", wIndex);
534 goto error;
535 }
536
537 vhci_hcd->port_status[rhport] |= USB_PORT_STAT_SUSPEND;
538 break;
539 case USB_PORT_FEAT_POWER:
540 usbip_dbg_vhci_rh(
541 " SetPortFeature: USB_PORT_FEAT_POWER\n");
542 if (invalid_rhport) {
543 pr_err("invalid port number %d\n", wIndex);
544 goto error;
545 }
546 if (hcd->speed == HCD_USB3)
547 vhci_hcd->port_status[rhport] |= USB_SS_PORT_STAT_POWER;
548 else
549 vhci_hcd->port_status[rhport] |= USB_PORT_STAT_POWER;
550 break;
551 case USB_PORT_FEAT_BH_PORT_RESET:
552 usbip_dbg_vhci_rh(
553 " SetPortFeature: USB_PORT_FEAT_BH_PORT_RESET\n");
554 if (invalid_rhport) {
555 pr_err("invalid port number %d\n", wIndex);
556 goto error;
557 }
558
559 if (hcd->speed != HCD_USB3) {
560 pr_err("USB_PORT_FEAT_BH_PORT_RESET req not "
561 "supported for USB 2.0 roothub\n");
562 goto error;
563 }
564
565 case USB_PORT_FEAT_RESET:
566 usbip_dbg_vhci_rh(
567 " SetPortFeature: USB_PORT_FEAT_RESET\n");
568 if (invalid_rhport) {
569 pr_err("invalid port number %d\n", wIndex);
570 goto error;
571 }
572
573 if (hcd->speed == HCD_USB3) {
574 vhci_hcd->port_status[rhport] = 0;
575 vhci_hcd->port_status[rhport] =
576 (USB_SS_PORT_STAT_POWER |
577 USB_PORT_STAT_CONNECTION |
578 USB_PORT_STAT_RESET);
579 } else if (vhci_hcd->port_status[rhport] & USB_PORT_STAT_ENABLE) {
580 vhci_hcd->port_status[rhport] &= ~(USB_PORT_STAT_ENABLE
581 | USB_PORT_STAT_LOW_SPEED
582 | USB_PORT_STAT_HIGH_SPEED);
583 }
584
585
586 vhci_hcd->re_timeout = jiffies + msecs_to_jiffies(50);
587
588
589 default:
590 usbip_dbg_vhci_rh(" SetPortFeature: default %d\n",
591 wValue);
592 if (invalid_rhport) {
593 pr_err("invalid port number %d\n", wIndex);
594 goto error;
595 }
596 if (hcd->speed == HCD_USB3) {
597 if ((vhci_hcd->port_status[rhport] &
598 USB_SS_PORT_STAT_POWER) != 0) {
599 vhci_hcd->port_status[rhport] |= (1 << wValue);
600 }
601 } else
602 if ((vhci_hcd->port_status[rhport] &
603 USB_PORT_STAT_POWER) != 0) {
604 vhci_hcd->port_status[rhport] |= (1 << wValue);
605 }
606 }
607 break;
608 case GetPortErrorCount:
609 usbip_dbg_vhci_rh(" GetPortErrorCount\n");
610 if (hcd->speed != HCD_USB3) {
611 pr_err("GetPortErrorCount req not "
612 "supported for USB 2.0 roothub\n");
613 goto error;
614 }
615
616 *(__le32 *) buf = cpu_to_le32(0);
617 break;
618 case SetHubDepth:
619 usbip_dbg_vhci_rh(" SetHubDepth\n");
620 if (hcd->speed != HCD_USB3) {
621 pr_err("SetHubDepth req not supported for "
622 "USB 2.0 roothub\n");
623 goto error;
624 }
625 break;
626 default:
627 pr_err("default hub control req: %04x v%04x i%04x l%d\n",
628 typeReq, wValue, wIndex, wLength);
629 error:
630
631 retval = -EPIPE;
632 }
633
634 if (usbip_dbg_flag_vhci_rh) {
635 pr_debug("port %d\n", rhport);
636
637 if (!invalid_rhport) {
638 dump_port_status_diff(prev_port_status[rhport],
639 vhci_hcd->port_status[rhport],
640 hcd->speed == HCD_USB3);
641 }
642 }
643 usbip_dbg_vhci_rh(" bye\n");
644
645 spin_unlock_irqrestore(&vhci->lock, flags);
646
647 if (!invalid_rhport &&
648 (vhci_hcd->port_status[rhport] & PORT_C_MASK) != 0) {
649 usb_hcd_poll_rh_status(hcd);
650 }
651
652 return retval;
653 }
654
655 static void vhci_tx_urb(struct urb *urb, struct vhci_device *vdev)
656 {
657 struct vhci_priv *priv;
658 struct vhci_hcd *vhci_hcd = vdev_to_vhci_hcd(vdev);
659 unsigned long flags;
660
661 priv = kzalloc(sizeof(struct vhci_priv), GFP_ATOMIC);
662 if (!priv) {
663 usbip_event_add(&vdev->ud, VDEV_EVENT_ERROR_MALLOC);
664 return;
665 }
666
667 spin_lock_irqsave(&vdev->priv_lock, flags);
668
669 priv->seqnum = atomic_inc_return(&vhci_hcd->seqnum);
670 if (priv->seqnum == 0xffff)
671 dev_info(&urb->dev->dev, "seqnum max\n");
672
673 priv->vdev = vdev;
674 priv->urb = urb;
675
676 urb->hcpriv = (void *) priv;
677
678 list_add_tail(&priv->list, &vdev->priv_tx);
679
680 wake_up(&vdev->waitq_tx);
681 spin_unlock_irqrestore(&vdev->priv_lock, flags);
682 }
683
684 static int vhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags)
685 {
686 struct vhci_hcd *vhci_hcd = hcd_to_vhci_hcd(hcd);
687 struct vhci *vhci = vhci_hcd->vhci;
688 struct device *dev = &urb->dev->dev;
689 u8 portnum = urb->dev->portnum;
690 int ret = 0;
691 struct vhci_device *vdev;
692 unsigned long flags;
693
694 if (portnum > VHCI_HC_PORTS) {
695 pr_err("invalid port number %d\n", portnum);
696 return -ENODEV;
697 }
698 vdev = &vhci_hcd->vdev[portnum-1];
699
700 if (!urb->transfer_buffer && !urb->num_sgs &&
701 urb->transfer_buffer_length) {
702 dev_dbg(dev, "Null URB transfer buffer\n");
703 return -EINVAL;
704 }
705
706 spin_lock_irqsave(&vhci->lock, flags);
707
708 if (urb->status != -EINPROGRESS) {
709 dev_err(dev, "URB already unlinked!, status %d\n", urb->status);
710 spin_unlock_irqrestore(&vhci->lock, flags);
711 return urb->status;
712 }
713
714
715 spin_lock(&vdev->ud.lock);
716 if (vdev->ud.status == VDEV_ST_NULL ||
717 vdev->ud.status == VDEV_ST_ERROR) {
718 dev_err(dev, "enqueue for inactive port %d\n", vdev->rhport);
719 spin_unlock(&vdev->ud.lock);
720 spin_unlock_irqrestore(&vhci->lock, flags);
721 return -ENODEV;
722 }
723 spin_unlock(&vdev->ud.lock);
724
725 ret = usb_hcd_link_urb_to_ep(hcd, urb);
726 if (ret)
727 goto no_need_unlink;
728
729
730
731
732
733
734
735
736
737
738 if (usb_pipedevice(urb->pipe) == 0) {
739 __u8 type = usb_pipetype(urb->pipe);
740 struct usb_ctrlrequest *ctrlreq =
741 (struct usb_ctrlrequest *) urb->setup_packet;
742
743 if (type != PIPE_CONTROL || !ctrlreq) {
744 dev_err(dev, "invalid request to devnum 0\n");
745 ret = -EINVAL;
746 goto no_need_xmit;
747 }
748
749 switch (ctrlreq->bRequest) {
750 case USB_REQ_SET_ADDRESS:
751
752 dev_info(dev, "SetAddress Request (%d) to port %d\n",
753 ctrlreq->wValue, vdev->rhport);
754
755 usb_put_dev(vdev->udev);
756 vdev->udev = usb_get_dev(urb->dev);
757
758 spin_lock(&vdev->ud.lock);
759 vdev->ud.status = VDEV_ST_USED;
760 spin_unlock(&vdev->ud.lock);
761
762 if (urb->status == -EINPROGRESS) {
763
764
765 urb->status = 0;
766 }
767
768 goto no_need_xmit;
769
770 case USB_REQ_GET_DESCRIPTOR:
771 if (ctrlreq->wValue == cpu_to_le16(USB_DT_DEVICE << 8))
772 usbip_dbg_vhci_hc(
773 "Not yet?:Get_Descriptor to device 0 (get max pipe size)\n");
774
775 usb_put_dev(vdev->udev);
776 vdev->udev = usb_get_dev(urb->dev);
777 goto out;
778
779 default:
780
781 dev_err(dev,
782 "invalid request to devnum 0 bRequest %u, wValue %u\n",
783 ctrlreq->bRequest,
784 ctrlreq->wValue);
785 ret = -EINVAL;
786 goto no_need_xmit;
787 }
788
789 }
790
791 out:
792 vhci_tx_urb(urb, vdev);
793 spin_unlock_irqrestore(&vhci->lock, flags);
794
795 return 0;
796
797 no_need_xmit:
798 usb_hcd_unlink_urb_from_ep(hcd, urb);
799 no_need_unlink:
800 spin_unlock_irqrestore(&vhci->lock, flags);
801 if (!ret)
802 usb_hcd_giveback_urb(hcd, urb, urb->status);
803 return ret;
804 }
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852 static int vhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
853 {
854 struct vhci_hcd *vhci_hcd = hcd_to_vhci_hcd(hcd);
855 struct vhci *vhci = vhci_hcd->vhci;
856 struct vhci_priv *priv;
857 struct vhci_device *vdev;
858 unsigned long flags;
859
860 spin_lock_irqsave(&vhci->lock, flags);
861
862 priv = urb->hcpriv;
863 if (!priv) {
864
865
866 spin_unlock_irqrestore(&vhci->lock, flags);
867 return -EIDRM;
868 }
869
870 {
871 int ret = 0;
872
873 ret = usb_hcd_check_unlink_urb(hcd, urb, status);
874 if (ret) {
875 spin_unlock_irqrestore(&vhci->lock, flags);
876 return ret;
877 }
878 }
879
880
881 vdev = priv->vdev;
882
883 if (!vdev->ud.tcp_socket) {
884
885 spin_lock(&vdev->priv_lock);
886
887 list_del(&priv->list);
888 kfree(priv);
889 urb->hcpriv = NULL;
890
891 spin_unlock(&vdev->priv_lock);
892
893
894
895
896
897
898 usb_hcd_unlink_urb_from_ep(hcd, urb);
899
900 spin_unlock_irqrestore(&vhci->lock, flags);
901 usb_hcd_giveback_urb(hcd, urb, urb->status);
902 spin_lock_irqsave(&vhci->lock, flags);
903
904 } else {
905
906 struct vhci_unlink *unlink;
907
908 spin_lock(&vdev->priv_lock);
909
910
911 unlink = kzalloc(sizeof(struct vhci_unlink), GFP_ATOMIC);
912 if (!unlink) {
913 spin_unlock(&vdev->priv_lock);
914 spin_unlock_irqrestore(&vhci->lock, flags);
915 usbip_event_add(&vdev->ud, VDEV_EVENT_ERROR_MALLOC);
916 return -ENOMEM;
917 }
918
919 unlink->seqnum = atomic_inc_return(&vhci_hcd->seqnum);
920 if (unlink->seqnum == 0xffff)
921 pr_info("seqnum max\n");
922
923 unlink->unlink_seqnum = priv->seqnum;
924
925
926
927 list_add_tail(&unlink->list, &vdev->unlink_tx);
928 wake_up(&vdev->waitq_tx);
929
930 spin_unlock(&vdev->priv_lock);
931 }
932
933 spin_unlock_irqrestore(&vhci->lock, flags);
934
935 usbip_dbg_vhci_hc("leave\n");
936 return 0;
937 }
938
939 static void vhci_device_unlink_cleanup(struct vhci_device *vdev)
940 {
941 struct vhci_hcd *vhci_hcd = vdev_to_vhci_hcd(vdev);
942 struct usb_hcd *hcd = vhci_hcd_to_hcd(vhci_hcd);
943 struct vhci *vhci = vhci_hcd->vhci;
944 struct vhci_unlink *unlink, *tmp;
945 unsigned long flags;
946
947 spin_lock_irqsave(&vhci->lock, flags);
948 spin_lock(&vdev->priv_lock);
949
950 list_for_each_entry_safe(unlink, tmp, &vdev->unlink_tx, list) {
951 pr_info("unlink cleanup tx %lu\n", unlink->unlink_seqnum);
952 list_del(&unlink->list);
953 kfree(unlink);
954 }
955
956 while (!list_empty(&vdev->unlink_rx)) {
957 struct urb *urb;
958
959 unlink = list_first_entry(&vdev->unlink_rx, struct vhci_unlink,
960 list);
961
962
963 pr_info("unlink cleanup rx %lu\n", unlink->unlink_seqnum);
964
965 urb = pickup_urb_and_free_priv(vdev, unlink->unlink_seqnum);
966 if (!urb) {
967 pr_info("the urb (seqnum %lu) was already given back\n",
968 unlink->unlink_seqnum);
969 list_del(&unlink->list);
970 kfree(unlink);
971 continue;
972 }
973
974 urb->status = -ENODEV;
975
976 usb_hcd_unlink_urb_from_ep(hcd, urb);
977
978 list_del(&unlink->list);
979
980 spin_unlock(&vdev->priv_lock);
981 spin_unlock_irqrestore(&vhci->lock, flags);
982
983 usb_hcd_giveback_urb(hcd, urb, urb->status);
984
985 spin_lock_irqsave(&vhci->lock, flags);
986 spin_lock(&vdev->priv_lock);
987
988 kfree(unlink);
989 }
990
991 spin_unlock(&vdev->priv_lock);
992 spin_unlock_irqrestore(&vhci->lock, flags);
993 }
994
995
996
997
998
999
1000 static void vhci_shutdown_connection(struct usbip_device *ud)
1001 {
1002 struct vhci_device *vdev = container_of(ud, struct vhci_device, ud);
1003
1004
1005 if (ud->tcp_socket) {
1006 pr_debug("shutdown tcp_socket %d\n", ud->sockfd);
1007 kernel_sock_shutdown(ud->tcp_socket, SHUT_RDWR);
1008 }
1009
1010
1011 if (vdev->ud.tcp_rx) {
1012 kthread_stop_put(vdev->ud.tcp_rx);
1013 vdev->ud.tcp_rx = NULL;
1014 }
1015 if (vdev->ud.tcp_tx) {
1016 kthread_stop_put(vdev->ud.tcp_tx);
1017 vdev->ud.tcp_tx = NULL;
1018 }
1019 pr_info("stop threads\n");
1020
1021
1022 if (vdev->ud.tcp_socket) {
1023 sockfd_put(vdev->ud.tcp_socket);
1024 vdev->ud.tcp_socket = NULL;
1025 vdev->ud.sockfd = -1;
1026 }
1027 pr_info("release socket\n");
1028
1029 vhci_device_unlink_cleanup(vdev);
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051 rh_port_disconnect(vdev);
1052
1053 pr_info("disconnect device\n");
1054 }
1055
1056 static void vhci_device_reset(struct usbip_device *ud)
1057 {
1058 struct vhci_device *vdev = container_of(ud, struct vhci_device, ud);
1059 unsigned long flags;
1060
1061 spin_lock_irqsave(&ud->lock, flags);
1062
1063 vdev->speed = 0;
1064 vdev->devid = 0;
1065
1066 usb_put_dev(vdev->udev);
1067 vdev->udev = NULL;
1068
1069 if (ud->tcp_socket) {
1070 sockfd_put(ud->tcp_socket);
1071 ud->tcp_socket = NULL;
1072 ud->sockfd = -1;
1073 }
1074 ud->status = VDEV_ST_NULL;
1075
1076 spin_unlock_irqrestore(&ud->lock, flags);
1077 }
1078
1079 static void vhci_device_unusable(struct usbip_device *ud)
1080 {
1081 unsigned long flags;
1082
1083 spin_lock_irqsave(&ud->lock, flags);
1084 ud->status = VDEV_ST_ERROR;
1085 spin_unlock_irqrestore(&ud->lock, flags);
1086 }
1087
1088 static void vhci_device_init(struct vhci_device *vdev)
1089 {
1090 memset(vdev, 0, sizeof(struct vhci_device));
1091
1092 vdev->ud.side = USBIP_VHCI;
1093 vdev->ud.status = VDEV_ST_NULL;
1094 spin_lock_init(&vdev->ud.lock);
1095
1096 INIT_LIST_HEAD(&vdev->priv_rx);
1097 INIT_LIST_HEAD(&vdev->priv_tx);
1098 INIT_LIST_HEAD(&vdev->unlink_tx);
1099 INIT_LIST_HEAD(&vdev->unlink_rx);
1100 spin_lock_init(&vdev->priv_lock);
1101
1102 init_waitqueue_head(&vdev->waitq_tx);
1103
1104 vdev->ud.eh_ops.shutdown = vhci_shutdown_connection;
1105 vdev->ud.eh_ops.reset = vhci_device_reset;
1106 vdev->ud.eh_ops.unusable = vhci_device_unusable;
1107
1108 usbip_start_eh(&vdev->ud);
1109 }
1110
1111 static int hcd_name_to_id(const char *name)
1112 {
1113 char *c;
1114 long val;
1115 int ret;
1116
1117 c = strchr(name, '.');
1118 if (c == NULL)
1119 return 0;
1120
1121 ret = kstrtol(c+1, 10, &val);
1122 if (ret < 0)
1123 return ret;
1124
1125 return val;
1126 }
1127
1128 static int vhci_setup(struct usb_hcd *hcd)
1129 {
1130 struct vhci *vhci = *((void **)dev_get_platdata(hcd->self.controller));
1131 if (usb_hcd_is_primary_hcd(hcd)) {
1132 vhci->vhci_hcd_hs = hcd_to_vhci_hcd(hcd);
1133 vhci->vhci_hcd_hs->vhci = vhci;
1134
1135
1136
1137
1138
1139 hcd->speed = HCD_USB2;
1140 hcd->self.root_hub->speed = USB_SPEED_HIGH;
1141 } else {
1142 vhci->vhci_hcd_ss = hcd_to_vhci_hcd(hcd);
1143 vhci->vhci_hcd_ss->vhci = vhci;
1144 hcd->speed = HCD_USB3;
1145 hcd->self.root_hub->speed = USB_SPEED_SUPER;
1146 }
1147
1148
1149
1150
1151
1152
1153 hcd->self.sg_tablesize = 32;
1154 hcd->self.no_sg_constraint = 1;
1155
1156 return 0;
1157 }
1158
1159 static int vhci_start(struct usb_hcd *hcd)
1160 {
1161 struct vhci_hcd *vhci_hcd = hcd_to_vhci_hcd(hcd);
1162 int id, rhport;
1163 int err;
1164
1165 usbip_dbg_vhci_hc("enter vhci_start\n");
1166
1167 if (usb_hcd_is_primary_hcd(hcd))
1168 spin_lock_init(&vhci_hcd->vhci->lock);
1169
1170
1171
1172 for (rhport = 0; rhport < VHCI_HC_PORTS; rhport++) {
1173 struct vhci_device *vdev = &vhci_hcd->vdev[rhport];
1174
1175 vhci_device_init(vdev);
1176 vdev->rhport = rhport;
1177 }
1178
1179 atomic_set(&vhci_hcd->seqnum, 0);
1180
1181 hcd->power_budget = 0;
1182 hcd->uses_new_polling = 1;
1183
1184 #ifdef CONFIG_USB_OTG
1185 hcd->self.otg_port = 1;
1186 #endif
1187
1188 id = hcd_name_to_id(hcd_name(hcd));
1189 if (id < 0) {
1190 pr_err("invalid vhci name %s\n", hcd_name(hcd));
1191 return -EINVAL;
1192 }
1193
1194
1195 if (id == 0 && usb_hcd_is_primary_hcd(hcd)) {
1196 err = vhci_init_attr_group();
1197 if (err) {
1198 dev_err(hcd_dev(hcd), "init attr group failed, err = %d\n", err);
1199 return err;
1200 }
1201 err = sysfs_create_group(&hcd_dev(hcd)->kobj, &vhci_attr_group);
1202 if (err) {
1203 dev_err(hcd_dev(hcd), "create sysfs files failed, err = %d\n", err);
1204 vhci_finish_attr_group();
1205 return err;
1206 }
1207 pr_info("created sysfs %s\n", hcd_name(hcd));
1208 }
1209
1210 return 0;
1211 }
1212
1213 static void vhci_stop(struct usb_hcd *hcd)
1214 {
1215 struct vhci_hcd *vhci_hcd = hcd_to_vhci_hcd(hcd);
1216 int id, rhport;
1217
1218 usbip_dbg_vhci_hc("stop VHCI controller\n");
1219
1220
1221 id = hcd_name_to_id(hcd_name(hcd));
1222 if (id == 0 && usb_hcd_is_primary_hcd(hcd)) {
1223 sysfs_remove_group(&hcd_dev(hcd)->kobj, &vhci_attr_group);
1224 vhci_finish_attr_group();
1225 }
1226
1227
1228 for (rhport = 0; rhport < VHCI_HC_PORTS; rhport++) {
1229 struct vhci_device *vdev = &vhci_hcd->vdev[rhport];
1230
1231 usbip_event_add(&vdev->ud, VDEV_EVENT_REMOVED);
1232 usbip_stop_eh(&vdev->ud);
1233 }
1234 }
1235
1236 static int vhci_get_frame_number(struct usb_hcd *hcd)
1237 {
1238 dev_err_ratelimited(&hcd->self.root_hub->dev, "Not yet implemented\n");
1239 return 0;
1240 }
1241
1242 #ifdef CONFIG_PM
1243
1244
1245 static int vhci_bus_suspend(struct usb_hcd *hcd)
1246 {
1247 struct vhci *vhci = *((void **)dev_get_platdata(hcd->self.controller));
1248 unsigned long flags;
1249
1250 dev_dbg(&hcd->self.root_hub->dev, "%s\n", __func__);
1251
1252 spin_lock_irqsave(&vhci->lock, flags);
1253 hcd->state = HC_STATE_SUSPENDED;
1254 spin_unlock_irqrestore(&vhci->lock, flags);
1255
1256 return 0;
1257 }
1258
1259 static int vhci_bus_resume(struct usb_hcd *hcd)
1260 {
1261 struct vhci *vhci = *((void **)dev_get_platdata(hcd->self.controller));
1262 int rc = 0;
1263 unsigned long flags;
1264
1265 dev_dbg(&hcd->self.root_hub->dev, "%s\n", __func__);
1266
1267 spin_lock_irqsave(&vhci->lock, flags);
1268 if (!HCD_HW_ACCESSIBLE(hcd))
1269 rc = -ESHUTDOWN;
1270 else
1271 hcd->state = HC_STATE_RUNNING;
1272 spin_unlock_irqrestore(&vhci->lock, flags);
1273
1274 return rc;
1275 }
1276
1277 #else
1278
1279 #define vhci_bus_suspend NULL
1280 #define vhci_bus_resume NULL
1281 #endif
1282
1283
1284 static int vhci_alloc_streams(struct usb_hcd *hcd, struct usb_device *udev,
1285 struct usb_host_endpoint **eps, unsigned int num_eps,
1286 unsigned int num_streams, gfp_t mem_flags)
1287 {
1288 dev_dbg(&hcd->self.root_hub->dev, "vhci_alloc_streams not implemented\n");
1289 return 0;
1290 }
1291
1292
1293 static int vhci_free_streams(struct usb_hcd *hcd, struct usb_device *udev,
1294 struct usb_host_endpoint **eps, unsigned int num_eps,
1295 gfp_t mem_flags)
1296 {
1297 dev_dbg(&hcd->self.root_hub->dev, "vhci_free_streams not implemented\n");
1298 return 0;
1299 }
1300
1301 static const struct hc_driver vhci_hc_driver = {
1302 .description = driver_name,
1303 .product_desc = driver_desc,
1304 .hcd_priv_size = sizeof(struct vhci_hcd),
1305
1306 .flags = HCD_USB3 | HCD_SHARED,
1307
1308 .reset = vhci_setup,
1309 .start = vhci_start,
1310 .stop = vhci_stop,
1311
1312 .urb_enqueue = vhci_urb_enqueue,
1313 .urb_dequeue = vhci_urb_dequeue,
1314
1315 .get_frame_number = vhci_get_frame_number,
1316
1317 .hub_status_data = vhci_hub_status,
1318 .hub_control = vhci_hub_control,
1319 .bus_suspend = vhci_bus_suspend,
1320 .bus_resume = vhci_bus_resume,
1321
1322 .alloc_streams = vhci_alloc_streams,
1323 .free_streams = vhci_free_streams,
1324 };
1325
1326 static int vhci_hcd_probe(struct platform_device *pdev)
1327 {
1328 struct vhci *vhci = *((void **)dev_get_platdata(&pdev->dev));
1329 struct usb_hcd *hcd_hs;
1330 struct usb_hcd *hcd_ss;
1331 int ret;
1332
1333 usbip_dbg_vhci_hc("name %s id %d\n", pdev->name, pdev->id);
1334
1335
1336
1337
1338
1339 hcd_hs = usb_create_hcd(&vhci_hc_driver, &pdev->dev, dev_name(&pdev->dev));
1340 if (!hcd_hs) {
1341 pr_err("create primary hcd failed\n");
1342 return -ENOMEM;
1343 }
1344 hcd_hs->has_tt = 1;
1345
1346
1347
1348
1349
1350 ret = usb_add_hcd(hcd_hs, 0, 0);
1351 if (ret != 0) {
1352 pr_err("usb_add_hcd hs failed %d\n", ret);
1353 goto put_usb2_hcd;
1354 }
1355
1356 hcd_ss = usb_create_shared_hcd(&vhci_hc_driver, &pdev->dev,
1357 dev_name(&pdev->dev), hcd_hs);
1358 if (!hcd_ss) {
1359 ret = -ENOMEM;
1360 pr_err("create shared hcd failed\n");
1361 goto remove_usb2_hcd;
1362 }
1363
1364 ret = usb_add_hcd(hcd_ss, 0, 0);
1365 if (ret) {
1366 pr_err("usb_add_hcd ss failed %d\n", ret);
1367 goto put_usb3_hcd;
1368 }
1369
1370 usbip_dbg_vhci_hc("bye\n");
1371 return 0;
1372
1373 put_usb3_hcd:
1374 usb_put_hcd(hcd_ss);
1375 remove_usb2_hcd:
1376 usb_remove_hcd(hcd_hs);
1377 put_usb2_hcd:
1378 usb_put_hcd(hcd_hs);
1379 vhci->vhci_hcd_hs = NULL;
1380 vhci->vhci_hcd_ss = NULL;
1381 return ret;
1382 }
1383
1384 static int vhci_hcd_remove(struct platform_device *pdev)
1385 {
1386 struct vhci *vhci = *((void **)dev_get_platdata(&pdev->dev));
1387
1388
1389
1390
1391
1392
1393 usb_remove_hcd(vhci_hcd_to_hcd(vhci->vhci_hcd_ss));
1394 usb_put_hcd(vhci_hcd_to_hcd(vhci->vhci_hcd_ss));
1395
1396 usb_remove_hcd(vhci_hcd_to_hcd(vhci->vhci_hcd_hs));
1397 usb_put_hcd(vhci_hcd_to_hcd(vhci->vhci_hcd_hs));
1398
1399 vhci->vhci_hcd_hs = NULL;
1400 vhci->vhci_hcd_ss = NULL;
1401
1402 return 0;
1403 }
1404
1405 #ifdef CONFIG_PM
1406
1407
1408 static int vhci_hcd_suspend(struct platform_device *pdev, pm_message_t state)
1409 {
1410 struct usb_hcd *hcd;
1411 struct vhci *vhci;
1412 int rhport;
1413 int connected = 0;
1414 int ret = 0;
1415 unsigned long flags;
1416
1417 dev_dbg(&pdev->dev, "%s\n", __func__);
1418
1419 hcd = platform_get_drvdata(pdev);
1420 if (!hcd)
1421 return 0;
1422
1423 vhci = *((void **)dev_get_platdata(hcd->self.controller));
1424
1425 spin_lock_irqsave(&vhci->lock, flags);
1426
1427 for (rhport = 0; rhport < VHCI_HC_PORTS; rhport++) {
1428 if (vhci->vhci_hcd_hs->port_status[rhport] &
1429 USB_PORT_STAT_CONNECTION)
1430 connected += 1;
1431
1432 if (vhci->vhci_hcd_ss->port_status[rhport] &
1433 USB_PORT_STAT_CONNECTION)
1434 connected += 1;
1435 }
1436
1437 spin_unlock_irqrestore(&vhci->lock, flags);
1438
1439 if (connected > 0) {
1440 dev_info(&pdev->dev,
1441 "We have %d active connection%s. Do not suspend.\n",
1442 connected, (connected == 1 ? "" : "s"));
1443 ret = -EBUSY;
1444 } else {
1445 dev_info(&pdev->dev, "suspend vhci_hcd");
1446 clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
1447 }
1448
1449 return ret;
1450 }
1451
1452 static int vhci_hcd_resume(struct platform_device *pdev)
1453 {
1454 struct usb_hcd *hcd;
1455
1456 dev_dbg(&pdev->dev, "%s\n", __func__);
1457
1458 hcd = platform_get_drvdata(pdev);
1459 if (!hcd)
1460 return 0;
1461 set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
1462 usb_hcd_poll_rh_status(hcd);
1463
1464 return 0;
1465 }
1466
1467 #else
1468
1469 #define vhci_hcd_suspend NULL
1470 #define vhci_hcd_resume NULL
1471
1472 #endif
1473
1474 static struct platform_driver vhci_driver = {
1475 .probe = vhci_hcd_probe,
1476 .remove = vhci_hcd_remove,
1477 .suspend = vhci_hcd_suspend,
1478 .resume = vhci_hcd_resume,
1479 .driver = {
1480 .name = driver_name,
1481 },
1482 };
1483
1484 static void del_platform_devices(void)
1485 {
1486 struct platform_device *pdev;
1487 int i;
1488
1489 for (i = 0; i < vhci_num_controllers; i++) {
1490 pdev = vhcis[i].pdev;
1491 if (pdev != NULL)
1492 platform_device_unregister(pdev);
1493 vhcis[i].pdev = NULL;
1494 }
1495 sysfs_remove_link(&platform_bus.kobj, driver_name);
1496 }
1497
1498 static int __init vhci_hcd_init(void)
1499 {
1500 int i, ret;
1501
1502 if (usb_disabled())
1503 return -ENODEV;
1504
1505 if (vhci_num_controllers < 1)
1506 vhci_num_controllers = 1;
1507
1508 vhcis = kcalloc(vhci_num_controllers, sizeof(struct vhci), GFP_KERNEL);
1509 if (vhcis == NULL)
1510 return -ENOMEM;
1511
1512 for (i = 0; i < vhci_num_controllers; i++) {
1513 vhcis[i].pdev = platform_device_alloc(driver_name, i);
1514 if (!vhcis[i].pdev) {
1515 i--;
1516 while (i >= 0)
1517 platform_device_put(vhcis[i--].pdev);
1518 ret = -ENOMEM;
1519 goto err_device_alloc;
1520 }
1521 }
1522 for (i = 0; i < vhci_num_controllers; i++) {
1523 void *vhci = &vhcis[i];
1524 ret = platform_device_add_data(vhcis[i].pdev, &vhci, sizeof(void *));
1525 if (ret)
1526 goto err_driver_register;
1527 }
1528
1529 ret = platform_driver_register(&vhci_driver);
1530 if (ret)
1531 goto err_driver_register;
1532
1533 for (i = 0; i < vhci_num_controllers; i++) {
1534 ret = platform_device_add(vhcis[i].pdev);
1535 if (ret < 0) {
1536 i--;
1537 while (i >= 0)
1538 platform_device_del(vhcis[i--].pdev);
1539 goto err_add_hcd;
1540 }
1541 }
1542
1543 return ret;
1544
1545 err_add_hcd:
1546 platform_driver_unregister(&vhci_driver);
1547 err_driver_register:
1548 for (i = 0; i < vhci_num_controllers; i++)
1549 platform_device_put(vhcis[i].pdev);
1550 err_device_alloc:
1551 kfree(vhcis);
1552 return ret;
1553 }
1554
1555 static void __exit vhci_hcd_exit(void)
1556 {
1557 del_platform_devices();
1558 platform_driver_unregister(&vhci_driver);
1559 kfree(vhcis);
1560 }
1561
1562 module_init(vhci_hcd_init);
1563 module_exit(vhci_hcd_exit);
1564
1565 MODULE_AUTHOR(DRIVER_AUTHOR);
1566 MODULE_DESCRIPTION(DRIVER_DESC);
1567 MODULE_LICENSE("GPL");