Lines Matching +full:num +full:- +full:ss +full:- +full:bits
1 // SPDX-License-Identifier: GPL-2.0+
3 * dummy_hcd.c -- Dummy/Loopback USB host and device emulator driver.
8 * Copyright (C) 2003-2005 Alan Stern
14 * Linux-USB host controller driver. USB traffic is simulated; there's
17 * - Gadget driver, responding to requests (device);
18 * - Host-side device driver, as already familiar in Linux.
51 #define POWER_BUDGET 500 /* in mA; use 8 for low-power port testing */
68 unsigned int num; member
74 .num = 1,
80 module_param_named(num, mod_data.num, uint, S_IRUGO);
81 MODULE_PARM_DESC(num, "number of emulated controllers");
82 /*-------------------------------------------------------------------------*/
114 /*-------------------------------------------------------------------------*/
120 * - Configurable: direction (in/out), type (bulk, iso, etc), and endpoint
121 * number can be changed. Names like "ep-a" are used for this type.
123 * - Fixed Function: in other cases. some characteristics may be mutable;
124 * that'd be hardware-specific. Names like "ep12out-bulk" are used.
149 EP_INFO("ep1in-bulk",
151 EP_INFO("ep2out-bulk",
154 EP_INFO("ep3in-iso",
156 EP_INFO("ep4out-iso",
159 EP_INFO("ep5in-int",
161 EP_INFO("ep6in-bulk",
163 EP_INFO("ep7out-bulk",
166 EP_INFO("ep8in-iso",
168 EP_INFO("ep9out-iso",
171 EP_INFO("ep10in-int",
173 EP_INFO("ep11in-bulk",
175 EP_INFO("ep12out-bulk",
178 EP_INFO("ep13in-iso",
180 EP_INFO("ep14out-iso",
183 EP_INFO("ep15in-int",
187 EP_INFO("ep1out-bulk",
189 EP_INFO("ep2in-bulk",
193 EP_INFO("ep-aout",
195 EP_INFO("ep-bin",
197 EP_INFO("ep-cout",
199 EP_INFO("ep-dout",
201 EP_INFO("ep-ein",
203 EP_INFO("ep-fout",
205 EP_INFO("ep-gin",
207 EP_INFO("ep-hout",
209 EP_INFO("ep-iout",
211 EP_INFO("ep-jin",
213 EP_INFO("ep-kout",
215 EP_INFO("ep-lin",
217 EP_INFO("ep-mout",
225 /*-------------------------------------------------------------------------*/
291 return (struct dummy_hcd *) (hcd->hcd_priv); in hcd_to_dummy_hcd()
301 return dummy_hcd_to_hcd(dum)->self.controller; in dummy_dev()
306 return dum->gadget.dev.parent; in udc_dev()
311 return container_of(ep->gadget, struct dummy, gadget); in ep_to_dummy()
317 if (dum->gadget.speed == USB_SPEED_SUPER) in gadget_to_dummy_hcd()
318 return dum->ss_hcd; in gadget_to_dummy_hcd()
320 return dum->hs_hcd; in gadget_to_dummy_hcd()
328 /*-------------------------------------------------------------------------*/
335 while (!list_empty(&ep->queue)) { in nuke()
338 req = list_entry(ep->queue.next, struct dummy_request, queue); in nuke()
339 list_del_init(&req->queue); in nuke()
340 req->req.status = -ESHUTDOWN; in nuke()
342 spin_unlock(&dum->lock); in nuke()
343 usb_gadget_giveback_request(&ep->ep, &req->req); in nuke()
344 spin_lock(&dum->lock); in nuke()
354 dum->address = 0; in stop_activity()
360 nuke(dum, &dum->ep[i]); in stop_activity()
362 /* driver now does any non-usb quiescing necessary */ in stop_activity()
366 * set_link_state_by_speed() - Sets the current state of the link according to
375 struct dummy *dum = dum_hcd->dum; in set_link_state_by_speed()
377 if (dummy_hcd_to_hcd(dum_hcd)->speed == HCD_USB3) { in set_link_state_by_speed()
378 if ((dum_hcd->port_status & USB_SS_PORT_STAT_POWER) == 0) { in set_link_state_by_speed()
379 dum_hcd->port_status = 0; in set_link_state_by_speed()
380 } else if (!dum->pullup || dum->udc_suspended) { in set_link_state_by_speed()
382 dum_hcd->port_status &= ~(USB_PORT_STAT_CONNECTION | in set_link_state_by_speed()
384 if ((dum_hcd->old_status & in set_link_state_by_speed()
386 dum_hcd->port_status |= in set_link_state_by_speed()
390 dum_hcd->port_status |= (USB_PORT_STAT_CONNECTION | in set_link_state_by_speed()
392 if ((dum_hcd->old_status & in set_link_state_by_speed()
394 dum_hcd->port_status |= in set_link_state_by_speed()
396 if ((dum_hcd->port_status & USB_PORT_STAT_ENABLE) && in set_link_state_by_speed()
397 (dum_hcd->port_status & in set_link_state_by_speed()
399 dum_hcd->rh_state != DUMMY_RH_SUSPENDED) in set_link_state_by_speed()
400 dum_hcd->active = 1; in set_link_state_by_speed()
403 if ((dum_hcd->port_status & USB_PORT_STAT_POWER) == 0) { in set_link_state_by_speed()
404 dum_hcd->port_status = 0; in set_link_state_by_speed()
405 } else if (!dum->pullup || dum->udc_suspended) { in set_link_state_by_speed()
407 dum_hcd->port_status &= ~(USB_PORT_STAT_CONNECTION | in set_link_state_by_speed()
412 if ((dum_hcd->old_status & in set_link_state_by_speed()
414 dum_hcd->port_status |= in set_link_state_by_speed()
417 dum_hcd->port_status |= USB_PORT_STAT_CONNECTION; in set_link_state_by_speed()
418 if ((dum_hcd->old_status & in set_link_state_by_speed()
420 dum_hcd->port_status |= in set_link_state_by_speed()
422 if ((dum_hcd->port_status & USB_PORT_STAT_ENABLE) == 0) in set_link_state_by_speed()
423 dum_hcd->port_status &= ~USB_PORT_STAT_SUSPEND; in set_link_state_by_speed()
424 else if ((dum_hcd->port_status & in set_link_state_by_speed()
426 dum_hcd->rh_state != DUMMY_RH_SUSPENDED) in set_link_state_by_speed()
427 dum_hcd->active = 1; in set_link_state_by_speed()
434 __must_hold(&dum->lock) in set_link_state()
436 struct dummy *dum = dum_hcd->dum; in set_link_state()
439 dum_hcd->active = 0; in set_link_state()
440 if (dum->pullup) in set_link_state()
441 if ((dummy_hcd_to_hcd(dum_hcd)->speed == HCD_USB3 && in set_link_state()
442 dum->gadget.speed != USB_SPEED_SUPER) || in set_link_state()
443 (dummy_hcd_to_hcd(dum_hcd)->speed != HCD_USB3 && in set_link_state()
444 dum->gadget.speed == USB_SPEED_SUPER)) in set_link_state()
448 power_bit = (dummy_hcd_to_hcd(dum_hcd)->speed == HCD_USB3 ? in set_link_state()
451 if ((dum_hcd->port_status & USB_PORT_STAT_ENABLE) == 0 || in set_link_state()
452 dum_hcd->active) in set_link_state()
453 dum_hcd->resuming = 0; in set_link_state()
456 if ((dum_hcd->port_status & power_bit) == 0 || in set_link_state()
457 (dum_hcd->port_status & USB_PORT_STAT_RESET) != 0) { in set_link_state()
459 dum_hcd->old_status & (~dum_hcd->port_status); in set_link_state()
461 (~dum_hcd->old_status) & dum_hcd->port_status; in set_link_state()
464 if (dum->ints_enabled && (disconnect || reset)) { in set_link_state()
466 ++dum->callback_usage; in set_link_state()
467 spin_unlock(&dum->lock); in set_link_state()
469 usb_gadget_udc_reset(&dum->gadget, dum->driver); in set_link_state()
471 dum->driver->disconnect(&dum->gadget); in set_link_state()
472 spin_lock(&dum->lock); in set_link_state()
473 --dum->callback_usage; in set_link_state()
475 } else if (dum_hcd->active != dum_hcd->old_active && in set_link_state()
476 dum->ints_enabled) { in set_link_state()
477 ++dum->callback_usage; in set_link_state()
478 spin_unlock(&dum->lock); in set_link_state()
479 if (dum_hcd->old_active && dum->driver->suspend) in set_link_state()
480 dum->driver->suspend(&dum->gadget); in set_link_state()
481 else if (!dum_hcd->old_active && dum->driver->resume) in set_link_state()
482 dum->driver->resume(&dum->gadget); in set_link_state()
483 spin_lock(&dum->lock); in set_link_state()
484 --dum->callback_usage; in set_link_state()
487 dum_hcd->old_status = dum_hcd->port_status; in set_link_state()
488 dum_hcd->old_active = dum_hcd->active; in set_link_state()
491 /*-------------------------------------------------------------------------*/
501 (dum->port_status & USB_PORT_STAT_ENABLE)
513 if (!_ep || !desc || ep->desc || _ep->name == ep0name in dummy_enable()
514 || desc->bDescriptorType != USB_DT_ENDPOINT) in dummy_enable()
515 return -EINVAL; in dummy_enable()
517 if (!dum->driver) in dummy_enable()
518 return -ESHUTDOWN; in dummy_enable()
520 dum_hcd = gadget_to_dummy_hcd(&dum->gadget); in dummy_enable()
522 return -ESHUTDOWN; in dummy_enable()
525 * For HS/FS devices only bits 0..10 of the wMaxPacketSize represent the in dummy_enable()
527 * For SS devices the wMaxPacketSize is limited by 1024. in dummy_enable()
539 retval = -EINVAL; in dummy_enable()
542 if (strstr(ep->ep.name, "-iso") in dummy_enable()
543 || strstr(ep->ep.name, "-int")) { in dummy_enable()
546 switch (dum->gadget.speed) { in dummy_enable()
566 if (strstr(ep->ep.name, "-iso")) /* bulk is ok */ in dummy_enable()
569 switch (dum->gadget.speed) { in dummy_enable()
588 if (strstr(ep->ep.name, "-bulk") in dummy_enable()
589 || strstr(ep->ep.name, "-int")) in dummy_enable()
592 switch (dum->gadget.speed) { in dummy_enable()
613 _ep->maxpacket = max; in dummy_enable()
614 if (usb_ss_max_streams(_ep->comp_desc)) { in dummy_enable()
617 "non-bulk ep %s\n", _ep->name); in dummy_enable()
618 return -EINVAL; in dummy_enable()
620 ep->stream_en = 1; in dummy_enable()
622 ep->desc = desc; in dummy_enable()
624 dev_dbg(udc_dev(dum), "enabled %s (ep%d%s-%s) maxpacket %d stream %s\n", in dummy_enable()
625 _ep->name, in dummy_enable()
626 desc->bEndpointAddress & 0x0f, in dummy_enable()
627 (desc->bEndpointAddress & USB_DIR_IN) ? "in" : "out", in dummy_enable()
629 max, str_enabled_disabled(ep->stream_en)); in dummy_enable()
634 ep->halted = ep->wedged = 0; in dummy_enable()
647 if (!_ep || !ep->desc || _ep->name == ep0name) in dummy_disable()
648 return -EINVAL; in dummy_disable()
651 spin_lock_irqsave(&dum->lock, flags); in dummy_disable()
652 ep->desc = NULL; in dummy_disable()
653 ep->stream_en = 0; in dummy_disable()
655 spin_unlock_irqrestore(&dum->lock, flags); in dummy_disable()
657 dev_dbg(udc_dev(dum), "disabled %s\n", _ep->name); in dummy_disable()
672 INIT_LIST_HEAD(&req->queue); in dummy_alloc_request()
673 return &req->req; in dummy_alloc_request()
686 WARN_ON(!list_empty(&req->queue)); in dummy_free_request()
704 if (!_req || !list_empty(&req->queue) || !_req->complete) in dummy_queue()
705 return -EINVAL; in dummy_queue()
708 if (!_ep || (!ep->desc && _ep->name != ep0name)) in dummy_queue()
709 return -EINVAL; in dummy_queue()
712 dum_hcd = gadget_to_dummy_hcd(&dum->gadget); in dummy_queue()
713 if (!dum->driver || !is_enabled(dum_hcd)) in dummy_queue()
714 return -ESHUTDOWN; in dummy_queue()
718 ep, _req, _ep->name, _req->length, _req->buf); in dummy_queue()
720 _req->status = -EINPROGRESS; in dummy_queue()
721 _req->actual = 0; in dummy_queue()
722 spin_lock_irqsave(&dum->lock, flags); in dummy_queue()
724 /* implement an emulated single-request FIFO */ in dummy_queue()
725 if (ep->desc && (ep->desc->bEndpointAddress & USB_DIR_IN) && in dummy_queue()
726 list_empty(&dum->fifo_req.queue) && in dummy_queue()
727 list_empty(&ep->queue) && in dummy_queue()
728 _req->length <= FIFO_SIZE) { in dummy_queue()
729 req = &dum->fifo_req; in dummy_queue()
730 req->req = *_req; in dummy_queue()
731 req->req.buf = dum->fifo_buf; in dummy_queue()
732 memcpy(dum->fifo_buf, _req->buf, _req->length); in dummy_queue()
733 req->req.context = dum; in dummy_queue()
734 req->req.complete = fifo_complete; in dummy_queue()
736 list_add_tail(&req->queue, &ep->queue); in dummy_queue()
737 spin_unlock(&dum->lock); in dummy_queue()
738 _req->actual = _req->length; in dummy_queue()
739 _req->status = 0; in dummy_queue()
741 spin_lock(&dum->lock); in dummy_queue()
743 list_add_tail(&req->queue, &ep->queue); in dummy_queue()
744 spin_unlock_irqrestore(&dum->lock, flags); in dummy_queue()
756 int retval = -EINVAL; in dummy_dequeue()
765 if (!dum->driver) in dummy_dequeue()
766 return -ESHUTDOWN; in dummy_dequeue()
769 spin_lock(&dum->lock); in dummy_dequeue()
770 list_for_each_entry(iter, &ep->queue, queue) { in dummy_dequeue()
771 if (&iter->req != _req) in dummy_dequeue()
773 list_del_init(&iter->queue); in dummy_dequeue()
774 _req->status = -ECONNRESET; in dummy_dequeue()
779 spin_unlock(&dum->lock); in dummy_dequeue()
784 req, _ep->name, _req->length, _req->buf); in dummy_dequeue()
798 return -EINVAL; in dummy_set_halt_and_wedge()
801 if (!dum->driver) in dummy_set_halt_and_wedge()
802 return -ESHUTDOWN; in dummy_set_halt_and_wedge()
804 ep->halted = ep->wedged = 0; in dummy_set_halt_and_wedge()
805 else if (ep->desc && (ep->desc->bEndpointAddress & USB_DIR_IN) && in dummy_set_halt_and_wedge()
806 !list_empty(&ep->queue)) in dummy_set_halt_and_wedge()
807 return -EAGAIN; in dummy_set_halt_and_wedge()
809 ep->halted = 1; in dummy_set_halt_and_wedge()
811 ep->wedged = 1; in dummy_set_halt_and_wedge()
825 if (!_ep || _ep->name == ep0name) in dummy_set_wedge()
826 return -EINVAL; in dummy_set_wedge()
844 /*-------------------------------------------------------------------------*/
860 if (!(dum_hcd->dum->devstatus & ((1 << USB_DEVICE_B_HNP_ENABLE) in dummy_wakeup()
862 return -EINVAL; in dummy_wakeup()
863 if ((dum_hcd->port_status & USB_PORT_STAT_CONNECTION) == 0) in dummy_wakeup()
864 return -ENOLINK; in dummy_wakeup()
865 if ((dum_hcd->port_status & USB_PORT_STAT_SUSPEND) == 0 && in dummy_wakeup()
866 dum_hcd->rh_state != DUMMY_RH_SUSPENDED) in dummy_wakeup()
867 return -EIO; in dummy_wakeup()
872 dum_hcd->resuming = 1; in dummy_wakeup()
873 dum_hcd->re_timeout = jiffies + msecs_to_jiffies(20); in dummy_wakeup()
874 mod_timer(&dummy_hcd_to_hcd(dum_hcd)->rh_timer, dum_hcd->re_timeout); in dummy_wakeup()
882 _gadget->is_selfpowered = (value != 0); in dummy_set_selfpowered()
883 dum = gadget_to_dummy_hcd(_gadget)->dum; in dummy_set_selfpowered()
885 dum->devstatus |= (1 << USB_DEVICE_SELF_POWERED); in dummy_set_selfpowered()
887 dum->devstatus &= ~(1 << USB_DEVICE_SELF_POWERED); in dummy_set_selfpowered()
893 if (dum->gadget.speed == USB_SPEED_SUPER) in dummy_udc_update_ep0()
894 dum->ep[0].ep.maxpacket = 9; in dummy_udc_update_ep0()
896 dum->ep[0].ep.maxpacket = 64; in dummy_udc_update_ep0()
905 dum = gadget_dev_to_dummy(&_gadget->dev); in dummy_pullup()
908 spin_lock_irqsave(&dum->lock, flags); in dummy_pullup()
909 dum->pullup = (value != 0); in dummy_pullup()
920 while (dum->callback_usage > 0) { in dummy_pullup()
921 spin_unlock_irqrestore(&dum->lock, flags); in dummy_pullup()
923 spin_lock_irqsave(&dum->lock, flags); in dummy_pullup()
926 spin_unlock_irqrestore(&dum->lock, flags); in dummy_pullup()
937 dum = gadget_dev_to_dummy(&_gadget->dev); in dummy_udc_set_speed()
938 dum->gadget.speed = speed; in dummy_udc_set_speed()
944 struct dummy *dum = gadget_dev_to_dummy(&_gadget->dev); in dummy_udc_async_callbacks()
946 spin_lock_irq(&dum->lock); in dummy_udc_async_callbacks()
947 dum->ints_enabled = enable; in dummy_udc_async_callbacks()
948 spin_unlock_irq(&dum->lock); in dummy_udc_async_callbacks()
966 /*-------------------------------------------------------------------------*/
974 if (!dum->driver || !dum->driver->function) in function_show()
976 return scnprintf(buf, PAGE_SIZE, "%s\n", dum->driver->function); in function_show()
980 /*-------------------------------------------------------------------------*/
985 * This is basically hardware-specific; there's usually only one real USB
1000 struct dummy *dum = dum_hcd->dum; in dummy_udc_start()
1002 switch (g->speed) { in dummy_udc_start()
1011 driver->max_speed); in dummy_udc_start()
1012 return -EINVAL; in dummy_udc_start()
1020 spin_lock_irq(&dum->lock); in dummy_udc_start()
1021 dum->devstatus = 0; in dummy_udc_start()
1022 dum->driver = driver; in dummy_udc_start()
1023 spin_unlock_irq(&dum->lock); in dummy_udc_start()
1031 struct dummy *dum = dum_hcd->dum; in dummy_udc_stop()
1033 spin_lock_irq(&dum->lock); in dummy_udc_stop()
1034 dum->ints_enabled = 0; in dummy_udc_stop()
1036 dum->driver = NULL; in dummy_udc_stop()
1037 spin_unlock_irq(&dum->lock); in dummy_udc_stop()
1050 INIT_LIST_HEAD(&dum->gadget.ep_list); in init_dummy_udc_hw()
1052 struct dummy_ep *ep = &dum->ep[i]; in init_dummy_udc_hw()
1056 ep->ep.name = ep_info[i].name; in init_dummy_udc_hw()
1057 ep->ep.caps = ep_info[i].caps; in init_dummy_udc_hw()
1058 ep->ep.ops = &dummy_ep_ops; in init_dummy_udc_hw()
1059 list_add_tail(&ep->ep.ep_list, &dum->gadget.ep_list); in init_dummy_udc_hw()
1060 ep->halted = ep->wedged = ep->already_seen = in init_dummy_udc_hw()
1061 ep->setup_stage = 0; in init_dummy_udc_hw()
1062 usb_ep_set_maxpacket_limit(&ep->ep, ~0); in init_dummy_udc_hw()
1063 ep->ep.max_streams = 16; in init_dummy_udc_hw()
1064 ep->last_io = jiffies; in init_dummy_udc_hw()
1065 ep->gadget = &dum->gadget; in init_dummy_udc_hw()
1066 ep->desc = NULL; in init_dummy_udc_hw()
1067 INIT_LIST_HEAD(&ep->queue); in init_dummy_udc_hw()
1070 dum->gadget.ep0 = &dum->ep[0].ep; in init_dummy_udc_hw()
1071 list_del_init(&dum->ep[0].ep.ep_list); in init_dummy_udc_hw()
1072 INIT_LIST_HEAD(&dum->fifo_req.queue); in init_dummy_udc_hw()
1075 dum->gadget.is_otg = 1; in init_dummy_udc_hw()
1084 dum = *((void **)dev_get_platdata(&pdev->dev)); in dummy_udc_probe()
1085 /* Clear usb_gadget region for new registration to udc-core */ in dummy_udc_probe()
1086 memzero_explicit(&dum->gadget, sizeof(struct usb_gadget)); in dummy_udc_probe()
1087 dum->gadget.name = gadget_name; in dummy_udc_probe()
1088 dum->gadget.ops = &dummy_ops; in dummy_udc_probe()
1090 dum->gadget.max_speed = USB_SPEED_SUPER; in dummy_udc_probe()
1092 dum->gadget.max_speed = USB_SPEED_HIGH; in dummy_udc_probe()
1094 dum->gadget.max_speed = USB_SPEED_FULL; in dummy_udc_probe()
1096 dum->gadget.dev.parent = &pdev->dev; in dummy_udc_probe()
1099 rc = usb_add_gadget_udc(&pdev->dev, &dum->gadget); in dummy_udc_probe()
1103 rc = device_create_file(&dum->gadget.dev, &dev_attr_function); in dummy_udc_probe()
1110 usb_del_gadget_udc(&dum->gadget); in dummy_udc_probe()
1119 device_remove_file(&dum->gadget.dev, &dev_attr_function); in dummy_udc_remove()
1120 usb_del_gadget_udc(&dum->gadget); in dummy_udc_remove()
1126 spin_lock_irq(&dum->lock); in dummy_udc_pm()
1127 dum->udc_suspended = suspend; in dummy_udc_pm()
1129 spin_unlock_irq(&dum->lock); in dummy_udc_pm()
1135 struct dummy_hcd *dum_hcd = gadget_to_dummy_hcd(&dum->gadget); in dummy_udc_suspend()
1137 dev_dbg(&pdev->dev, "%s\n", __func__); in dummy_udc_suspend()
1146 struct dummy_hcd *dum_hcd = gadget_to_dummy_hcd(&dum->gadget); in dummy_udc_resume()
1148 dev_dbg(&pdev->dev, "%s\n", __func__); in dummy_udc_resume()
1164 /*-------------------------------------------------------------------------*/
1190 const struct usb_endpoint_descriptor *desc = &urb->ep->desc; in dummy_ep_stream_en()
1197 return (1 << index) & dum_hcd->stream_en_ep; in dummy_ep_stream_en()
1212 max_streams = dum_hcd->num_stream[usb_pipeendpoint(pipe)]; in get_max_streams_for_pipe()
1226 streams--; in set_max_streams_for_pipe()
1227 max_streams = dum_hcd->num_stream[usb_pipeendpoint(pipe)]; in set_max_streams_for_pipe()
1235 dum_hcd->num_stream[usb_pipeendpoint(pipe)] = max_streams; in set_max_streams_for_pipe()
1244 if (!urb->stream_id) { in dummy_validate_stream()
1246 return -EINVAL; in dummy_validate_stream()
1250 return -EINVAL; in dummy_validate_stream()
1253 usb_pipeendpoint(urb->pipe)); in dummy_validate_stream()
1254 if (urb->stream_id > max_streams) { in dummy_validate_stream()
1256 urb->stream_id); in dummy_validate_stream()
1258 return -EINVAL; in dummy_validate_stream()
1275 return -ENOMEM; in dummy_urb_enqueue()
1276 urbp->urb = urb; in dummy_urb_enqueue()
1277 urbp->miter_started = 0; in dummy_urb_enqueue()
1280 spin_lock_irqsave(&dum_hcd->dum->lock, flags); in dummy_urb_enqueue()
1294 if (!dum_hcd->udev) { in dummy_urb_enqueue()
1295 dum_hcd->udev = urb->dev; in dummy_urb_enqueue()
1296 usb_get_dev(dum_hcd->udev); in dummy_urb_enqueue()
1297 } else if (unlikely(dum_hcd->udev != urb->dev)) in dummy_urb_enqueue()
1300 list_add_tail(&urbp->urbp_list, &dum_hcd->urbp_list); in dummy_urb_enqueue()
1301 urb->hcpriv = urbp; in dummy_urb_enqueue()
1302 if (!dum_hcd->next_frame_urbp) in dummy_urb_enqueue()
1303 dum_hcd->next_frame_urbp = urbp; in dummy_urb_enqueue()
1304 if (usb_pipetype(urb->pipe) == PIPE_CONTROL) in dummy_urb_enqueue()
1305 urb->error_count = 1; /* mark as a new urb */ in dummy_urb_enqueue()
1308 if (!dum_hcd->timer_pending) { in dummy_urb_enqueue()
1309 dum_hcd->timer_pending = 1; in dummy_urb_enqueue()
1310 hrtimer_start(&dum_hcd->timer, ns_to_ktime(DUMMY_TIMER_INT_NSECS), in dummy_urb_enqueue()
1315 spin_unlock_irqrestore(&dum_hcd->dum->lock, flags); in dummy_urb_enqueue()
1328 spin_lock_irqsave(&dum_hcd->dum->lock, flags); in dummy_urb_dequeue()
1331 if (rc == 0 && !dum_hcd->timer_pending) { in dummy_urb_dequeue()
1332 dum_hcd->timer_pending = 1; in dummy_urb_dequeue()
1333 hrtimer_start(&dum_hcd->timer, ns_to_ktime(0), HRTIMER_MODE_REL_SOFT); in dummy_urb_dequeue()
1336 spin_unlock_irqrestore(&dum_hcd->dum->lock, flags); in dummy_urb_dequeue()
1344 struct urbp *urbp = urb->hcpriv; in dummy_perform_transfer()
1346 struct sg_mapping_iter *miter = &urbp->miter; in dummy_perform_transfer()
1352 rbuf = req->req.buf + req->req.actual; in dummy_perform_transfer()
1354 if (!urb->num_sgs) { in dummy_perform_transfer()
1355 ubuf = urb->transfer_buffer + urb->actual_length; in dummy_perform_transfer()
1363 if (!urbp->miter_started) { in dummy_perform_transfer()
1371 sg_miter_start(miter, urb->sg, urb->num_sgs, flags); in dummy_perform_transfer()
1372 urbp->miter_started = 1; in dummy_perform_transfer()
1377 return -EINVAL; in dummy_perform_transfer()
1380 ubuf = miter->addr; in dummy_perform_transfer()
1381 this_sg = min_t(u32, len, miter->length); in dummy_perform_transfer()
1382 miter->consumed = this_sg; in dummy_perform_transfer()
1389 len -= this_sg; in dummy_perform_transfer()
1396 return -EINVAL; in dummy_perform_transfer()
1410 struct dummy *dum = dum_hcd->dum; in transfer()
1416 list_for_each_entry(req, &ep->queue, queue) { in transfer()
1422 if ((urb->stream_id != req->req.stream_id)) in transfer()
1426 /* 1..N packets of ep->ep.maxpacket each ... the last one in transfer()
1433 host_len = urb->transfer_buffer_length - urb->actual_length; in transfer()
1434 dev_len = req->req.length - req->req.actual; in transfer()
1444 if (limit < ep->ep.maxpacket && limit < len) in transfer()
1451 if (len >= ep->ep.maxpacket) { in transfer()
1453 if (len % ep->ep.maxpacket) in transfer()
1455 len -= len % ep->ep.maxpacket; in transfer()
1462 ep->last_io = jiffies; in transfer()
1464 req->req.status = len; in transfer()
1466 limit -= len; in transfer()
1468 urb->actual_length += len; in transfer()
1469 req->req.actual += len; in transfer()
1478 * need to emulate such data-in-flight. in transfer()
1482 req->req.status = 0; in transfer()
1485 req->req.status = 0; in transfer()
1487 *status = -EOVERFLOW; in transfer()
1493 req->req.status = -EOVERFLOW; in transfer()
1495 req->req.status = 0; in transfer()
1503 if (req->req.length == req->req.actual) { in transfer()
1504 if (req->req.zero && to_host) in transfer()
1507 req->req.status = 0; in transfer()
1509 if (urb->transfer_buffer_length == urb->actual_length) { in transfer()
1510 if (urb->transfer_flags & URB_ZERO_PACKET && in transfer()
1518 /* device side completion --> continuable */ in transfer()
1519 if (req->req.status != -EINPROGRESS) { in transfer()
1520 list_del_init(&req->queue); in transfer()
1522 spin_unlock(&dum->lock); in transfer()
1523 usb_gadget_giveback_request(&ep->ep, &req->req); in transfer()
1524 spin_lock(&dum->lock); in transfer()
1530 /* host side completion --> terminate */ in transfer()
1531 if (*status != -EINPROGRESS) in transfer()
1543 int limit = ep->ep.maxpacket; in periodic_bytes()
1545 if (dum->gadget.speed == USB_SPEED_HIGH) { in periodic_bytes()
1549 tmp = usb_endpoint_maxp_mult(ep->desc); in periodic_bytes()
1553 if (dum->gadget.speed == USB_SPEED_SUPER) { in periodic_bytes()
1554 switch (usb_endpoint_type(ep->desc)) { in periodic_bytes()
1571 #define is_active(dum_hcd) ((dum_hcd->port_status & \
1580 if (!is_active((dum->gadget.speed == USB_SPEED_SUPER ? in find_endpoint()
1581 dum->ss_hcd : dum->hs_hcd))) in find_endpoint()
1583 if (!dum->ints_enabled) in find_endpoint()
1586 return &dum->ep[0]; in find_endpoint()
1588 struct dummy_ep *ep = &dum->ep[i]; in find_endpoint()
1590 if (!ep->desc) in find_endpoint()
1592 if (ep->desc->bEndpointAddress == address) in find_endpoint()
1609 * handle_control_request() - handles all control transfers
1616 * Return 0 - if the request was handled
1617 * 1 - if the request wasn't handles
1625 struct dummy *dum = dum_hcd->dum; in handle_control_request()
1630 w_index = le16_to_cpu(setup->wIndex); in handle_control_request()
1631 w_value = le16_to_cpu(setup->wValue); in handle_control_request()
1632 switch (setup->bRequest) { in handle_control_request()
1634 if (setup->bRequestType != Dev_Request) in handle_control_request()
1636 dum->address = w_value; in handle_control_request()
1643 if (setup->bRequestType == Dev_Request) { in handle_control_request()
1649 dum->gadget.b_hnp_enable = 1; in handle_control_request()
1652 dum->gadget.a_hnp_support = 1; in handle_control_request()
1655 dum->gadget.a_alt_hnp_support = 1; in handle_control_request()
1658 if (dummy_hcd_to_hcd(dum_hcd)->speed == in handle_control_request()
1662 ret_val = -EOPNOTSUPP; in handle_control_request()
1665 if (dummy_hcd_to_hcd(dum_hcd)->speed == in handle_control_request()
1669 ret_val = -EOPNOTSUPP; in handle_control_request()
1672 if (dummy_hcd_to_hcd(dum_hcd)->speed == in handle_control_request()
1676 ret_val = -EOPNOTSUPP; in handle_control_request()
1679 ret_val = -EOPNOTSUPP; in handle_control_request()
1682 dum->devstatus |= (1 << w_value); in handle_control_request()
1685 } else if (setup->bRequestType == Ep_Request) { in handle_control_request()
1688 if (!ep2 || ep2->ep.name == ep0name) { in handle_control_request()
1689 ret_val = -EOPNOTSUPP; in handle_control_request()
1692 ep2->halted = 1; in handle_control_request()
1698 if (setup->bRequestType == Dev_Request) { in handle_control_request()
1705 if (dummy_hcd_to_hcd(dum_hcd)->speed == in handle_control_request()
1709 ret_val = -EOPNOTSUPP; in handle_control_request()
1712 if (dummy_hcd_to_hcd(dum_hcd)->speed == in handle_control_request()
1716 ret_val = -EOPNOTSUPP; in handle_control_request()
1719 if (dummy_hcd_to_hcd(dum_hcd)->speed == in handle_control_request()
1723 ret_val = -EOPNOTSUPP; in handle_control_request()
1726 ret_val = -EOPNOTSUPP; in handle_control_request()
1730 dum->devstatus &= ~(1 << w_value); in handle_control_request()
1733 } else if (setup->bRequestType == Ep_Request) { in handle_control_request()
1737 ret_val = -EOPNOTSUPP; in handle_control_request()
1740 if (!ep2->wedged) in handle_control_request()
1741 ep2->halted = 0; in handle_control_request()
1747 if (setup->bRequestType == Dev_InRequest in handle_control_request()
1748 || setup->bRequestType == Intf_InRequest in handle_control_request()
1749 || setup->bRequestType == Ep_InRequest) { in handle_control_request()
1756 buf = (char *)urb->transfer_buffer; in handle_control_request()
1757 if (urb->transfer_buffer_length > 0) { in handle_control_request()
1758 if (setup->bRequestType == Ep_InRequest) { in handle_control_request()
1761 ret_val = -EOPNOTSUPP; in handle_control_request()
1764 buf[0] = ep2->halted; in handle_control_request()
1765 } else if (setup->bRequestType == in handle_control_request()
1767 buf[0] = (u8)dum->devstatus; in handle_control_request()
1771 if (urb->transfer_buffer_length > 1) in handle_control_request()
1773 urb->actual_length = min_t(u32, 2, in handle_control_request()
1774 urb->transfer_buffer_length); in handle_control_request()
1791 struct dummy *dum = dum_hcd->dum; in dummy_timer()
1799 switch (dum->gadget.speed) { in dummy_timer()
1820 spin_lock_irqsave(&dum->lock, flags); in dummy_timer()
1821 dum_hcd->timer_pending = 0; in dummy_timer()
1823 if (!dum_hcd->udev) { in dummy_timer()
1826 spin_unlock_irqrestore(&dum->lock, flags); in dummy_timer()
1829 dum_hcd->next_frame_urbp = NULL; in dummy_timer()
1834 dum->ep[i].already_seen = 0; in dummy_timer()
1838 list_for_each_entry_safe(urbp, tmp, &dum_hcd->urbp_list, urbp_list) { in dummy_timer()
1843 int status = -EINPROGRESS; in dummy_timer()
1846 if (urbp == dum_hcd->next_frame_urbp) in dummy_timer()
1849 urb = urbp->urb; in dummy_timer()
1850 if (urb->unlinked) in dummy_timer()
1852 else if (dum_hcd->rh_state != DUMMY_RH_RUNNING) in dummy_timer()
1860 address = usb_pipeendpoint (urb->pipe); in dummy_timer()
1869 status = -EPROTO; in dummy_timer()
1873 if (ep->already_seen) in dummy_timer()
1875 ep->already_seen = 1; in dummy_timer()
1876 if (ep == &dum->ep[0] && urb->error_count) { in dummy_timer()
1877 ep->setup_stage = 1; /* a new urb */ in dummy_timer()
1878 urb->error_count = 0; in dummy_timer()
1880 if (ep->halted && !ep->setup_stage) { in dummy_timer()
1883 ep->ep.name, urb); in dummy_timer()
1884 status = -EPIPE; in dummy_timer()
1890 if (ep == &dum->ep[0] && ep->setup_stage) { in dummy_timer()
1894 setup = *(struct usb_ctrlrequest *) urb->setup_packet; in dummy_timer()
1896 list_for_each_entry(req, &ep->queue, queue) { in dummy_timer()
1897 list_del_init(&req->queue); in dummy_timer()
1898 req->req.status = -EOVERFLOW; in dummy_timer()
1902 spin_unlock(&dum->lock); in dummy_timer()
1903 usb_gadget_giveback_request(&ep->ep, &req->req); in dummy_timer()
1904 spin_lock(&dum->lock); in dummy_timer()
1905 ep->already_seen = 0; in dummy_timer()
1913 ep->last_io = jiffies; in dummy_timer()
1914 ep->setup_stage = 0; in dummy_timer()
1915 ep->halted = 0; in dummy_timer()
1924 ++dum->callback_usage; in dummy_timer()
1925 spin_unlock(&dum->lock); in dummy_timer()
1926 value = dum->driver->setup(&dum->gadget, in dummy_timer()
1928 spin_lock(&dum->lock); in dummy_timer()
1929 --dum->callback_usage; in dummy_timer()
1940 if (value != -EOPNOTSUPP) in dummy_timer()
1942 "setup --> %d\n", in dummy_timer()
1944 status = -EPIPE; in dummy_timer()
1945 urb->actual_length = 0; in dummy_timer()
1951 /* non-control requests */ in dummy_timer()
1953 switch (usb_pipetype(urb->pipe)) { in dummy_timer()
1959 * Is it urb->interval since the last xfer? in dummy_timer()
1960 * Use urb->iso_frame_desc[i]. in dummy_timer()
1965 status = -EINVAL; /* fail all xfers */ in dummy_timer()
1969 /* FIXME is it urb->interval since the last xfer? in dummy_timer()
1977 ep->last_io = jiffies; in dummy_timer()
1978 total -= transfer(dum_hcd, urb, ep, limit, &status); in dummy_timer()
1983 if (status == -EINPROGRESS) in dummy_timer()
1987 list_del(&urbp->urbp_list); in dummy_timer()
1990 ep->already_seen = ep->setup_stage = 0; in dummy_timer()
1993 spin_unlock(&dum->lock); in dummy_timer()
1995 spin_lock(&dum->lock); in dummy_timer()
2000 if (list_empty(&dum_hcd->urbp_list)) { in dummy_timer()
2001 usb_put_dev(dum_hcd->udev); in dummy_timer()
2002 dum_hcd->udev = NULL; in dummy_timer()
2003 } else if (!dum_hcd->timer_pending && in dummy_timer()
2004 dum_hcd->rh_state == DUMMY_RH_RUNNING) { in dummy_timer()
2006 dum_hcd->timer_pending = 1; in dummy_timer()
2007 hrtimer_start(&dum_hcd->timer, ns_to_ktime(DUMMY_TIMER_INT_NSECS), in dummy_timer()
2011 spin_unlock_irqrestore(&dum->lock, flags); in dummy_timer()
2016 /*-------------------------------------------------------------------------*/
2033 spin_lock_irqsave(&dum_hcd->dum->lock, flags); in dummy_hub_status()
2037 if (dum_hcd->resuming && time_after_eq(jiffies, dum_hcd->re_timeout)) { in dummy_hub_status()
2038 dum_hcd->port_status |= (USB_PORT_STAT_C_SUSPEND << 16); in dummy_hub_status()
2039 dum_hcd->port_status &= ~USB_PORT_STAT_SUSPEND; in dummy_hub_status()
2043 if ((dum_hcd->port_status & PORT_C_MASK) != 0) { in dummy_hub_status()
2046 dum_hcd->port_status); in dummy_hub_status()
2048 if (dum_hcd->rh_state == DUMMY_RH_SUSPENDED) in dummy_hub_status()
2052 spin_unlock_irqrestore(&dum_hcd->dum->lock, flags); in dummy_hub_status()
2081 desc->bDescriptorType = USB_DT_SS_HUB; in ss_hub_descriptor()
2082 desc->bDescLength = 12; in ss_hub_descriptor()
2083 desc->wHubCharacteristics = cpu_to_le16( in ss_hub_descriptor()
2086 desc->bNbrPorts = 1; in ss_hub_descriptor()
2087 desc->u.ss.bHubHdrDecLat = 0x04; /* Worst case: 0.4 micro sec*/ in ss_hub_descriptor()
2088 desc->u.ss.DeviceRemovable = 0; in ss_hub_descriptor()
2094 desc->bDescriptorType = USB_DT_HUB; in hub_descriptor()
2095 desc->bDescLength = 9; in hub_descriptor()
2096 desc->wHubCharacteristics = cpu_to_le16( in hub_descriptor()
2099 desc->bNbrPorts = 1; in hub_descriptor()
2100 desc->u.hs.DeviceRemovable[0] = 0; in hub_descriptor()
2101 desc->u.hs.DeviceRemovable[1] = 0xff; /* PortPwrCtrlMask */ in hub_descriptor()
2117 return -ETIMEDOUT; in dummy_hub_control()
2121 spin_lock_irqsave(&dum_hcd->dum->lock, flags); in dummy_hub_control()
2128 if (hcd->speed == HCD_USB3) { in dummy_hub_control()
2134 if (dum_hcd->port_status & USB_PORT_STAT_SUSPEND) { in dummy_hub_control()
2136 dum_hcd->resuming = 1; in dummy_hub_control()
2137 dum_hcd->re_timeout = jiffies + in dummy_hub_control()
2142 dev_dbg(dummy_dev(dum_hcd), "power-off\n"); in dummy_hub_control()
2143 if (hcd->speed == HCD_USB3) in dummy_hub_control()
2144 dum_hcd->port_status &= ~USB_SS_PORT_STAT_POWER; in dummy_hub_control()
2146 dum_hcd->port_status &= ~USB_PORT_STAT_POWER; in dummy_hub_control()
2152 /* Not allowed for USB-3 */ in dummy_hub_control()
2153 if (hcd->speed == HCD_USB3) in dummy_hub_control()
2158 dum_hcd->port_status &= ~(1 << wValue); in dummy_hub_control()
2167 if (hcd->speed == HCD_USB3 && in dummy_hub_control()
2175 if (hcd->speed == HCD_USB3) in dummy_hub_control()
2182 if (hcd->speed != HCD_USB3) in dummy_hub_control()
2197 retval = -EPIPE; in dummy_hub_control()
2202 if (dum_hcd->resuming && in dummy_hub_control()
2203 time_after_eq(jiffies, dum_hcd->re_timeout)) { in dummy_hub_control()
2204 dum_hcd->port_status |= (USB_PORT_STAT_C_SUSPEND << 16); in dummy_hub_control()
2205 dum_hcd->port_status &= ~USB_PORT_STAT_SUSPEND; in dummy_hub_control()
2207 if ((dum_hcd->port_status & USB_PORT_STAT_RESET) != 0 && in dummy_hub_control()
2208 time_after_eq(jiffies, dum_hcd->re_timeout)) { in dummy_hub_control()
2209 dum_hcd->port_status |= (USB_PORT_STAT_C_RESET << 16); in dummy_hub_control()
2210 dum_hcd->port_status &= ~USB_PORT_STAT_RESET; in dummy_hub_control()
2211 if (dum_hcd->dum->pullup) { in dummy_hub_control()
2212 dum_hcd->port_status |= USB_PORT_STAT_ENABLE; in dummy_hub_control()
2214 if (hcd->speed < HCD_USB3) { in dummy_hub_control()
2215 switch (dum_hcd->dum->gadget.speed) { in dummy_hub_control()
2217 dum_hcd->port_status |= in dummy_hub_control()
2221 dum_hcd->dum->gadget.ep0-> in dummy_hub_control()
2223 dum_hcd->port_status |= in dummy_hub_control()
2233 ((__le16 *) buf)[0] = cpu_to_le16(dum_hcd->port_status); in dummy_hub_control()
2234 ((__le16 *) buf)[1] = cpu_to_le16(dum_hcd->port_status >> 16); in dummy_hub_control()
2237 retval = -EPIPE; in dummy_hub_control()
2242 if (hcd->speed != HCD_USB3) { in dummy_hub_control()
2256 if (hcd->speed != HCD_USB3) { in dummy_hub_control()
2265 if (hcd->speed == HCD_USB3) { in dummy_hub_control()
2271 if (dum_hcd->active) { in dummy_hub_control()
2272 dum_hcd->port_status |= USB_PORT_STAT_SUSPEND; in dummy_hub_control()
2279 & dum_hcd->dum->devstatus) != 0) in dummy_hub_control()
2285 if (hcd->speed == HCD_USB3) in dummy_hub_control()
2286 dum_hcd->port_status |= USB_SS_PORT_STAT_POWER; in dummy_hub_control()
2288 dum_hcd->port_status |= USB_PORT_STAT_POWER; in dummy_hub_control()
2293 if (hcd->speed != HCD_USB3) { in dummy_hub_control()
2301 if (!(dum_hcd->port_status & USB_PORT_STAT_CONNECTION)) in dummy_hub_control()
2304 if (hcd->speed == HCD_USB3) { in dummy_hub_control()
2305 dum_hcd->port_status = in dummy_hub_control()
2310 dum_hcd->port_status &= ~(USB_PORT_STAT_ENABLE in dummy_hub_control()
2313 dum_hcd->port_status |= USB_PORT_STAT_RESET; in dummy_hub_control()
2319 dum_hcd->dum->devstatus &= in dummy_hub_control()
2325 dum_hcd->re_timeout = jiffies + msecs_to_jiffies(50); in dummy_hub_control()
2332 /* Not allowed for USB-3, and ignored for USB-2 */ in dummy_hub_control()
2333 if (hcd->speed == HCD_USB3) in dummy_hub_control()
2342 if (hcd->speed != HCD_USB3) { in dummy_hub_control()
2352 if (hcd->speed != HCD_USB3) { in dummy_hub_control()
2365 retval = -EPIPE; in dummy_hub_control()
2367 spin_unlock_irqrestore(&dum_hcd->dum->lock, flags); in dummy_hub_control()
2369 if ((dum_hcd->port_status & PORT_C_MASK) != 0) in dummy_hub_control()
2378 dev_dbg(&hcd->self.root_hub->dev, "%s\n", __func__); in dummy_bus_suspend()
2380 spin_lock_irq(&dum_hcd->dum->lock); in dummy_bus_suspend()
2381 dum_hcd->rh_state = DUMMY_RH_SUSPENDED; in dummy_bus_suspend()
2383 hcd->state = HC_STATE_SUSPENDED; in dummy_bus_suspend()
2384 spin_unlock_irq(&dum_hcd->dum->lock); in dummy_bus_suspend()
2393 dev_dbg(&hcd->self.root_hub->dev, "%s\n", __func__); in dummy_bus_resume()
2395 spin_lock_irq(&dum_hcd->dum->lock); in dummy_bus_resume()
2397 rc = -ESHUTDOWN; in dummy_bus_resume()
2399 dum_hcd->rh_state = DUMMY_RH_RUNNING; in dummy_bus_resume()
2401 if (!list_empty(&dum_hcd->urbp_list)) { in dummy_bus_resume()
2402 dum_hcd->timer_pending = 1; in dummy_bus_resume()
2403 hrtimer_start(&dum_hcd->timer, ns_to_ktime(0), HRTIMER_MODE_REL_SOFT); in dummy_bus_resume()
2405 hcd->state = HC_STATE_RUNNING; in dummy_bus_resume()
2407 spin_unlock_irq(&dum_hcd->dum->lock); in dummy_bus_resume()
2411 /*-------------------------------------------------------------------------*/
2415 int ep = usb_pipeendpoint(urb->pipe); in show_urb()
2421 switch (urb->dev->speed) { in show_urb()
2432 s = "ss"; in show_urb()
2440 switch (usb_pipetype(urb->pipe)) { \ in show_urb()
2445 s = "-bulk"; \ in show_urb()
2448 s = "-int"; \ in show_urb()
2451 s = "-iso"; \ in show_urb()
2454 urb->actual_length, urb->transfer_buffer_length); in show_urb()
2466 spin_lock_irqsave(&dum_hcd->dum->lock, flags); in urbs_show()
2467 list_for_each_entry(urbp, &dum_hcd->urbp_list, urbp_list) { in urbs_show()
2470 temp = show_urb(buf, PAGE_SIZE - size, urbp->urb); in urbs_show()
2474 spin_unlock_irqrestore(&dum_hcd->dum->lock, flags); in urbs_show()
2482 hrtimer_init(&dum_hcd->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_SOFT); in dummy_start_ss()
2483 dum_hcd->timer.function = dummy_timer; in dummy_start_ss()
2484 dum_hcd->rh_state = DUMMY_RH_RUNNING; in dummy_start_ss()
2485 dum_hcd->stream_en_ep = 0; in dummy_start_ss()
2486 INIT_LIST_HEAD(&dum_hcd->urbp_list); in dummy_start_ss()
2487 dummy_hcd_to_hcd(dum_hcd)->power_budget = POWER_BUDGET_3; in dummy_start_ss()
2488 dummy_hcd_to_hcd(dum_hcd)->state = HC_STATE_RUNNING; in dummy_start_ss()
2489 dummy_hcd_to_hcd(dum_hcd)->uses_new_polling = 1; in dummy_start_ss()
2491 dummy_hcd_to_hcd(dum_hcd)->self.otg_port = 1; in dummy_start_ss()
2495 /* FIXME 'urbs' should be a per-device thing, maybe in usbcore */ in dummy_start_ss()
2506 * just like more familiar pci-based HCDs. in dummy_start()
2511 spin_lock_init(&dum_hcd->dum->lock); in dummy_start()
2512 hrtimer_init(&dum_hcd->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_SOFT); in dummy_start()
2513 dum_hcd->timer.function = dummy_timer; in dummy_start()
2514 dum_hcd->rh_state = DUMMY_RH_RUNNING; in dummy_start()
2516 INIT_LIST_HEAD(&dum_hcd->urbp_list); in dummy_start()
2518 hcd->power_budget = POWER_BUDGET; in dummy_start()
2519 hcd->state = HC_STATE_RUNNING; in dummy_start()
2520 hcd->uses_new_polling = 1; in dummy_start()
2523 hcd->self.otg_port = 1; in dummy_start()
2526 /* FIXME 'urbs' should be a per-device thing, maybe in usbcore */ in dummy_start()
2534 hrtimer_cancel(&dum_hcd->timer); in dummy_stop()
2535 dum_hcd->timer_pending = 0; in dummy_stop()
2540 /*-------------------------------------------------------------------------*/
2551 dum = *((void **)dev_get_platdata(hcd->self.controller)); in dummy_setup()
2552 hcd->self.sg_tablesize = ~0; in dummy_setup()
2554 dum->hs_hcd = hcd_to_dummy_hcd(hcd); in dummy_setup()
2555 dum->hs_hcd->dum = dum; in dummy_setup()
2561 hcd->speed = HCD_USB2; in dummy_setup()
2562 hcd->self.root_hub->speed = USB_SPEED_HIGH; in dummy_setup()
2564 dum->ss_hcd = hcd_to_dummy_hcd(hcd); in dummy_setup()
2565 dum->ss_hcd->dum = dum; in dummy_setup()
2566 hcd->speed = HCD_USB3; in dummy_setup()
2567 hcd->self.root_hub->speed = USB_SPEED_SUPER; in dummy_setup()
2585 return -EINVAL; in dummy_alloc_streams()
2587 spin_lock_irqsave(&dum_hcd->dum->lock, flags); in dummy_alloc_streams()
2589 index = dummy_get_ep_idx(&eps[i]->desc); in dummy_alloc_streams()
2590 if ((1 << index) & dum_hcd->stream_en_ep) { in dummy_alloc_streams()
2591 ret_streams = -EINVAL; in dummy_alloc_streams()
2594 max_stream = usb_ss_max_streams(&eps[i]->ss_ep_comp); in dummy_alloc_streams()
2596 ret_streams = -EINVAL; in dummy_alloc_streams()
2602 eps[i]->desc.bEndpointAddress, in dummy_alloc_streams()
2609 index = dummy_get_ep_idx(&eps[i]->desc); in dummy_alloc_streams()
2610 dum_hcd->stream_en_ep |= 1 << index; in dummy_alloc_streams()
2612 usb_endpoint_num(&eps[i]->desc), ret_streams); in dummy_alloc_streams()
2615 spin_unlock_irqrestore(&dum_hcd->dum->lock, flags); in dummy_alloc_streams()
2630 spin_lock_irqsave(&dum_hcd->dum->lock, flags); in dummy_free_streams()
2632 index = dummy_get_ep_idx(&eps[i]->desc); in dummy_free_streams()
2633 if (!((1 << index) & dum_hcd->stream_en_ep)) { in dummy_free_streams()
2634 ret = -EINVAL; in dummy_free_streams()
2640 index = dummy_get_ep_idx(&eps[i]->desc); in dummy_free_streams()
2641 dum_hcd->stream_en_ep &= ~(1 << index); in dummy_free_streams()
2643 usb_endpoint_num(&eps[i]->desc), 0); in dummy_free_streams()
2647 spin_unlock_irqrestore(&dum_hcd->dum->lock, flags); in dummy_free_streams()
2681 dev_info(&pdev->dev, "%s, driver " DRIVER_VERSION "\n", driver_desc); in dummy_hcd_probe()
2682 dum = *((void **)dev_get_platdata(&pdev->dev)); in dummy_hcd_probe()
2690 hs_hcd = usb_create_hcd(&dummy_hcd, &pdev->dev, dev_name(&pdev->dev)); in dummy_hcd_probe()
2692 return -ENOMEM; in dummy_hcd_probe()
2693 hs_hcd->has_tt = 1; in dummy_hcd_probe()
2700 ss_hcd = usb_create_shared_hcd(&dummy_hcd, &pdev->dev, in dummy_hcd_probe()
2701 dev_name(&pdev->dev), hs_hcd); in dummy_hcd_probe()
2703 retval = -ENOMEM; in dummy_hcd_probe()
2719 dum->hs_hcd = dum->ss_hcd = NULL; in dummy_hcd_probe()
2727 dum = hcd_to_dummy_hcd(platform_get_drvdata(pdev))->dum; in dummy_hcd_remove()
2729 if (dum->ss_hcd) { in dummy_hcd_remove()
2730 usb_remove_hcd(dummy_hcd_to_hcd(dum->ss_hcd)); in dummy_hcd_remove()
2731 usb_put_hcd(dummy_hcd_to_hcd(dum->ss_hcd)); in dummy_hcd_remove()
2734 usb_remove_hcd(dummy_hcd_to_hcd(dum->hs_hcd)); in dummy_hcd_remove()
2735 usb_put_hcd(dummy_hcd_to_hcd(dum->hs_hcd)); in dummy_hcd_remove()
2737 dum->hs_hcd = NULL; in dummy_hcd_remove()
2738 dum->ss_hcd = NULL; in dummy_hcd_remove()
2747 dev_dbg(&pdev->dev, "%s\n", __func__); in dummy_hcd_suspend()
2751 if (dum_hcd->rh_state == DUMMY_RH_RUNNING) { in dummy_hcd_suspend()
2752 dev_warn(&pdev->dev, "Root hub isn't suspended!\n"); in dummy_hcd_suspend()
2753 rc = -EBUSY; in dummy_hcd_suspend()
2755 clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); in dummy_hcd_suspend()
2763 dev_dbg(&pdev->dev, "%s\n", __func__); in dummy_hcd_resume()
2766 set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); in dummy_hcd_resume()
2781 /*-------------------------------------------------------------------------*/
2788 int retval = -ENOMEM; in dummy_hcd_init()
2793 return -ENODEV; in dummy_hcd_init()
2796 return -EINVAL; in dummy_hcd_init()
2798 if (mod_data.num < 1 || mod_data.num > MAX_NUM_UDC) { in dummy_hcd_init()
2801 return -EINVAL; in dummy_hcd_init()
2804 for (i = 0; i < mod_data.num; i++) { in dummy_hcd_init()
2807 i--; in dummy_hcd_init()
2809 platform_device_put(the_hcd_pdev[i--]); in dummy_hcd_init()
2813 for (i = 0; i < mod_data.num; i++) { in dummy_hcd_init()
2816 i--; in dummy_hcd_init()
2818 platform_device_put(the_udc_pdev[i--]); in dummy_hcd_init()
2822 for (i = 0; i < mod_data.num; i++) { in dummy_hcd_init()
2825 retval = -ENOMEM; in dummy_hcd_init()
2845 for (i = 0; i < mod_data.num; i++) { in dummy_hcd_init()
2848 i--; in dummy_hcd_init()
2850 platform_device_del(the_hcd_pdev[i--]); in dummy_hcd_init()
2854 for (i = 0; i < mod_data.num; i++) { in dummy_hcd_init()
2855 if (!dum[i]->hs_hcd || in dummy_hcd_init()
2856 (!dum[i]->ss_hcd && mod_data.is_super_speed)) { in dummy_hcd_init()
2861 retval = -EINVAL; in dummy_hcd_init()
2866 for (i = 0; i < mod_data.num; i++) { in dummy_hcd_init()
2869 i--; in dummy_hcd_init()
2871 platform_device_del(the_udc_pdev[i--]); in dummy_hcd_init()
2876 for (i = 0; i < mod_data.num; i++) { in dummy_hcd_init()
2882 retval = -EINVAL; in dummy_hcd_init()
2889 for (i = 0; i < mod_data.num; i++) in dummy_hcd_init()
2892 for (i = 0; i < mod_data.num; i++) in dummy_hcd_init()
2899 for (i = 0; i < mod_data.num; i++) in dummy_hcd_init()
2901 for (i = 0; i < mod_data.num; i++) in dummy_hcd_init()
2904 for (i = 0; i < mod_data.num; i++) in dummy_hcd_init()
2914 for (i = 0; i < mod_data.num; i++) { in dummy_hcd_cleanup()
2917 dum = *((void **)dev_get_platdata(&the_udc_pdev[i]->dev)); in dummy_hcd_cleanup()