Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  1// SPDX-License-Identifier: GPL-2.0+
  2/*
  3 * Copyright (C) 2015 Karol Kosik <karo9@interia.eu>
  4 * Copyright (C) 2015-2016 Samsung Electronics
  5 *               Igor Kotrasinski <i.kotrasinsk@samsung.com>
  6 *               Krzysztof Opasiak <k.opasiak@samsung.com>
  7 */
  8
  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>
 19
 20#include "usbip_common.h"
 21#include "vudc.h"
 22
 23#define VIRTUAL_ENDPOINTS (1 /* ep0 */ + 15 /* in eps */ + 15 /* out eps */)
 24
 25/* urb-related structures alloc / free */
 26
 27
 28static void free_urb(struct urb *urb)
 29{
 30	if (!urb)
 31		return;
 32
 33	kfree(urb->setup_packet);
 34	urb->setup_packet = NULL;
 35
 36	kfree(urb->transfer_buffer);
 37	urb->transfer_buffer = NULL;
 38
 39	usb_free_urb(urb);
 40}
 41
 42struct urbp *alloc_urbp(void)
 43{
 44	struct urbp *urb_p;
 45
 46	urb_p = kzalloc(sizeof(*urb_p), GFP_KERNEL);
 47	if (!urb_p)
 48		return urb_p;
 49
 50	urb_p->urb = NULL;
 51	urb_p->ep = NULL;
 52	INIT_LIST_HEAD(&urb_p->urb_entry);
 53	return urb_p;
 54}
 55
 56static void free_urbp(struct urbp *urb_p)
 57{
 58	kfree(urb_p);
 59}
 60
 61void free_urbp_and_urb(struct urbp *urb_p)
 62{
 63	if (!urb_p)
 64		return;
 65	free_urb(urb_p->urb);
 66	free_urbp(urb_p);
 67}
 68
 69
 70/* utilities ; almost verbatim from dummy_hcd.c */
 71
 72/* called with spinlock held */
 73static void nuke(struct vudc *udc, struct vep *ep)
 74{
 75	struct vrequest	*req;
 76
 77	while (!list_empty(&ep->req_queue)) {
 78		req = list_first_entry(&ep->req_queue, struct vrequest,
 79				       req_entry);
 80		list_del_init(&req->req_entry);
 81		req->req.status = -ESHUTDOWN;
 82
 83		spin_unlock(&udc->lock);
 84		usb_gadget_giveback_request(&ep->ep, &req->req);
 85		spin_lock(&udc->lock);
 86	}
 87}
 88
 89/* caller must hold lock */
 90static void stop_activity(struct vudc *udc)
 91{
 92	int i;
 93	struct urbp *urb_p, *tmp;
 94
 95	udc->address = 0;
 96
 97	for (i = 0; i < VIRTUAL_ENDPOINTS; i++)
 98		nuke(udc, &udc->ep[i]);
 99
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);
103	}
104}
105
106struct vep *vudc_find_endpoint(struct vudc *udc, u8 address)
107{
108	int i;
109
110	if ((address & ~USB_DIR_IN) == 0)
111		return &udc->ep[0];
112
113	for (i = 1; i < VIRTUAL_ENDPOINTS; i++) {
114		struct vep *ep = &udc->ep[i];
115
116		if (!ep->desc)
117			continue;
118		if (ep->desc->bEndpointAddress == address)
119			return ep;
120	}
121	return NULL;
122}
123
124/* gadget ops */
125
126static int vgadget_get_frame(struct usb_gadget *_gadget)
127{
128	struct timespec64 now;
129	struct vudc *udc = usb_gadget_to_vudc(_gadget);
130
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)
134			& 0x7FF;
135}
136
137static int vgadget_set_selfpowered(struct usb_gadget *_gadget, int value)
138{
139	struct vudc *udc = usb_gadget_to_vudc(_gadget);
140
141	if (value)
142		udc->devstatus |= (1 << USB_DEVICE_SELF_POWERED);
143	else
144		udc->devstatus &= ~(1 << USB_DEVICE_SELF_POWERED);
145	return 0;
146}
147
148static int vgadget_pullup(struct usb_gadget *_gadget, int value)
149{
150	struct vudc *udc = usb_gadget_to_vudc(_gadget);
151	unsigned long flags;
152	int ret;
153
154
155	spin_lock_irqsave(&udc->lock, flags);
156	value = !!value;
157	if (value == udc->pullup)
158		goto unlock;
159
160	udc->pullup = value;
161	if (value) {
162		udc->gadget.speed = min_t(u8, USB_SPEED_HIGH,
163					   udc->driver->max_speed);
164		udc->ep[0].ep.maxpacket = 64;
165		/*
166		 * This is the first place where we can ask our
167		 * gadget driver for descriptors.
168		 */
169		ret = get_gadget_descs(udc);
170		if (ret) {
171			dev_err(&udc->gadget.dev, "Unable go get desc: %d", ret);
172			goto unlock;
173		}
174
175		spin_unlock_irqrestore(&udc->lock, flags);
176		usbip_start_eh(&udc->ud);
177	} else {
178		/* Invalidate descriptors */
179		udc->desc_cached = 0;
180
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 */
184	}
185
186	return 0;
187
188unlock:
189	spin_unlock_irqrestore(&udc->lock, flags);
190	return 0;
191}
192
193static int vgadget_udc_start(struct usb_gadget *g,
194		struct usb_gadget_driver *driver)
195{
196	struct vudc *udc = usb_gadget_to_vudc(g);
197	unsigned long flags;
198
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);
203
204	return 0;
205}
206
207static int vgadget_udc_stop(struct usb_gadget *g)
208{
209	struct vudc *udc = usb_gadget_to_vudc(g);
210	unsigned long flags;
211
212	spin_lock_irqsave(&udc->lock, flags);
213	udc->driver = NULL;
214	spin_unlock_irqrestore(&udc->lock, flags);
215	return 0;
216}
217
218static 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,
224};
225
226
227/* endpoint ops */
228
229static int vep_enable(struct usb_ep *_ep,
230		const struct usb_endpoint_descriptor *desc)
231{
232	struct vep	*ep;
233	struct vudc	*udc;
234	unsigned int	maxp;
235	unsigned long	flags;
236
237	ep = to_vep(_ep);
238	udc = ep_to_vudc(ep);
239
240	if (!_ep || !desc || ep->desc || _ep->caps.type_control
241			|| desc->bDescriptorType != USB_DT_ENDPOINT)
242		return -EINVAL;
243
244	if (!udc->driver)
245		return -ESHUTDOWN;
246
247	spin_lock_irqsave(&udc->lock, flags);
248
249	maxp = usb_endpoint_maxp(desc);
250	_ep->maxpacket = maxp;
251	ep->desc = desc;
252	ep->type = usb_endpoint_type(desc);
253	ep->halted = ep->wedged = 0;
254
255	spin_unlock_irqrestore(&udc->lock, flags);
256
257	return 0;
258}
259
260static int vep_disable(struct usb_ep *_ep)
261{
262	struct vep *ep;
263	struct vudc *udc;
264	unsigned long flags;
265
266	ep = to_vep(_ep);
267	udc = ep_to_vudc(ep);
268	if (!_ep || !ep->desc || _ep->caps.type_control)
269		return -EINVAL;
270
271	spin_lock_irqsave(&udc->lock, flags);
272	ep->desc = NULL;
273	nuke(udc, ep);
274	spin_unlock_irqrestore(&udc->lock, flags);
275
276	return 0;
277}
278
279static struct usb_request *vep_alloc_request(struct usb_ep *_ep,
280		gfp_t mem_flags)
281{
282	struct vep *ep;
283	struct vrequest *req;
284
285	if (!_ep)
286		return NULL;
287	ep = to_vep(_ep);
288
289	req = kzalloc(sizeof(*req), mem_flags);
290	if (!req)
291		return NULL;
292
293	INIT_LIST_HEAD(&req->req_entry);
294
295	return &req->req;
296}
297
298static void vep_free_request(struct usb_ep *_ep, struct usb_request *_req)
299{
300	struct vrequest *req;
301
302	if (WARN_ON(!_ep || !_req))
303		return;
304
305	req = to_vrequest(_req);
306	kfree(req);
307}
308
309static int vep_queue(struct usb_ep *_ep, struct usb_request *_req,
310		gfp_t mem_flags)
311{
312	struct vep *ep;
313	struct vrequest *req;
314	struct vudc *udc;
315	unsigned long flags;
316
317	if (!_ep || !_req)
318		return -EINVAL;
319
320	ep = to_vep(_ep);
321	req = to_vrequest(_req);
322	udc = ep_to_vudc(ep);
323
324	spin_lock_irqsave(&udc->lock, flags);
325	_req->actual = 0;
326	_req->status = -EINPROGRESS;
327
328	list_add_tail(&req->req_entry, &ep->req_queue);
329	spin_unlock_irqrestore(&udc->lock, flags);
330
331	return 0;
332}
333
334static int vep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
335{
336	struct vep *ep;
337	struct vrequest *req;
338	struct vudc *udc;
339	struct vrequest *lst;
340	unsigned long flags;
341	int ret = -EINVAL;
342
343	if (!_ep || !_req)
344		return ret;
345
346	ep = to_vep(_ep);
347	req = to_vrequest(_req);
348	udc = req->udc;
349
350	if (!udc->driver)
351		return -ESHUTDOWN;
352
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;
358			ret = 0;
359			break;
360		}
361	}
362	spin_unlock_irqrestore(&udc->lock, flags);
363
364	if (ret == 0)
365		usb_gadget_giveback_request(_ep, _req);
366
367	return ret;
368}
369
370static int
371vep_set_halt_and_wedge(struct usb_ep *_ep, int value, int wedged)
372{
373	struct vep *ep;
374	struct vudc *udc;
375	unsigned long flags;
376	int ret = 0;
377
378	ep = to_vep(_ep);
379	if (!_ep)
380		return -EINVAL;
381
382	udc = ep_to_vudc(ep);
383	if (!udc->driver)
384		return -ESHUTDOWN;
385
386	spin_lock_irqsave(&udc->lock, flags);
387	if (!value)
388		ep->halted = ep->wedged = 0;
389	else if (ep->desc && (ep->desc->bEndpointAddress & USB_DIR_IN) &&
390			!list_empty(&ep->req_queue))
391		ret = -EAGAIN;
392	else {
393		ep->halted = 1;
394		if (wedged)
395			ep->wedged = 1;
396	}
397
398	spin_unlock_irqrestore(&udc->lock, flags);
399	return ret;
400}
401
402static int
403vep_set_halt(struct usb_ep *_ep, int value)
404{
405	return vep_set_halt_and_wedge(_ep, value, 0);
406}
407
408static int vep_set_wedge(struct usb_ep *_ep)
409{
410	return vep_set_halt_and_wedge(_ep, 1, 1);
411}
412
413static const struct usb_ep_ops vep_ops = {
414	.enable		= vep_enable,
415	.disable	= vep_disable,
416
417	.alloc_request	= vep_alloc_request,
418	.free_request	= vep_free_request,
419
420	.queue		= vep_queue,
421	.dequeue	= vep_dequeue,
422
423	.set_halt	= vep_set_halt,
424	.set_wedge	= vep_set_wedge,
425};
426
427
428/* shutdown / reset / error handlers */
429
430static void vudc_shutdown(struct usbip_device *ud)
431{
432	struct vudc *udc = container_of(ud, struct vudc, ud);
433	int call_disconnect = 0;
434	unsigned long flags;
435
436	dev_dbg(&udc->pdev->dev, "device shutdown");
437	if (ud->tcp_socket)
438		kernel_sock_shutdown(ud->tcp_socket, SHUT_RDWR);
439
440	if (ud->tcp_rx) {
441		kthread_stop_put(ud->tcp_rx);
442		ud->tcp_rx = NULL;
443	}
444	if (ud->tcp_tx) {
445		kthread_stop_put(ud->tcp_tx);
446		ud->tcp_tx = NULL;
447	}
448
449	if (ud->tcp_socket) {
450		sockfd_put(ud->tcp_socket);
451		ud->tcp_socket = NULL;
452	}
453
454	spin_lock_irqsave(&udc->lock, flags);
455	stop_activity(udc);
456	if (udc->connected && udc->driver->disconnect)
457		call_disconnect = 1;
458	udc->connected = 0;
459	spin_unlock_irqrestore(&udc->lock, flags);
460	if (call_disconnect)
461		udc->driver->disconnect(&udc->gadget);
462}
463
464static void vudc_device_reset(struct usbip_device *ud)
465{
466	struct vudc *udc = container_of(ud, struct vudc, ud);
467	unsigned long flags;
468
469	dev_dbg(&udc->pdev->dev, "device reset");
470	spin_lock_irqsave(&udc->lock, flags);
471	stop_activity(udc);
472	spin_unlock_irqrestore(&udc->lock, flags);
473	if (udc->driver)
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);
478}
479
480static void vudc_device_unusable(struct usbip_device *ud)
481{
482	unsigned long flags;
483
484	spin_lock_irqsave(&ud->lock, flags);
485	ud->status = SDEV_ST_ERROR;
486	spin_unlock_irqrestore(&ud->lock, flags);
487}
488
489/* device setup / cleanup */
490
491struct vudc_device *alloc_vudc_device(int devid)
492{
493	struct vudc_device *udc_dev = NULL;
494
495	udc_dev = kzalloc(sizeof(*udc_dev), GFP_KERNEL);
496	if (!udc_dev)
497		goto out;
498
499	INIT_LIST_HEAD(&udc_dev->dev_entry);
500
501	udc_dev->pdev = platform_device_alloc(GADGET_NAME, devid);
502	if (!udc_dev->pdev) {
503		kfree(udc_dev);
504		udc_dev = NULL;
505	}
506
507out:
508	return udc_dev;
509}
510
511void put_vudc_device(struct vudc_device *udc_dev)
512{
513	platform_device_put(udc_dev->pdev);
514	kfree(udc_dev);
515}
516
517static int init_vudc_hw(struct vudc *udc)
518{
519	int i;
520	struct usbip_device *ud = &udc->ud;
521	struct vep *ep;
522
523	udc->ep = kcalloc(VIRTUAL_ENDPOINTS, sizeof(*udc->ep), GFP_KERNEL);
524	if (!udc->ep)
525		goto nomem_ep;
526
527	INIT_LIST_HEAD(&udc->gadget.ep_list);
528
529	/* create ep0 and 15 in, 15 out general purpose eps */
530	for (i = 0; i < VIRTUAL_ENDPOINTS; ++i) {
531		int is_out = i % 2;
532		int num = (i + 1) / 2;
533
534		ep = &udc->ep[i];
535
536		sprintf(ep->name, "ep%d%s", num,
537			i ? (is_out ? "out" : "in") : "");
538		ep->ep.name = ep->name;
539
540		ep->ep.ops = &vep_ops;
541
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);
546
547		if (i == 0) {
548			/* ep0 */
549			ep->ep.caps.type_control = true;
550			ep->ep.caps.dir_out = true;
551			ep->ep.caps.dir_in = true;
552
553			udc->gadget.ep0 = &ep->ep;
554		} else {
555			/* All other eps */
556			ep->ep.caps.type_iso = true;
557			ep->ep.caps.type_int = true;
558			ep->ep.caps.type_bulk = true;
559
560			if (is_out)
561				ep->ep.caps.dir_out = true;
562			else
563				ep->ep.caps.dir_in = true;
564
565			list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list);
566		}
567	}
568
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);
574
575	spin_lock_init(&ud->lock);
576	ud->status = SDEV_ST_AVAILABLE;
577	ud->side = USBIP_VUDC;
578
579	ud->eh_ops.shutdown = vudc_shutdown;
580	ud->eh_ops.reset    = vudc_device_reset;
581	ud->eh_ops.unusable = vudc_device_unusable;
582
583	v_init_timer(udc);
584	return 0;
585
586nomem_ep:
587		return -ENOMEM;
588}
589
590static void cleanup_vudc_hw(struct vudc *udc)
591{
592	kfree(udc->ep);
593}
594
595/* platform driver ops */
596
597int vudc_probe(struct platform_device *pdev)
598{
599	struct vudc *udc;
600	int ret = -ENOMEM;
601
602	udc = kzalloc(sizeof(*udc), GFP_KERNEL);
603	if (!udc)
604		goto out;
605
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;
610	udc->pdev = pdev;
611
612	ret = init_vudc_hw(udc);
613	if (ret)
614		goto err_init_vudc_hw;
615
616	ret = usb_add_gadget_udc(&pdev->dev, &udc->gadget);
617	if (ret < 0)
618		goto err_add_udc;
619
620	ret = sysfs_create_group(&pdev->dev.kobj, &vudc_attr_group);
621	if (ret) {
622		dev_err(&udc->pdev->dev, "create sysfs files\n");
623		goto err_sysfs;
624	}
625
626	platform_set_drvdata(pdev, udc);
627
628	return ret;
629
630err_sysfs:
631	usb_del_gadget_udc(&udc->gadget);
632err_add_udc:
633	cleanup_vudc_hw(udc);
634err_init_vudc_hw:
635	kfree(udc);
636out:
637	return ret;
638}
639
640int vudc_remove(struct platform_device *pdev)
641{
642	struct vudc *udc = platform_get_drvdata(pdev);
643
644	sysfs_remove_group(&pdev->dev.kobj, &vudc_attr_group);
645	usb_del_gadget_udc(&udc->gadget);
646	cleanup_vudc_hw(udc);
647	kfree(udc);
648	return 0;
649}