Lines Matching +full:ep +full:- +full:side

1 // SPDX-License-Identifier: GPL-2.0+
4 * Copyright (C) 2015-2016 Samsung Electronics
25 /* urb-related structures alloc / free */
33 kfree(urb->setup_packet); in free_urb()
34 urb->setup_packet = NULL; in free_urb()
36 kfree(urb->transfer_buffer); in free_urb()
37 urb->transfer_buffer = NULL; in free_urb()
50 urb_p->urb = NULL; in alloc_urbp()
51 urb_p->ep = NULL; in alloc_urbp()
52 INIT_LIST_HEAD(&urb_p->urb_entry); in alloc_urbp()
65 free_urb(urb_p->urb); in free_urbp_and_urb()
73 static void nuke(struct vudc *udc, struct vep *ep) in nuke() argument
77 while (!list_empty(&ep->req_queue)) { in nuke()
78 req = list_first_entry(&ep->req_queue, struct vrequest, in nuke()
80 list_del_init(&req->req_entry); in nuke()
81 req->req.status = -ESHUTDOWN; in nuke()
83 spin_unlock(&udc->lock); in nuke()
84 usb_gadget_giveback_request(&ep->ep, &req->req); in nuke()
85 spin_lock(&udc->lock); in nuke()
95 udc->address = 0; in stop_activity()
98 nuke(udc, &udc->ep[i]); in stop_activity()
100 list_for_each_entry_safe(urb_p, tmp, &udc->urb_queue, urb_entry) { in stop_activity()
101 list_del(&urb_p->urb_entry); in stop_activity()
111 return &udc->ep[0]; in vudc_find_endpoint()
114 struct vep *ep = &udc->ep[i]; in vudc_find_endpoint() local
116 if (!ep->desc) in vudc_find_endpoint()
118 if (ep->desc->bEndpointAddress == address) in vudc_find_endpoint()
119 return ep; in vudc_find_endpoint()
132 return ((now.tv_sec - udc->start_time.tv_sec) * 1000 + in vgadget_get_frame()
133 (now.tv_nsec - udc->start_time.tv_nsec) / NSEC_PER_MSEC) in vgadget_get_frame()
142 udc->devstatus |= (1 << USB_DEVICE_SELF_POWERED); in vgadget_set_selfpowered()
144 udc->devstatus &= ~(1 << USB_DEVICE_SELF_POWERED); in vgadget_set_selfpowered()
155 spin_lock_irqsave(&udc->lock, flags); in vgadget_pullup()
157 if (value == udc->pullup) in vgadget_pullup()
160 udc->pullup = value; in vgadget_pullup()
162 udc->gadget.speed = min_t(u8, USB_SPEED_HIGH, in vgadget_pullup()
163 udc->driver->max_speed); in vgadget_pullup()
164 udc->ep[0].ep.maxpacket = 64; in vgadget_pullup()
171 dev_err(&udc->gadget.dev, "Unable go get desc: %d", ret); in vgadget_pullup()
175 spin_unlock_irqrestore(&udc->lock, flags); in vgadget_pullup()
176 usbip_start_eh(&udc->ud); in vgadget_pullup()
179 udc->desc_cached = 0; in vgadget_pullup()
181 spin_unlock_irqrestore(&udc->lock, flags); in vgadget_pullup()
182 usbip_event_add(&udc->ud, VUDC_EVENT_REMOVED); in vgadget_pullup()
183 usbip_stop_eh(&udc->ud); /* Wait for eh completion */ in vgadget_pullup()
189 spin_unlock_irqrestore(&udc->lock, flags); in vgadget_pullup()
199 spin_lock_irqsave(&udc->lock, flags); in vgadget_udc_start()
200 udc->driver = driver; in vgadget_udc_start()
201 udc->pullup = udc->connected = udc->desc_cached = 0; in vgadget_udc_start()
202 spin_unlock_irqrestore(&udc->lock, flags); in vgadget_udc_start()
212 spin_lock_irqsave(&udc->lock, flags); in vgadget_udc_stop()
213 udc->driver = NULL; in vgadget_udc_stop()
214 spin_unlock_irqrestore(&udc->lock, flags); in vgadget_udc_stop()
232 struct vep *ep; in vep_enable() local
237 ep = to_vep(_ep); in vep_enable()
238 udc = ep_to_vudc(ep); in vep_enable()
240 if (!_ep || !desc || ep->desc || _ep->caps.type_control in vep_enable()
241 || desc->bDescriptorType != USB_DT_ENDPOINT) in vep_enable()
242 return -EINVAL; in vep_enable()
244 if (!udc->driver) in vep_enable()
245 return -ESHUTDOWN; in vep_enable()
247 spin_lock_irqsave(&udc->lock, flags); in vep_enable()
250 _ep->maxpacket = maxp; in vep_enable()
251 ep->desc = desc; in vep_enable()
252 ep->type = usb_endpoint_type(desc); in vep_enable()
253 ep->halted = ep->wedged = 0; in vep_enable()
255 spin_unlock_irqrestore(&udc->lock, flags); in vep_enable()
262 struct vep *ep; in vep_disable() local
266 ep = to_vep(_ep); in vep_disable()
267 udc = ep_to_vudc(ep); in vep_disable()
268 if (!_ep || !ep->desc || _ep->caps.type_control) in vep_disable()
269 return -EINVAL; in vep_disable()
271 spin_lock_irqsave(&udc->lock, flags); in vep_disable()
272 ep->desc = NULL; in vep_disable()
273 nuke(udc, ep); in vep_disable()
274 spin_unlock_irqrestore(&udc->lock, flags); in vep_disable()
291 INIT_LIST_HEAD(&req->req_entry); in vep_alloc_request()
293 return &req->req; in vep_alloc_request()
300 /* ep is always valid here - see usb_ep_free_request() */ in vep_free_request()
311 struct vep *ep; in vep_queue() local
317 return -EINVAL; in vep_queue()
319 ep = to_vep(_ep); in vep_queue()
321 udc = ep_to_vudc(ep); in vep_queue()
323 spin_lock_irqsave(&udc->lock, flags); in vep_queue()
324 _req->actual = 0; in vep_queue()
325 _req->status = -EINPROGRESS; in vep_queue()
327 list_add_tail(&req->req_entry, &ep->req_queue); in vep_queue()
328 spin_unlock_irqrestore(&udc->lock, flags); in vep_queue()
335 struct vep *ep; in vep_dequeue() local
340 int ret = -EINVAL; in vep_dequeue()
345 ep = to_vep(_ep); in vep_dequeue()
347 udc = req->udc; in vep_dequeue()
349 if (!udc->driver) in vep_dequeue()
350 return -ESHUTDOWN; in vep_dequeue()
352 spin_lock_irqsave(&udc->lock, flags); in vep_dequeue()
353 list_for_each_entry(lst, &ep->req_queue, req_entry) { in vep_dequeue()
354 if (&lst->req == _req) { in vep_dequeue()
355 list_del_init(&lst->req_entry); in vep_dequeue()
356 _req->status = -ECONNRESET; in vep_dequeue()
361 spin_unlock_irqrestore(&udc->lock, flags); in vep_dequeue()
372 struct vep *ep; in vep_set_halt_and_wedge() local
377 ep = to_vep(_ep); in vep_set_halt_and_wedge()
379 return -EINVAL; in vep_set_halt_and_wedge()
381 udc = ep_to_vudc(ep); in vep_set_halt_and_wedge()
382 if (!udc->driver) in vep_set_halt_and_wedge()
383 return -ESHUTDOWN; in vep_set_halt_and_wedge()
385 spin_lock_irqsave(&udc->lock, flags); in vep_set_halt_and_wedge()
387 ep->halted = ep->wedged = 0; in vep_set_halt_and_wedge()
388 else if (ep->desc && (ep->desc->bEndpointAddress & USB_DIR_IN) && in vep_set_halt_and_wedge()
389 !list_empty(&ep->req_queue)) in vep_set_halt_and_wedge()
390 ret = -EAGAIN; in vep_set_halt_and_wedge()
392 ep->halted = 1; in vep_set_halt_and_wedge()
394 ep->wedged = 1; in vep_set_halt_and_wedge()
397 spin_unlock_irqrestore(&udc->lock, flags); in vep_set_halt_and_wedge()
435 dev_dbg(&udc->pdev->dev, "device shutdown"); in vudc_shutdown()
436 if (ud->tcp_socket) in vudc_shutdown()
437 kernel_sock_shutdown(ud->tcp_socket, SHUT_RDWR); in vudc_shutdown()
439 if (ud->tcp_rx) { in vudc_shutdown()
440 kthread_stop_put(ud->tcp_rx); in vudc_shutdown()
441 ud->tcp_rx = NULL; in vudc_shutdown()
443 if (ud->tcp_tx) { in vudc_shutdown()
444 kthread_stop_put(ud->tcp_tx); in vudc_shutdown()
445 ud->tcp_tx = NULL; in vudc_shutdown()
448 if (ud->tcp_socket) { in vudc_shutdown()
449 sockfd_put(ud->tcp_socket); in vudc_shutdown()
450 ud->tcp_socket = NULL; in vudc_shutdown()
453 spin_lock_irqsave(&udc->lock, flags); in vudc_shutdown()
455 if (udc->connected && udc->driver->disconnect) in vudc_shutdown()
457 udc->connected = 0; in vudc_shutdown()
458 spin_unlock_irqrestore(&udc->lock, flags); in vudc_shutdown()
460 udc->driver->disconnect(&udc->gadget); in vudc_shutdown()
468 dev_dbg(&udc->pdev->dev, "device reset"); in vudc_device_reset()
469 spin_lock_irqsave(&udc->lock, flags); in vudc_device_reset()
471 spin_unlock_irqrestore(&udc->lock, flags); in vudc_device_reset()
472 if (udc->driver) in vudc_device_reset()
473 usb_gadget_udc_reset(&udc->gadget, udc->driver); in vudc_device_reset()
474 spin_lock_irqsave(&ud->lock, flags); in vudc_device_reset()
475 ud->status = SDEV_ST_AVAILABLE; in vudc_device_reset()
476 spin_unlock_irqrestore(&ud->lock, flags); in vudc_device_reset()
483 spin_lock_irqsave(&ud->lock, flags); in vudc_device_unusable()
484 ud->status = SDEV_ST_ERROR; in vudc_device_unusable()
485 spin_unlock_irqrestore(&ud->lock, flags); in vudc_device_unusable()
498 INIT_LIST_HEAD(&udc_dev->dev_entry); in alloc_vudc_device()
500 udc_dev->pdev = platform_device_alloc(GADGET_NAME, devid); in alloc_vudc_device()
501 if (!udc_dev->pdev) { in alloc_vudc_device()
511 platform_device_put(udc_dev->pdev); in put_vudc_device()
518 struct usbip_device *ud = &udc->ud; in init_vudc_hw()
519 struct vep *ep; in init_vudc_hw() local
521 udc->ep = kcalloc(VIRTUAL_ENDPOINTS, sizeof(*udc->ep), GFP_KERNEL); in init_vudc_hw()
522 if (!udc->ep) in init_vudc_hw()
525 INIT_LIST_HEAD(&udc->gadget.ep_list); in init_vudc_hw()
532 ep = &udc->ep[i]; in init_vudc_hw()
534 sprintf(ep->name, "ep%d%s", num, in init_vudc_hw()
536 ep->ep.name = ep->name; in init_vudc_hw()
538 ep->ep.ops = &vep_ops; in init_vudc_hw()
540 usb_ep_set_maxpacket_limit(&ep->ep, ~0); in init_vudc_hw()
541 ep->ep.max_streams = 16; in init_vudc_hw()
542 ep->gadget = &udc->gadget; in init_vudc_hw()
543 INIT_LIST_HEAD(&ep->req_queue); in init_vudc_hw()
547 ep->ep.caps.type_control = true; in init_vudc_hw()
548 ep->ep.caps.dir_out = true; in init_vudc_hw()
549 ep->ep.caps.dir_in = true; in init_vudc_hw()
551 udc->gadget.ep0 = &ep->ep; in init_vudc_hw()
554 ep->ep.caps.type_iso = true; in init_vudc_hw()
555 ep->ep.caps.type_int = true; in init_vudc_hw()
556 ep->ep.caps.type_bulk = true; in init_vudc_hw()
559 ep->ep.caps.dir_out = true; in init_vudc_hw()
561 ep->ep.caps.dir_in = true; in init_vudc_hw()
563 list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); in init_vudc_hw()
567 spin_lock_init(&udc->lock); in init_vudc_hw()
568 spin_lock_init(&udc->lock_tx); in init_vudc_hw()
569 INIT_LIST_HEAD(&udc->urb_queue); in init_vudc_hw()
570 INIT_LIST_HEAD(&udc->tx_queue); in init_vudc_hw()
571 init_waitqueue_head(&udc->tx_waitq); in init_vudc_hw()
573 spin_lock_init(&ud->lock); in init_vudc_hw()
574 mutex_init(&ud->sysfs_lock); in init_vudc_hw()
575 ud->status = SDEV_ST_AVAILABLE; in init_vudc_hw()
576 ud->side = USBIP_VUDC; in init_vudc_hw()
578 ud->eh_ops.shutdown = vudc_shutdown; in init_vudc_hw()
579 ud->eh_ops.reset = vudc_device_reset; in init_vudc_hw()
580 ud->eh_ops.unusable = vudc_device_unusable; in init_vudc_hw()
586 return -ENOMEM; in init_vudc_hw()
591 kfree(udc->ep); in cleanup_vudc_hw()
599 int ret = -ENOMEM; in vudc_probe()
605 udc->gadget.name = GADGET_NAME; in vudc_probe()
606 udc->gadget.ops = &vgadget_ops; in vudc_probe()
607 udc->gadget.max_speed = USB_SPEED_HIGH; in vudc_probe()
608 udc->gadget.dev.parent = &pdev->dev; in vudc_probe()
609 udc->pdev = pdev; in vudc_probe()
615 ret = usb_add_gadget_udc(&pdev->dev, &udc->gadget); in vudc_probe()
635 usb_del_gadget_udc(&udc->gadget); in vudc_remove()