1 // SPDX-License-Identifier: GPL-2.0+
4 * Copyright (C) 2015-2016 Samsung Electronics
9 #include <linux/device.h>
10 #include <linux/kernel.h>
11 #include <linux/list.h>
12 #include <linux/platform_device.h>
13 #include <linux/usb.h>
14 #include <linux/usb/gadget.h>
15 #include <linux/usb/hcd.h>
16 #include <linux/kthread.h>
17 #include <linux/file.h>
18 #include <linux/byteorder/generic.h>
20 #include "usbip_common.h"
23 #define VIRTUAL_ENDPOINTS (1 /* ep0 */ + 15 /* in eps */ + 15 /* out eps */)
25 /* urb-related structures alloc / free */
28 static void free_urb(struct urb *urb)
33 kfree(urb->setup_packet);
34 urb->setup_packet = NULL;
36 kfree(urb->transfer_buffer);
37 urb->transfer_buffer = NULL;
42 struct urbp *alloc_urbp(void)
46 urb_p = kzalloc(sizeof(*urb_p), GFP_KERNEL);
52 INIT_LIST_HEAD(&urb_p->urb_entry);
56 static void free_urbp(struct urbp *urb_p)
61 void free_urbp_and_urb(struct urbp *urb_p)
70 /* utilities ; almost verbatim from dummy_hcd.c */
72 /* called with spinlock held */
73 static void nuke(struct vudc *udc, struct vep *ep)
77 while (!list_empty(&ep->req_queue)) {
78 req = list_first_entry(&ep->req_queue, struct vrequest,
80 list_del_init(&req->req_entry);
81 req->req.status = -ESHUTDOWN;
83 spin_unlock(&udc->lock);
84 usb_gadget_giveback_request(&ep->ep, &req->req);
85 spin_lock(&udc->lock);
89 /* caller must hold lock */
90 static void stop_activity(struct vudc *udc)
93 struct urbp *urb_p, *tmp;
97 for (i = 0; i < VIRTUAL_ENDPOINTS; i++)
98 nuke(udc, &udc->ep[i]);
100 list_for_each_entry_safe(urb_p, tmp, &udc->urb_queue, urb_entry) {
101 list_del(&urb_p->urb_entry);
102 free_urbp_and_urb(urb_p);
106 struct vep *vudc_find_endpoint(struct vudc *udc, u8 address)
110 if ((address & ~USB_DIR_IN) == 0)
113 for (i = 1; i < VIRTUAL_ENDPOINTS; i++) {
114 struct vep *ep = &udc->ep[i];
118 if (ep->desc->bEndpointAddress == address)
126 static int vgadget_get_frame(struct usb_gadget *_gadget)
128 struct timespec64 now;
129 struct vudc *udc = usb_gadget_to_vudc(_gadget);
131 ktime_get_ts64(&now);
132 return ((now.tv_sec - udc->start_time.tv_sec) * 1000 +
133 (now.tv_nsec - udc->start_time.tv_nsec) / NSEC_PER_MSEC)
137 static int vgadget_set_selfpowered(struct usb_gadget *_gadget, int value)
139 struct vudc *udc = usb_gadget_to_vudc(_gadget);
142 udc->devstatus |= (1 << USB_DEVICE_SELF_POWERED);
144 udc->devstatus &= ~(1 << USB_DEVICE_SELF_POWERED);
148 static int vgadget_pullup(struct usb_gadget *_gadget, int value)
150 struct vudc *udc = usb_gadget_to_vudc(_gadget);
155 spin_lock_irqsave(&udc->lock, flags);
157 if (value == udc->pullup)
162 udc->gadget.speed = min_t(u8, USB_SPEED_HIGH,
163 udc->driver->max_speed);
164 udc->ep[0].ep.maxpacket = 64;
166 * This is the first place where we can ask our
167 * gadget driver for descriptors.
169 ret = get_gadget_descs(udc);
171 dev_err(&udc->gadget.dev, "Unable go get desc: %d", ret);
175 spin_unlock_irqrestore(&udc->lock, flags);
176 usbip_start_eh(&udc->ud);
178 /* Invalidate descriptors */
179 udc->desc_cached = 0;
181 spin_unlock_irqrestore(&udc->lock, flags);
182 usbip_event_add(&udc->ud, VUDC_EVENT_REMOVED);
183 usbip_stop_eh(&udc->ud); /* Wait for eh completion */
189 spin_unlock_irqrestore(&udc->lock, flags);
193 static int vgadget_udc_start(struct usb_gadget *g,
194 struct usb_gadget_driver *driver)
196 struct vudc *udc = usb_gadget_to_vudc(g);
199 spin_lock_irqsave(&udc->lock, flags);
200 udc->driver = driver;
201 udc->pullup = udc->connected = udc->desc_cached = 0;
202 spin_unlock_irqrestore(&udc->lock, flags);
207 static int vgadget_udc_stop(struct usb_gadget *g)
209 struct vudc *udc = usb_gadget_to_vudc(g);
212 spin_lock_irqsave(&udc->lock, flags);
214 spin_unlock_irqrestore(&udc->lock, flags);
218 static const struct usb_gadget_ops vgadget_ops = {
219 .get_frame = vgadget_get_frame,
220 .set_selfpowered = vgadget_set_selfpowered,
221 .pullup = vgadget_pullup,
222 .udc_start = vgadget_udc_start,
223 .udc_stop = vgadget_udc_stop,
229 static int vep_enable(struct usb_ep *_ep,
230 const struct usb_endpoint_descriptor *desc)
238 udc = ep_to_vudc(ep);
240 if (!_ep || !desc || ep->desc || _ep->caps.type_control
241 || desc->bDescriptorType != USB_DT_ENDPOINT)
247 spin_lock_irqsave(&udc->lock, flags);
249 maxp = usb_endpoint_maxp(desc);
250 _ep->maxpacket = maxp;
252 ep->type = usb_endpoint_type(desc);
253 ep->halted = ep->wedged = 0;
255 spin_unlock_irqrestore(&udc->lock, flags);
260 static int vep_disable(struct usb_ep *_ep)
267 udc = ep_to_vudc(ep);
268 if (!_ep || !ep->desc || _ep->caps.type_control)
271 spin_lock_irqsave(&udc->lock, flags);
274 spin_unlock_irqrestore(&udc->lock, flags);
279 static struct usb_request *vep_alloc_request(struct usb_ep *_ep,
283 struct vrequest *req;
289 req = kzalloc(sizeof(*req), mem_flags);
293 INIT_LIST_HEAD(&req->req_entry);
298 static void vep_free_request(struct usb_ep *_ep, struct usb_request *_req)
300 struct vrequest *req;
302 if (WARN_ON(!_ep || !_req))
305 req = to_vrequest(_req);
309 static int vep_queue(struct usb_ep *_ep, struct usb_request *_req,
313 struct vrequest *req;
321 req = to_vrequest(_req);
322 udc = ep_to_vudc(ep);
324 spin_lock_irqsave(&udc->lock, flags);
326 _req->status = -EINPROGRESS;
328 list_add_tail(&req->req_entry, &ep->req_queue);
329 spin_unlock_irqrestore(&udc->lock, flags);
334 static int vep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
337 struct vrequest *req;
339 struct vrequest *lst;
347 req = to_vrequest(_req);
353 spin_lock_irqsave(&udc->lock, flags);
354 list_for_each_entry(lst, &ep->req_queue, req_entry) {
355 if (&lst->req == _req) {
356 list_del_init(&lst->req_entry);
357 _req->status = -ECONNRESET;
362 spin_unlock_irqrestore(&udc->lock, flags);
365 usb_gadget_giveback_request(_ep, _req);
371 vep_set_halt_and_wedge(struct usb_ep *_ep, int value, int wedged)
382 udc = ep_to_vudc(ep);
386 spin_lock_irqsave(&udc->lock, flags);
388 ep->halted = ep->wedged = 0;
389 else if (ep->desc && (ep->desc->bEndpointAddress & USB_DIR_IN) &&
390 !list_empty(&ep->req_queue))
398 spin_unlock_irqrestore(&udc->lock, flags);
403 vep_set_halt(struct usb_ep *_ep, int value)
405 return vep_set_halt_and_wedge(_ep, value, 0);
408 static int vep_set_wedge(struct usb_ep *_ep)
410 return vep_set_halt_and_wedge(_ep, 1, 1);
413 static const struct usb_ep_ops vep_ops = {
414 .enable = vep_enable,
415 .disable = vep_disable,
417 .alloc_request = vep_alloc_request,
418 .free_request = vep_free_request,
421 .dequeue = vep_dequeue,
423 .set_halt = vep_set_halt,
424 .set_wedge = vep_set_wedge,
428 /* shutdown / reset / error handlers */
430 static void vudc_shutdown(struct usbip_device *ud)
432 struct vudc *udc = container_of(ud, struct vudc, ud);
433 int call_disconnect = 0;
436 dev_dbg(&udc->pdev->dev, "device shutdown");
438 kernel_sock_shutdown(ud->tcp_socket, SHUT_RDWR);
441 kthread_stop_put(ud->tcp_rx);
445 kthread_stop_put(ud->tcp_tx);
449 if (ud->tcp_socket) {
450 sockfd_put(ud->tcp_socket);
451 ud->tcp_socket = NULL;
454 spin_lock_irqsave(&udc->lock, flags);
456 if (udc->connected && udc->driver->disconnect)
459 spin_unlock_irqrestore(&udc->lock, flags);
461 udc->driver->disconnect(&udc->gadget);
464 static void vudc_device_reset(struct usbip_device *ud)
466 struct vudc *udc = container_of(ud, struct vudc, ud);
469 dev_dbg(&udc->pdev->dev, "device reset");
470 spin_lock_irqsave(&udc->lock, flags);
472 spin_unlock_irqrestore(&udc->lock, flags);
474 usb_gadget_udc_reset(&udc->gadget, udc->driver);
475 spin_lock_irqsave(&ud->lock, flags);
476 ud->status = SDEV_ST_AVAILABLE;
477 spin_unlock_irqrestore(&ud->lock, flags);
480 static void vudc_device_unusable(struct usbip_device *ud)
484 spin_lock_irqsave(&ud->lock, flags);
485 ud->status = SDEV_ST_ERROR;
486 spin_unlock_irqrestore(&ud->lock, flags);
489 /* device setup / cleanup */
491 struct vudc_device *alloc_vudc_device(int devid)
493 struct vudc_device *udc_dev = NULL;
495 udc_dev = kzalloc(sizeof(*udc_dev), GFP_KERNEL);
499 INIT_LIST_HEAD(&udc_dev->dev_entry);
501 udc_dev->pdev = platform_device_alloc(GADGET_NAME, devid);
502 if (!udc_dev->pdev) {
511 void put_vudc_device(struct vudc_device *udc_dev)
513 platform_device_put(udc_dev->pdev);
517 static int init_vudc_hw(struct vudc *udc)
520 struct usbip_device *ud = &udc->ud;
523 udc->ep = kcalloc(VIRTUAL_ENDPOINTS, sizeof(*udc->ep), GFP_KERNEL);
527 INIT_LIST_HEAD(&udc->gadget.ep_list);
529 /* create ep0 and 15 in, 15 out general purpose eps */
530 for (i = 0; i < VIRTUAL_ENDPOINTS; ++i) {
532 int num = (i + 1) / 2;
536 sprintf(ep->name, "ep%d%s", num,
537 i ? (is_out ? "out" : "in") : "");
538 ep->ep.name = ep->name;
540 ep->ep.ops = &vep_ops;
542 usb_ep_set_maxpacket_limit(&ep->ep, ~0);
543 ep->ep.max_streams = 16;
544 ep->gadget = &udc->gadget;
545 INIT_LIST_HEAD(&ep->req_queue);
549 ep->ep.caps.type_control = true;
550 ep->ep.caps.dir_out = true;
551 ep->ep.caps.dir_in = true;
553 udc->gadget.ep0 = &ep->ep;
556 ep->ep.caps.type_iso = true;
557 ep->ep.caps.type_int = true;
558 ep->ep.caps.type_bulk = true;
561 ep->ep.caps.dir_out = true;
563 ep->ep.caps.dir_in = true;
565 list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list);
569 spin_lock_init(&udc->lock);
570 spin_lock_init(&udc->lock_tx);
571 INIT_LIST_HEAD(&udc->urb_queue);
572 INIT_LIST_HEAD(&udc->tx_queue);
573 init_waitqueue_head(&udc->tx_waitq);
575 spin_lock_init(&ud->lock);
576 ud->status = SDEV_ST_AVAILABLE;
577 ud->side = USBIP_VUDC;
579 ud->eh_ops.shutdown = vudc_shutdown;
580 ud->eh_ops.reset = vudc_device_reset;
581 ud->eh_ops.unusable = vudc_device_unusable;
590 static void cleanup_vudc_hw(struct vudc *udc)
595 /* platform driver ops */
597 int vudc_probe(struct platform_device *pdev)
602 udc = kzalloc(sizeof(*udc), GFP_KERNEL);
606 udc->gadget.name = GADGET_NAME;
607 udc->gadget.ops = &vgadget_ops;
608 udc->gadget.max_speed = USB_SPEED_HIGH;
609 udc->gadget.dev.parent = &pdev->dev;
612 ret = init_vudc_hw(udc);
614 goto err_init_vudc_hw;
616 ret = usb_add_gadget_udc(&pdev->dev, &udc->gadget);
620 ret = sysfs_create_group(&pdev->dev.kobj, &vudc_attr_group);
622 dev_err(&udc->pdev->dev, "create sysfs files\n");
626 platform_set_drvdata(pdev, udc);
631 usb_del_gadget_udc(&udc->gadget);
633 cleanup_vudc_hw(udc);
640 int vudc_remove(struct platform_device *pdev)
642 struct vudc *udc = platform_get_drvdata(pdev);
644 sysfs_remove_group(&pdev->dev.kobj, &vudc_attr_group);
645 usb_del_gadget_udc(&udc->gadget);
646 cleanup_vudc_hw(udc);