1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#include <linux/init.h>
21#include <linux/kernel.h>
22#include <linux/kthread.h>
23#include <linux/module.h>
24#include <linux/platform_device.h>
25#include <linux/slab.h>
26
27#include "usbip_common.h"
28#include "vhci.h"
29
30#define DRIVER_AUTHOR "Takahiro Hirofuchi"
31#define DRIVER_DESC "USB/IP 'Virtual' Host Controller (VHCI) Driver"
32
33
34
35
36
37
38
39
40
41
42
43
44
45static int vhci_hub_status(struct usb_hcd *hcd, char *buff);
46static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
47 u16 wIndex, char *buff, u16 wLength);
48static int vhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
49 gfp_t mem_flags);
50static int vhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status);
51static int vhci_start(struct usb_hcd *vhci_hcd);
52static void vhci_stop(struct usb_hcd *hcd);
53static int vhci_get_frame_number(struct usb_hcd *hcd);
54
55static const char driver_name[] = "vhci_hcd";
56static const char driver_desc[] = "USB/IP Virtual Host Controller";
57
58struct vhci_hcd *the_controller;
59
60static const char * const bit_desc[] = {
61 "CONNECTION",
62 "ENABLE",
63 "SUSPEND",
64 "OVER_CURRENT",
65 "RESET",
66 "R5",
67 "R6",
68 "R7",
69 "POWER",
70 "LOWSPEED",
71 "HIGHSPEED",
72 "PORT_TEST",
73 "INDICATOR",
74 "R13",
75 "R14",
76 "R15",
77 "C_CONNECTION",
78 "C_ENABLE",
79 "C_SUSPEND",
80 "C_OVER_CURRENT",
81 "C_RESET",
82 "R21",
83 "R22",
84 "R23",
85 "R24",
86 "R25",
87 "R26",
88 "R27",
89 "R28",
90 "R29",
91 "R30",
92 "R31",
93};
94
95static void dump_port_status_diff(u32 prev_status, u32 new_status)
96{
97 int i = 0;
98 u32 bit = 1;
99
100 pr_debug("status prev -> new: %08x -> %08x\n", prev_status, new_status);
101 while (bit) {
102 u32 prev = prev_status & bit;
103 u32 new = new_status & bit;
104 char change;
105
106 if (!prev && new)
107 change = '+';
108 else if (prev && !new)
109 change = '-';
110 else
111 change = ' ';
112
113 if (prev || new)
114 pr_debug(" %c%s\n", change, bit_desc[i]);
115 bit <<= 1;
116 i++;
117 }
118 pr_debug("\n");
119}
120
121void rh_port_connect(int rhport, enum usb_device_speed speed)
122{
123 unsigned long flags;
124
125 usbip_dbg_vhci_rh("rh_port_connect %d\n", rhport);
126
127 spin_lock_irqsave(&the_controller->lock, flags);
128
129 the_controller->port_status[rhport] |= USB_PORT_STAT_CONNECTION
130 | (1 << USB_PORT_FEAT_C_CONNECTION);
131
132 switch (speed) {
133 case USB_SPEED_HIGH:
134 the_controller->port_status[rhport] |= USB_PORT_STAT_HIGH_SPEED;
135 break;
136 case USB_SPEED_LOW:
137 the_controller->port_status[rhport] |= USB_PORT_STAT_LOW_SPEED;
138 break;
139 default:
140 break;
141 }
142
143
144
145
146
147 spin_unlock_irqrestore(&the_controller->lock, flags);
148
149 usb_hcd_poll_rh_status(vhci_to_hcd(the_controller));
150}
151
152void rh_port_disconnect(int rhport)
153{
154 unsigned long flags;
155
156 usbip_dbg_vhci_rh("rh_port_disconnect %d\n", rhport);
157
158 spin_lock_irqsave(&the_controller->lock, flags);
159
160 the_controller->port_status[rhport] &= ~USB_PORT_STAT_CONNECTION;
161 the_controller->port_status[rhport] |=
162 (1 << USB_PORT_FEAT_C_CONNECTION);
163
164
165
166
167
168
169 spin_unlock_irqrestore(&the_controller->lock, flags);
170 usb_hcd_poll_rh_status(vhci_to_hcd(the_controller));
171}
172
173#define PORT_C_MASK \
174 ((USB_PORT_STAT_C_CONNECTION \
175 | USB_PORT_STAT_C_ENABLE \
176 | USB_PORT_STAT_C_SUSPEND \
177 | USB_PORT_STAT_C_OVERCURRENT \
178 | USB_PORT_STAT_C_RESET) << 16)
179
180
181
182
183
184
185
186
187
188
189
190
191static int vhci_hub_status(struct usb_hcd *hcd, char *buf)
192{
193 struct vhci_hcd *vhci;
194 unsigned long flags;
195 int retval;
196 int rhport;
197 int changed = 0;
198
199 retval = DIV_ROUND_UP(VHCI_NPORTS + 1, 8);
200 memset(buf, 0, retval);
201
202 vhci = hcd_to_vhci(hcd);
203
204 spin_lock_irqsave(&vhci->lock, flags);
205 if (!HCD_HW_ACCESSIBLE(hcd)) {
206 usbip_dbg_vhci_rh("hw accessible flag not on?\n");
207 goto done;
208 }
209
210
211 for (rhport = 0; rhport < VHCI_NPORTS; rhport++) {
212 if ((vhci->port_status[rhport] & PORT_C_MASK)) {
213
214 usbip_dbg_vhci_rh("port %d status changed\n", rhport);
215
216 buf[(rhport + 1) / 8] |= 1 << (rhport + 1) % 8;
217 changed = 1;
218 }
219 }
220
221 pr_info("changed %d\n", changed);
222
223 if (hcd->state == HC_STATE_SUSPENDED)
224 usb_hcd_resume_root_hub(hcd);
225
226done:
227 spin_unlock_irqrestore(&vhci->lock, flags);
228 return changed ? retval : 0;
229}
230
231
232static inline void hub_descriptor(struct usb_hub_descriptor *desc)
233{
234 memset(desc, 0, sizeof(*desc));
235 desc->bDescriptorType = 0x29;
236 desc->bDescLength = 9;
237 desc->wHubCharacteristics = (__force __u16)
238 (__constant_cpu_to_le16(0x0001));
239 desc->bNbrPorts = VHCI_NPORTS;
240 desc->u.hs.DeviceRemovable[0] = 0xff;
241 desc->u.hs.DeviceRemovable[1] = 0xff;
242}
243
244static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
245 u16 wIndex, char *buf, u16 wLength)
246{
247 struct vhci_hcd *dum;
248 int retval = 0;
249 unsigned long flags;
250 int rhport;
251
252 u32 prev_port_status[VHCI_NPORTS];
253
254 if (!HCD_HW_ACCESSIBLE(hcd))
255 return -ETIMEDOUT;
256
257
258
259
260
261 usbip_dbg_vhci_rh("typeReq %x wValue %x wIndex %x\n", typeReq, wValue,
262 wIndex);
263 if (wIndex > VHCI_NPORTS)
264 pr_err("invalid port number %d\n", wIndex);
265 rhport = ((__u8)(wIndex & 0x00ff)) - 1;
266
267 dum = hcd_to_vhci(hcd);
268
269 spin_lock_irqsave(&dum->lock, flags);
270
271
272 if (usbip_dbg_flag_vhci_rh) {
273 memcpy(prev_port_status, dum->port_status,
274 sizeof(prev_port_status));
275 }
276
277 switch (typeReq) {
278 case ClearHubFeature:
279 usbip_dbg_vhci_rh(" ClearHubFeature\n");
280 break;
281 case ClearPortFeature:
282 switch (wValue) {
283 case USB_PORT_FEAT_SUSPEND:
284 if (dum->port_status[rhport] & USB_PORT_STAT_SUSPEND) {
285
286 dum->resuming = 1;
287 dum->re_timeout =
288 jiffies + msecs_to_jiffies(20);
289 }
290 break;
291 case USB_PORT_FEAT_POWER:
292 usbip_dbg_vhci_rh(" ClearPortFeature: "
293 "USB_PORT_FEAT_POWER\n");
294 dum->port_status[rhport] = 0;
295
296
297 dum->resuming = 0;
298 break;
299 case USB_PORT_FEAT_C_RESET:
300 usbip_dbg_vhci_rh(" ClearPortFeature: "
301 "USB_PORT_FEAT_C_RESET\n");
302 switch (dum->vdev[rhport].speed) {
303 case USB_SPEED_HIGH:
304 dum->port_status[rhport] |=
305 USB_PORT_STAT_HIGH_SPEED;
306 break;
307 case USB_SPEED_LOW:
308 dum->port_status[rhport] |=
309 USB_PORT_STAT_LOW_SPEED;
310 break;
311 default:
312 break;
313 }
314 default:
315 usbip_dbg_vhci_rh(" ClearPortFeature: default %x\n",
316 wValue);
317 dum->port_status[rhport] &= ~(1 << wValue);
318 break;
319 }
320 break;
321 case GetHubDescriptor:
322 usbip_dbg_vhci_rh(" GetHubDescriptor\n");
323 hub_descriptor((struct usb_hub_descriptor *) buf);
324 break;
325 case GetHubStatus:
326 usbip_dbg_vhci_rh(" GetHubStatus\n");
327 *(__le32 *) buf = __constant_cpu_to_le32(0);
328 break;
329 case GetPortStatus:
330 usbip_dbg_vhci_rh(" GetPortStatus port %x\n", wIndex);
331 if (wIndex > VHCI_NPORTS || wIndex < 1) {
332 pr_err("invalid port number %d\n", wIndex);
333 retval = -EPIPE;
334 }
335
336
337
338
339
340
341 if (dum->resuming && time_after(jiffies, dum->re_timeout)) {
342 dum->port_status[rhport] |=
343 (1 << USB_PORT_FEAT_C_SUSPEND);
344 dum->port_status[rhport] &=
345 ~(1 << USB_PORT_FEAT_SUSPEND);
346 dum->resuming = 0;
347 dum->re_timeout = 0;
348
349
350
351
352
353 }
354
355 if ((dum->port_status[rhport] & (1 << USB_PORT_FEAT_RESET)) !=
356 0 && time_after(jiffies, dum->re_timeout)) {
357 dum->port_status[rhport] |=
358 (1 << USB_PORT_FEAT_C_RESET);
359 dum->port_status[rhport] &=
360 ~(1 << USB_PORT_FEAT_RESET);
361 dum->re_timeout = 0;
362
363 if (dum->vdev[rhport].ud.status ==
364 VDEV_ST_NOTASSIGNED) {
365 usbip_dbg_vhci_rh(" enable rhport %d "
366 "(status %u)\n",
367 rhport,
368 dum->vdev[rhport].ud.status);
369 dum->port_status[rhport] |=
370 USB_PORT_STAT_ENABLE;
371 }
372 }
373 ((u16 *) buf)[0] = cpu_to_le16(dum->port_status[rhport]);
374 ((u16 *) buf)[1] = cpu_to_le16(dum->port_status[rhport] >> 16);
375
376 usbip_dbg_vhci_rh(" GetPortStatus bye %x %x\n", ((u16 *)buf)[0],
377 ((u16 *)buf)[1]);
378 break;
379 case SetHubFeature:
380 usbip_dbg_vhci_rh(" SetHubFeature\n");
381 retval = -EPIPE;
382 break;
383 case SetPortFeature:
384 switch (wValue) {
385 case USB_PORT_FEAT_SUSPEND:
386 usbip_dbg_vhci_rh(" SetPortFeature: "
387 "USB_PORT_FEAT_SUSPEND\n");
388 break;
389 case USB_PORT_FEAT_RESET:
390 usbip_dbg_vhci_rh(" SetPortFeature: "
391 "USB_PORT_FEAT_RESET\n");
392
393 if (dum->port_status[rhport] & USB_PORT_STAT_ENABLE) {
394 dum->port_status[rhport] &=
395 ~(USB_PORT_STAT_ENABLE |
396 USB_PORT_STAT_LOW_SPEED |
397 USB_PORT_STAT_HIGH_SPEED);
398
399 }
400
401 dum->re_timeout = jiffies + msecs_to_jiffies(50);
402
403
404 default:
405 usbip_dbg_vhci_rh(" SetPortFeature: default %d\n",
406 wValue);
407 dum->port_status[rhport] |= (1 << wValue);
408 break;
409 }
410 break;
411
412 default:
413 pr_err("default: no such request\n");
414
415
416
417
418
419 retval = -EPIPE;
420 }
421
422 if (usbip_dbg_flag_vhci_rh) {
423 pr_debug("port %d\n", rhport);
424
425 if (rhport >= 0) {
426 dump_port_status_diff(prev_port_status[rhport],
427 dum->port_status[rhport]);
428 }
429 }
430 usbip_dbg_vhci_rh(" bye\n");
431
432 spin_unlock_irqrestore(&dum->lock, flags);
433
434 return retval;
435}
436
437static struct vhci_device *get_vdev(struct usb_device *udev)
438{
439 int i;
440
441 if (!udev)
442 return NULL;
443
444 for (i = 0; i < VHCI_NPORTS; i++)
445 if (the_controller->vdev[i].udev == udev)
446 return port_to_vdev(i);
447
448 return NULL;
449}
450
451static void vhci_tx_urb(struct urb *urb)
452{
453 struct vhci_device *vdev = get_vdev(urb->dev);
454 struct vhci_priv *priv;
455 unsigned long flag;
456
457 if (!vdev) {
458 pr_err("could not get virtual device");
459
460 return;
461 }
462
463 priv = kzalloc(sizeof(struct vhci_priv), GFP_ATOMIC);
464
465 spin_lock_irqsave(&vdev->priv_lock, flag);
466
467 if (!priv) {
468 dev_err(&urb->dev->dev, "malloc vhci_priv\n");
469 spin_unlock_irqrestore(&vdev->priv_lock, flag);
470 usbip_event_add(&vdev->ud, VDEV_EVENT_ERROR_MALLOC);
471 return;
472 }
473
474 priv->seqnum = atomic_inc_return(&the_controller->seqnum);
475 if (priv->seqnum == 0xffff)
476 dev_info(&urb->dev->dev, "seqnum max\n");
477
478 priv->vdev = vdev;
479 priv->urb = urb;
480
481 urb->hcpriv = (void *) priv;
482
483 list_add_tail(&priv->list, &vdev->priv_tx);
484
485 wake_up(&vdev->waitq_tx);
486 spin_unlock_irqrestore(&vdev->priv_lock, flag);
487}
488
489static int vhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
490 gfp_t mem_flags)
491{
492 struct device *dev = &urb->dev->dev;
493 int ret = 0;
494 unsigned long flags;
495 struct vhci_device *vdev;
496
497 usbip_dbg_vhci_hc("enter, usb_hcd %p urb %p mem_flags %d\n",
498 hcd, urb, mem_flags);
499
500
501 BUG_ON(!urb->transfer_buffer && urb->transfer_buffer_length);
502
503 spin_lock_irqsave(&the_controller->lock, flags);
504
505 if (urb->status != -EINPROGRESS) {
506 dev_err(dev, "URB already unlinked!, status %d\n", urb->status);
507 spin_unlock_irqrestore(&the_controller->lock, flags);
508 return urb->status;
509 }
510
511 vdev = port_to_vdev(urb->dev->portnum-1);
512
513
514 spin_lock(&vdev->ud.lock);
515 if (vdev->ud.status == VDEV_ST_NULL ||
516 vdev->ud.status == VDEV_ST_ERROR) {
517 dev_err(dev, "enqueue for inactive port %d\n", vdev->rhport);
518 spin_unlock(&vdev->ud.lock);
519 spin_unlock_irqrestore(&the_controller->lock, flags);
520 return -ENODEV;
521 }
522 spin_unlock(&vdev->ud.lock);
523
524 ret = usb_hcd_link_urb_to_ep(hcd, urb);
525 if (ret)
526 goto no_need_unlink;
527
528
529
530
531
532
533
534
535
536
537 if (usb_pipedevice(urb->pipe) == 0) {
538 __u8 type = usb_pipetype(urb->pipe);
539 struct usb_ctrlrequest *ctrlreq =
540 (struct usb_ctrlrequest *) urb->setup_packet;
541
542 if (type != PIPE_CONTROL || !ctrlreq) {
543 dev_err(dev, "invalid request to devnum 0\n");
544 ret = -EINVAL;
545 goto no_need_xmit;
546 }
547
548 switch (ctrlreq->bRequest) {
549 case USB_REQ_SET_ADDRESS:
550
551 dev_info(dev, "SetAddress Request (%d) to port %d\n",
552 ctrlreq->wValue, vdev->rhport);
553
554 if (vdev->udev)
555 usb_put_dev(vdev->udev);
556 vdev->udev = usb_get_dev(urb->dev);
557
558 spin_lock(&vdev->ud.lock);
559 vdev->ud.status = VDEV_ST_USED;
560 spin_unlock(&vdev->ud.lock);
561
562 if (urb->status == -EINPROGRESS) {
563
564
565 urb->status = 0;
566 }
567
568 goto no_need_xmit;
569
570 case USB_REQ_GET_DESCRIPTOR:
571 if (ctrlreq->wValue == (USB_DT_DEVICE << 8))
572 usbip_dbg_vhci_hc("Not yet?: "
573 "Get_Descriptor to device 0 "
574 "(get max pipe size)\n");
575
576 if (vdev->udev)
577 usb_put_dev(vdev->udev);
578 vdev->udev = usb_get_dev(urb->dev);
579 goto out;
580
581 default:
582
583 dev_err(dev, "invalid request to devnum 0 bRequest %u, "
584 "wValue %u\n", ctrlreq->bRequest,
585 ctrlreq->wValue);
586 ret = -EINVAL;
587 goto no_need_xmit;
588 }
589
590 }
591
592out:
593 vhci_tx_urb(urb);
594 spin_unlock_irqrestore(&the_controller->lock, flags);
595
596 return 0;
597
598no_need_xmit:
599 usb_hcd_unlink_urb_from_ep(hcd, urb);
600no_need_unlink:
601 spin_unlock_irqrestore(&the_controller->lock, flags);
602 usb_hcd_giveback_urb(vhci_to_hcd(the_controller), urb, urb->status);
603 return ret;
604}
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652static int vhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
653{
654 unsigned long flags;
655 struct vhci_priv *priv;
656 struct vhci_device *vdev;
657
658 pr_info("dequeue a urb %p\n", urb);
659
660 spin_lock_irqsave(&the_controller->lock, flags);
661
662 priv = urb->hcpriv;
663 if (!priv) {
664
665
666 spin_unlock_irqrestore(&the_controller->lock, flags);
667 return 0;
668 }
669
670 {
671 int ret = 0;
672 ret = usb_hcd_check_unlink_urb(hcd, urb, status);
673 if (ret) {
674 spin_unlock_irqrestore(&the_controller->lock, flags);
675 return ret;
676 }
677 }
678
679
680 vdev = priv->vdev;
681
682 if (!vdev->ud.tcp_socket) {
683
684 unsigned long flags2;
685
686 spin_lock_irqsave(&vdev->priv_lock, flags2);
687
688 pr_info("device %p seems to be disconnected\n", vdev);
689 list_del(&priv->list);
690 kfree(priv);
691 urb->hcpriv = NULL;
692
693 spin_unlock_irqrestore(&vdev->priv_lock, flags2);
694
695
696
697
698
699
700 pr_info("gives back urb %p\n", urb);
701
702 usb_hcd_unlink_urb_from_ep(hcd, urb);
703
704 spin_unlock_irqrestore(&the_controller->lock, flags);
705 usb_hcd_giveback_urb(vhci_to_hcd(the_controller), urb,
706 urb->status);
707 spin_lock_irqsave(&the_controller->lock, flags);
708
709 } else {
710
711 unsigned long flags2;
712 struct vhci_unlink *unlink;
713
714 spin_lock_irqsave(&vdev->priv_lock, flags2);
715
716
717 unlink = kzalloc(sizeof(struct vhci_unlink), GFP_ATOMIC);
718 if (!unlink) {
719 pr_err("malloc vhci_unlink\n");
720 spin_unlock_irqrestore(&vdev->priv_lock, flags2);
721 spin_unlock_irqrestore(&the_controller->lock, flags);
722 usbip_event_add(&vdev->ud, VDEV_EVENT_ERROR_MALLOC);
723 return -ENOMEM;
724 }
725
726 unlink->seqnum = atomic_inc_return(&the_controller->seqnum);
727 if (unlink->seqnum == 0xffff)
728 pr_info("seqnum max\n");
729
730 unlink->unlink_seqnum = priv->seqnum;
731
732 pr_info("device %p seems to be still connected\n", vdev);
733
734
735
736 list_add_tail(&unlink->list, &vdev->unlink_tx);
737 wake_up(&vdev->waitq_tx);
738
739 spin_unlock_irqrestore(&vdev->priv_lock, flags2);
740 }
741
742 spin_unlock_irqrestore(&the_controller->lock, flags);
743
744 usbip_dbg_vhci_hc("leave\n");
745 return 0;
746}
747
748static void vhci_device_unlink_cleanup(struct vhci_device *vdev)
749{
750 struct vhci_unlink *unlink, *tmp;
751
752 spin_lock(&vdev->priv_lock);
753
754 list_for_each_entry_safe(unlink, tmp, &vdev->unlink_tx, list) {
755 pr_info("unlink cleanup tx %lu\n", unlink->unlink_seqnum);
756 list_del(&unlink->list);
757 kfree(unlink);
758 }
759
760 list_for_each_entry_safe(unlink, tmp, &vdev->unlink_rx, list) {
761 struct urb *urb;
762
763
764 pr_info("unlink cleanup rx %lu\n", unlink->unlink_seqnum);
765
766 urb = pickup_urb_and_free_priv(vdev, unlink->unlink_seqnum);
767 if (!urb) {
768 pr_info("the urb (seqnum %lu) was already given back\n",
769 unlink->unlink_seqnum);
770 list_del(&unlink->list);
771 kfree(unlink);
772 continue;
773 }
774
775 urb->status = -ENODEV;
776
777 spin_lock(&the_controller->lock);
778 usb_hcd_unlink_urb_from_ep(vhci_to_hcd(the_controller), urb);
779 spin_unlock(&the_controller->lock);
780
781 usb_hcd_giveback_urb(vhci_to_hcd(the_controller), urb,
782 urb->status);
783
784 list_del(&unlink->list);
785 kfree(unlink);
786 }
787
788 spin_unlock(&vdev->priv_lock);
789}
790
791
792
793
794
795
796static void vhci_shutdown_connection(struct usbip_device *ud)
797{
798 struct vhci_device *vdev = container_of(ud, struct vhci_device, ud);
799
800
801 if (ud->tcp_socket) {
802 pr_debug("shutdown tcp_socket %p\n", ud->tcp_socket);
803 kernel_sock_shutdown(ud->tcp_socket, SHUT_RDWR);
804 }
805
806
807 if (vdev->ud.tcp_rx)
808 kthread_stop_put(vdev->ud.tcp_rx);
809 if (vdev->ud.tcp_tx)
810 kthread_stop_put(vdev->ud.tcp_tx);
811
812 pr_info("stop threads\n");
813
814
815 if (vdev->ud.tcp_socket != NULL) {
816 sock_release(vdev->ud.tcp_socket);
817 vdev->ud.tcp_socket = NULL;
818 }
819 pr_info("release socket\n");
820
821 vhci_device_unlink_cleanup(vdev);
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843 rh_port_disconnect(vdev->rhport);
844
845 pr_info("disconnect device\n");
846}
847
848
849static void vhci_device_reset(struct usbip_device *ud)
850{
851 struct vhci_device *vdev = container_of(ud, struct vhci_device, ud);
852
853 spin_lock(&ud->lock);
854
855 vdev->speed = 0;
856 vdev->devid = 0;
857
858 if (vdev->udev)
859 usb_put_dev(vdev->udev);
860 vdev->udev = NULL;
861
862 ud->tcp_socket = NULL;
863 ud->status = VDEV_ST_NULL;
864
865 spin_unlock(&ud->lock);
866}
867
868static void vhci_device_unusable(struct usbip_device *ud)
869{
870 spin_lock(&ud->lock);
871 ud->status = VDEV_ST_ERROR;
872 spin_unlock(&ud->lock);
873}
874
875static void vhci_device_init(struct vhci_device *vdev)
876{
877 memset(vdev, 0, sizeof(*vdev));
878
879 vdev->ud.side = USBIP_VHCI;
880 vdev->ud.status = VDEV_ST_NULL;
881 spin_lock_init(&vdev->ud.lock);
882
883 INIT_LIST_HEAD(&vdev->priv_rx);
884 INIT_LIST_HEAD(&vdev->priv_tx);
885 INIT_LIST_HEAD(&vdev->unlink_tx);
886 INIT_LIST_HEAD(&vdev->unlink_rx);
887 spin_lock_init(&vdev->priv_lock);
888
889 init_waitqueue_head(&vdev->waitq_tx);
890
891 vdev->ud.eh_ops.shutdown = vhci_shutdown_connection;
892 vdev->ud.eh_ops.reset = vhci_device_reset;
893 vdev->ud.eh_ops.unusable = vhci_device_unusable;
894
895 usbip_start_eh(&vdev->ud);
896}
897
898static int vhci_start(struct usb_hcd *hcd)
899{
900 struct vhci_hcd *vhci = hcd_to_vhci(hcd);
901 int rhport;
902 int err = 0;
903
904 usbip_dbg_vhci_hc("enter vhci_start\n");
905
906
907
908 for (rhport = 0; rhport < VHCI_NPORTS; rhport++) {
909 struct vhci_device *vdev = &vhci->vdev[rhport];
910 vhci_device_init(vdev);
911 vdev->rhport = rhport;
912 }
913
914 atomic_set(&vhci->seqnum, 0);
915 spin_lock_init(&vhci->lock);
916
917 hcd->power_budget = 0;
918 hcd->state = HC_STATE_RUNNING;
919 hcd->uses_new_polling = 1;
920
921
922 err = sysfs_create_group(&vhci_dev(vhci)->kobj, &dev_attr_group);
923 if (err) {
924 pr_err("create sysfs files\n");
925 return err;
926 }
927
928 return 0;
929}
930
931static void vhci_stop(struct usb_hcd *hcd)
932{
933 struct vhci_hcd *vhci = hcd_to_vhci(hcd);
934 int rhport = 0;
935
936 usbip_dbg_vhci_hc("stop VHCI controller\n");
937
938
939 sysfs_remove_group(&vhci_dev(vhci)->kobj, &dev_attr_group);
940
941
942 for (rhport = 0 ; rhport < VHCI_NPORTS; rhport++) {
943 struct vhci_device *vdev = &vhci->vdev[rhport];
944
945 usbip_event_add(&vdev->ud, VDEV_EVENT_REMOVED);
946 usbip_stop_eh(&vdev->ud);
947 }
948}
949
950static int vhci_get_frame_number(struct usb_hcd *hcd)
951{
952 pr_err("Not yet implemented\n");
953 return 0;
954}
955
956#ifdef CONFIG_PM
957
958
959static int vhci_bus_suspend(struct usb_hcd *hcd)
960{
961 struct vhci_hcd *vhci = hcd_to_vhci(hcd);
962
963 dev_dbg(&hcd->self.root_hub->dev, "%s\n", __func__);
964
965 spin_lock_irq(&vhci->lock);
966
967
968 hcd->state = HC_STATE_SUSPENDED;
969 spin_unlock_irq(&vhci->lock);
970
971 return 0;
972}
973
974static int vhci_bus_resume(struct usb_hcd *hcd)
975{
976 struct vhci_hcd *vhci = hcd_to_vhci(hcd);
977 int rc = 0;
978
979 dev_dbg(&hcd->self.root_hub->dev, "%s\n", __func__);
980
981 spin_lock_irq(&vhci->lock);
982 if (!HCD_HW_ACCESSIBLE(hcd)) {
983 rc = -ESHUTDOWN;
984 } else {
985
986
987
988
989 hcd->state = HC_STATE_RUNNING;
990 }
991 spin_unlock_irq(&vhci->lock);
992
993 return rc;
994}
995
996#else
997
998#define vhci_bus_suspend NULL
999#define vhci_bus_resume NULL
1000#endif
1001
1002static struct hc_driver vhci_hc_driver = {
1003 .description = driver_name,
1004 .product_desc = driver_desc,
1005 .hcd_priv_size = sizeof(struct vhci_hcd),
1006
1007 .flags = HCD_USB2,
1008
1009 .start = vhci_start,
1010 .stop = vhci_stop,
1011
1012 .urb_enqueue = vhci_urb_enqueue,
1013 .urb_dequeue = vhci_urb_dequeue,
1014
1015 .get_frame_number = vhci_get_frame_number,
1016
1017 .hub_status_data = vhci_hub_status,
1018 .hub_control = vhci_hub_control,
1019 .bus_suspend = vhci_bus_suspend,
1020 .bus_resume = vhci_bus_resume,
1021};
1022
1023static int vhci_hcd_probe(struct platform_device *pdev)
1024{
1025 struct usb_hcd *hcd;
1026 int ret;
1027
1028 usbip_dbg_vhci_hc("name %s id %d\n", pdev->name, pdev->id);
1029
1030
1031 if (pdev->dev.dma_mask) {
1032 dev_info(&pdev->dev, "vhci_hcd DMA not supported\n");
1033 return -EINVAL;
1034 }
1035
1036
1037
1038
1039
1040 hcd = usb_create_hcd(&vhci_hc_driver, &pdev->dev, dev_name(&pdev->dev));
1041 if (!hcd) {
1042 pr_err("create hcd failed\n");
1043 return -ENOMEM;
1044 }
1045 hcd->has_tt = 1;
1046
1047
1048 the_controller = hcd_to_vhci(hcd);
1049
1050
1051
1052
1053
1054 ret = usb_add_hcd(hcd, 0, 0);
1055 if (ret != 0) {
1056 pr_err("usb_add_hcd failed %d\n", ret);
1057 usb_put_hcd(hcd);
1058 the_controller = NULL;
1059 return ret;
1060 }
1061
1062 usbip_dbg_vhci_hc("bye\n");
1063 return 0;
1064}
1065
1066static int vhci_hcd_remove(struct platform_device *pdev)
1067{
1068 struct usb_hcd *hcd;
1069
1070 hcd = platform_get_drvdata(pdev);
1071 if (!hcd)
1072 return 0;
1073
1074
1075
1076
1077
1078
1079 usb_remove_hcd(hcd);
1080 usb_put_hcd(hcd);
1081 the_controller = NULL;
1082
1083 return 0;
1084}
1085
1086#ifdef CONFIG_PM
1087
1088
1089static int vhci_hcd_suspend(struct platform_device *pdev, pm_message_t state)
1090{
1091 struct usb_hcd *hcd;
1092 int rhport = 0;
1093 int connected = 0;
1094 int ret = 0;
1095
1096 hcd = platform_get_drvdata(pdev);
1097
1098 spin_lock(&the_controller->lock);
1099
1100 for (rhport = 0; rhport < VHCI_NPORTS; rhport++)
1101 if (the_controller->port_status[rhport] &
1102 USB_PORT_STAT_CONNECTION)
1103 connected += 1;
1104
1105 spin_unlock(&the_controller->lock);
1106
1107 if (connected > 0) {
1108 dev_info(&pdev->dev, "We have %d active connection%s. Do not "
1109 "suspend.\n", connected, (connected == 1 ? "" : "s"));
1110 ret = -EBUSY;
1111 } else {
1112 dev_info(&pdev->dev, "suspend vhci_hcd");
1113 clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
1114 }
1115
1116 return ret;
1117}
1118
1119static int vhci_hcd_resume(struct platform_device *pdev)
1120{
1121 struct usb_hcd *hcd;
1122
1123 dev_dbg(&pdev->dev, "%s\n", __func__);
1124
1125 hcd = platform_get_drvdata(pdev);
1126 set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
1127 usb_hcd_poll_rh_status(hcd);
1128
1129 return 0;
1130}
1131
1132#else
1133
1134#define vhci_hcd_suspend NULL
1135#define vhci_hcd_resume NULL
1136
1137#endif
1138
1139static struct platform_driver vhci_driver = {
1140 .probe = vhci_hcd_probe,
1141 .remove = __devexit_p(vhci_hcd_remove),
1142 .suspend = vhci_hcd_suspend,
1143 .resume = vhci_hcd_resume,
1144 .driver = {
1145 .name = (char *) driver_name,
1146 .owner = THIS_MODULE,
1147 },
1148};
1149
1150
1151
1152
1153
1154
1155static void the_pdev_release(struct device *dev)
1156{
1157 return;
1158}
1159
1160static struct platform_device the_pdev = {
1161
1162 .name = (char *) driver_name,
1163 .id = -1,
1164 .dev = {
1165
1166 .release = the_pdev_release,
1167 },
1168};
1169
1170static int __init vhci_hcd_init(void)
1171{
1172 int ret;
1173
1174 if (usb_disabled())
1175 return -ENODEV;
1176
1177 ret = platform_driver_register(&vhci_driver);
1178 if (ret < 0)
1179 goto err_driver_register;
1180
1181 ret = platform_device_register(&the_pdev);
1182 if (ret < 0)
1183 goto err_platform_device_register;
1184
1185 pr_info(DRIVER_DESC " v" USBIP_VERSION "\n");
1186 return ret;
1187
1188err_platform_device_register:
1189 platform_driver_unregister(&vhci_driver);
1190err_driver_register:
1191 return ret;
1192}
1193
1194static void __exit vhci_hcd_exit(void)
1195{
1196 platform_device_unregister(&the_pdev);
1197 platform_driver_unregister(&vhci_driver);
1198}
1199
1200module_init(vhci_hcd_init);
1201module_exit(vhci_hcd_exit);
1202
1203MODULE_AUTHOR(DRIVER_AUTHOR);
1204MODULE_DESCRIPTION(DRIVER_DESC);
1205MODULE_LICENSE("GPL");
1206MODULE_VERSION(USBIP_VERSION);
1207