1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#include <linux/module.h>
29#include <linux/kernel.h>
30#include <linux/delay.h>
31#include <linux/ioport.h>
32#include <linux/slab.h>
33#include <linux/errno.h>
34#include <linux/init.h>
35#include <linux/timer.h>
36#include <linux/list.h>
37#include <linux/interrupt.h>
38#include <linux/platform_device.h>
39#include <linux/usb.h>
40#include <linux/usb/gadget.h>
41#include <linux/usb/hcd.h>
42#include <linux/scatterlist.h>
43
44#include <asm/byteorder.h>
45#include <linux/io.h>
46#include <asm/irq.h>
47#include <asm/unaligned.h>
48
49#define DRIVER_DESC "USB Host+Gadget Emulator"
50#define DRIVER_VERSION "02 May 2005"
51
52#define POWER_BUDGET 500
53
54static const char driver_name[] = "dummy_hcd";
55static const char driver_desc[] = "USB Host+Gadget Emulator";
56
57static const char gadget_name[] = "dummy_udc";
58
59MODULE_DESCRIPTION(DRIVER_DESC);
60MODULE_AUTHOR("David Brownell");
61MODULE_LICENSE("GPL");
62
63struct dummy_hcd_module_parameters {
64 bool is_super_speed;
65 bool is_high_speed;
66 unsigned int num;
67};
68
69static struct dummy_hcd_module_parameters mod_data = {
70 .is_super_speed = false,
71 .is_high_speed = true,
72 .num = 1,
73};
74module_param_named(is_super_speed, mod_data.is_super_speed, bool, S_IRUGO);
75MODULE_PARM_DESC(is_super_speed, "true to simulate SuperSpeed connection");
76module_param_named(is_high_speed, mod_data.is_high_speed, bool, S_IRUGO);
77MODULE_PARM_DESC(is_high_speed, "true to simulate HighSpeed connection");
78module_param_named(num, mod_data.num, uint, S_IRUGO);
79MODULE_PARM_DESC(num, "number of emulated controllers");
80
81
82
83struct dummy_ep {
84 struct list_head queue;
85 unsigned long last_io;
86 struct usb_gadget *gadget;
87 const struct usb_endpoint_descriptor *desc;
88 struct usb_ep ep;
89 unsigned halted:1;
90 unsigned wedged:1;
91 unsigned already_seen:1;
92 unsigned setup_stage:1;
93 unsigned stream_en:1;
94};
95
96struct dummy_request {
97 struct list_head queue;
98 struct usb_request req;
99};
100
101static inline struct dummy_ep *usb_ep_to_dummy_ep(struct usb_ep *_ep)
102{
103 return container_of(_ep, struct dummy_ep, ep);
104}
105
106static inline struct dummy_request *usb_request_to_dummy_request
107 (struct usb_request *_req)
108{
109 return container_of(_req, struct dummy_request, req);
110}
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128static const char ep0name[] = "ep0";
129
130static const struct {
131 const char *name;
132 const struct usb_ep_caps caps;
133} ep_info[] = {
134#define EP_INFO(_name, _caps) \
135 { \
136 .name = _name, \
137 .caps = _caps, \
138 }
139
140
141 EP_INFO(ep0name,
142 USB_EP_CAPS(USB_EP_CAPS_TYPE_CONTROL, USB_EP_CAPS_DIR_ALL)),
143
144 EP_INFO("ep1in-bulk",
145 USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
146 EP_INFO("ep2out-bulk",
147 USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
148 EP_INFO("ep3in-iso",
149 USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_IN)),
150 EP_INFO("ep4out-iso",
151 USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_OUT)),
152 EP_INFO("ep5in-int",
153 USB_EP_CAPS(USB_EP_CAPS_TYPE_INT, USB_EP_CAPS_DIR_IN)),
154 EP_INFO("ep6in-bulk",
155 USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
156 EP_INFO("ep7out-bulk",
157 USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
158 EP_INFO("ep8in-iso",
159 USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_IN)),
160 EP_INFO("ep9out-iso",
161 USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_OUT)),
162 EP_INFO("ep10in-int",
163 USB_EP_CAPS(USB_EP_CAPS_TYPE_INT, USB_EP_CAPS_DIR_IN)),
164 EP_INFO("ep11in-bulk",
165 USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
166 EP_INFO("ep12out-bulk",
167 USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
168 EP_INFO("ep13in-iso",
169 USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_IN)),
170 EP_INFO("ep14out-iso",
171 USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_OUT)),
172 EP_INFO("ep15in-int",
173 USB_EP_CAPS(USB_EP_CAPS_TYPE_INT, USB_EP_CAPS_DIR_IN)),
174
175 EP_INFO("ep1out-bulk",
176 USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
177 EP_INFO("ep2in-bulk",
178 USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
179
180 EP_INFO("ep3out",
181 USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
182 EP_INFO("ep4in",
183 USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_IN)),
184 EP_INFO("ep5out",
185 USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
186 EP_INFO("ep6out",
187 USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
188 EP_INFO("ep7in",
189 USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_IN)),
190 EP_INFO("ep8out",
191 USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
192 EP_INFO("ep9in",
193 USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_IN)),
194 EP_INFO("ep10out",
195 USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
196 EP_INFO("ep11out",
197 USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
198 EP_INFO("ep12in",
199 USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_IN)),
200 EP_INFO("ep13out",
201 USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
202 EP_INFO("ep14in",
203 USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_IN)),
204 EP_INFO("ep15out",
205 USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
206
207#undef EP_INFO
208};
209
210#define DUMMY_ENDPOINTS ARRAY_SIZE(ep_info)
211
212
213
214#define FIFO_SIZE 64
215
216struct urbp {
217 struct urb *urb;
218 struct list_head urbp_list;
219 struct sg_mapping_iter miter;
220 u32 miter_started;
221};
222
223
224enum dummy_rh_state {
225 DUMMY_RH_RESET,
226 DUMMY_RH_SUSPENDED,
227 DUMMY_RH_RUNNING
228};
229
230struct dummy_hcd {
231 struct dummy *dum;
232 enum dummy_rh_state rh_state;
233 struct timer_list timer;
234 u32 port_status;
235 u32 old_status;
236 unsigned long re_timeout;
237
238 struct usb_device *udev;
239 struct list_head urbp_list;
240 struct urbp *next_frame_urbp;
241
242 u32 stream_en_ep;
243 u8 num_stream[30 / 2];
244
245 unsigned active:1;
246 unsigned old_active:1;
247 unsigned resuming:1;
248};
249
250struct dummy {
251 spinlock_t lock;
252
253
254
255
256 struct dummy_ep ep[DUMMY_ENDPOINTS];
257 int address;
258 int callback_usage;
259 struct usb_gadget gadget;
260 struct usb_gadget_driver *driver;
261 struct dummy_request fifo_req;
262 u8 fifo_buf[FIFO_SIZE];
263 u16 devstatus;
264 unsigned ints_enabled:1;
265 unsigned udc_suspended:1;
266 unsigned pullup:1;
267
268
269
270
271 struct dummy_hcd *hs_hcd;
272 struct dummy_hcd *ss_hcd;
273};
274
275static inline struct dummy_hcd *hcd_to_dummy_hcd(struct usb_hcd *hcd)
276{
277 return (struct dummy_hcd *) (hcd->hcd_priv);
278}
279
280static inline struct usb_hcd *dummy_hcd_to_hcd(struct dummy_hcd *dum)
281{
282 return container_of((void *) dum, struct usb_hcd, hcd_priv);
283}
284
285static inline struct device *dummy_dev(struct dummy_hcd *dum)
286{
287 return dummy_hcd_to_hcd(dum)->self.controller;
288}
289
290static inline struct device *udc_dev(struct dummy *dum)
291{
292 return dum->gadget.dev.parent;
293}
294
295static inline struct dummy *ep_to_dummy(struct dummy_ep *ep)
296{
297 return container_of(ep->gadget, struct dummy, gadget);
298}
299
300static inline struct dummy_hcd *gadget_to_dummy_hcd(struct usb_gadget *gadget)
301{
302 struct dummy *dum = container_of(gadget, struct dummy, gadget);
303 if (dum->gadget.speed == USB_SPEED_SUPER)
304 return dum->ss_hcd;
305 else
306 return dum->hs_hcd;
307}
308
309static inline struct dummy *gadget_dev_to_dummy(struct device *dev)
310{
311 return container_of(dev, struct dummy, gadget.dev);
312}
313
314
315
316
317
318
319static void nuke(struct dummy *dum, struct dummy_ep *ep)
320{
321 while (!list_empty(&ep->queue)) {
322 struct dummy_request *req;
323
324 req = list_entry(ep->queue.next, struct dummy_request, queue);
325 list_del_init(&req->queue);
326 req->req.status = -ESHUTDOWN;
327
328 spin_unlock(&dum->lock);
329 usb_gadget_giveback_request(&ep->ep, &req->req);
330 spin_lock(&dum->lock);
331 }
332}
333
334
335static void stop_activity(struct dummy *dum)
336{
337 int i;
338
339
340 dum->address = 0;
341
342
343
344
345 for (i = 0; i < DUMMY_ENDPOINTS; ++i)
346 nuke(dum, &dum->ep[i]);
347
348
349}
350
351
352
353
354
355
356
357
358
359static void set_link_state_by_speed(struct dummy_hcd *dum_hcd)
360{
361 struct dummy *dum = dum_hcd->dum;
362
363 if (dummy_hcd_to_hcd(dum_hcd)->speed == HCD_USB3) {
364 if ((dum_hcd->port_status & USB_SS_PORT_STAT_POWER) == 0) {
365 dum_hcd->port_status = 0;
366 } else if (!dum->pullup || dum->udc_suspended) {
367
368 dum_hcd->port_status &= ~(USB_PORT_STAT_CONNECTION |
369 USB_PORT_STAT_ENABLE);
370 if ((dum_hcd->old_status &
371 USB_PORT_STAT_CONNECTION) != 0)
372 dum_hcd->port_status |=
373 (USB_PORT_STAT_C_CONNECTION << 16);
374 } else {
375
376 dum_hcd->port_status |= (USB_PORT_STAT_CONNECTION |
377 USB_PORT_STAT_SPEED_5GBPS) ;
378 if ((dum_hcd->old_status &
379 USB_PORT_STAT_CONNECTION) == 0)
380 dum_hcd->port_status |=
381 (USB_PORT_STAT_C_CONNECTION << 16);
382 if ((dum_hcd->port_status & USB_PORT_STAT_ENABLE) &&
383 (dum_hcd->port_status &
384 USB_PORT_STAT_LINK_STATE) == USB_SS_PORT_LS_U0 &&
385 dum_hcd->rh_state != DUMMY_RH_SUSPENDED)
386 dum_hcd->active = 1;
387 }
388 } else {
389 if ((dum_hcd->port_status & USB_PORT_STAT_POWER) == 0) {
390 dum_hcd->port_status = 0;
391 } else if (!dum->pullup || dum->udc_suspended) {
392
393 dum_hcd->port_status &= ~(USB_PORT_STAT_CONNECTION |
394 USB_PORT_STAT_ENABLE |
395 USB_PORT_STAT_LOW_SPEED |
396 USB_PORT_STAT_HIGH_SPEED |
397 USB_PORT_STAT_SUSPEND);
398 if ((dum_hcd->old_status &
399 USB_PORT_STAT_CONNECTION) != 0)
400 dum_hcd->port_status |=
401 (USB_PORT_STAT_C_CONNECTION << 16);
402 } else {
403 dum_hcd->port_status |= USB_PORT_STAT_CONNECTION;
404 if ((dum_hcd->old_status &
405 USB_PORT_STAT_CONNECTION) == 0)
406 dum_hcd->port_status |=
407 (USB_PORT_STAT_C_CONNECTION << 16);
408 if ((dum_hcd->port_status & USB_PORT_STAT_ENABLE) == 0)
409 dum_hcd->port_status &= ~USB_PORT_STAT_SUSPEND;
410 else if ((dum_hcd->port_status &
411 USB_PORT_STAT_SUSPEND) == 0 &&
412 dum_hcd->rh_state != DUMMY_RH_SUSPENDED)
413 dum_hcd->active = 1;
414 }
415 }
416}
417
418
419static void set_link_state(struct dummy_hcd *dum_hcd)
420{
421 struct dummy *dum = dum_hcd->dum;
422 unsigned int power_bit;
423
424 dum_hcd->active = 0;
425 if (dum->pullup)
426 if ((dummy_hcd_to_hcd(dum_hcd)->speed == HCD_USB3 &&
427 dum->gadget.speed != USB_SPEED_SUPER) ||
428 (dummy_hcd_to_hcd(dum_hcd)->speed != HCD_USB3 &&
429 dum->gadget.speed == USB_SPEED_SUPER))
430 return;
431
432 set_link_state_by_speed(dum_hcd);
433 power_bit = (dummy_hcd_to_hcd(dum_hcd)->speed == HCD_USB3 ?
434 USB_SS_PORT_STAT_POWER : USB_PORT_STAT_POWER);
435
436 if ((dum_hcd->port_status & USB_PORT_STAT_ENABLE) == 0 ||
437 dum_hcd->active)
438 dum_hcd->resuming = 0;
439
440
441 if ((dum_hcd->port_status & power_bit) == 0 ||
442 (dum_hcd->port_status & USB_PORT_STAT_RESET) != 0) {
443 unsigned int disconnect = power_bit &
444 dum_hcd->old_status & (~dum_hcd->port_status);
445 unsigned int reset = USB_PORT_STAT_RESET &
446 (~dum_hcd->old_status) & dum_hcd->port_status;
447
448
449 if (dum->ints_enabled && (disconnect || reset)) {
450 stop_activity(dum);
451 ++dum->callback_usage;
452 spin_unlock(&dum->lock);
453 if (reset)
454 usb_gadget_udc_reset(&dum->gadget, dum->driver);
455 else
456 dum->driver->disconnect(&dum->gadget);
457 spin_lock(&dum->lock);
458 --dum->callback_usage;
459 }
460 } else if (dum_hcd->active != dum_hcd->old_active &&
461 dum->ints_enabled) {
462 ++dum->callback_usage;
463 spin_unlock(&dum->lock);
464 if (dum_hcd->old_active && dum->driver->suspend)
465 dum->driver->suspend(&dum->gadget);
466 else if (!dum_hcd->old_active && dum->driver->resume)
467 dum->driver->resume(&dum->gadget);
468 spin_lock(&dum->lock);
469 --dum->callback_usage;
470 }
471
472 dum_hcd->old_status = dum_hcd->port_status;
473 dum_hcd->old_active = dum_hcd->active;
474}
475
476
477
478
479
480
481
482
483
484
485#define is_enabled(dum) \
486 (dum->port_status & USB_PORT_STAT_ENABLE)
487
488static int dummy_enable(struct usb_ep *_ep,
489 const struct usb_endpoint_descriptor *desc)
490{
491 struct dummy *dum;
492 struct dummy_hcd *dum_hcd;
493 struct dummy_ep *ep;
494 unsigned max;
495 int retval;
496
497 ep = usb_ep_to_dummy_ep(_ep);
498 if (!_ep || !desc || ep->desc || _ep->name == ep0name
499 || desc->bDescriptorType != USB_DT_ENDPOINT)
500 return -EINVAL;
501 dum = ep_to_dummy(ep);
502 if (!dum->driver)
503 return -ESHUTDOWN;
504
505 dum_hcd = gadget_to_dummy_hcd(&dum->gadget);
506 if (!is_enabled(dum_hcd))
507 return -ESHUTDOWN;
508
509
510
511
512
513
514 max = usb_endpoint_maxp(desc);
515
516
517
518
519
520
521
522
523
524 retval = -EINVAL;
525 switch (usb_endpoint_type(desc)) {
526 case USB_ENDPOINT_XFER_BULK:
527 if (strstr(ep->ep.name, "-iso")
528 || strstr(ep->ep.name, "-int")) {
529 goto done;
530 }
531 switch (dum->gadget.speed) {
532 case USB_SPEED_SUPER:
533 if (max == 1024)
534 break;
535 goto done;
536 case USB_SPEED_HIGH:
537 if (max == 512)
538 break;
539 goto done;
540 case USB_SPEED_FULL:
541 if (max == 8 || max == 16 || max == 32 || max == 64)
542
543 break;
544
545 default:
546 goto done;
547 }
548 break;
549 case USB_ENDPOINT_XFER_INT:
550 if (strstr(ep->ep.name, "-iso"))
551 goto done;
552
553 switch (dum->gadget.speed) {
554 case USB_SPEED_SUPER:
555 case USB_SPEED_HIGH:
556 if (max <= 1024)
557 break;
558
559 case USB_SPEED_FULL:
560 if (max <= 64)
561 break;
562
563 default:
564 if (max <= 8)
565 break;
566 goto done;
567 }
568 break;
569 case USB_ENDPOINT_XFER_ISOC:
570 if (strstr(ep->ep.name, "-bulk")
571 || strstr(ep->ep.name, "-int"))
572 goto done;
573
574 switch (dum->gadget.speed) {
575 case USB_SPEED_SUPER:
576 case USB_SPEED_HIGH:
577 if (max <= 1024)
578 break;
579
580 case USB_SPEED_FULL:
581 if (max <= 1023)
582 break;
583
584 default:
585 goto done;
586 }
587 break;
588 default:
589
590 goto done;
591 }
592
593 _ep->maxpacket = max;
594 if (usb_ss_max_streams(_ep->comp_desc)) {
595 if (!usb_endpoint_xfer_bulk(desc)) {
596 dev_err(udc_dev(dum), "Can't enable stream support on "
597 "non-bulk ep %s\n", _ep->name);
598 return -EINVAL;
599 }
600 ep->stream_en = 1;
601 }
602 ep->desc = desc;
603
604 dev_dbg(udc_dev(dum), "enabled %s (ep%d%s-%s) maxpacket %d stream %s\n",
605 _ep->name,
606 desc->bEndpointAddress & 0x0f,
607 (desc->bEndpointAddress & USB_DIR_IN) ? "in" : "out",
608 ({ char *val;
609 switch (usb_endpoint_type(desc)) {
610 case USB_ENDPOINT_XFER_BULK:
611 val = "bulk";
612 break;
613 case USB_ENDPOINT_XFER_ISOC:
614 val = "iso";
615 break;
616 case USB_ENDPOINT_XFER_INT:
617 val = "intr";
618 break;
619 default:
620 val = "ctrl";
621 break;
622 } val; }),
623 max, ep->stream_en ? "enabled" : "disabled");
624
625
626
627
628 ep->halted = ep->wedged = 0;
629 retval = 0;
630done:
631 return retval;
632}
633
634static int dummy_disable(struct usb_ep *_ep)
635{
636 struct dummy_ep *ep;
637 struct dummy *dum;
638 unsigned long flags;
639
640 ep = usb_ep_to_dummy_ep(_ep);
641 if (!_ep || !ep->desc || _ep->name == ep0name)
642 return -EINVAL;
643 dum = ep_to_dummy(ep);
644
645 spin_lock_irqsave(&dum->lock, flags);
646 ep->desc = NULL;
647 ep->stream_en = 0;
648 nuke(dum, ep);
649 spin_unlock_irqrestore(&dum->lock, flags);
650
651 dev_dbg(udc_dev(dum), "disabled %s\n", _ep->name);
652 return 0;
653}
654
655static struct usb_request *dummy_alloc_request(struct usb_ep *_ep,
656 gfp_t mem_flags)
657{
658 struct dummy_request *req;
659
660 if (!_ep)
661 return NULL;
662
663 req = kzalloc(sizeof(*req), mem_flags);
664 if (!req)
665 return NULL;
666 INIT_LIST_HEAD(&req->queue);
667 return &req->req;
668}
669
670static void dummy_free_request(struct usb_ep *_ep, struct usb_request *_req)
671{
672 struct dummy_request *req;
673
674 if (!_ep || !_req) {
675 WARN_ON(1);
676 return;
677 }
678
679 req = usb_request_to_dummy_request(_req);
680 WARN_ON(!list_empty(&req->queue));
681 kfree(req);
682}
683
684static void fifo_complete(struct usb_ep *ep, struct usb_request *req)
685{
686}
687
688static int dummy_queue(struct usb_ep *_ep, struct usb_request *_req,
689 gfp_t mem_flags)
690{
691 struct dummy_ep *ep;
692 struct dummy_request *req;
693 struct dummy *dum;
694 struct dummy_hcd *dum_hcd;
695 unsigned long flags;
696
697 req = usb_request_to_dummy_request(_req);
698 if (!_req || !list_empty(&req->queue) || !_req->complete)
699 return -EINVAL;
700
701 ep = usb_ep_to_dummy_ep(_ep);
702 if (!_ep || (!ep->desc && _ep->name != ep0name))
703 return -EINVAL;
704
705 dum = ep_to_dummy(ep);
706 dum_hcd = gadget_to_dummy_hcd(&dum->gadget);
707 if (!dum->driver || !is_enabled(dum_hcd))
708 return -ESHUTDOWN;
709
710#if 0
711 dev_dbg(udc_dev(dum), "ep %p queue req %p to %s, len %d buf %p\n",
712 ep, _req, _ep->name, _req->length, _req->buf);
713#endif
714 _req->status = -EINPROGRESS;
715 _req->actual = 0;
716 spin_lock_irqsave(&dum->lock, flags);
717
718
719 if (ep->desc && (ep->desc->bEndpointAddress & USB_DIR_IN) &&
720 list_empty(&dum->fifo_req.queue) &&
721 list_empty(&ep->queue) &&
722 _req->length <= FIFO_SIZE) {
723 req = &dum->fifo_req;
724 req->req = *_req;
725 req->req.buf = dum->fifo_buf;
726 memcpy(dum->fifo_buf, _req->buf, _req->length);
727 req->req.context = dum;
728 req->req.complete = fifo_complete;
729
730 list_add_tail(&req->queue, &ep->queue);
731 spin_unlock(&dum->lock);
732 _req->actual = _req->length;
733 _req->status = 0;
734 usb_gadget_giveback_request(_ep, _req);
735 spin_lock(&dum->lock);
736 } else
737 list_add_tail(&req->queue, &ep->queue);
738 spin_unlock_irqrestore(&dum->lock, flags);
739
740
741
742
743 return 0;
744}
745
746static int dummy_dequeue(struct usb_ep *_ep, struct usb_request *_req)
747{
748 struct dummy_ep *ep;
749 struct dummy *dum;
750 int retval = -EINVAL;
751 unsigned long flags;
752 struct dummy_request *req = NULL;
753
754 if (!_ep || !_req)
755 return retval;
756 ep = usb_ep_to_dummy_ep(_ep);
757 dum = ep_to_dummy(ep);
758
759 if (!dum->driver)
760 return -ESHUTDOWN;
761
762 local_irq_save(flags);
763 spin_lock(&dum->lock);
764 list_for_each_entry(req, &ep->queue, queue) {
765 if (&req->req == _req) {
766 list_del_init(&req->queue);
767 _req->status = -ECONNRESET;
768 retval = 0;
769 break;
770 }
771 }
772 spin_unlock(&dum->lock);
773
774 if (retval == 0) {
775 dev_dbg(udc_dev(dum),
776 "dequeued req %p from %s, len %d buf %p\n",
777 req, _ep->name, _req->length, _req->buf);
778 usb_gadget_giveback_request(_ep, _req);
779 }
780 local_irq_restore(flags);
781 return retval;
782}
783
784static int
785dummy_set_halt_and_wedge(struct usb_ep *_ep, int value, int wedged)
786{
787 struct dummy_ep *ep;
788 struct dummy *dum;
789
790 if (!_ep)
791 return -EINVAL;
792 ep = usb_ep_to_dummy_ep(_ep);
793 dum = ep_to_dummy(ep);
794 if (!dum->driver)
795 return -ESHUTDOWN;
796 if (!value)
797 ep->halted = ep->wedged = 0;
798 else if (ep->desc && (ep->desc->bEndpointAddress & USB_DIR_IN) &&
799 !list_empty(&ep->queue))
800 return -EAGAIN;
801 else {
802 ep->halted = 1;
803 if (wedged)
804 ep->wedged = 1;
805 }
806
807 return 0;
808}
809
810static int
811dummy_set_halt(struct usb_ep *_ep, int value)
812{
813 return dummy_set_halt_and_wedge(_ep, value, 0);
814}
815
816static int dummy_set_wedge(struct usb_ep *_ep)
817{
818 if (!_ep || _ep->name == ep0name)
819 return -EINVAL;
820 return dummy_set_halt_and_wedge(_ep, 1, 1);
821}
822
823static const struct usb_ep_ops dummy_ep_ops = {
824 .enable = dummy_enable,
825 .disable = dummy_disable,
826
827 .alloc_request = dummy_alloc_request,
828 .free_request = dummy_free_request,
829
830 .queue = dummy_queue,
831 .dequeue = dummy_dequeue,
832
833 .set_halt = dummy_set_halt,
834 .set_wedge = dummy_set_wedge,
835};
836
837
838
839
840static int dummy_g_get_frame(struct usb_gadget *_gadget)
841{
842 struct timespec64 ts64;
843
844 ktime_get_ts64(&ts64);
845 return ts64.tv_nsec / NSEC_PER_MSEC;
846}
847
848static int dummy_wakeup(struct usb_gadget *_gadget)
849{
850 struct dummy_hcd *dum_hcd;
851
852 dum_hcd = gadget_to_dummy_hcd(_gadget);
853 if (!(dum_hcd->dum->devstatus & ((1 << USB_DEVICE_B_HNP_ENABLE)
854 | (1 << USB_DEVICE_REMOTE_WAKEUP))))
855 return -EINVAL;
856 if ((dum_hcd->port_status & USB_PORT_STAT_CONNECTION) == 0)
857 return -ENOLINK;
858 if ((dum_hcd->port_status & USB_PORT_STAT_SUSPEND) == 0 &&
859 dum_hcd->rh_state != DUMMY_RH_SUSPENDED)
860 return -EIO;
861
862
863
864
865 dum_hcd->resuming = 1;
866 dum_hcd->re_timeout = jiffies + msecs_to_jiffies(20);
867 mod_timer(&dummy_hcd_to_hcd(dum_hcd)->rh_timer, dum_hcd->re_timeout);
868 return 0;
869}
870
871static int dummy_set_selfpowered(struct usb_gadget *_gadget, int value)
872{
873 struct dummy *dum;
874
875 _gadget->is_selfpowered = (value != 0);
876 dum = gadget_to_dummy_hcd(_gadget)->dum;
877 if (value)
878 dum->devstatus |= (1 << USB_DEVICE_SELF_POWERED);
879 else
880 dum->devstatus &= ~(1 << USB_DEVICE_SELF_POWERED);
881 return 0;
882}
883
884static void dummy_udc_update_ep0(struct dummy *dum)
885{
886 if (dum->gadget.speed == USB_SPEED_SUPER)
887 dum->ep[0].ep.maxpacket = 9;
888 else
889 dum->ep[0].ep.maxpacket = 64;
890}
891
892static int dummy_pullup(struct usb_gadget *_gadget, int value)
893{
894 struct dummy_hcd *dum_hcd;
895 struct dummy *dum;
896 unsigned long flags;
897
898 dum = gadget_dev_to_dummy(&_gadget->dev);
899 dum_hcd = gadget_to_dummy_hcd(_gadget);
900
901 spin_lock_irqsave(&dum->lock, flags);
902 dum->pullup = (value != 0);
903 set_link_state(dum_hcd);
904 spin_unlock_irqrestore(&dum->lock, flags);
905
906 usb_hcd_poll_rh_status(dummy_hcd_to_hcd(dum_hcd));
907 return 0;
908}
909
910static void dummy_udc_set_speed(struct usb_gadget *_gadget,
911 enum usb_device_speed speed)
912{
913 struct dummy *dum;
914
915 dum = gadget_dev_to_dummy(&_gadget->dev);
916
917 if (mod_data.is_super_speed)
918 dum->gadget.speed = min_t(u8, USB_SPEED_SUPER, speed);
919 else if (mod_data.is_high_speed)
920 dum->gadget.speed = min_t(u8, USB_SPEED_HIGH, speed);
921 else
922 dum->gadget.speed = USB_SPEED_FULL;
923
924 dummy_udc_update_ep0(dum);
925
926 if (dum->gadget.speed < speed)
927 dev_dbg(udc_dev(dum), "This device can perform faster"
928 " if you connect it to a %s port...\n",
929 usb_speed_string(speed));
930}
931
932static int dummy_udc_start(struct usb_gadget *g,
933 struct usb_gadget_driver *driver);
934static int dummy_udc_stop(struct usb_gadget *g);
935
936static const struct usb_gadget_ops dummy_ops = {
937 .get_frame = dummy_g_get_frame,
938 .wakeup = dummy_wakeup,
939 .set_selfpowered = dummy_set_selfpowered,
940 .pullup = dummy_pullup,
941 .udc_start = dummy_udc_start,
942 .udc_stop = dummy_udc_stop,
943 .udc_set_speed = dummy_udc_set_speed,
944};
945
946
947
948
949static ssize_t function_show(struct device *dev, struct device_attribute *attr,
950 char *buf)
951{
952 struct dummy *dum = gadget_dev_to_dummy(dev);
953
954 if (!dum->driver || !dum->driver->function)
955 return 0;
956 return scnprintf(buf, PAGE_SIZE, "%s\n", dum->driver->function);
957}
958static DEVICE_ATTR_RO(function);
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976static int dummy_udc_start(struct usb_gadget *g,
977 struct usb_gadget_driver *driver)
978{
979 struct dummy_hcd *dum_hcd = gadget_to_dummy_hcd(g);
980 struct dummy *dum = dum_hcd->dum;
981
982 if (driver->max_speed == USB_SPEED_UNKNOWN)
983 return -EINVAL;
984
985
986
987
988
989
990 spin_lock_irq(&dum->lock);
991 dum->devstatus = 0;
992 dum->driver = driver;
993 dum->ints_enabled = 1;
994 spin_unlock_irq(&dum->lock);
995
996 return 0;
997}
998
999static int dummy_udc_stop(struct usb_gadget *g)
1000{
1001 struct dummy_hcd *dum_hcd = gadget_to_dummy_hcd(g);
1002 struct dummy *dum = dum_hcd->dum;
1003
1004 spin_lock_irq(&dum->lock);
1005 dum->ints_enabled = 0;
1006 stop_activity(dum);
1007
1008
1009 while (dum->callback_usage > 0) {
1010 spin_unlock_irq(&dum->lock);
1011 usleep_range(1000, 2000);
1012 spin_lock_irq(&dum->lock);
1013 }
1014
1015 dum->driver = NULL;
1016 spin_unlock_irq(&dum->lock);
1017
1018 return 0;
1019}
1020
1021#undef is_enabled
1022
1023
1024
1025static void init_dummy_udc_hw(struct dummy *dum)
1026{
1027 int i;
1028
1029 INIT_LIST_HEAD(&dum->gadget.ep_list);
1030 for (i = 0; i < DUMMY_ENDPOINTS; i++) {
1031 struct dummy_ep *ep = &dum->ep[i];
1032
1033 if (!ep_info[i].name)
1034 break;
1035 ep->ep.name = ep_info[i].name;
1036 ep->ep.caps = ep_info[i].caps;
1037 ep->ep.ops = &dummy_ep_ops;
1038 list_add_tail(&ep->ep.ep_list, &dum->gadget.ep_list);
1039 ep->halted = ep->wedged = ep->already_seen =
1040 ep->setup_stage = 0;
1041 usb_ep_set_maxpacket_limit(&ep->ep, ~0);
1042 ep->ep.max_streams = 16;
1043 ep->last_io = jiffies;
1044 ep->gadget = &dum->gadget;
1045 ep->desc = NULL;
1046 INIT_LIST_HEAD(&ep->queue);
1047 }
1048
1049 dum->gadget.ep0 = &dum->ep[0].ep;
1050 list_del_init(&dum->ep[0].ep.ep_list);
1051 INIT_LIST_HEAD(&dum->fifo_req.queue);
1052
1053#ifdef CONFIG_USB_OTG
1054 dum->gadget.is_otg = 1;
1055#endif
1056}
1057
1058static int dummy_udc_probe(struct platform_device *pdev)
1059{
1060 struct dummy *dum;
1061 int rc;
1062
1063 dum = *((void **)dev_get_platdata(&pdev->dev));
1064
1065 memzero_explicit(&dum->gadget, sizeof(struct usb_gadget));
1066 dum->gadget.name = gadget_name;
1067 dum->gadget.ops = &dummy_ops;
1068 if (mod_data.is_super_speed)
1069 dum->gadget.max_speed = USB_SPEED_SUPER;
1070 else if (mod_data.is_high_speed)
1071 dum->gadget.max_speed = USB_SPEED_HIGH;
1072 else
1073 dum->gadget.max_speed = USB_SPEED_FULL;
1074
1075 dum->gadget.dev.parent = &pdev->dev;
1076 init_dummy_udc_hw(dum);
1077
1078 rc = usb_add_gadget_udc(&pdev->dev, &dum->gadget);
1079 if (rc < 0)
1080 goto err_udc;
1081
1082 rc = device_create_file(&dum->gadget.dev, &dev_attr_function);
1083 if (rc < 0)
1084 goto err_dev;
1085 platform_set_drvdata(pdev, dum);
1086 return rc;
1087
1088err_dev:
1089 usb_del_gadget_udc(&dum->gadget);
1090err_udc:
1091 return rc;
1092}
1093
1094static int dummy_udc_remove(struct platform_device *pdev)
1095{
1096 struct dummy *dum = platform_get_drvdata(pdev);
1097
1098 device_remove_file(&dum->gadget.dev, &dev_attr_function);
1099 usb_del_gadget_udc(&dum->gadget);
1100 return 0;
1101}
1102
1103static void dummy_udc_pm(struct dummy *dum, struct dummy_hcd *dum_hcd,
1104 int suspend)
1105{
1106 spin_lock_irq(&dum->lock);
1107 dum->udc_suspended = suspend;
1108 set_link_state(dum_hcd);
1109 spin_unlock_irq(&dum->lock);
1110}
1111
1112static int dummy_udc_suspend(struct platform_device *pdev, pm_message_t state)
1113{
1114 struct dummy *dum = platform_get_drvdata(pdev);
1115 struct dummy_hcd *dum_hcd = gadget_to_dummy_hcd(&dum->gadget);
1116
1117 dev_dbg(&pdev->dev, "%s\n", __func__);
1118 dummy_udc_pm(dum, dum_hcd, 1);
1119 usb_hcd_poll_rh_status(dummy_hcd_to_hcd(dum_hcd));
1120 return 0;
1121}
1122
1123static int dummy_udc_resume(struct platform_device *pdev)
1124{
1125 struct dummy *dum = platform_get_drvdata(pdev);
1126 struct dummy_hcd *dum_hcd = gadget_to_dummy_hcd(&dum->gadget);
1127
1128 dev_dbg(&pdev->dev, "%s\n", __func__);
1129 dummy_udc_pm(dum, dum_hcd, 0);
1130 usb_hcd_poll_rh_status(dummy_hcd_to_hcd(dum_hcd));
1131 return 0;
1132}
1133
1134static struct platform_driver dummy_udc_driver = {
1135 .probe = dummy_udc_probe,
1136 .remove = dummy_udc_remove,
1137 .suspend = dummy_udc_suspend,
1138 .resume = dummy_udc_resume,
1139 .driver = {
1140 .name = (char *) gadget_name,
1141 },
1142};
1143
1144
1145
1146static unsigned int dummy_get_ep_idx(const struct usb_endpoint_descriptor *desc)
1147{
1148 unsigned int index;
1149
1150 index = usb_endpoint_num(desc) << 1;
1151 if (usb_endpoint_dir_in(desc))
1152 index |= 1;
1153 return index;
1154}
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168static int dummy_ep_stream_en(struct dummy_hcd *dum_hcd, struct urb *urb)
1169{
1170 const struct usb_endpoint_descriptor *desc = &urb->ep->desc;
1171 u32 index;
1172
1173 if (!usb_endpoint_xfer_bulk(desc))
1174 return 0;
1175
1176 index = dummy_get_ep_idx(desc);
1177 return (1 << index) & dum_hcd->stream_en_ep;
1178}
1179
1180
1181
1182
1183
1184
1185
1186
1187static int get_max_streams_for_pipe(struct dummy_hcd *dum_hcd,
1188 unsigned int pipe)
1189{
1190 int max_streams;
1191
1192 max_streams = dum_hcd->num_stream[usb_pipeendpoint(pipe)];
1193 if (usb_pipeout(pipe))
1194 max_streams >>= 4;
1195 else
1196 max_streams &= 0xf;
1197 max_streams++;
1198 return max_streams;
1199}
1200
1201static void set_max_streams_for_pipe(struct dummy_hcd *dum_hcd,
1202 unsigned int pipe, unsigned int streams)
1203{
1204 int max_streams;
1205
1206 streams--;
1207 max_streams = dum_hcd->num_stream[usb_pipeendpoint(pipe)];
1208 if (usb_pipeout(pipe)) {
1209 streams <<= 4;
1210 max_streams &= 0xf;
1211 } else {
1212 max_streams &= 0xf0;
1213 }
1214 max_streams |= streams;
1215 dum_hcd->num_stream[usb_pipeendpoint(pipe)] = max_streams;
1216}
1217
1218static int dummy_validate_stream(struct dummy_hcd *dum_hcd, struct urb *urb)
1219{
1220 unsigned int max_streams;
1221 int enabled;
1222
1223 enabled = dummy_ep_stream_en(dum_hcd, urb);
1224 if (!urb->stream_id) {
1225 if (enabled)
1226 return -EINVAL;
1227 return 0;
1228 }
1229 if (!enabled)
1230 return -EINVAL;
1231
1232 max_streams = get_max_streams_for_pipe(dum_hcd,
1233 usb_pipeendpoint(urb->pipe));
1234 if (urb->stream_id > max_streams) {
1235 dev_err(dummy_dev(dum_hcd), "Stream id %d is out of range.\n",
1236 urb->stream_id);
1237 BUG();
1238 return -EINVAL;
1239 }
1240 return 0;
1241}
1242
1243static int dummy_urb_enqueue(
1244 struct usb_hcd *hcd,
1245 struct urb *urb,
1246 gfp_t mem_flags
1247) {
1248 struct dummy_hcd *dum_hcd;
1249 struct urbp *urbp;
1250 unsigned long flags;
1251 int rc;
1252
1253 urbp = kmalloc(sizeof *urbp, mem_flags);
1254 if (!urbp)
1255 return -ENOMEM;
1256 urbp->urb = urb;
1257 urbp->miter_started = 0;
1258
1259 dum_hcd = hcd_to_dummy_hcd(hcd);
1260 spin_lock_irqsave(&dum_hcd->dum->lock, flags);
1261
1262 rc = dummy_validate_stream(dum_hcd, urb);
1263 if (rc) {
1264 kfree(urbp);
1265 goto done;
1266 }
1267
1268 rc = usb_hcd_link_urb_to_ep(hcd, urb);
1269 if (rc) {
1270 kfree(urbp);
1271 goto done;
1272 }
1273
1274 if (!dum_hcd->udev) {
1275 dum_hcd->udev = urb->dev;
1276 usb_get_dev(dum_hcd->udev);
1277 } else if (unlikely(dum_hcd->udev != urb->dev))
1278 dev_err(dummy_dev(dum_hcd), "usb_device address has changed!\n");
1279
1280 list_add_tail(&urbp->urbp_list, &dum_hcd->urbp_list);
1281 urb->hcpriv = urbp;
1282 if (!dum_hcd->next_frame_urbp)
1283 dum_hcd->next_frame_urbp = urbp;
1284 if (usb_pipetype(urb->pipe) == PIPE_CONTROL)
1285 urb->error_count = 1;
1286
1287
1288 if (!timer_pending(&dum_hcd->timer))
1289 mod_timer(&dum_hcd->timer, jiffies + 1);
1290
1291 done:
1292 spin_unlock_irqrestore(&dum_hcd->dum->lock, flags);
1293 return rc;
1294}
1295
1296static int dummy_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
1297{
1298 struct dummy_hcd *dum_hcd;
1299 unsigned long flags;
1300 int rc;
1301
1302
1303
1304 dum_hcd = hcd_to_dummy_hcd(hcd);
1305 spin_lock_irqsave(&dum_hcd->dum->lock, flags);
1306
1307 rc = usb_hcd_check_unlink_urb(hcd, urb, status);
1308 if (!rc && dum_hcd->rh_state != DUMMY_RH_RUNNING &&
1309 !list_empty(&dum_hcd->urbp_list))
1310 mod_timer(&dum_hcd->timer, jiffies);
1311
1312 spin_unlock_irqrestore(&dum_hcd->dum->lock, flags);
1313 return rc;
1314}
1315
1316static int dummy_perform_transfer(struct urb *urb, struct dummy_request *req,
1317 u32 len)
1318{
1319 void *ubuf, *rbuf;
1320 struct urbp *urbp = urb->hcpriv;
1321 int to_host;
1322 struct sg_mapping_iter *miter = &urbp->miter;
1323 u32 trans = 0;
1324 u32 this_sg;
1325 bool next_sg;
1326
1327 to_host = usb_pipein(urb->pipe);
1328 rbuf = req->req.buf + req->req.actual;
1329
1330 if (!urb->num_sgs) {
1331 ubuf = urb->transfer_buffer + urb->actual_length;
1332 if (to_host)
1333 memcpy(ubuf, rbuf, len);
1334 else
1335 memcpy(rbuf, ubuf, len);
1336 return len;
1337 }
1338
1339 if (!urbp->miter_started) {
1340 u32 flags = SG_MITER_ATOMIC;
1341
1342 if (to_host)
1343 flags |= SG_MITER_TO_SG;
1344 else
1345 flags |= SG_MITER_FROM_SG;
1346
1347 sg_miter_start(miter, urb->sg, urb->num_sgs, flags);
1348 urbp->miter_started = 1;
1349 }
1350 next_sg = sg_miter_next(miter);
1351 if (next_sg == false) {
1352 WARN_ON_ONCE(1);
1353 return -EINVAL;
1354 }
1355 do {
1356 ubuf = miter->addr;
1357 this_sg = min_t(u32, len, miter->length);
1358 miter->consumed = this_sg;
1359 trans += this_sg;
1360
1361 if (to_host)
1362 memcpy(ubuf, rbuf, this_sg);
1363 else
1364 memcpy(rbuf, ubuf, this_sg);
1365 len -= this_sg;
1366
1367 if (!len)
1368 break;
1369 next_sg = sg_miter_next(miter);
1370 if (next_sg == false) {
1371 WARN_ON_ONCE(1);
1372 return -EINVAL;
1373 }
1374
1375 rbuf += this_sg;
1376 } while (1);
1377
1378 sg_miter_stop(miter);
1379 return trans;
1380}
1381
1382
1383static int transfer(struct dummy_hcd *dum_hcd, struct urb *urb,
1384 struct dummy_ep *ep, int limit, int *status)
1385{
1386 struct dummy *dum = dum_hcd->dum;
1387 struct dummy_request *req;
1388 int sent = 0;
1389
1390top:
1391
1392 list_for_each_entry(req, &ep->queue, queue) {
1393 unsigned host_len, dev_len, len;
1394 int is_short, to_host;
1395 int rescan = 0;
1396
1397 if (dummy_ep_stream_en(dum_hcd, urb)) {
1398 if ((urb->stream_id != req->req.stream_id))
1399 continue;
1400 }
1401
1402
1403
1404
1405
1406
1407
1408
1409 host_len = urb->transfer_buffer_length - urb->actual_length;
1410 dev_len = req->req.length - req->req.actual;
1411 len = min(host_len, dev_len);
1412
1413
1414
1415 to_host = usb_pipein(urb->pipe);
1416 if (unlikely(len == 0))
1417 is_short = 1;
1418 else {
1419
1420 if (limit < ep->ep.maxpacket && limit < len)
1421 break;
1422 len = min_t(unsigned, len, limit);
1423 if (len == 0)
1424 break;
1425
1426
1427 if (len >= ep->ep.maxpacket) {
1428 is_short = 0;
1429 if (len % ep->ep.maxpacket)
1430 rescan = 1;
1431 len -= len % ep->ep.maxpacket;
1432 } else {
1433 is_short = 1;
1434 }
1435
1436 len = dummy_perform_transfer(urb, req, len);
1437
1438 ep->last_io = jiffies;
1439 if ((int)len < 0) {
1440 req->req.status = len;
1441 } else {
1442 limit -= len;
1443 sent += len;
1444 urb->actual_length += len;
1445 req->req.actual += len;
1446 }
1447 }
1448
1449
1450
1451
1452
1453
1454
1455
1456 if (is_short) {
1457 if (host_len == dev_len) {
1458 req->req.status = 0;
1459 *status = 0;
1460 } else if (to_host) {
1461 req->req.status = 0;
1462 if (dev_len > host_len)
1463 *status = -EOVERFLOW;
1464 else
1465 *status = 0;
1466 } else {
1467 *status = 0;
1468 if (host_len > dev_len)
1469 req->req.status = -EOVERFLOW;
1470 else
1471 req->req.status = 0;
1472 }
1473
1474
1475
1476
1477
1478 } else {
1479 if (req->req.length == req->req.actual) {
1480 if (req->req.zero && to_host)
1481 rescan = 1;
1482 else
1483 req->req.status = 0;
1484 }
1485 if (urb->transfer_buffer_length == urb->actual_length) {
1486 if (urb->transfer_flags & URB_ZERO_PACKET &&
1487 !to_host)
1488 rescan = 1;
1489 else
1490 *status = 0;
1491 }
1492 }
1493
1494
1495 if (req->req.status != -EINPROGRESS) {
1496 list_del_init(&req->queue);
1497
1498 spin_unlock(&dum->lock);
1499 usb_gadget_giveback_request(&ep->ep, &req->req);
1500 spin_lock(&dum->lock);
1501
1502
1503 rescan = 1;
1504 }
1505
1506
1507 if (*status != -EINPROGRESS)
1508 break;
1509
1510
1511 if (rescan)
1512 goto top;
1513 }
1514 return sent;
1515}
1516
1517static int periodic_bytes(struct dummy *dum, struct dummy_ep *ep)
1518{
1519 int limit = ep->ep.maxpacket;
1520
1521 if (dum->gadget.speed == USB_SPEED_HIGH) {
1522 int tmp;
1523
1524
1525 tmp = usb_endpoint_maxp_mult(ep->desc);
1526 tmp *= 8 ;
1527 limit += limit * tmp;
1528 }
1529 if (dum->gadget.speed == USB_SPEED_SUPER) {
1530 switch (usb_endpoint_type(ep->desc)) {
1531 case USB_ENDPOINT_XFER_ISOC:
1532
1533 limit = 3 * 16 * 1024 * 8;
1534 break;
1535 case USB_ENDPOINT_XFER_INT:
1536
1537 limit = 3 * 1024 * 8;
1538 break;
1539 case USB_ENDPOINT_XFER_BULK:
1540 default:
1541 break;
1542 }
1543 }
1544 return limit;
1545}
1546
1547#define is_active(dum_hcd) ((dum_hcd->port_status & \
1548 (USB_PORT_STAT_CONNECTION | USB_PORT_STAT_ENABLE | \
1549 USB_PORT_STAT_SUSPEND)) \
1550 == (USB_PORT_STAT_CONNECTION | USB_PORT_STAT_ENABLE))
1551
1552static struct dummy_ep *find_endpoint(struct dummy *dum, u8 address)
1553{
1554 int i;
1555
1556 if (!is_active((dum->gadget.speed == USB_SPEED_SUPER ?
1557 dum->ss_hcd : dum->hs_hcd)))
1558 return NULL;
1559 if (!dum->ints_enabled)
1560 return NULL;
1561 if ((address & ~USB_DIR_IN) == 0)
1562 return &dum->ep[0];
1563 for (i = 1; i < DUMMY_ENDPOINTS; i++) {
1564 struct dummy_ep *ep = &dum->ep[i];
1565
1566 if (!ep->desc)
1567 continue;
1568 if (ep->desc->bEndpointAddress == address)
1569 return ep;
1570 }
1571 return NULL;
1572}
1573
1574#undef is_active
1575
1576#define Dev_Request (USB_TYPE_STANDARD | USB_RECIP_DEVICE)
1577#define Dev_InRequest (Dev_Request | USB_DIR_IN)
1578#define Intf_Request (USB_TYPE_STANDARD | USB_RECIP_INTERFACE)
1579#define Intf_InRequest (Intf_Request | USB_DIR_IN)
1580#define Ep_Request (USB_TYPE_STANDARD | USB_RECIP_ENDPOINT)
1581#define Ep_InRequest (Ep_Request | USB_DIR_IN)
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596static int handle_control_request(struct dummy_hcd *dum_hcd, struct urb *urb,
1597 struct usb_ctrlrequest *setup,
1598 int *status)
1599{
1600 struct dummy_ep *ep2;
1601 struct dummy *dum = dum_hcd->dum;
1602 int ret_val = 1;
1603 unsigned w_index;
1604 unsigned w_value;
1605
1606 w_index = le16_to_cpu(setup->wIndex);
1607 w_value = le16_to_cpu(setup->wValue);
1608 switch (setup->bRequest) {
1609 case USB_REQ_SET_ADDRESS:
1610 if (setup->bRequestType != Dev_Request)
1611 break;
1612 dum->address = w_value;
1613 *status = 0;
1614 dev_dbg(udc_dev(dum), "set_address = %d\n",
1615 w_value);
1616 ret_val = 0;
1617 break;
1618 case USB_REQ_SET_FEATURE:
1619 if (setup->bRequestType == Dev_Request) {
1620 ret_val = 0;
1621 switch (w_value) {
1622 case USB_DEVICE_REMOTE_WAKEUP:
1623 break;
1624 case USB_DEVICE_B_HNP_ENABLE:
1625 dum->gadget.b_hnp_enable = 1;
1626 break;
1627 case USB_DEVICE_A_HNP_SUPPORT:
1628 dum->gadget.a_hnp_support = 1;
1629 break;
1630 case USB_DEVICE_A_ALT_HNP_SUPPORT:
1631 dum->gadget.a_alt_hnp_support = 1;
1632 break;
1633 case USB_DEVICE_U1_ENABLE:
1634 if (dummy_hcd_to_hcd(dum_hcd)->speed ==
1635 HCD_USB3)
1636 w_value = USB_DEV_STAT_U1_ENABLED;
1637 else
1638 ret_val = -EOPNOTSUPP;
1639 break;
1640 case USB_DEVICE_U2_ENABLE:
1641 if (dummy_hcd_to_hcd(dum_hcd)->speed ==
1642 HCD_USB3)
1643 w_value = USB_DEV_STAT_U2_ENABLED;
1644 else
1645 ret_val = -EOPNOTSUPP;
1646 break;
1647 case USB_DEVICE_LTM_ENABLE:
1648 if (dummy_hcd_to_hcd(dum_hcd)->speed ==
1649 HCD_USB3)
1650 w_value = USB_DEV_STAT_LTM_ENABLED;
1651 else
1652 ret_val = -EOPNOTSUPP;
1653 break;
1654 default:
1655 ret_val = -EOPNOTSUPP;
1656 }
1657 if (ret_val == 0) {
1658 dum->devstatus |= (1 << w_value);
1659 *status = 0;
1660 }
1661 } else if (setup->bRequestType == Ep_Request) {
1662
1663 ep2 = find_endpoint(dum, w_index);
1664 if (!ep2 || ep2->ep.name == ep0name) {
1665 ret_val = -EOPNOTSUPP;
1666 break;
1667 }
1668 ep2->halted = 1;
1669 ret_val = 0;
1670 *status = 0;
1671 }
1672 break;
1673 case USB_REQ_CLEAR_FEATURE:
1674 if (setup->bRequestType == Dev_Request) {
1675 ret_val = 0;
1676 switch (w_value) {
1677 case USB_DEVICE_REMOTE_WAKEUP:
1678 w_value = USB_DEVICE_REMOTE_WAKEUP;
1679 break;
1680 case USB_DEVICE_U1_ENABLE:
1681 if (dummy_hcd_to_hcd(dum_hcd)->speed ==
1682 HCD_USB3)
1683 w_value = USB_DEV_STAT_U1_ENABLED;
1684 else
1685 ret_val = -EOPNOTSUPP;
1686 break;
1687 case USB_DEVICE_U2_ENABLE:
1688 if (dummy_hcd_to_hcd(dum_hcd)->speed ==
1689 HCD_USB3)
1690 w_value = USB_DEV_STAT_U2_ENABLED;
1691 else
1692 ret_val = -EOPNOTSUPP;
1693 break;
1694 case USB_DEVICE_LTM_ENABLE:
1695 if (dummy_hcd_to_hcd(dum_hcd)->speed ==
1696 HCD_USB3)
1697 w_value = USB_DEV_STAT_LTM_ENABLED;
1698 else
1699 ret_val = -EOPNOTSUPP;
1700 break;
1701 default:
1702 ret_val = -EOPNOTSUPP;
1703 break;
1704 }
1705 if (ret_val == 0) {
1706 dum->devstatus &= ~(1 << w_value);
1707 *status = 0;
1708 }
1709 } else if (setup->bRequestType == Ep_Request) {
1710
1711 ep2 = find_endpoint(dum, w_index);
1712 if (!ep2) {
1713 ret_val = -EOPNOTSUPP;
1714 break;
1715 }
1716 if (!ep2->wedged)
1717 ep2->halted = 0;
1718 ret_val = 0;
1719 *status = 0;
1720 }
1721 break;
1722 case USB_REQ_GET_STATUS:
1723 if (setup->bRequestType == Dev_InRequest
1724 || setup->bRequestType == Intf_InRequest
1725 || setup->bRequestType == Ep_InRequest) {
1726 char *buf;
1727
1728
1729
1730
1731
1732 buf = (char *)urb->transfer_buffer;
1733 if (urb->transfer_buffer_length > 0) {
1734 if (setup->bRequestType == Ep_InRequest) {
1735 ep2 = find_endpoint(dum, w_index);
1736 if (!ep2) {
1737 ret_val = -EOPNOTSUPP;
1738 break;
1739 }
1740 buf[0] = ep2->halted;
1741 } else if (setup->bRequestType ==
1742 Dev_InRequest) {
1743 buf[0] = (u8)dum->devstatus;
1744 } else
1745 buf[0] = 0;
1746 }
1747 if (urb->transfer_buffer_length > 1)
1748 buf[1] = 0;
1749 urb->actual_length = min_t(u32, 2,
1750 urb->transfer_buffer_length);
1751 ret_val = 0;
1752 *status = 0;
1753 }
1754 break;
1755 }
1756 return ret_val;
1757}
1758
1759
1760
1761
1762static void dummy_timer(unsigned long _dum_hcd)
1763{
1764 struct dummy_hcd *dum_hcd = (struct dummy_hcd *) _dum_hcd;
1765 struct dummy *dum = dum_hcd->dum;
1766 struct urbp *urbp, *tmp;
1767 unsigned long flags;
1768 int limit, total;
1769 int i;
1770
1771
1772 switch (dum->gadget.speed) {
1773 case USB_SPEED_LOW:
1774 total = 8 * 12;
1775 break;
1776 case USB_SPEED_FULL:
1777 total = 64 * 19;
1778 break;
1779 case USB_SPEED_HIGH:
1780 total = 512 * 13 * 8;
1781 break;
1782 case USB_SPEED_SUPER:
1783
1784 total = 490000;
1785 break;
1786 default:
1787 dev_err(dummy_dev(dum_hcd), "bogus device speed\n");
1788 return;
1789 }
1790
1791
1792
1793
1794 spin_lock_irqsave(&dum->lock, flags);
1795
1796 if (!dum_hcd->udev) {
1797 dev_err(dummy_dev(dum_hcd),
1798 "timer fired with no URBs pending?\n");
1799 spin_unlock_irqrestore(&dum->lock, flags);
1800 return;
1801 }
1802 dum_hcd->next_frame_urbp = NULL;
1803
1804 for (i = 0; i < DUMMY_ENDPOINTS; i++) {
1805 if (!ep_info[i].name)
1806 break;
1807 dum->ep[i].already_seen = 0;
1808 }
1809
1810restart:
1811 list_for_each_entry_safe(urbp, tmp, &dum_hcd->urbp_list, urbp_list) {
1812 struct urb *urb;
1813 struct dummy_request *req;
1814 u8 address;
1815 struct dummy_ep *ep = NULL;
1816 int type;
1817 int status = -EINPROGRESS;
1818
1819
1820 if (urbp == dum_hcd->next_frame_urbp)
1821 break;
1822
1823 urb = urbp->urb;
1824 if (urb->unlinked)
1825 goto return_urb;
1826 else if (dum_hcd->rh_state != DUMMY_RH_RUNNING)
1827 continue;
1828 type = usb_pipetype(urb->pipe);
1829
1830
1831
1832
1833
1834 if (total <= 0 && type == PIPE_BULK)
1835 continue;
1836
1837
1838 address = usb_pipeendpoint (urb->pipe);
1839 if (usb_pipein(urb->pipe))
1840 address |= USB_DIR_IN;
1841 ep = find_endpoint(dum, address);
1842 if (!ep) {
1843
1844 dev_dbg(dummy_dev(dum_hcd),
1845 "no ep configured for urb %p\n",
1846 urb);
1847 status = -EPROTO;
1848 goto return_urb;
1849 }
1850
1851 if (ep->already_seen)
1852 continue;
1853 ep->already_seen = 1;
1854 if (ep == &dum->ep[0] && urb->error_count) {
1855 ep->setup_stage = 1;
1856 urb->error_count = 0;
1857 }
1858 if (ep->halted && !ep->setup_stage) {
1859
1860 dev_dbg(dummy_dev(dum_hcd), "ep %s halted, urb %p\n",
1861 ep->ep.name, urb);
1862 status = -EPIPE;
1863 goto return_urb;
1864 }
1865
1866
1867
1868 if (ep == &dum->ep[0] && ep->setup_stage) {
1869 struct usb_ctrlrequest setup;
1870 int value = 1;
1871
1872 setup = *(struct usb_ctrlrequest *) urb->setup_packet;
1873
1874 list_for_each_entry(req, &ep->queue, queue) {
1875 list_del_init(&req->queue);
1876 req->req.status = -EOVERFLOW;
1877 dev_dbg(udc_dev(dum), "stale req = %p\n",
1878 req);
1879
1880 spin_unlock(&dum->lock);
1881 usb_gadget_giveback_request(&ep->ep, &req->req);
1882 spin_lock(&dum->lock);
1883 ep->already_seen = 0;
1884 goto restart;
1885 }
1886
1887
1888
1889
1890
1891 ep->last_io = jiffies;
1892 ep->setup_stage = 0;
1893 ep->halted = 0;
1894
1895 value = handle_control_request(dum_hcd, urb, &setup,
1896 &status);
1897
1898
1899
1900
1901 if (value > 0) {
1902 ++dum->callback_usage;
1903 spin_unlock(&dum->lock);
1904 value = dum->driver->setup(&dum->gadget,
1905 &setup);
1906 spin_lock(&dum->lock);
1907 --dum->callback_usage;
1908
1909 if (value >= 0) {
1910
1911 limit = 64*1024;
1912 goto treat_control_like_bulk;
1913 }
1914
1915 }
1916
1917 if (value < 0) {
1918 if (value != -EOPNOTSUPP)
1919 dev_dbg(udc_dev(dum),
1920 "setup --> %d\n",
1921 value);
1922 status = -EPIPE;
1923 urb->actual_length = 0;
1924 }
1925
1926 goto return_urb;
1927 }
1928
1929
1930 limit = total;
1931 switch (usb_pipetype(urb->pipe)) {
1932 case PIPE_ISOCHRONOUS:
1933
1934
1935
1936
1937
1938 limit = max(limit, periodic_bytes(dum, ep));
1939 status = -ENOSYS;
1940 break;
1941
1942 case PIPE_INTERRUPT:
1943
1944
1945
1946 limit = max(limit, periodic_bytes(dum, ep));
1947
1948
1949 default:
1950treat_control_like_bulk:
1951 ep->last_io = jiffies;
1952 total -= transfer(dum_hcd, urb, ep, limit, &status);
1953 break;
1954 }
1955
1956
1957 if (status == -EINPROGRESS)
1958 continue;
1959
1960return_urb:
1961 list_del(&urbp->urbp_list);
1962 kfree(urbp);
1963 if (ep)
1964 ep->already_seen = ep->setup_stage = 0;
1965
1966 usb_hcd_unlink_urb_from_ep(dummy_hcd_to_hcd(dum_hcd), urb);
1967 spin_unlock(&dum->lock);
1968 usb_hcd_giveback_urb(dummy_hcd_to_hcd(dum_hcd), urb, status);
1969 spin_lock(&dum->lock);
1970
1971 goto restart;
1972 }
1973
1974 if (list_empty(&dum_hcd->urbp_list)) {
1975 usb_put_dev(dum_hcd->udev);
1976 dum_hcd->udev = NULL;
1977 } else if (dum_hcd->rh_state == DUMMY_RH_RUNNING) {
1978
1979 mod_timer(&dum_hcd->timer, jiffies + msecs_to_jiffies(1));
1980 }
1981
1982 spin_unlock_irqrestore(&dum->lock, flags);
1983}
1984
1985
1986
1987#define PORT_C_MASK \
1988 ((USB_PORT_STAT_C_CONNECTION \
1989 | USB_PORT_STAT_C_ENABLE \
1990 | USB_PORT_STAT_C_SUSPEND \
1991 | USB_PORT_STAT_C_OVERCURRENT \
1992 | USB_PORT_STAT_C_RESET) << 16)
1993
1994static int dummy_hub_status(struct usb_hcd *hcd, char *buf)
1995{
1996 struct dummy_hcd *dum_hcd;
1997 unsigned long flags;
1998 int retval = 0;
1999
2000 dum_hcd = hcd_to_dummy_hcd(hcd);
2001
2002 spin_lock_irqsave(&dum_hcd->dum->lock, flags);
2003 if (!HCD_HW_ACCESSIBLE(hcd))
2004 goto done;
2005
2006 if (dum_hcd->resuming && time_after_eq(jiffies, dum_hcd->re_timeout)) {
2007 dum_hcd->port_status |= (USB_PORT_STAT_C_SUSPEND << 16);
2008 dum_hcd->port_status &= ~USB_PORT_STAT_SUSPEND;
2009 set_link_state(dum_hcd);
2010 }
2011
2012 if ((dum_hcd->port_status & PORT_C_MASK) != 0) {
2013 *buf = (1 << 1);
2014 dev_dbg(dummy_dev(dum_hcd), "port status 0x%08x has changes\n",
2015 dum_hcd->port_status);
2016 retval = 1;
2017 if (dum_hcd->rh_state == DUMMY_RH_SUSPENDED)
2018 usb_hcd_resume_root_hub(hcd);
2019 }
2020done:
2021 spin_unlock_irqrestore(&dum_hcd->dum->lock, flags);
2022 return retval;
2023}
2024
2025
2026static struct {
2027 struct usb_bos_descriptor bos;
2028 struct usb_ss_cap_descriptor ss_cap;
2029} __packed usb3_bos_desc = {
2030
2031 .bos = {
2032 .bLength = USB_DT_BOS_SIZE,
2033 .bDescriptorType = USB_DT_BOS,
2034 .wTotalLength = cpu_to_le16(sizeof(usb3_bos_desc)),
2035 .bNumDeviceCaps = 1,
2036 },
2037 .ss_cap = {
2038 .bLength = USB_DT_USB_SS_CAP_SIZE,
2039 .bDescriptorType = USB_DT_DEVICE_CAPABILITY,
2040 .bDevCapabilityType = USB_SS_CAP_TYPE,
2041 .wSpeedSupported = cpu_to_le16(USB_5GBPS_OPERATION),
2042 .bFunctionalitySupport = ilog2(USB_5GBPS_OPERATION),
2043 },
2044};
2045
2046static inline void
2047ss_hub_descriptor(struct usb_hub_descriptor *desc)
2048{
2049 memset(desc, 0, sizeof *desc);
2050 desc->bDescriptorType = USB_DT_SS_HUB;
2051 desc->bDescLength = 12;
2052 desc->wHubCharacteristics = cpu_to_le16(
2053 HUB_CHAR_INDV_PORT_LPSM |
2054 HUB_CHAR_COMMON_OCPM);
2055 desc->bNbrPorts = 1;
2056 desc->u.ss.bHubHdrDecLat = 0x04;
2057 desc->u.ss.DeviceRemovable = 0;
2058}
2059
2060static inline void hub_descriptor(struct usb_hub_descriptor *desc)
2061{
2062 memset(desc, 0, sizeof *desc);
2063 desc->bDescriptorType = USB_DT_HUB;
2064 desc->bDescLength = 9;
2065 desc->wHubCharacteristics = cpu_to_le16(
2066 HUB_CHAR_INDV_PORT_LPSM |
2067 HUB_CHAR_COMMON_OCPM);
2068 desc->bNbrPorts = 1;
2069 desc->u.hs.DeviceRemovable[0] = 0;
2070 desc->u.hs.DeviceRemovable[1] = 0xff;
2071}
2072
2073static int dummy_hub_control(
2074 struct usb_hcd *hcd,
2075 u16 typeReq,
2076 u16 wValue,
2077 u16 wIndex,
2078 char *buf,
2079 u16 wLength
2080) {
2081 struct dummy_hcd *dum_hcd;
2082 int retval = 0;
2083 unsigned long flags;
2084
2085 if (!HCD_HW_ACCESSIBLE(hcd))
2086 return -ETIMEDOUT;
2087
2088 dum_hcd = hcd_to_dummy_hcd(hcd);
2089
2090 spin_lock_irqsave(&dum_hcd->dum->lock, flags);
2091 switch (typeReq) {
2092 case ClearHubFeature:
2093 break;
2094 case ClearPortFeature:
2095 switch (wValue) {
2096 case USB_PORT_FEAT_SUSPEND:
2097 if (hcd->speed == HCD_USB3) {
2098 dev_dbg(dummy_dev(dum_hcd),
2099 "USB_PORT_FEAT_SUSPEND req not "
2100 "supported for USB 3.0 roothub\n");
2101 goto error;
2102 }
2103 if (dum_hcd->port_status & USB_PORT_STAT_SUSPEND) {
2104
2105 dum_hcd->resuming = 1;
2106 dum_hcd->re_timeout = jiffies +
2107 msecs_to_jiffies(20);
2108 }
2109 break;
2110 case USB_PORT_FEAT_POWER:
2111 dev_dbg(dummy_dev(dum_hcd), "power-off\n");
2112 if (hcd->speed == HCD_USB3)
2113 dum_hcd->port_status &= ~USB_SS_PORT_STAT_POWER;
2114 else
2115 dum_hcd->port_status &= ~USB_PORT_STAT_POWER;
2116 set_link_state(dum_hcd);
2117 break;
2118 default:
2119 dum_hcd->port_status &= ~(1 << wValue);
2120 set_link_state(dum_hcd);
2121 }
2122 break;
2123 case GetHubDescriptor:
2124 if (hcd->speed == HCD_USB3 &&
2125 (wLength < USB_DT_SS_HUB_SIZE ||
2126 wValue != (USB_DT_SS_HUB << 8))) {
2127 dev_dbg(dummy_dev(dum_hcd),
2128 "Wrong hub descriptor type for "
2129 "USB 3.0 roothub.\n");
2130 goto error;
2131 }
2132 if (hcd->speed == HCD_USB3)
2133 ss_hub_descriptor((struct usb_hub_descriptor *) buf);
2134 else
2135 hub_descriptor((struct usb_hub_descriptor *) buf);
2136 break;
2137
2138 case DeviceRequest | USB_REQ_GET_DESCRIPTOR:
2139 if (hcd->speed != HCD_USB3)
2140 goto error;
2141
2142 if ((wValue >> 8) != USB_DT_BOS)
2143 goto error;
2144
2145 memcpy(buf, &usb3_bos_desc, sizeof(usb3_bos_desc));
2146 retval = sizeof(usb3_bos_desc);
2147 break;
2148
2149 case GetHubStatus:
2150 *(__le32 *) buf = cpu_to_le32(0);
2151 break;
2152 case GetPortStatus:
2153 if (wIndex != 1)
2154 retval = -EPIPE;
2155
2156
2157
2158
2159 if (dum_hcd->resuming &&
2160 time_after_eq(jiffies, dum_hcd->re_timeout)) {
2161 dum_hcd->port_status |= (USB_PORT_STAT_C_SUSPEND << 16);
2162 dum_hcd->port_status &= ~USB_PORT_STAT_SUSPEND;
2163 }
2164 if ((dum_hcd->port_status & USB_PORT_STAT_RESET) != 0 &&
2165 time_after_eq(jiffies, dum_hcd->re_timeout)) {
2166 dum_hcd->port_status |= (USB_PORT_STAT_C_RESET << 16);
2167 dum_hcd->port_status &= ~USB_PORT_STAT_RESET;
2168 if (dum_hcd->dum->pullup) {
2169 dum_hcd->port_status |= USB_PORT_STAT_ENABLE;
2170
2171 if (hcd->speed < HCD_USB3) {
2172 switch (dum_hcd->dum->gadget.speed) {
2173 case USB_SPEED_HIGH:
2174 dum_hcd->port_status |=
2175 USB_PORT_STAT_HIGH_SPEED;
2176 break;
2177 case USB_SPEED_LOW:
2178 dum_hcd->dum->gadget.ep0->
2179 maxpacket = 8;
2180 dum_hcd->port_status |=
2181 USB_PORT_STAT_LOW_SPEED;
2182 break;
2183 default:
2184 dum_hcd->dum->gadget.speed =
2185 USB_SPEED_FULL;
2186 break;
2187 }
2188 }
2189 }
2190 }
2191 set_link_state(dum_hcd);
2192 ((__le16 *) buf)[0] = cpu_to_le16(dum_hcd->port_status);
2193 ((__le16 *) buf)[1] = cpu_to_le16(dum_hcd->port_status >> 16);
2194 break;
2195 case SetHubFeature:
2196 retval = -EPIPE;
2197 break;
2198 case SetPortFeature:
2199 switch (wValue) {
2200 case USB_PORT_FEAT_LINK_STATE:
2201 if (hcd->speed != HCD_USB3) {
2202 dev_dbg(dummy_dev(dum_hcd),
2203 "USB_PORT_FEAT_LINK_STATE req not "
2204 "supported for USB 2.0 roothub\n");
2205 goto error;
2206 }
2207
2208
2209
2210
2211 break;
2212 case USB_PORT_FEAT_U1_TIMEOUT:
2213 case USB_PORT_FEAT_U2_TIMEOUT:
2214
2215 if (hcd->speed != HCD_USB3) {
2216 dev_dbg(dummy_dev(dum_hcd),
2217 "USB_PORT_FEAT_U1/2_TIMEOUT req not "
2218 "supported for USB 2.0 roothub\n");
2219 goto error;
2220 }
2221 break;
2222 case USB_PORT_FEAT_SUSPEND:
2223
2224 if (hcd->speed == HCD_USB3) {
2225 dev_dbg(dummy_dev(dum_hcd),
2226 "USB_PORT_FEAT_SUSPEND req not "
2227 "supported for USB 3.0 roothub\n");
2228 goto error;
2229 }
2230 if (dum_hcd->active) {
2231 dum_hcd->port_status |= USB_PORT_STAT_SUSPEND;
2232
2233
2234
2235
2236 set_link_state(dum_hcd);
2237 if (((1 << USB_DEVICE_B_HNP_ENABLE)
2238 & dum_hcd->dum->devstatus) != 0)
2239 dev_dbg(dummy_dev(dum_hcd),
2240 "no HNP yet!\n");
2241 }
2242 break;
2243 case USB_PORT_FEAT_POWER:
2244 if (hcd->speed == HCD_USB3)
2245 dum_hcd->port_status |= USB_SS_PORT_STAT_POWER;
2246 else
2247 dum_hcd->port_status |= USB_PORT_STAT_POWER;
2248 set_link_state(dum_hcd);
2249 break;
2250 case USB_PORT_FEAT_BH_PORT_RESET:
2251
2252 if (hcd->speed != HCD_USB3) {
2253 dev_dbg(dummy_dev(dum_hcd),
2254 "USB_PORT_FEAT_BH_PORT_RESET req not "
2255 "supported for USB 2.0 roothub\n");
2256 goto error;
2257 }
2258
2259 case USB_PORT_FEAT_RESET:
2260
2261 if (hcd->speed == HCD_USB3) {
2262 dum_hcd->port_status = 0;
2263 dum_hcd->port_status =
2264 (USB_SS_PORT_STAT_POWER |
2265 USB_PORT_STAT_CONNECTION |
2266 USB_PORT_STAT_RESET);
2267 } else
2268 dum_hcd->port_status &= ~(USB_PORT_STAT_ENABLE
2269 | USB_PORT_STAT_LOW_SPEED
2270 | USB_PORT_STAT_HIGH_SPEED);
2271
2272
2273
2274
2275 dum_hcd->dum->devstatus &=
2276 (1 << USB_DEVICE_SELF_POWERED);
2277
2278
2279
2280
2281 dum_hcd->re_timeout = jiffies + msecs_to_jiffies(50);
2282
2283 default:
2284 if (hcd->speed == HCD_USB3) {
2285 if ((dum_hcd->port_status &
2286 USB_SS_PORT_STAT_POWER) != 0) {
2287 dum_hcd->port_status |= (1 << wValue);
2288 }
2289 } else
2290 if ((dum_hcd->port_status &
2291 USB_PORT_STAT_POWER) != 0) {
2292 dum_hcd->port_status |= (1 << wValue);
2293 }
2294 set_link_state(dum_hcd);
2295 }
2296 break;
2297 case GetPortErrorCount:
2298 if (hcd->speed != HCD_USB3) {
2299 dev_dbg(dummy_dev(dum_hcd),
2300 "GetPortErrorCount req not "
2301 "supported for USB 2.0 roothub\n");
2302 goto error;
2303 }
2304
2305 *(__le32 *) buf = cpu_to_le32(0);
2306 break;
2307 case SetHubDepth:
2308 if (hcd->speed != HCD_USB3) {
2309 dev_dbg(dummy_dev(dum_hcd),
2310 "SetHubDepth req not supported for "
2311 "USB 2.0 roothub\n");
2312 goto error;
2313 }
2314 break;
2315 default:
2316 dev_dbg(dummy_dev(dum_hcd),
2317 "hub control req%04x v%04x i%04x l%d\n",
2318 typeReq, wValue, wIndex, wLength);
2319error:
2320
2321 retval = -EPIPE;
2322 }
2323 spin_unlock_irqrestore(&dum_hcd->dum->lock, flags);
2324
2325 if ((dum_hcd->port_status & PORT_C_MASK) != 0)
2326 usb_hcd_poll_rh_status(hcd);
2327 return retval;
2328}
2329
2330static int dummy_bus_suspend(struct usb_hcd *hcd)
2331{
2332 struct dummy_hcd *dum_hcd = hcd_to_dummy_hcd(hcd);
2333
2334 dev_dbg(&hcd->self.root_hub->dev, "%s\n", __func__);
2335
2336 spin_lock_irq(&dum_hcd->dum->lock);
2337 dum_hcd->rh_state = DUMMY_RH_SUSPENDED;
2338 set_link_state(dum_hcd);
2339 hcd->state = HC_STATE_SUSPENDED;
2340 spin_unlock_irq(&dum_hcd->dum->lock);
2341 return 0;
2342}
2343
2344static int dummy_bus_resume(struct usb_hcd *hcd)
2345{
2346 struct dummy_hcd *dum_hcd = hcd_to_dummy_hcd(hcd);
2347 int rc = 0;
2348
2349 dev_dbg(&hcd->self.root_hub->dev, "%s\n", __func__);
2350
2351 spin_lock_irq(&dum_hcd->dum->lock);
2352 if (!HCD_HW_ACCESSIBLE(hcd)) {
2353 rc = -ESHUTDOWN;
2354 } else {
2355 dum_hcd->rh_state = DUMMY_RH_RUNNING;
2356 set_link_state(dum_hcd);
2357 if (!list_empty(&dum_hcd->urbp_list))
2358 mod_timer(&dum_hcd->timer, jiffies);
2359 hcd->state = HC_STATE_RUNNING;
2360 }
2361 spin_unlock_irq(&dum_hcd->dum->lock);
2362 return rc;
2363}
2364
2365
2366
2367static inline ssize_t show_urb(char *buf, size_t size, struct urb *urb)
2368{
2369 int ep = usb_pipeendpoint(urb->pipe);
2370
2371 return snprintf(buf, size,
2372 "urb/%p %s ep%d%s%s len %d/%d\n",
2373 urb,
2374 ({ char *s;
2375 switch (urb->dev->speed) {
2376 case USB_SPEED_LOW:
2377 s = "ls";
2378 break;
2379 case USB_SPEED_FULL:
2380 s = "fs";
2381 break;
2382 case USB_SPEED_HIGH:
2383 s = "hs";
2384 break;
2385 case USB_SPEED_SUPER:
2386 s = "ss";
2387 break;
2388 default:
2389 s = "?";
2390 break;
2391 } s; }),
2392 ep, ep ? (usb_pipein(urb->pipe) ? "in" : "out") : "",
2393 ({ char *s; \
2394 switch (usb_pipetype(urb->pipe)) { \
2395 case PIPE_CONTROL: \
2396 s = ""; \
2397 break; \
2398 case PIPE_BULK: \
2399 s = "-bulk"; \
2400 break; \
2401 case PIPE_INTERRUPT: \
2402 s = "-int"; \
2403 break; \
2404 default: \
2405 s = "-iso"; \
2406 break; \
2407 } s; }),
2408 urb->actual_length, urb->transfer_buffer_length);
2409}
2410
2411static ssize_t urbs_show(struct device *dev, struct device_attribute *attr,
2412 char *buf)
2413{
2414 struct usb_hcd *hcd = dev_get_drvdata(dev);
2415 struct dummy_hcd *dum_hcd = hcd_to_dummy_hcd(hcd);
2416 struct urbp *urbp;
2417 size_t size = 0;
2418 unsigned long flags;
2419
2420 spin_lock_irqsave(&dum_hcd->dum->lock, flags);
2421 list_for_each_entry(urbp, &dum_hcd->urbp_list, urbp_list) {
2422 size_t temp;
2423
2424 temp = show_urb(buf, PAGE_SIZE - size, urbp->urb);
2425 buf += temp;
2426 size += temp;
2427 }
2428 spin_unlock_irqrestore(&dum_hcd->dum->lock, flags);
2429
2430 return size;
2431}
2432static DEVICE_ATTR_RO(urbs);
2433
2434static int dummy_start_ss(struct dummy_hcd *dum_hcd)
2435{
2436 init_timer(&dum_hcd->timer);
2437 dum_hcd->timer.function = dummy_timer;
2438 dum_hcd->timer.data = (unsigned long)dum_hcd;
2439 dum_hcd->rh_state = DUMMY_RH_RUNNING;
2440 dum_hcd->stream_en_ep = 0;
2441 INIT_LIST_HEAD(&dum_hcd->urbp_list);
2442 dummy_hcd_to_hcd(dum_hcd)->power_budget = POWER_BUDGET;
2443 dummy_hcd_to_hcd(dum_hcd)->state = HC_STATE_RUNNING;
2444 dummy_hcd_to_hcd(dum_hcd)->uses_new_polling = 1;
2445#ifdef CONFIG_USB_OTG
2446 dummy_hcd_to_hcd(dum_hcd)->self.otg_port = 1;
2447#endif
2448 return 0;
2449
2450
2451 return device_create_file(dummy_dev(dum_hcd), &dev_attr_urbs);
2452}
2453
2454static int dummy_start(struct usb_hcd *hcd)
2455{
2456 struct dummy_hcd *dum_hcd = hcd_to_dummy_hcd(hcd);
2457
2458
2459
2460
2461
2462
2463 if (!usb_hcd_is_primary_hcd(hcd))
2464 return dummy_start_ss(dum_hcd);
2465
2466 spin_lock_init(&dum_hcd->dum->lock);
2467 init_timer(&dum_hcd->timer);
2468 dum_hcd->timer.function = dummy_timer;
2469 dum_hcd->timer.data = (unsigned long)dum_hcd;
2470 dum_hcd->rh_state = DUMMY_RH_RUNNING;
2471
2472 INIT_LIST_HEAD(&dum_hcd->urbp_list);
2473
2474 hcd->power_budget = POWER_BUDGET;
2475 hcd->state = HC_STATE_RUNNING;
2476 hcd->uses_new_polling = 1;
2477
2478#ifdef CONFIG_USB_OTG
2479 hcd->self.otg_port = 1;
2480#endif
2481
2482
2483 return device_create_file(dummy_dev(dum_hcd), &dev_attr_urbs);
2484}
2485
2486static void dummy_stop(struct usb_hcd *hcd)
2487{
2488 device_remove_file(dummy_dev(hcd_to_dummy_hcd(hcd)), &dev_attr_urbs);
2489 dev_info(dummy_dev(hcd_to_dummy_hcd(hcd)), "stopped\n");
2490}
2491
2492
2493
2494static int dummy_h_get_frame(struct usb_hcd *hcd)
2495{
2496 return dummy_g_get_frame(NULL);
2497}
2498
2499static int dummy_setup(struct usb_hcd *hcd)
2500{
2501 struct dummy *dum;
2502
2503 dum = *((void **)dev_get_platdata(hcd->self.controller));
2504 hcd->self.sg_tablesize = ~0;
2505 if (usb_hcd_is_primary_hcd(hcd)) {
2506 dum->hs_hcd = hcd_to_dummy_hcd(hcd);
2507 dum->hs_hcd->dum = dum;
2508
2509
2510
2511
2512
2513 hcd->speed = HCD_USB2;
2514 hcd->self.root_hub->speed = USB_SPEED_HIGH;
2515 } else {
2516 dum->ss_hcd = hcd_to_dummy_hcd(hcd);
2517 dum->ss_hcd->dum = dum;
2518 hcd->speed = HCD_USB3;
2519 hcd->self.root_hub->speed = USB_SPEED_SUPER;
2520 }
2521 return 0;
2522}
2523
2524
2525static int dummy_alloc_streams(struct usb_hcd *hcd, struct usb_device *udev,
2526 struct usb_host_endpoint **eps, unsigned int num_eps,
2527 unsigned int num_streams, gfp_t mem_flags)
2528{
2529 struct dummy_hcd *dum_hcd = hcd_to_dummy_hcd(hcd);
2530 unsigned long flags;
2531 int max_stream;
2532 int ret_streams = num_streams;
2533 unsigned int index;
2534 unsigned int i;
2535
2536 if (!num_eps)
2537 return -EINVAL;
2538
2539 spin_lock_irqsave(&dum_hcd->dum->lock, flags);
2540 for (i = 0; i < num_eps; i++) {
2541 index = dummy_get_ep_idx(&eps[i]->desc);
2542 if ((1 << index) & dum_hcd->stream_en_ep) {
2543 ret_streams = -EINVAL;
2544 goto out;
2545 }
2546 max_stream = usb_ss_max_streams(&eps[i]->ss_ep_comp);
2547 if (!max_stream) {
2548 ret_streams = -EINVAL;
2549 goto out;
2550 }
2551 if (max_stream < ret_streams) {
2552 dev_dbg(dummy_dev(dum_hcd), "Ep 0x%x only supports %u "
2553 "stream IDs.\n",
2554 eps[i]->desc.bEndpointAddress,
2555 max_stream);
2556 ret_streams = max_stream;
2557 }
2558 }
2559
2560 for (i = 0; i < num_eps; i++) {
2561 index = dummy_get_ep_idx(&eps[i]->desc);
2562 dum_hcd->stream_en_ep |= 1 << index;
2563 set_max_streams_for_pipe(dum_hcd,
2564 usb_endpoint_num(&eps[i]->desc), ret_streams);
2565 }
2566out:
2567 spin_unlock_irqrestore(&dum_hcd->dum->lock, flags);
2568 return ret_streams;
2569}
2570
2571
2572static int dummy_free_streams(struct usb_hcd *hcd, struct usb_device *udev,
2573 struct usb_host_endpoint **eps, unsigned int num_eps,
2574 gfp_t mem_flags)
2575{
2576 struct dummy_hcd *dum_hcd = hcd_to_dummy_hcd(hcd);
2577 unsigned long flags;
2578 int ret;
2579 unsigned int index;
2580 unsigned int i;
2581
2582 spin_lock_irqsave(&dum_hcd->dum->lock, flags);
2583 for (i = 0; i < num_eps; i++) {
2584 index = dummy_get_ep_idx(&eps[i]->desc);
2585 if (!((1 << index) & dum_hcd->stream_en_ep)) {
2586 ret = -EINVAL;
2587 goto out;
2588 }
2589 }
2590
2591 for (i = 0; i < num_eps; i++) {
2592 index = dummy_get_ep_idx(&eps[i]->desc);
2593 dum_hcd->stream_en_ep &= ~(1 << index);
2594 set_max_streams_for_pipe(dum_hcd,
2595 usb_endpoint_num(&eps[i]->desc), 0);
2596 }
2597 ret = 0;
2598out:
2599 spin_unlock_irqrestore(&dum_hcd->dum->lock, flags);
2600 return ret;
2601}
2602
2603static struct hc_driver dummy_hcd = {
2604 .description = (char *) driver_name,
2605 .product_desc = "Dummy host controller",
2606 .hcd_priv_size = sizeof(struct dummy_hcd),
2607
2608 .reset = dummy_setup,
2609 .start = dummy_start,
2610 .stop = dummy_stop,
2611
2612 .urb_enqueue = dummy_urb_enqueue,
2613 .urb_dequeue = dummy_urb_dequeue,
2614
2615 .get_frame_number = dummy_h_get_frame,
2616
2617 .hub_status_data = dummy_hub_status,
2618 .hub_control = dummy_hub_control,
2619 .bus_suspend = dummy_bus_suspend,
2620 .bus_resume = dummy_bus_resume,
2621
2622 .alloc_streams = dummy_alloc_streams,
2623 .free_streams = dummy_free_streams,
2624};
2625
2626static int dummy_hcd_probe(struct platform_device *pdev)
2627{
2628 struct dummy *dum;
2629 struct usb_hcd *hs_hcd;
2630 struct usb_hcd *ss_hcd;
2631 int retval;
2632
2633 dev_info(&pdev->dev, "%s, driver " DRIVER_VERSION "\n", driver_desc);
2634 dum = *((void **)dev_get_platdata(&pdev->dev));
2635
2636 if (mod_data.is_super_speed)
2637 dummy_hcd.flags = HCD_USB3 | HCD_SHARED;
2638 else if (mod_data.is_high_speed)
2639 dummy_hcd.flags = HCD_USB2;
2640 else
2641 dummy_hcd.flags = HCD_USB11;
2642 hs_hcd = usb_create_hcd(&dummy_hcd, &pdev->dev, dev_name(&pdev->dev));
2643 if (!hs_hcd)
2644 return -ENOMEM;
2645 hs_hcd->has_tt = 1;
2646
2647 retval = usb_add_hcd(hs_hcd, 0, 0);
2648 if (retval)
2649 goto put_usb2_hcd;
2650
2651 if (mod_data.is_super_speed) {
2652 ss_hcd = usb_create_shared_hcd(&dummy_hcd, &pdev->dev,
2653 dev_name(&pdev->dev), hs_hcd);
2654 if (!ss_hcd) {
2655 retval = -ENOMEM;
2656 goto dealloc_usb2_hcd;
2657 }
2658
2659 retval = usb_add_hcd(ss_hcd, 0, 0);
2660 if (retval)
2661 goto put_usb3_hcd;
2662 }
2663 return 0;
2664
2665put_usb3_hcd:
2666 usb_put_hcd(ss_hcd);
2667dealloc_usb2_hcd:
2668 usb_remove_hcd(hs_hcd);
2669put_usb2_hcd:
2670 usb_put_hcd(hs_hcd);
2671 dum->hs_hcd = dum->ss_hcd = NULL;
2672 return retval;
2673}
2674
2675static int dummy_hcd_remove(struct platform_device *pdev)
2676{
2677 struct dummy *dum;
2678
2679 dum = hcd_to_dummy_hcd(platform_get_drvdata(pdev))->dum;
2680
2681 if (dum->ss_hcd) {
2682 usb_remove_hcd(dummy_hcd_to_hcd(dum->ss_hcd));
2683 usb_put_hcd(dummy_hcd_to_hcd(dum->ss_hcd));
2684 }
2685
2686 usb_remove_hcd(dummy_hcd_to_hcd(dum->hs_hcd));
2687 usb_put_hcd(dummy_hcd_to_hcd(dum->hs_hcd));
2688
2689 dum->hs_hcd = NULL;
2690 dum->ss_hcd = NULL;
2691
2692 return 0;
2693}
2694
2695static int dummy_hcd_suspend(struct platform_device *pdev, pm_message_t state)
2696{
2697 struct usb_hcd *hcd;
2698 struct dummy_hcd *dum_hcd;
2699 int rc = 0;
2700
2701 dev_dbg(&pdev->dev, "%s\n", __func__);
2702
2703 hcd = platform_get_drvdata(pdev);
2704 dum_hcd = hcd_to_dummy_hcd(hcd);
2705 if (dum_hcd->rh_state == DUMMY_RH_RUNNING) {
2706 dev_warn(&pdev->dev, "Root hub isn't suspended!\n");
2707 rc = -EBUSY;
2708 } else
2709 clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
2710 return rc;
2711}
2712
2713static int dummy_hcd_resume(struct platform_device *pdev)
2714{
2715 struct usb_hcd *hcd;
2716
2717 dev_dbg(&pdev->dev, "%s\n", __func__);
2718
2719 hcd = platform_get_drvdata(pdev);
2720 set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
2721 usb_hcd_poll_rh_status(hcd);
2722 return 0;
2723}
2724
2725static struct platform_driver dummy_hcd_driver = {
2726 .probe = dummy_hcd_probe,
2727 .remove = dummy_hcd_remove,
2728 .suspend = dummy_hcd_suspend,
2729 .resume = dummy_hcd_resume,
2730 .driver = {
2731 .name = (char *) driver_name,
2732 },
2733};
2734
2735
2736#define MAX_NUM_UDC 2
2737static struct platform_device *the_udc_pdev[MAX_NUM_UDC];
2738static struct platform_device *the_hcd_pdev[MAX_NUM_UDC];
2739
2740static int __init init(void)
2741{
2742 int retval = -ENOMEM;
2743 int i;
2744 struct dummy *dum[MAX_NUM_UDC];
2745
2746 if (usb_disabled())
2747 return -ENODEV;
2748
2749 if (!mod_data.is_high_speed && mod_data.is_super_speed)
2750 return -EINVAL;
2751
2752 if (mod_data.num < 1 || mod_data.num > MAX_NUM_UDC) {
2753 pr_err("Number of emulated UDC must be in range of 1...%d\n",
2754 MAX_NUM_UDC);
2755 return -EINVAL;
2756 }
2757
2758 for (i = 0; i < mod_data.num; i++) {
2759 the_hcd_pdev[i] = platform_device_alloc(driver_name, i);
2760 if (!the_hcd_pdev[i]) {
2761 i--;
2762 while (i >= 0)
2763 platform_device_put(the_hcd_pdev[i--]);
2764 return retval;
2765 }
2766 }
2767 for (i = 0; i < mod_data.num; i++) {
2768 the_udc_pdev[i] = platform_device_alloc(gadget_name, i);
2769 if (!the_udc_pdev[i]) {
2770 i--;
2771 while (i >= 0)
2772 platform_device_put(the_udc_pdev[i--]);
2773 goto err_alloc_udc;
2774 }
2775 }
2776 for (i = 0; i < mod_data.num; i++) {
2777 dum[i] = kzalloc(sizeof(struct dummy), GFP_KERNEL);
2778 if (!dum[i]) {
2779 retval = -ENOMEM;
2780 goto err_add_pdata;
2781 }
2782 retval = platform_device_add_data(the_hcd_pdev[i], &dum[i],
2783 sizeof(void *));
2784 if (retval)
2785 goto err_add_pdata;
2786 retval = platform_device_add_data(the_udc_pdev[i], &dum[i],
2787 sizeof(void *));
2788 if (retval)
2789 goto err_add_pdata;
2790 }
2791
2792 retval = platform_driver_register(&dummy_hcd_driver);
2793 if (retval < 0)
2794 goto err_add_pdata;
2795 retval = platform_driver_register(&dummy_udc_driver);
2796 if (retval < 0)
2797 goto err_register_udc_driver;
2798
2799 for (i = 0; i < mod_data.num; i++) {
2800 retval = platform_device_add(the_hcd_pdev[i]);
2801 if (retval < 0) {
2802 i--;
2803 while (i >= 0)
2804 platform_device_del(the_hcd_pdev[i--]);
2805 goto err_add_hcd;
2806 }
2807 }
2808 for (i = 0; i < mod_data.num; i++) {
2809 if (!dum[i]->hs_hcd ||
2810 (!dum[i]->ss_hcd && mod_data.is_super_speed)) {
2811
2812
2813
2814
2815 retval = -EINVAL;
2816 goto err_add_udc;
2817 }
2818 }
2819
2820 for (i = 0; i < mod_data.num; i++) {
2821 retval = platform_device_add(the_udc_pdev[i]);
2822 if (retval < 0) {
2823 i--;
2824 while (i >= 0)
2825 platform_device_del(the_udc_pdev[i--]);
2826 goto err_add_udc;
2827 }
2828 }
2829
2830 for (i = 0; i < mod_data.num; i++) {
2831 if (!platform_get_drvdata(the_udc_pdev[i])) {
2832
2833
2834
2835
2836 retval = -EINVAL;
2837 goto err_probe_udc;
2838 }
2839 }
2840 return retval;
2841
2842err_probe_udc:
2843 for (i = 0; i < mod_data.num; i++)
2844 platform_device_del(the_udc_pdev[i]);
2845err_add_udc:
2846 for (i = 0; i < mod_data.num; i++)
2847 platform_device_del(the_hcd_pdev[i]);
2848err_add_hcd:
2849 platform_driver_unregister(&dummy_udc_driver);
2850err_register_udc_driver:
2851 platform_driver_unregister(&dummy_hcd_driver);
2852err_add_pdata:
2853 for (i = 0; i < mod_data.num; i++)
2854 kfree(dum[i]);
2855 for (i = 0; i < mod_data.num; i++)
2856 platform_device_put(the_udc_pdev[i]);
2857err_alloc_udc:
2858 for (i = 0; i < mod_data.num; i++)
2859 platform_device_put(the_hcd_pdev[i]);
2860 return retval;
2861}
2862module_init(init);
2863
2864static void __exit cleanup(void)
2865{
2866 int i;
2867
2868 for (i = 0; i < mod_data.num; i++) {
2869 struct dummy *dum;
2870
2871 dum = *((void **)dev_get_platdata(&the_udc_pdev[i]->dev));
2872
2873 platform_device_unregister(the_udc_pdev[i]);
2874 platform_device_unregister(the_hcd_pdev[i]);
2875 kfree(dum);
2876 }
2877 platform_driver_unregister(&dummy_udc_driver);
2878 platform_driver_unregister(&dummy_hcd_driver);
2879}
2880module_exit(cleanup);
2881