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
33static int vhci_hub_status(struct usb_hcd *hcd, char *buff);
34static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
35 u16 wIndex, char *buff, u16 wLength);
36static int vhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
37 gfp_t mem_flags);
38static int vhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status);
39static int vhci_start(struct usb_hcd *vhci_hcd);
40static void vhci_stop(struct usb_hcd *hcd);
41static int vhci_get_frame_number(struct usb_hcd *hcd);
42
43static const char driver_name[] = "vhci_hcd";
44static const char driver_desc[] = "USB/IP Virtual Host Controller";
45
46int vhci_num_controllers = VHCI_NR_HCS;
47struct vhci *vhcis;
48
49static 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
84static 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
119static 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
153void 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
187static 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
228static 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
259done:
260 spin_unlock_irqrestore(&vhci->lock, flags);
261 return changed ? retval : 0;
262}
263
264
265static 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
285static inline void
286ss_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
298static 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
315static 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;
322 unsigned long flags;
323
324 u32 prev_port_status[VHCI_HC_PORTS];
325
326 if (!HCD_HW_ACCESSIBLE(hcd))
327 return -ETIMEDOUT;
328
329
330
331
332
333 wIndex = ((__u8)(wIndex & 0x00ff));
334 usbip_dbg_vhci_rh("typeReq %x wValue %x wIndex %x\n", typeReq, wValue,
335 wIndex);
336
337 if (wIndex > VHCI_HC_PORTS)
338 pr_err("invalid port number %d\n", wIndex);
339 rhport = wIndex - 1;
340
341 vhci_hcd = hcd_to_vhci_hcd(hcd);
342 vhci = vhci_hcd->vhci;
343
344 spin_lock_irqsave(&vhci->lock, flags);
345
346
347 if (usbip_dbg_flag_vhci_rh) {
348 memcpy(prev_port_status, vhci_hcd->port_status,
349 sizeof(prev_port_status));
350 }
351
352 switch (typeReq) {
353 case ClearHubFeature:
354 usbip_dbg_vhci_rh(" ClearHubFeature\n");
355 break;
356 case ClearPortFeature:
357 switch (wValue) {
358 case USB_PORT_FEAT_SUSPEND:
359 if (hcd->speed == HCD_USB3) {
360 pr_err(" ClearPortFeature: USB_PORT_FEAT_SUSPEND req not "
361 "supported for USB 3.0 roothub\n");
362 goto error;
363 }
364 usbip_dbg_vhci_rh(
365 " ClearPortFeature: USB_PORT_FEAT_SUSPEND\n");
366 if (vhci_hcd->port_status[rhport] & USB_PORT_STAT_SUSPEND) {
367
368 vhci_hcd->resuming = 1;
369 vhci_hcd->re_timeout = jiffies + msecs_to_jiffies(20);
370 }
371 break;
372 case USB_PORT_FEAT_POWER:
373 usbip_dbg_vhci_rh(
374 " ClearPortFeature: USB_PORT_FEAT_POWER\n");
375 if (hcd->speed == HCD_USB3)
376 vhci_hcd->port_status[rhport] &= ~USB_SS_PORT_STAT_POWER;
377 else
378 vhci_hcd->port_status[rhport] &= ~USB_PORT_STAT_POWER;
379 break;
380 default:
381 usbip_dbg_vhci_rh(" ClearPortFeature: default %x\n",
382 wValue);
383 vhci_hcd->port_status[rhport] &= ~(1 << wValue);
384 break;
385 }
386 break;
387 case GetHubDescriptor:
388 usbip_dbg_vhci_rh(" GetHubDescriptor\n");
389 if (hcd->speed == HCD_USB3 &&
390 (wLength < USB_DT_SS_HUB_SIZE ||
391 wValue != (USB_DT_SS_HUB << 8))) {
392 pr_err("Wrong hub descriptor type for USB 3.0 roothub.\n");
393 goto error;
394 }
395 if (hcd->speed == HCD_USB3)
396 ss_hub_descriptor((struct usb_hub_descriptor *) buf);
397 else
398 hub_descriptor((struct usb_hub_descriptor *) buf);
399 break;
400 case DeviceRequest | USB_REQ_GET_DESCRIPTOR:
401 if (hcd->speed != HCD_USB3)
402 goto error;
403
404 if ((wValue >> 8) != USB_DT_BOS)
405 goto error;
406
407 memcpy(buf, &usb3_bos_desc, sizeof(usb3_bos_desc));
408 retval = sizeof(usb3_bos_desc);
409 break;
410 case GetHubStatus:
411 usbip_dbg_vhci_rh(" GetHubStatus\n");
412 *(__le32 *) buf = cpu_to_le32(0);
413 break;
414 case GetPortStatus:
415 usbip_dbg_vhci_rh(" GetPortStatus port %x\n", wIndex);
416 if (wIndex < 1) {
417 pr_err("invalid port number %d\n", wIndex);
418 retval = -EPIPE;
419 }
420
421
422
423
424
425
426 if (vhci_hcd->resuming && time_after(jiffies, vhci_hcd->re_timeout)) {
427 vhci_hcd->port_status[rhport] |= (1 << USB_PORT_FEAT_C_SUSPEND);
428 vhci_hcd->port_status[rhport] &= ~(1 << USB_PORT_FEAT_SUSPEND);
429 vhci_hcd->resuming = 0;
430 vhci_hcd->re_timeout = 0;
431 }
432
433 if ((vhci_hcd->port_status[rhport] & (1 << USB_PORT_FEAT_RESET)) !=
434 0 && time_after(jiffies, vhci_hcd->re_timeout)) {
435 vhci_hcd->port_status[rhport] |= (1 << USB_PORT_FEAT_C_RESET);
436 vhci_hcd->port_status[rhport] &= ~(1 << USB_PORT_FEAT_RESET);
437 vhci_hcd->re_timeout = 0;
438
439 if (vhci_hcd->vdev[rhport].ud.status ==
440 VDEV_ST_NOTASSIGNED) {
441 usbip_dbg_vhci_rh(
442 " enable rhport %d (status %u)\n",
443 rhport,
444 vhci_hcd->vdev[rhport].ud.status);
445 vhci_hcd->port_status[rhport] |=
446 USB_PORT_STAT_ENABLE;
447 }
448
449 if (hcd->speed < HCD_USB3) {
450 switch (vhci_hcd->vdev[rhport].speed) {
451 case USB_SPEED_HIGH:
452 vhci_hcd->port_status[rhport] |=
453 USB_PORT_STAT_HIGH_SPEED;
454 break;
455 case USB_SPEED_LOW:
456 vhci_hcd->port_status[rhport] |=
457 USB_PORT_STAT_LOW_SPEED;
458 break;
459 default:
460 pr_err("vhci_device speed not set\n");
461 break;
462 }
463 }
464 }
465 ((__le16 *) buf)[0] = cpu_to_le16(vhci_hcd->port_status[rhport]);
466 ((__le16 *) buf)[1] =
467 cpu_to_le16(vhci_hcd->port_status[rhport] >> 16);
468
469 usbip_dbg_vhci_rh(" GetPortStatus bye %x %x\n", ((u16 *)buf)[0],
470 ((u16 *)buf)[1]);
471 break;
472 case SetHubFeature:
473 usbip_dbg_vhci_rh(" SetHubFeature\n");
474 retval = -EPIPE;
475 break;
476 case SetPortFeature:
477 switch (wValue) {
478 case USB_PORT_FEAT_LINK_STATE:
479 usbip_dbg_vhci_rh(
480 " SetPortFeature: USB_PORT_FEAT_LINK_STATE\n");
481 if (hcd->speed != HCD_USB3) {
482 pr_err("USB_PORT_FEAT_LINK_STATE req not "
483 "supported for USB 2.0 roothub\n");
484 goto error;
485 }
486
487
488
489
490 break;
491 case USB_PORT_FEAT_U1_TIMEOUT:
492 usbip_dbg_vhci_rh(
493 " SetPortFeature: USB_PORT_FEAT_U1_TIMEOUT\n");
494 case USB_PORT_FEAT_U2_TIMEOUT:
495 usbip_dbg_vhci_rh(
496 " SetPortFeature: USB_PORT_FEAT_U2_TIMEOUT\n");
497
498 if (hcd->speed != HCD_USB3) {
499 pr_err("USB_PORT_FEAT_U1/2_TIMEOUT req not "
500 "supported for USB 2.0 roothub\n");
501 goto error;
502 }
503 break;
504 case USB_PORT_FEAT_SUSPEND:
505 usbip_dbg_vhci_rh(
506 " SetPortFeature: USB_PORT_FEAT_SUSPEND\n");
507
508 if (hcd->speed == HCD_USB3) {
509 pr_err("USB_PORT_FEAT_SUSPEND req not "
510 "supported for USB 3.0 roothub\n");
511 goto error;
512 }
513
514 vhci_hcd->port_status[rhport] |= USB_PORT_STAT_SUSPEND;
515 break;
516 case USB_PORT_FEAT_POWER:
517 usbip_dbg_vhci_rh(
518 " SetPortFeature: USB_PORT_FEAT_POWER\n");
519 if (hcd->speed == HCD_USB3)
520 vhci_hcd->port_status[rhport] |= USB_SS_PORT_STAT_POWER;
521 else
522 vhci_hcd->port_status[rhport] |= USB_PORT_STAT_POWER;
523 break;
524 case USB_PORT_FEAT_BH_PORT_RESET:
525 usbip_dbg_vhci_rh(
526 " SetPortFeature: USB_PORT_FEAT_BH_PORT_RESET\n");
527
528 if (hcd->speed != HCD_USB3) {
529 pr_err("USB_PORT_FEAT_BH_PORT_RESET req not "
530 "supported for USB 2.0 roothub\n");
531 goto error;
532 }
533
534 case USB_PORT_FEAT_RESET:
535 usbip_dbg_vhci_rh(
536 " SetPortFeature: USB_PORT_FEAT_RESET\n");
537
538 if (hcd->speed == HCD_USB3) {
539 vhci_hcd->port_status[rhport] = 0;
540 vhci_hcd->port_status[rhport] =
541 (USB_SS_PORT_STAT_POWER |
542 USB_PORT_STAT_CONNECTION |
543 USB_PORT_STAT_RESET);
544 } else if (vhci_hcd->port_status[rhport] & USB_PORT_STAT_ENABLE) {
545 vhci_hcd->port_status[rhport] &= ~(USB_PORT_STAT_ENABLE
546 | USB_PORT_STAT_LOW_SPEED
547 | USB_PORT_STAT_HIGH_SPEED);
548 }
549
550
551 vhci_hcd->re_timeout = jiffies + msecs_to_jiffies(50);
552
553
554 default:
555 usbip_dbg_vhci_rh(" SetPortFeature: default %d\n",
556 wValue);
557 if (hcd->speed == HCD_USB3) {
558 if ((vhci_hcd->port_status[rhport] &
559 USB_SS_PORT_STAT_POWER) != 0) {
560 vhci_hcd->port_status[rhport] |= (1 << wValue);
561 }
562 } else
563 if ((vhci_hcd->port_status[rhport] &
564 USB_PORT_STAT_POWER) != 0) {
565 vhci_hcd->port_status[rhport] |= (1 << wValue);
566 }
567 }
568 break;
569 case GetPortErrorCount:
570 usbip_dbg_vhci_rh(" GetPortErrorCount\n");
571 if (hcd->speed != HCD_USB3) {
572 pr_err("GetPortErrorCount req not "
573 "supported for USB 2.0 roothub\n");
574 goto error;
575 }
576
577 *(__le32 *) buf = cpu_to_le32(0);
578 break;
579 case SetHubDepth:
580 usbip_dbg_vhci_rh(" SetHubDepth\n");
581 if (hcd->speed != HCD_USB3) {
582 pr_err("SetHubDepth req not supported for "
583 "USB 2.0 roothub\n");
584 goto error;
585 }
586 break;
587 default:
588 pr_err("default hub control req: %04x v%04x i%04x l%d\n",
589 typeReq, wValue, wIndex, wLength);
590error:
591
592 retval = -EPIPE;
593 }
594
595 if (usbip_dbg_flag_vhci_rh) {
596 pr_debug("port %d\n", rhport);
597
598 if (rhport >= 0) {
599 dump_port_status_diff(prev_port_status[rhport],
600 vhci_hcd->port_status[rhport],
601 hcd->speed == HCD_USB3);
602 }
603 }
604 usbip_dbg_vhci_rh(" bye\n");
605
606 spin_unlock_irqrestore(&vhci->lock, flags);
607
608 if ((vhci_hcd->port_status[rhport] & PORT_C_MASK) != 0)
609 usb_hcd_poll_rh_status(hcd);
610
611 return retval;
612}
613
614static void vhci_tx_urb(struct urb *urb, struct vhci_device *vdev)
615{
616 struct vhci_priv *priv;
617 struct vhci_hcd *vhci_hcd;
618 unsigned long flags;
619
620 if (!vdev) {
621 pr_err("could not get virtual device");
622 return;
623 }
624 vhci_hcd = vdev_to_vhci_hcd(vdev);
625
626 priv = kzalloc(sizeof(struct vhci_priv), GFP_ATOMIC);
627 if (!priv) {
628 usbip_event_add(&vdev->ud, VDEV_EVENT_ERROR_MALLOC);
629 return;
630 }
631
632 spin_lock_irqsave(&vdev->priv_lock, flags);
633
634 priv->seqnum = atomic_inc_return(&vhci_hcd->seqnum);
635 if (priv->seqnum == 0xffff)
636 dev_info(&urb->dev->dev, "seqnum max\n");
637
638 priv->vdev = vdev;
639 priv->urb = urb;
640
641 urb->hcpriv = (void *) priv;
642
643 list_add_tail(&priv->list, &vdev->priv_tx);
644
645 wake_up(&vdev->waitq_tx);
646 spin_unlock_irqrestore(&vdev->priv_lock, flags);
647}
648
649static int vhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags)
650{
651 struct vhci_hcd *vhci_hcd = hcd_to_vhci_hcd(hcd);
652 struct vhci *vhci = vhci_hcd->vhci;
653 struct device *dev = &urb->dev->dev;
654 u8 portnum = urb->dev->portnum;
655 int ret = 0;
656 struct vhci_device *vdev;
657 unsigned long flags;
658
659 if (portnum > VHCI_HC_PORTS) {
660 pr_err("invalid port number %d\n", portnum);
661 return -ENODEV;
662 }
663 vdev = &vhci_hcd->vdev[portnum-1];
664
665
666 BUG_ON(!urb->transfer_buffer && urb->transfer_buffer_length);
667
668 spin_lock_irqsave(&vhci->lock, flags);
669
670 if (urb->status != -EINPROGRESS) {
671 dev_err(dev, "URB already unlinked!, status %d\n", urb->status);
672 spin_unlock_irqrestore(&vhci->lock, flags);
673 return urb->status;
674 }
675
676
677 spin_lock(&vdev->ud.lock);
678 if (vdev->ud.status == VDEV_ST_NULL ||
679 vdev->ud.status == VDEV_ST_ERROR) {
680 dev_err(dev, "enqueue for inactive port %d\n", vdev->rhport);
681 spin_unlock(&vdev->ud.lock);
682 spin_unlock_irqrestore(&vhci->lock, flags);
683 return -ENODEV;
684 }
685 spin_unlock(&vdev->ud.lock);
686
687 ret = usb_hcd_link_urb_to_ep(hcd, urb);
688 if (ret)
689 goto no_need_unlink;
690
691
692
693
694
695
696
697
698
699
700 if (usb_pipedevice(urb->pipe) == 0) {
701 __u8 type = usb_pipetype(urb->pipe);
702 struct usb_ctrlrequest *ctrlreq =
703 (struct usb_ctrlrequest *) urb->setup_packet;
704
705 if (type != PIPE_CONTROL || !ctrlreq) {
706 dev_err(dev, "invalid request to devnum 0\n");
707 ret = -EINVAL;
708 goto no_need_xmit;
709 }
710
711 switch (ctrlreq->bRequest) {
712 case USB_REQ_SET_ADDRESS:
713
714 dev_info(dev, "SetAddress Request (%d) to port %d\n",
715 ctrlreq->wValue, vdev->rhport);
716
717 usb_put_dev(vdev->udev);
718 vdev->udev = usb_get_dev(urb->dev);
719
720 spin_lock(&vdev->ud.lock);
721 vdev->ud.status = VDEV_ST_USED;
722 spin_unlock(&vdev->ud.lock);
723
724 if (urb->status == -EINPROGRESS) {
725
726
727 urb->status = 0;
728 }
729
730 goto no_need_xmit;
731
732 case USB_REQ_GET_DESCRIPTOR:
733 if (ctrlreq->wValue == cpu_to_le16(USB_DT_DEVICE << 8))
734 usbip_dbg_vhci_hc(
735 "Not yet?:Get_Descriptor to device 0 (get max pipe size)\n");
736
737 usb_put_dev(vdev->udev);
738 vdev->udev = usb_get_dev(urb->dev);
739 goto out;
740
741 default:
742
743 dev_err(dev,
744 "invalid request to devnum 0 bRequest %u, wValue %u\n",
745 ctrlreq->bRequest,
746 ctrlreq->wValue);
747 ret = -EINVAL;
748 goto no_need_xmit;
749 }
750
751 }
752
753out:
754 vhci_tx_urb(urb, vdev);
755 spin_unlock_irqrestore(&vhci->lock, flags);
756
757 return 0;
758
759no_need_xmit:
760 usb_hcd_unlink_urb_from_ep(hcd, urb);
761no_need_unlink:
762 spin_unlock_irqrestore(&vhci->lock, flags);
763 if (!ret)
764 usb_hcd_giveback_urb(hcd, urb, urb->status);
765 return ret;
766}
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814static int vhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
815{
816 struct vhci_hcd *vhci_hcd = hcd_to_vhci_hcd(hcd);
817 struct vhci *vhci = vhci_hcd->vhci;
818 struct vhci_priv *priv;
819 struct vhci_device *vdev;
820 unsigned long flags;
821
822 spin_lock_irqsave(&vhci->lock, flags);
823
824 priv = urb->hcpriv;
825 if (!priv) {
826
827
828 spin_unlock_irqrestore(&vhci->lock, flags);
829 return -EIDRM;
830 }
831
832 {
833 int ret = 0;
834
835 ret = usb_hcd_check_unlink_urb(hcd, urb, status);
836 if (ret) {
837 spin_unlock_irqrestore(&vhci->lock, flags);
838 return ret;
839 }
840 }
841
842
843 vdev = priv->vdev;
844
845 if (!vdev->ud.tcp_socket) {
846
847 spin_lock(&vdev->priv_lock);
848
849 list_del(&priv->list);
850 kfree(priv);
851 urb->hcpriv = NULL;
852
853 spin_unlock(&vdev->priv_lock);
854
855
856
857
858
859
860 usb_hcd_unlink_urb_from_ep(hcd, urb);
861
862 spin_unlock_irqrestore(&vhci->lock, flags);
863 usb_hcd_giveback_urb(hcd, urb, urb->status);
864 spin_lock_irqsave(&vhci->lock, flags);
865
866 } else {
867
868 struct vhci_unlink *unlink;
869
870 spin_lock(&vdev->priv_lock);
871
872
873 unlink = kzalloc(sizeof(struct vhci_unlink), GFP_ATOMIC);
874 if (!unlink) {
875 spin_unlock(&vdev->priv_lock);
876 spin_unlock_irqrestore(&vhci->lock, flags);
877 usbip_event_add(&vdev->ud, VDEV_EVENT_ERROR_MALLOC);
878 return -ENOMEM;
879 }
880
881 unlink->seqnum = atomic_inc_return(&vhci_hcd->seqnum);
882 if (unlink->seqnum == 0xffff)
883 pr_info("seqnum max\n");
884
885 unlink->unlink_seqnum = priv->seqnum;
886
887
888
889 list_add_tail(&unlink->list, &vdev->unlink_tx);
890 wake_up(&vdev->waitq_tx);
891
892 spin_unlock(&vdev->priv_lock);
893 }
894
895 spin_unlock_irqrestore(&vhci->lock, flags);
896
897 usbip_dbg_vhci_hc("leave\n");
898 return 0;
899}
900
901static void vhci_device_unlink_cleanup(struct vhci_device *vdev)
902{
903 struct vhci_hcd *vhci_hcd = vdev_to_vhci_hcd(vdev);
904 struct usb_hcd *hcd = vhci_hcd_to_hcd(vhci_hcd);
905 struct vhci *vhci = vhci_hcd->vhci;
906 struct vhci_unlink *unlink, *tmp;
907 unsigned long flags;
908
909 spin_lock_irqsave(&vhci->lock, flags);
910 spin_lock(&vdev->priv_lock);
911
912 list_for_each_entry_safe(unlink, tmp, &vdev->unlink_tx, list) {
913 pr_info("unlink cleanup tx %lu\n", unlink->unlink_seqnum);
914 list_del(&unlink->list);
915 kfree(unlink);
916 }
917
918 while (!list_empty(&vdev->unlink_rx)) {
919 struct urb *urb;
920
921 unlink = list_first_entry(&vdev->unlink_rx, struct vhci_unlink,
922 list);
923
924
925 pr_info("unlink cleanup rx %lu\n", unlink->unlink_seqnum);
926
927 urb = pickup_urb_and_free_priv(vdev, unlink->unlink_seqnum);
928 if (!urb) {
929 pr_info("the urb (seqnum %lu) was already given back\n",
930 unlink->unlink_seqnum);
931 list_del(&unlink->list);
932 kfree(unlink);
933 continue;
934 }
935
936 urb->status = -ENODEV;
937
938 usb_hcd_unlink_urb_from_ep(hcd, urb);
939
940 list_del(&unlink->list);
941
942 spin_unlock(&vdev->priv_lock);
943 spin_unlock_irqrestore(&vhci->lock, flags);
944
945 usb_hcd_giveback_urb(hcd, urb, urb->status);
946
947 spin_lock_irqsave(&vhci->lock, flags);
948 spin_lock(&vdev->priv_lock);
949
950 kfree(unlink);
951 }
952
953 spin_unlock(&vdev->priv_lock);
954 spin_unlock_irqrestore(&vhci->lock, flags);
955}
956
957
958
959
960
961
962static void vhci_shutdown_connection(struct usbip_device *ud)
963{
964 struct vhci_device *vdev = container_of(ud, struct vhci_device, ud);
965
966
967 if (ud->tcp_socket) {
968 pr_debug("shutdown tcp_socket %d\n", ud->sockfd);
969 kernel_sock_shutdown(ud->tcp_socket, SHUT_RDWR);
970 }
971
972
973 if (vdev->ud.tcp_rx) {
974 kthread_stop_put(vdev->ud.tcp_rx);
975 vdev->ud.tcp_rx = NULL;
976 }
977 if (vdev->ud.tcp_tx) {
978 kthread_stop_put(vdev->ud.tcp_tx);
979 vdev->ud.tcp_tx = NULL;
980 }
981 pr_info("stop threads\n");
982
983
984 if (vdev->ud.tcp_socket) {
985 sockfd_put(vdev->ud.tcp_socket);
986 vdev->ud.tcp_socket = NULL;
987 }
988 pr_info("release socket\n");
989
990 vhci_device_unlink_cleanup(vdev);
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012 rh_port_disconnect(vdev);
1013
1014 pr_info("disconnect device\n");
1015}
1016
1017static void vhci_device_reset(struct usbip_device *ud)
1018{
1019 struct vhci_device *vdev = container_of(ud, struct vhci_device, ud);
1020 unsigned long flags;
1021
1022 spin_lock_irqsave(&ud->lock, flags);
1023
1024 vdev->speed = 0;
1025 vdev->devid = 0;
1026
1027 usb_put_dev(vdev->udev);
1028 vdev->udev = NULL;
1029
1030 if (ud->tcp_socket) {
1031 sockfd_put(ud->tcp_socket);
1032 ud->tcp_socket = NULL;
1033 }
1034 ud->status = VDEV_ST_NULL;
1035
1036 spin_unlock_irqrestore(&ud->lock, flags);
1037}
1038
1039static void vhci_device_unusable(struct usbip_device *ud)
1040{
1041 unsigned long flags;
1042
1043 spin_lock_irqsave(&ud->lock, flags);
1044 ud->status = VDEV_ST_ERROR;
1045 spin_unlock_irqrestore(&ud->lock, flags);
1046}
1047
1048static void vhci_device_init(struct vhci_device *vdev)
1049{
1050 memset(vdev, 0, sizeof(struct vhci_device));
1051
1052 vdev->ud.side = USBIP_VHCI;
1053 vdev->ud.status = VDEV_ST_NULL;
1054 spin_lock_init(&vdev->ud.lock);
1055
1056 INIT_LIST_HEAD(&vdev->priv_rx);
1057 INIT_LIST_HEAD(&vdev->priv_tx);
1058 INIT_LIST_HEAD(&vdev->unlink_tx);
1059 INIT_LIST_HEAD(&vdev->unlink_rx);
1060 spin_lock_init(&vdev->priv_lock);
1061
1062 init_waitqueue_head(&vdev->waitq_tx);
1063
1064 vdev->ud.eh_ops.shutdown = vhci_shutdown_connection;
1065 vdev->ud.eh_ops.reset = vhci_device_reset;
1066 vdev->ud.eh_ops.unusable = vhci_device_unusable;
1067
1068 usbip_start_eh(&vdev->ud);
1069}
1070
1071static int hcd_name_to_id(const char *name)
1072{
1073 char *c;
1074 long val;
1075 int ret;
1076
1077 c = strchr(name, '.');
1078 if (c == NULL)
1079 return 0;
1080
1081 ret = kstrtol(c+1, 10, &val);
1082 if (ret < 0)
1083 return ret;
1084
1085 return val;
1086}
1087
1088static int vhci_setup(struct usb_hcd *hcd)
1089{
1090 struct vhci *vhci = *((void **)dev_get_platdata(hcd->self.controller));
1091 if (usb_hcd_is_primary_hcd(hcd)) {
1092 vhci->vhci_hcd_hs = hcd_to_vhci_hcd(hcd);
1093 vhci->vhci_hcd_hs->vhci = vhci;
1094
1095
1096
1097
1098
1099 hcd->speed = HCD_USB2;
1100 hcd->self.root_hub->speed = USB_SPEED_HIGH;
1101 } else {
1102 vhci->vhci_hcd_ss = hcd_to_vhci_hcd(hcd);
1103 vhci->vhci_hcd_ss->vhci = vhci;
1104 hcd->speed = HCD_USB3;
1105 hcd->self.root_hub->speed = USB_SPEED_SUPER;
1106 }
1107 return 0;
1108}
1109
1110static int vhci_start(struct usb_hcd *hcd)
1111{
1112 struct vhci_hcd *vhci_hcd = hcd_to_vhci_hcd(hcd);
1113 int id, rhport;
1114 int err;
1115
1116 usbip_dbg_vhci_hc("enter vhci_start\n");
1117
1118 if (usb_hcd_is_primary_hcd(hcd))
1119 spin_lock_init(&vhci_hcd->vhci->lock);
1120
1121
1122
1123 for (rhport = 0; rhport < VHCI_HC_PORTS; rhport++) {
1124 struct vhci_device *vdev = &vhci_hcd->vdev[rhport];
1125
1126 vhci_device_init(vdev);
1127 vdev->rhport = rhport;
1128 }
1129
1130 atomic_set(&vhci_hcd->seqnum, 0);
1131
1132 hcd->power_budget = 0;
1133 hcd->uses_new_polling = 1;
1134
1135#ifdef CONFIG_USB_OTG
1136 hcd->self.otg_port = 1;
1137#endif
1138
1139 id = hcd_name_to_id(hcd_name(hcd));
1140 if (id < 0) {
1141 pr_err("invalid vhci name %s\n", hcd_name(hcd));
1142 return -EINVAL;
1143 }
1144
1145
1146 if (id == 0 && usb_hcd_is_primary_hcd(hcd)) {
1147 err = vhci_init_attr_group();
1148 if (err) {
1149 pr_err("init attr group\n");
1150 return err;
1151 }
1152 err = sysfs_create_group(&hcd_dev(hcd)->kobj, &vhci_attr_group);
1153 if (err) {
1154 pr_err("create sysfs files\n");
1155 vhci_finish_attr_group();
1156 return err;
1157 }
1158 pr_info("created sysfs %s\n", hcd_name(hcd));
1159 }
1160
1161 return 0;
1162}
1163
1164static void vhci_stop(struct usb_hcd *hcd)
1165{
1166 struct vhci_hcd *vhci_hcd = hcd_to_vhci_hcd(hcd);
1167 int id, rhport;
1168
1169 usbip_dbg_vhci_hc("stop VHCI controller\n");
1170
1171
1172 id = hcd_name_to_id(hcd_name(hcd));
1173 if (id == 0 && usb_hcd_is_primary_hcd(hcd)) {
1174 sysfs_remove_group(&hcd_dev(hcd)->kobj, &vhci_attr_group);
1175 vhci_finish_attr_group();
1176 }
1177
1178
1179 for (rhport = 0; rhport < VHCI_HC_PORTS; rhport++) {
1180 struct vhci_device *vdev = &vhci_hcd->vdev[rhport];
1181
1182 usbip_event_add(&vdev->ud, VDEV_EVENT_REMOVED);
1183 usbip_stop_eh(&vdev->ud);
1184 }
1185}
1186
1187static int vhci_get_frame_number(struct usb_hcd *hcd)
1188{
1189 dev_err_ratelimited(&hcd->self.root_hub->dev, "Not yet implemented\n");
1190 return 0;
1191}
1192
1193#ifdef CONFIG_PM
1194
1195
1196static int vhci_bus_suspend(struct usb_hcd *hcd)
1197{
1198 struct vhci *vhci = *((void **)dev_get_platdata(hcd->self.controller));
1199 unsigned long flags;
1200
1201 dev_dbg(&hcd->self.root_hub->dev, "%s\n", __func__);
1202
1203 spin_lock_irqsave(&vhci->lock, flags);
1204 hcd->state = HC_STATE_SUSPENDED;
1205 spin_unlock_irqrestore(&vhci->lock, flags);
1206
1207 return 0;
1208}
1209
1210static int vhci_bus_resume(struct usb_hcd *hcd)
1211{
1212 struct vhci *vhci = *((void **)dev_get_platdata(hcd->self.controller));
1213 int rc = 0;
1214 unsigned long flags;
1215
1216 dev_dbg(&hcd->self.root_hub->dev, "%s\n", __func__);
1217
1218 spin_lock_irqsave(&vhci->lock, flags);
1219 if (!HCD_HW_ACCESSIBLE(hcd))
1220 rc = -ESHUTDOWN;
1221 else
1222 hcd->state = HC_STATE_RUNNING;
1223 spin_unlock_irqrestore(&vhci->lock, flags);
1224
1225 return rc;
1226}
1227
1228#else
1229
1230#define vhci_bus_suspend NULL
1231#define vhci_bus_resume NULL
1232#endif
1233
1234
1235static int vhci_alloc_streams(struct usb_hcd *hcd, struct usb_device *udev,
1236 struct usb_host_endpoint **eps, unsigned int num_eps,
1237 unsigned int num_streams, gfp_t mem_flags)
1238{
1239 dev_dbg(&hcd->self.root_hub->dev, "vhci_alloc_streams not implemented\n");
1240 return 0;
1241}
1242
1243
1244static int vhci_free_streams(struct usb_hcd *hcd, struct usb_device *udev,
1245 struct usb_host_endpoint **eps, unsigned int num_eps,
1246 gfp_t mem_flags)
1247{
1248 dev_dbg(&hcd->self.root_hub->dev, "vhci_free_streams not implemented\n");
1249 return 0;
1250}
1251
1252static const struct hc_driver vhci_hc_driver = {
1253 .description = driver_name,
1254 .product_desc = driver_desc,
1255 .hcd_priv_size = sizeof(struct vhci_hcd),
1256
1257 .flags = HCD_USB3 | HCD_SHARED,
1258
1259 .reset = vhci_setup,
1260 .start = vhci_start,
1261 .stop = vhci_stop,
1262
1263 .urb_enqueue = vhci_urb_enqueue,
1264 .urb_dequeue = vhci_urb_dequeue,
1265
1266 .get_frame_number = vhci_get_frame_number,
1267
1268 .hub_status_data = vhci_hub_status,
1269 .hub_control = vhci_hub_control,
1270 .bus_suspend = vhci_bus_suspend,
1271 .bus_resume = vhci_bus_resume,
1272
1273 .alloc_streams = vhci_alloc_streams,
1274 .free_streams = vhci_free_streams,
1275};
1276
1277static int vhci_hcd_probe(struct platform_device *pdev)
1278{
1279 struct vhci *vhci = *((void **)dev_get_platdata(&pdev->dev));
1280 struct usb_hcd *hcd_hs;
1281 struct usb_hcd *hcd_ss;
1282 int ret;
1283
1284 usbip_dbg_vhci_hc("name %s id %d\n", pdev->name, pdev->id);
1285
1286
1287
1288
1289
1290 hcd_hs = usb_create_hcd(&vhci_hc_driver, &pdev->dev, dev_name(&pdev->dev));
1291 if (!hcd_hs) {
1292 pr_err("create primary hcd failed\n");
1293 return -ENOMEM;
1294 }
1295 hcd_hs->has_tt = 1;
1296
1297
1298
1299
1300
1301 ret = usb_add_hcd(hcd_hs, 0, 0);
1302 if (ret != 0) {
1303 pr_err("usb_add_hcd hs failed %d\n", ret);
1304 goto put_usb2_hcd;
1305 }
1306
1307 hcd_ss = usb_create_shared_hcd(&vhci_hc_driver, &pdev->dev,
1308 dev_name(&pdev->dev), hcd_hs);
1309 if (!hcd_ss) {
1310 ret = -ENOMEM;
1311 pr_err("create shared hcd failed\n");
1312 goto remove_usb2_hcd;
1313 }
1314
1315 ret = usb_add_hcd(hcd_ss, 0, 0);
1316 if (ret) {
1317 pr_err("usb_add_hcd ss failed %d\n", ret);
1318 goto put_usb3_hcd;
1319 }
1320
1321 usbip_dbg_vhci_hc("bye\n");
1322 return 0;
1323
1324put_usb3_hcd:
1325 usb_put_hcd(hcd_ss);
1326remove_usb2_hcd:
1327 usb_remove_hcd(hcd_hs);
1328put_usb2_hcd:
1329 usb_put_hcd(hcd_hs);
1330 vhci->vhci_hcd_hs = NULL;
1331 vhci->vhci_hcd_ss = NULL;
1332 return ret;
1333}
1334
1335static int vhci_hcd_remove(struct platform_device *pdev)
1336{
1337 struct vhci *vhci = *((void **)dev_get_platdata(&pdev->dev));
1338
1339
1340
1341
1342
1343
1344 usb_remove_hcd(vhci_hcd_to_hcd(vhci->vhci_hcd_ss));
1345 usb_put_hcd(vhci_hcd_to_hcd(vhci->vhci_hcd_ss));
1346
1347 usb_remove_hcd(vhci_hcd_to_hcd(vhci->vhci_hcd_hs));
1348 usb_put_hcd(vhci_hcd_to_hcd(vhci->vhci_hcd_hs));
1349
1350 vhci->vhci_hcd_hs = NULL;
1351 vhci->vhci_hcd_ss = NULL;
1352
1353 return 0;
1354}
1355
1356#ifdef CONFIG_PM
1357
1358
1359static int vhci_hcd_suspend(struct platform_device *pdev, pm_message_t state)
1360{
1361 struct usb_hcd *hcd;
1362 struct vhci *vhci;
1363 int rhport;
1364 int connected = 0;
1365 int ret = 0;
1366 unsigned long flags;
1367
1368 dev_dbg(&pdev->dev, "%s\n", __func__);
1369
1370 hcd = platform_get_drvdata(pdev);
1371 if (!hcd)
1372 return 0;
1373
1374 vhci = *((void **)dev_get_platdata(hcd->self.controller));
1375
1376 spin_lock_irqsave(&vhci->lock, flags);
1377
1378 for (rhport = 0; rhport < VHCI_HC_PORTS; rhport++) {
1379 if (vhci->vhci_hcd_hs->port_status[rhport] &
1380 USB_PORT_STAT_CONNECTION)
1381 connected += 1;
1382
1383 if (vhci->vhci_hcd_ss->port_status[rhport] &
1384 USB_PORT_STAT_CONNECTION)
1385 connected += 1;
1386 }
1387
1388 spin_unlock_irqrestore(&vhci->lock, flags);
1389
1390 if (connected > 0) {
1391 dev_info(&pdev->dev,
1392 "We have %d active connection%s. Do not suspend.\n",
1393 connected, (connected == 1 ? "" : "s"));
1394 ret = -EBUSY;
1395 } else {
1396 dev_info(&pdev->dev, "suspend vhci_hcd");
1397 clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
1398 }
1399
1400 return ret;
1401}
1402
1403static int vhci_hcd_resume(struct platform_device *pdev)
1404{
1405 struct usb_hcd *hcd;
1406
1407 dev_dbg(&pdev->dev, "%s\n", __func__);
1408
1409 hcd = platform_get_drvdata(pdev);
1410 if (!hcd)
1411 return 0;
1412 set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
1413 usb_hcd_poll_rh_status(hcd);
1414
1415 return 0;
1416}
1417
1418#else
1419
1420#define vhci_hcd_suspend NULL
1421#define vhci_hcd_resume NULL
1422
1423#endif
1424
1425static struct platform_driver vhci_driver = {
1426 .probe = vhci_hcd_probe,
1427 .remove = vhci_hcd_remove,
1428 .suspend = vhci_hcd_suspend,
1429 .resume = vhci_hcd_resume,
1430 .driver = {
1431 .name = driver_name,
1432 },
1433};
1434
1435static void del_platform_devices(void)
1436{
1437 struct platform_device *pdev;
1438 int i;
1439
1440 for (i = 0; i < vhci_num_controllers; i++) {
1441 pdev = vhcis[i].pdev;
1442 if (pdev != NULL)
1443 platform_device_unregister(pdev);
1444 vhcis[i].pdev = NULL;
1445 }
1446 sysfs_remove_link(&platform_bus.kobj, driver_name);
1447}
1448
1449static int __init vhci_hcd_init(void)
1450{
1451 int i, ret;
1452
1453 if (usb_disabled())
1454 return -ENODEV;
1455
1456 if (vhci_num_controllers < 1)
1457 vhci_num_controllers = 1;
1458
1459 vhcis = kcalloc(vhci_num_controllers, sizeof(struct vhci), GFP_KERNEL);
1460 if (vhcis == NULL)
1461 return -ENOMEM;
1462
1463 for (i = 0; i < vhci_num_controllers; i++) {
1464 vhcis[i].pdev = platform_device_alloc(driver_name, i);
1465 if (!vhcis[i].pdev) {
1466 i--;
1467 while (i >= 0)
1468 platform_device_put(vhcis[i--].pdev);
1469 ret = -ENOMEM;
1470 goto err_device_alloc;
1471 }
1472 }
1473 for (i = 0; i < vhci_num_controllers; i++) {
1474 void *vhci = &vhcis[i];
1475 ret = platform_device_add_data(vhcis[i].pdev, &vhci, sizeof(void *));
1476 if (ret)
1477 goto err_driver_register;
1478 }
1479
1480 ret = platform_driver_register(&vhci_driver);
1481 if (ret)
1482 goto err_driver_register;
1483
1484 for (i = 0; i < vhci_num_controllers; i++) {
1485 ret = platform_device_add(vhcis[i].pdev);
1486 if (ret < 0) {
1487 i--;
1488 while (i >= 0)
1489 platform_device_del(vhcis[i--].pdev);
1490 goto err_add_hcd;
1491 }
1492 }
1493
1494 return ret;
1495
1496err_add_hcd:
1497 platform_driver_unregister(&vhci_driver);
1498err_driver_register:
1499 for (i = 0; i < vhci_num_controllers; i++)
1500 platform_device_put(vhcis[i].pdev);
1501err_device_alloc:
1502 kfree(vhcis);
1503 return ret;
1504}
1505
1506static void __exit vhci_hcd_exit(void)
1507{
1508 del_platform_devices();
1509 platform_driver_unregister(&vhci_driver);
1510 kfree(vhcis);
1511}
1512
1513module_init(vhci_hcd_init);
1514module_exit(vhci_hcd_exit);
1515
1516MODULE_AUTHOR(DRIVER_AUTHOR);
1517MODULE_DESCRIPTION(DRIVER_DESC);
1518MODULE_LICENSE("GPL");
1519