0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/device.h>
0010 #include <linux/kernel.h>
0011 #include <linux/list.h>
0012 #include <linux/platform_device.h>
0013 #include <linux/usb.h>
0014 #include <linux/usb/gadget.h>
0015 #include <linux/usb/hcd.h>
0016 #include <linux/kthread.h>
0017 #include <linux/file.h>
0018 #include <linux/byteorder/generic.h>
0019
0020 #include "usbip_common.h"
0021 #include "vudc.h"
0022
0023 #define VIRTUAL_ENDPOINTS (1 + 15 + 15 )
0024
0025
0026
0027
0028 static void free_urb(struct urb *urb)
0029 {
0030 if (!urb)
0031 return;
0032
0033 kfree(urb->setup_packet);
0034 urb->setup_packet = NULL;
0035
0036 kfree(urb->transfer_buffer);
0037 urb->transfer_buffer = NULL;
0038
0039 usb_free_urb(urb);
0040 }
0041
0042 struct urbp *alloc_urbp(void)
0043 {
0044 struct urbp *urb_p;
0045
0046 urb_p = kzalloc(sizeof(*urb_p), GFP_KERNEL);
0047 if (!urb_p)
0048 return urb_p;
0049
0050 urb_p->urb = NULL;
0051 urb_p->ep = NULL;
0052 INIT_LIST_HEAD(&urb_p->urb_entry);
0053 return urb_p;
0054 }
0055
0056 static void free_urbp(struct urbp *urb_p)
0057 {
0058 kfree(urb_p);
0059 }
0060
0061 void free_urbp_and_urb(struct urbp *urb_p)
0062 {
0063 if (!urb_p)
0064 return;
0065 free_urb(urb_p->urb);
0066 free_urbp(urb_p);
0067 }
0068
0069
0070
0071
0072
0073 static void nuke(struct vudc *udc, struct vep *ep)
0074 {
0075 struct vrequest *req;
0076
0077 while (!list_empty(&ep->req_queue)) {
0078 req = list_first_entry(&ep->req_queue, struct vrequest,
0079 req_entry);
0080 list_del_init(&req->req_entry);
0081 req->req.status = -ESHUTDOWN;
0082
0083 spin_unlock(&udc->lock);
0084 usb_gadget_giveback_request(&ep->ep, &req->req);
0085 spin_lock(&udc->lock);
0086 }
0087 }
0088
0089
0090 static void stop_activity(struct vudc *udc)
0091 {
0092 int i;
0093 struct urbp *urb_p, *tmp;
0094
0095 udc->address = 0;
0096
0097 for (i = 0; i < VIRTUAL_ENDPOINTS; i++)
0098 nuke(udc, &udc->ep[i]);
0099
0100 list_for_each_entry_safe(urb_p, tmp, &udc->urb_queue, urb_entry) {
0101 list_del(&urb_p->urb_entry);
0102 free_urbp_and_urb(urb_p);
0103 }
0104 }
0105
0106 struct vep *vudc_find_endpoint(struct vudc *udc, u8 address)
0107 {
0108 int i;
0109
0110 if ((address & ~USB_DIR_IN) == 0)
0111 return &udc->ep[0];
0112
0113 for (i = 1; i < VIRTUAL_ENDPOINTS; i++) {
0114 struct vep *ep = &udc->ep[i];
0115
0116 if (!ep->desc)
0117 continue;
0118 if (ep->desc->bEndpointAddress == address)
0119 return ep;
0120 }
0121 return NULL;
0122 }
0123
0124
0125
0126 static int vgadget_get_frame(struct usb_gadget *_gadget)
0127 {
0128 struct timespec64 now;
0129 struct vudc *udc = usb_gadget_to_vudc(_gadget);
0130
0131 ktime_get_ts64(&now);
0132 return ((now.tv_sec - udc->start_time.tv_sec) * 1000 +
0133 (now.tv_nsec - udc->start_time.tv_nsec) / NSEC_PER_MSEC)
0134 & 0x7FF;
0135 }
0136
0137 static int vgadget_set_selfpowered(struct usb_gadget *_gadget, int value)
0138 {
0139 struct vudc *udc = usb_gadget_to_vudc(_gadget);
0140
0141 if (value)
0142 udc->devstatus |= (1 << USB_DEVICE_SELF_POWERED);
0143 else
0144 udc->devstatus &= ~(1 << USB_DEVICE_SELF_POWERED);
0145 return 0;
0146 }
0147
0148 static int vgadget_pullup(struct usb_gadget *_gadget, int value)
0149 {
0150 struct vudc *udc = usb_gadget_to_vudc(_gadget);
0151 unsigned long flags;
0152 int ret;
0153
0154
0155 spin_lock_irqsave(&udc->lock, flags);
0156 value = !!value;
0157 if (value == udc->pullup)
0158 goto unlock;
0159
0160 udc->pullup = value;
0161 if (value) {
0162 udc->gadget.speed = min_t(u8, USB_SPEED_HIGH,
0163 udc->driver->max_speed);
0164 udc->ep[0].ep.maxpacket = 64;
0165
0166
0167
0168
0169 ret = get_gadget_descs(udc);
0170 if (ret) {
0171 dev_err(&udc->gadget.dev, "Unable go get desc: %d", ret);
0172 goto unlock;
0173 }
0174
0175 spin_unlock_irqrestore(&udc->lock, flags);
0176 usbip_start_eh(&udc->ud);
0177 } else {
0178
0179 udc->desc_cached = 0;
0180
0181 spin_unlock_irqrestore(&udc->lock, flags);
0182 usbip_event_add(&udc->ud, VUDC_EVENT_REMOVED);
0183 usbip_stop_eh(&udc->ud);
0184 }
0185
0186 return 0;
0187
0188 unlock:
0189 spin_unlock_irqrestore(&udc->lock, flags);
0190 return 0;
0191 }
0192
0193 static int vgadget_udc_start(struct usb_gadget *g,
0194 struct usb_gadget_driver *driver)
0195 {
0196 struct vudc *udc = usb_gadget_to_vudc(g);
0197 unsigned long flags;
0198
0199 spin_lock_irqsave(&udc->lock, flags);
0200 udc->driver = driver;
0201 udc->pullup = udc->connected = udc->desc_cached = 0;
0202 spin_unlock_irqrestore(&udc->lock, flags);
0203
0204 return 0;
0205 }
0206
0207 static int vgadget_udc_stop(struct usb_gadget *g)
0208 {
0209 struct vudc *udc = usb_gadget_to_vudc(g);
0210 unsigned long flags;
0211
0212 spin_lock_irqsave(&udc->lock, flags);
0213 udc->driver = NULL;
0214 spin_unlock_irqrestore(&udc->lock, flags);
0215 return 0;
0216 }
0217
0218 static const struct usb_gadget_ops vgadget_ops = {
0219 .get_frame = vgadget_get_frame,
0220 .set_selfpowered = vgadget_set_selfpowered,
0221 .pullup = vgadget_pullup,
0222 .udc_start = vgadget_udc_start,
0223 .udc_stop = vgadget_udc_stop,
0224 };
0225
0226
0227
0228
0229 static int vep_enable(struct usb_ep *_ep,
0230 const struct usb_endpoint_descriptor *desc)
0231 {
0232 struct vep *ep;
0233 struct vudc *udc;
0234 unsigned int maxp;
0235 unsigned long flags;
0236
0237 ep = to_vep(_ep);
0238 udc = ep_to_vudc(ep);
0239
0240 if (!_ep || !desc || ep->desc || _ep->caps.type_control
0241 || desc->bDescriptorType != USB_DT_ENDPOINT)
0242 return -EINVAL;
0243
0244 if (!udc->driver)
0245 return -ESHUTDOWN;
0246
0247 spin_lock_irqsave(&udc->lock, flags);
0248
0249 maxp = usb_endpoint_maxp(desc);
0250 _ep->maxpacket = maxp;
0251 ep->desc = desc;
0252 ep->type = usb_endpoint_type(desc);
0253 ep->halted = ep->wedged = 0;
0254
0255 spin_unlock_irqrestore(&udc->lock, flags);
0256
0257 return 0;
0258 }
0259
0260 static int vep_disable(struct usb_ep *_ep)
0261 {
0262 struct vep *ep;
0263 struct vudc *udc;
0264 unsigned long flags;
0265
0266 ep = to_vep(_ep);
0267 udc = ep_to_vudc(ep);
0268 if (!_ep || !ep->desc || _ep->caps.type_control)
0269 return -EINVAL;
0270
0271 spin_lock_irqsave(&udc->lock, flags);
0272 ep->desc = NULL;
0273 nuke(udc, ep);
0274 spin_unlock_irqrestore(&udc->lock, flags);
0275
0276 return 0;
0277 }
0278
0279 static struct usb_request *vep_alloc_request(struct usb_ep *_ep,
0280 gfp_t mem_flags)
0281 {
0282 struct vrequest *req;
0283
0284 if (!_ep)
0285 return NULL;
0286
0287 req = kzalloc(sizeof(*req), mem_flags);
0288 if (!req)
0289 return NULL;
0290
0291 INIT_LIST_HEAD(&req->req_entry);
0292
0293 return &req->req;
0294 }
0295
0296 static void vep_free_request(struct usb_ep *_ep, struct usb_request *_req)
0297 {
0298 struct vrequest *req;
0299
0300
0301 if (!_req)
0302 return;
0303
0304 req = to_vrequest(_req);
0305 kfree(req);
0306 }
0307
0308 static int vep_queue(struct usb_ep *_ep, struct usb_request *_req,
0309 gfp_t mem_flags)
0310 {
0311 struct vep *ep;
0312 struct vrequest *req;
0313 struct vudc *udc;
0314 unsigned long flags;
0315
0316 if (!_ep || !_req)
0317 return -EINVAL;
0318
0319 ep = to_vep(_ep);
0320 req = to_vrequest(_req);
0321 udc = ep_to_vudc(ep);
0322
0323 spin_lock_irqsave(&udc->lock, flags);
0324 _req->actual = 0;
0325 _req->status = -EINPROGRESS;
0326
0327 list_add_tail(&req->req_entry, &ep->req_queue);
0328 spin_unlock_irqrestore(&udc->lock, flags);
0329
0330 return 0;
0331 }
0332
0333 static int vep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
0334 {
0335 struct vep *ep;
0336 struct vrequest *req;
0337 struct vudc *udc;
0338 struct vrequest *lst;
0339 unsigned long flags;
0340 int ret = -EINVAL;
0341
0342 if (!_ep || !_req)
0343 return ret;
0344
0345 ep = to_vep(_ep);
0346 req = to_vrequest(_req);
0347 udc = req->udc;
0348
0349 if (!udc->driver)
0350 return -ESHUTDOWN;
0351
0352 spin_lock_irqsave(&udc->lock, flags);
0353 list_for_each_entry(lst, &ep->req_queue, req_entry) {
0354 if (&lst->req == _req) {
0355 list_del_init(&lst->req_entry);
0356 _req->status = -ECONNRESET;
0357 ret = 0;
0358 break;
0359 }
0360 }
0361 spin_unlock_irqrestore(&udc->lock, flags);
0362
0363 if (ret == 0)
0364 usb_gadget_giveback_request(_ep, _req);
0365
0366 return ret;
0367 }
0368
0369 static int
0370 vep_set_halt_and_wedge(struct usb_ep *_ep, int value, int wedged)
0371 {
0372 struct vep *ep;
0373 struct vudc *udc;
0374 unsigned long flags;
0375 int ret = 0;
0376
0377 ep = to_vep(_ep);
0378 if (!_ep)
0379 return -EINVAL;
0380
0381 udc = ep_to_vudc(ep);
0382 if (!udc->driver)
0383 return -ESHUTDOWN;
0384
0385 spin_lock_irqsave(&udc->lock, flags);
0386 if (!value)
0387 ep->halted = ep->wedged = 0;
0388 else if (ep->desc && (ep->desc->bEndpointAddress & USB_DIR_IN) &&
0389 !list_empty(&ep->req_queue))
0390 ret = -EAGAIN;
0391 else {
0392 ep->halted = 1;
0393 if (wedged)
0394 ep->wedged = 1;
0395 }
0396
0397 spin_unlock_irqrestore(&udc->lock, flags);
0398 return ret;
0399 }
0400
0401 static int
0402 vep_set_halt(struct usb_ep *_ep, int value)
0403 {
0404 return vep_set_halt_and_wedge(_ep, value, 0);
0405 }
0406
0407 static int vep_set_wedge(struct usb_ep *_ep)
0408 {
0409 return vep_set_halt_and_wedge(_ep, 1, 1);
0410 }
0411
0412 static const struct usb_ep_ops vep_ops = {
0413 .enable = vep_enable,
0414 .disable = vep_disable,
0415
0416 .alloc_request = vep_alloc_request,
0417 .free_request = vep_free_request,
0418
0419 .queue = vep_queue,
0420 .dequeue = vep_dequeue,
0421
0422 .set_halt = vep_set_halt,
0423 .set_wedge = vep_set_wedge,
0424 };
0425
0426
0427
0428
0429 static void vudc_shutdown(struct usbip_device *ud)
0430 {
0431 struct vudc *udc = container_of(ud, struct vudc, ud);
0432 int call_disconnect = 0;
0433 unsigned long flags;
0434
0435 dev_dbg(&udc->pdev->dev, "device shutdown");
0436 if (ud->tcp_socket)
0437 kernel_sock_shutdown(ud->tcp_socket, SHUT_RDWR);
0438
0439 if (ud->tcp_rx) {
0440 kthread_stop_put(ud->tcp_rx);
0441 ud->tcp_rx = NULL;
0442 }
0443 if (ud->tcp_tx) {
0444 kthread_stop_put(ud->tcp_tx);
0445 ud->tcp_tx = NULL;
0446 }
0447
0448 if (ud->tcp_socket) {
0449 sockfd_put(ud->tcp_socket);
0450 ud->tcp_socket = NULL;
0451 }
0452
0453 spin_lock_irqsave(&udc->lock, flags);
0454 stop_activity(udc);
0455 if (udc->connected && udc->driver->disconnect)
0456 call_disconnect = 1;
0457 udc->connected = 0;
0458 spin_unlock_irqrestore(&udc->lock, flags);
0459 if (call_disconnect)
0460 udc->driver->disconnect(&udc->gadget);
0461 }
0462
0463 static void vudc_device_reset(struct usbip_device *ud)
0464 {
0465 struct vudc *udc = container_of(ud, struct vudc, ud);
0466 unsigned long flags;
0467
0468 dev_dbg(&udc->pdev->dev, "device reset");
0469 spin_lock_irqsave(&udc->lock, flags);
0470 stop_activity(udc);
0471 spin_unlock_irqrestore(&udc->lock, flags);
0472 if (udc->driver)
0473 usb_gadget_udc_reset(&udc->gadget, udc->driver);
0474 spin_lock_irqsave(&ud->lock, flags);
0475 ud->status = SDEV_ST_AVAILABLE;
0476 spin_unlock_irqrestore(&ud->lock, flags);
0477 }
0478
0479 static void vudc_device_unusable(struct usbip_device *ud)
0480 {
0481 unsigned long flags;
0482
0483 spin_lock_irqsave(&ud->lock, flags);
0484 ud->status = SDEV_ST_ERROR;
0485 spin_unlock_irqrestore(&ud->lock, flags);
0486 }
0487
0488
0489
0490 struct vudc_device *alloc_vudc_device(int devid)
0491 {
0492 struct vudc_device *udc_dev = NULL;
0493
0494 udc_dev = kzalloc(sizeof(*udc_dev), GFP_KERNEL);
0495 if (!udc_dev)
0496 goto out;
0497
0498 INIT_LIST_HEAD(&udc_dev->dev_entry);
0499
0500 udc_dev->pdev = platform_device_alloc(GADGET_NAME, devid);
0501 if (!udc_dev->pdev) {
0502 kfree(udc_dev);
0503 udc_dev = NULL;
0504 }
0505
0506 out:
0507 return udc_dev;
0508 }
0509
0510 void put_vudc_device(struct vudc_device *udc_dev)
0511 {
0512 platform_device_put(udc_dev->pdev);
0513 kfree(udc_dev);
0514 }
0515
0516 static int init_vudc_hw(struct vudc *udc)
0517 {
0518 int i;
0519 struct usbip_device *ud = &udc->ud;
0520 struct vep *ep;
0521
0522 udc->ep = kcalloc(VIRTUAL_ENDPOINTS, sizeof(*udc->ep), GFP_KERNEL);
0523 if (!udc->ep)
0524 goto nomem_ep;
0525
0526 INIT_LIST_HEAD(&udc->gadget.ep_list);
0527
0528
0529 for (i = 0; i < VIRTUAL_ENDPOINTS; ++i) {
0530 int is_out = i % 2;
0531 int num = (i + 1) / 2;
0532
0533 ep = &udc->ep[i];
0534
0535 sprintf(ep->name, "ep%d%s", num,
0536 i ? (is_out ? "out" : "in") : "");
0537 ep->ep.name = ep->name;
0538
0539 ep->ep.ops = &vep_ops;
0540
0541 usb_ep_set_maxpacket_limit(&ep->ep, ~0);
0542 ep->ep.max_streams = 16;
0543 ep->gadget = &udc->gadget;
0544 INIT_LIST_HEAD(&ep->req_queue);
0545
0546 if (i == 0) {
0547
0548 ep->ep.caps.type_control = true;
0549 ep->ep.caps.dir_out = true;
0550 ep->ep.caps.dir_in = true;
0551
0552 udc->gadget.ep0 = &ep->ep;
0553 } else {
0554
0555 ep->ep.caps.type_iso = true;
0556 ep->ep.caps.type_int = true;
0557 ep->ep.caps.type_bulk = true;
0558
0559 if (is_out)
0560 ep->ep.caps.dir_out = true;
0561 else
0562 ep->ep.caps.dir_in = true;
0563
0564 list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list);
0565 }
0566 }
0567
0568 spin_lock_init(&udc->lock);
0569 spin_lock_init(&udc->lock_tx);
0570 INIT_LIST_HEAD(&udc->urb_queue);
0571 INIT_LIST_HEAD(&udc->tx_queue);
0572 init_waitqueue_head(&udc->tx_waitq);
0573
0574 spin_lock_init(&ud->lock);
0575 mutex_init(&ud->sysfs_lock);
0576 ud->status = SDEV_ST_AVAILABLE;
0577 ud->side = USBIP_VUDC;
0578
0579 ud->eh_ops.shutdown = vudc_shutdown;
0580 ud->eh_ops.reset = vudc_device_reset;
0581 ud->eh_ops.unusable = vudc_device_unusable;
0582
0583 v_init_timer(udc);
0584 return 0;
0585
0586 nomem_ep:
0587 return -ENOMEM;
0588 }
0589
0590 static void cleanup_vudc_hw(struct vudc *udc)
0591 {
0592 kfree(udc->ep);
0593 }
0594
0595
0596
0597 int vudc_probe(struct platform_device *pdev)
0598 {
0599 struct vudc *udc;
0600 int ret = -ENOMEM;
0601
0602 udc = kzalloc(sizeof(*udc), GFP_KERNEL);
0603 if (!udc)
0604 goto out;
0605
0606 udc->gadget.name = GADGET_NAME;
0607 udc->gadget.ops = &vgadget_ops;
0608 udc->gadget.max_speed = USB_SPEED_HIGH;
0609 udc->gadget.dev.parent = &pdev->dev;
0610 udc->pdev = pdev;
0611
0612 ret = init_vudc_hw(udc);
0613 if (ret)
0614 goto err_init_vudc_hw;
0615
0616 ret = usb_add_gadget_udc(&pdev->dev, &udc->gadget);
0617 if (ret < 0)
0618 goto err_add_udc;
0619
0620 platform_set_drvdata(pdev, udc);
0621
0622 return ret;
0623
0624 err_add_udc:
0625 cleanup_vudc_hw(udc);
0626 err_init_vudc_hw:
0627 kfree(udc);
0628 out:
0629 return ret;
0630 }
0631
0632 int vudc_remove(struct platform_device *pdev)
0633 {
0634 struct vudc *udc = platform_get_drvdata(pdev);
0635
0636 usb_del_gadget_udc(&udc->gadget);
0637 cleanup_vudc_hw(udc);
0638 kfree(udc);
0639 return 0;
0640 }