1// SPDX-License-Identifier: GPL-2.0+
2/*
3 * f_sourcesink.c - USB peripheral source/sink configuration driver
4 *
5 * Copyright (C) 2003-2008 David Brownell
6 * Copyright (C) 2008 by Nokia Corporation
7 */
8
9/* #define VERBOSE_DEBUG */
10
11#include <linux/slab.h>
12#include <linux/kernel.h>
13#include <linux/device.h>
14#include <linux/module.h>
15#include <linux/usb/composite.h>
16#include <linux/err.h>
17
18#include "g_zero.h"
19#include "u_f.h"
20
21/*
22 * SOURCE/SINK FUNCTION ... a primary testing vehicle for USB peripheral
23 * controller drivers.
24 *
25 * This just sinks bulk packets OUT to the peripheral and sources them IN
26 * to the host, optionally with specific data patterns for integrity tests.
27 * As such it supports basic functionality and load tests.
28 *
29 * In terms of control messaging, this supports all the standard requests
30 * plus two that support control-OUT tests.  If the optional "autoresume"
31 * mode is enabled, it provides good functional coverage for the "USBCV"
32 * test harness from USB-IF.
33 */
34struct f_sourcesink {
35	struct usb_function	function;
36
37	struct usb_ep		*in_ep;
38	struct usb_ep		*out_ep;
39	struct usb_ep		*iso_in_ep;
40	struct usb_ep		*iso_out_ep;
41	int			cur_alt;
42
43	unsigned pattern;
44	unsigned isoc_interval;
45	unsigned isoc_maxpacket;
46	unsigned isoc_mult;
47	unsigned isoc_maxburst;
48	unsigned buflen;
49	unsigned bulk_qlen;
50	unsigned iso_qlen;
51};
52
53static inline struct f_sourcesink *func_to_ss(struct usb_function *f)
54{
55	return container_of(f, struct f_sourcesink, function);
56}
57
58/*-------------------------------------------------------------------------*/
59
60static struct usb_interface_descriptor source_sink_intf_alt0 = {
61	.bLength =		USB_DT_INTERFACE_SIZE,
62	.bDescriptorType =	USB_DT_INTERFACE,
63
64	.bAlternateSetting =	0,
65	.bNumEndpoints =	2,
66	.bInterfaceClass =	USB_CLASS_VENDOR_SPEC,
67	/* .iInterface		= DYNAMIC */
68};
69
70static struct usb_interface_descriptor source_sink_intf_alt1 = {
71	.bLength =		USB_DT_INTERFACE_SIZE,
72	.bDescriptorType =	USB_DT_INTERFACE,
73
74	.bAlternateSetting =	1,
75	.bNumEndpoints =	4,
76	.bInterfaceClass =	USB_CLASS_VENDOR_SPEC,
77	/* .iInterface		= DYNAMIC */
78};
79
80/* full speed support: */
81
82static struct usb_endpoint_descriptor fs_source_desc = {
83	.bLength =		USB_DT_ENDPOINT_SIZE,
84	.bDescriptorType =	USB_DT_ENDPOINT,
85
86	.bEndpointAddress =	USB_DIR_IN,
87	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
88};
89
90static struct usb_endpoint_descriptor fs_sink_desc = {
91	.bLength =		USB_DT_ENDPOINT_SIZE,
92	.bDescriptorType =	USB_DT_ENDPOINT,
93
94	.bEndpointAddress =	USB_DIR_OUT,
95	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
96};
97
98static struct usb_endpoint_descriptor fs_iso_source_desc = {
99	.bLength =		USB_DT_ENDPOINT_SIZE,
100	.bDescriptorType =	USB_DT_ENDPOINT,
101
102	.bEndpointAddress =	USB_DIR_IN,
103	.bmAttributes =		USB_ENDPOINT_XFER_ISOC,
104	.wMaxPacketSize =	cpu_to_le16(1023),
105	.bInterval =		4,
106};
107
108static struct usb_endpoint_descriptor fs_iso_sink_desc = {
109	.bLength =		USB_DT_ENDPOINT_SIZE,
110	.bDescriptorType =	USB_DT_ENDPOINT,
111
112	.bEndpointAddress =	USB_DIR_OUT,
113	.bmAttributes =		USB_ENDPOINT_XFER_ISOC,
114	.wMaxPacketSize =	cpu_to_le16(1023),
115	.bInterval =		4,
116};
117
118static struct usb_descriptor_header *fs_source_sink_descs[] = {
119	(struct usb_descriptor_header *) &source_sink_intf_alt0,
120	(struct usb_descriptor_header *) &fs_sink_desc,
121	(struct usb_descriptor_header *) &fs_source_desc,
122	(struct usb_descriptor_header *) &source_sink_intf_alt1,
123#define FS_ALT_IFC_1_OFFSET	3
124	(struct usb_descriptor_header *) &fs_sink_desc,
125	(struct usb_descriptor_header *) &fs_source_desc,
126	(struct usb_descriptor_header *) &fs_iso_sink_desc,
127	(struct usb_descriptor_header *) &fs_iso_source_desc,
128	NULL,
129};
130
131/* high speed support: */
132
133static struct usb_endpoint_descriptor hs_source_desc = {
134	.bLength =		USB_DT_ENDPOINT_SIZE,
135	.bDescriptorType =	USB_DT_ENDPOINT,
136
137	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
138	.wMaxPacketSize =	cpu_to_le16(512),
139};
140
141static struct usb_endpoint_descriptor hs_sink_desc = {
142	.bLength =		USB_DT_ENDPOINT_SIZE,
143	.bDescriptorType =	USB_DT_ENDPOINT,
144
145	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
146	.wMaxPacketSize =	cpu_to_le16(512),
147};
148
149static struct usb_endpoint_descriptor hs_iso_source_desc = {
150	.bLength =		USB_DT_ENDPOINT_SIZE,
151	.bDescriptorType =	USB_DT_ENDPOINT,
152
153	.bmAttributes =		USB_ENDPOINT_XFER_ISOC,
154	.wMaxPacketSize =	cpu_to_le16(1024),
155	.bInterval =		4,
156};
157
158static struct usb_endpoint_descriptor hs_iso_sink_desc = {
159	.bLength =		USB_DT_ENDPOINT_SIZE,
160	.bDescriptorType =	USB_DT_ENDPOINT,
161
162	.bmAttributes =		USB_ENDPOINT_XFER_ISOC,
163	.wMaxPacketSize =	cpu_to_le16(1024),
164	.bInterval =		4,
165};
166
167static struct usb_descriptor_header *hs_source_sink_descs[] = {
168	(struct usb_descriptor_header *) &source_sink_intf_alt0,
169	(struct usb_descriptor_header *) &hs_source_desc,
170	(struct usb_descriptor_header *) &hs_sink_desc,
171	(struct usb_descriptor_header *) &source_sink_intf_alt1,
172#define HS_ALT_IFC_1_OFFSET	3
173	(struct usb_descriptor_header *) &hs_source_desc,
174	(struct usb_descriptor_header *) &hs_sink_desc,
175	(struct usb_descriptor_header *) &hs_iso_source_desc,
176	(struct usb_descriptor_header *) &hs_iso_sink_desc,
177	NULL,
178};
179
180/* super speed support: */
181
182static struct usb_endpoint_descriptor ss_source_desc = {
183	.bLength =		USB_DT_ENDPOINT_SIZE,
184	.bDescriptorType =	USB_DT_ENDPOINT,
185
186	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
187	.wMaxPacketSize =	cpu_to_le16(1024),
188};
189
190static struct usb_ss_ep_comp_descriptor ss_source_comp_desc = {
191	.bLength =		USB_DT_SS_EP_COMP_SIZE,
192	.bDescriptorType =	USB_DT_SS_ENDPOINT_COMP,
193
194	.bMaxBurst =		0,
195	.bmAttributes =		0,
196	.wBytesPerInterval =	0,
197};
198
199static struct usb_endpoint_descriptor ss_sink_desc = {
200	.bLength =		USB_DT_ENDPOINT_SIZE,
201	.bDescriptorType =	USB_DT_ENDPOINT,
202
203	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
204	.wMaxPacketSize =	cpu_to_le16(1024),
205};
206
207static struct usb_ss_ep_comp_descriptor ss_sink_comp_desc = {
208	.bLength =		USB_DT_SS_EP_COMP_SIZE,
209	.bDescriptorType =	USB_DT_SS_ENDPOINT_COMP,
210
211	.bMaxBurst =		0,
212	.bmAttributes =		0,
213	.wBytesPerInterval =	0,
214};
215
216static struct usb_endpoint_descriptor ss_iso_source_desc = {
217	.bLength =		USB_DT_ENDPOINT_SIZE,
218	.bDescriptorType =	USB_DT_ENDPOINT,
219
220	.bmAttributes =		USB_ENDPOINT_XFER_ISOC,
221	.wMaxPacketSize =	cpu_to_le16(1024),
222	.bInterval =		4,
223};
224
225static struct usb_ss_ep_comp_descriptor ss_iso_source_comp_desc = {
226	.bLength =		USB_DT_SS_EP_COMP_SIZE,
227	.bDescriptorType =	USB_DT_SS_ENDPOINT_COMP,
228
229	.bMaxBurst =		0,
230	.bmAttributes =		0,
231	.wBytesPerInterval =	cpu_to_le16(1024),
232};
233
234static struct usb_endpoint_descriptor ss_iso_sink_desc = {
235	.bLength =		USB_DT_ENDPOINT_SIZE,
236	.bDescriptorType =	USB_DT_ENDPOINT,
237
238	.bmAttributes =		USB_ENDPOINT_XFER_ISOC,
239	.wMaxPacketSize =	cpu_to_le16(1024),
240	.bInterval =		4,
241};
242
243static struct usb_ss_ep_comp_descriptor ss_iso_sink_comp_desc = {
244	.bLength =		USB_DT_SS_EP_COMP_SIZE,
245	.bDescriptorType =	USB_DT_SS_ENDPOINT_COMP,
246
247	.bMaxBurst =		0,
248	.bmAttributes =		0,
249	.wBytesPerInterval =	cpu_to_le16(1024),
250};
251
252static struct usb_descriptor_header *ss_source_sink_descs[] = {
253	(struct usb_descriptor_header *) &source_sink_intf_alt0,
254	(struct usb_descriptor_header *) &ss_source_desc,
255	(struct usb_descriptor_header *) &ss_source_comp_desc,
256	(struct usb_descriptor_header *) &ss_sink_desc,
257	(struct usb_descriptor_header *) &ss_sink_comp_desc,
258	(struct usb_descriptor_header *) &source_sink_intf_alt1,
259#define SS_ALT_IFC_1_OFFSET	5
260	(struct usb_descriptor_header *) &ss_source_desc,
261	(struct usb_descriptor_header *) &ss_source_comp_desc,
262	(struct usb_descriptor_header *) &ss_sink_desc,
263	(struct usb_descriptor_header *) &ss_sink_comp_desc,
264	(struct usb_descriptor_header *) &ss_iso_source_desc,
265	(struct usb_descriptor_header *) &ss_iso_source_comp_desc,
266	(struct usb_descriptor_header *) &ss_iso_sink_desc,
267	(struct usb_descriptor_header *) &ss_iso_sink_comp_desc,
268	NULL,
269};
270
271/* function-specific strings: */
272
273static struct usb_string strings_sourcesink[] = {
274	[0].s = "source and sink data",
275	{  }			/* end of list */
276};
277
278static struct usb_gadget_strings stringtab_sourcesink = {
279	.language	= 0x0409,	/* en-us */
280	.strings	= strings_sourcesink,
281};
282
283static struct usb_gadget_strings *sourcesink_strings[] = {
284	&stringtab_sourcesink,
285	NULL,
286};
287
288/*-------------------------------------------------------------------------*/
289
290static inline struct usb_request *ss_alloc_ep_req(struct usb_ep *ep, int len)
291{
292	return alloc_ep_req(ep, len);
293}
294
295static void disable_ep(struct usb_composite_dev *cdev, struct usb_ep *ep)
296{
297	int			value;
298
299	value = usb_ep_disable(ep);
300	if (value < 0)
301		DBG(cdev, "disable %s --> %d\n", ep->name, value);
302}
303
304void disable_endpoints(struct usb_composite_dev *cdev,
305		struct usb_ep *in, struct usb_ep *out,
306		struct usb_ep *iso_in, struct usb_ep *iso_out)
307{
308	disable_ep(cdev, in);
309	disable_ep(cdev, out);
310	if (iso_in)
311		disable_ep(cdev, iso_in);
312	if (iso_out)
313		disable_ep(cdev, iso_out);
314}
315
316static int
317sourcesink_bind(struct usb_configuration *c, struct usb_function *f)
318{
319	struct usb_composite_dev *cdev = c->cdev;
320	struct f_sourcesink	*ss = func_to_ss(f);
321	int	id;
322	int ret;
323
324	/* allocate interface ID(s) */
325	id = usb_interface_id(c, f);
326	if (id < 0)
327		return id;
328	source_sink_intf_alt0.bInterfaceNumber = id;
329	source_sink_intf_alt1.bInterfaceNumber = id;
330
331	/* allocate bulk endpoints */
332	ss->in_ep = usb_ep_autoconfig(cdev->gadget, &fs_source_desc);
333	if (!ss->in_ep) {
334autoconf_fail:
335		ERROR(cdev, "%s: can't autoconfigure on %s\n",
336			f->name, cdev->gadget->name);
337		return -ENODEV;
338	}
339
340	ss->out_ep = usb_ep_autoconfig(cdev->gadget, &fs_sink_desc);
341	if (!ss->out_ep)
342		goto autoconf_fail;
343
344	/* sanity check the isoc module parameters */
345	if (ss->isoc_interval < 1)
346		ss->isoc_interval = 1;
347	if (ss->isoc_interval > 16)
348		ss->isoc_interval = 16;
349	if (ss->isoc_mult > 2)
350		ss->isoc_mult = 2;
351	if (ss->isoc_maxburst > 15)
352		ss->isoc_maxburst = 15;
353
354	/* fill in the FS isoc descriptors from the module parameters */
355	fs_iso_source_desc.wMaxPacketSize = ss->isoc_maxpacket > 1023 ?
356						1023 : ss->isoc_maxpacket;
357	fs_iso_source_desc.bInterval = ss->isoc_interval;
358	fs_iso_sink_desc.wMaxPacketSize = ss->isoc_maxpacket > 1023 ?
359						1023 : ss->isoc_maxpacket;
360	fs_iso_sink_desc.bInterval = ss->isoc_interval;
361
362	/* allocate iso endpoints */
363	ss->iso_in_ep = usb_ep_autoconfig(cdev->gadget, &fs_iso_source_desc);
364	if (!ss->iso_in_ep)
365		goto no_iso;
366
367	ss->iso_out_ep = usb_ep_autoconfig(cdev->gadget, &fs_iso_sink_desc);
368	if (!ss->iso_out_ep) {
369		usb_ep_autoconfig_release(ss->iso_in_ep);
370		ss->iso_in_ep = NULL;
371no_iso:
372		/*
373		 * We still want to work even if the UDC doesn't have isoc
374		 * endpoints, so null out the alt interface that contains
375		 * them and continue.
376		 */
377		fs_source_sink_descs[FS_ALT_IFC_1_OFFSET] = NULL;
378		hs_source_sink_descs[HS_ALT_IFC_1_OFFSET] = NULL;
379		ss_source_sink_descs[SS_ALT_IFC_1_OFFSET] = NULL;
380	}
381
382	if (ss->isoc_maxpacket > 1024)
383		ss->isoc_maxpacket = 1024;
384
385	/* support high speed hardware */
386	hs_source_desc.bEndpointAddress = fs_source_desc.bEndpointAddress;
387	hs_sink_desc.bEndpointAddress = fs_sink_desc.bEndpointAddress;
388
389	/*
390	 * Fill in the HS isoc descriptors from the module parameters.
391	 * We assume that the user knows what they are doing and won't
392	 * give parameters that their UDC doesn't support.
393	 */
394	hs_iso_source_desc.wMaxPacketSize = ss->isoc_maxpacket;
395	hs_iso_source_desc.wMaxPacketSize |= ss->isoc_mult << 11;
396	hs_iso_source_desc.bInterval = ss->isoc_interval;
397	hs_iso_source_desc.bEndpointAddress =
398		fs_iso_source_desc.bEndpointAddress;
399
400	hs_iso_sink_desc.wMaxPacketSize = ss->isoc_maxpacket;
401	hs_iso_sink_desc.wMaxPacketSize |= ss->isoc_mult << 11;
402	hs_iso_sink_desc.bInterval = ss->isoc_interval;
403	hs_iso_sink_desc.bEndpointAddress = fs_iso_sink_desc.bEndpointAddress;
404
405	/* support super speed hardware */
406	ss_source_desc.bEndpointAddress =
407		fs_source_desc.bEndpointAddress;
408	ss_sink_desc.bEndpointAddress =
409		fs_sink_desc.bEndpointAddress;
410
411	/*
412	 * Fill in the SS isoc descriptors from the module parameters.
413	 * We assume that the user knows what they are doing and won't
414	 * give parameters that their UDC doesn't support.
415	 */
416	ss_iso_source_desc.wMaxPacketSize = ss->isoc_maxpacket;
417	ss_iso_source_desc.bInterval = ss->isoc_interval;
418	ss_iso_source_comp_desc.bmAttributes = ss->isoc_mult;
419	ss_iso_source_comp_desc.bMaxBurst = ss->isoc_maxburst;
420	ss_iso_source_comp_desc.wBytesPerInterval = ss->isoc_maxpacket *
421		(ss->isoc_mult + 1) * (ss->isoc_maxburst + 1);
422	ss_iso_source_desc.bEndpointAddress =
423		fs_iso_source_desc.bEndpointAddress;
424
425	ss_iso_sink_desc.wMaxPacketSize = ss->isoc_maxpacket;
426	ss_iso_sink_desc.bInterval = ss->isoc_interval;
427	ss_iso_sink_comp_desc.bmAttributes = ss->isoc_mult;
428	ss_iso_sink_comp_desc.bMaxBurst = ss->isoc_maxburst;
429	ss_iso_sink_comp_desc.wBytesPerInterval = ss->isoc_maxpacket *
430		(ss->isoc_mult + 1) * (ss->isoc_maxburst + 1);
431	ss_iso_sink_desc.bEndpointAddress = fs_iso_sink_desc.bEndpointAddress;
432
433	ret = usb_assign_descriptors(f, fs_source_sink_descs,
434			hs_source_sink_descs, ss_source_sink_descs,
435			ss_source_sink_descs);
436	if (ret)
437		return ret;
438
439	DBG(cdev, "%s speed %s: IN/%s, OUT/%s, ISO-IN/%s, ISO-OUT/%s\n",
440	    (gadget_is_superspeed(c->cdev->gadget) ? "super" :
441	     (gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full")),
442			f->name, ss->in_ep->name, ss->out_ep->name,
443			ss->iso_in_ep ? ss->iso_in_ep->name : "<none>",
444			ss->iso_out_ep ? ss->iso_out_ep->name : "<none>");
445	return 0;
446}
447
448static void
449sourcesink_free_func(struct usb_function *f)
450{
451	struct f_ss_opts *opts;
452
453	opts = container_of(f->fi, struct f_ss_opts, func_inst);
454
455	mutex_lock(&opts->lock);
456	opts->refcnt--;
457	mutex_unlock(&opts->lock);
458
459	usb_free_all_descriptors(f);
460	kfree(func_to_ss(f));
461}
462
463/* optionally require specific source/sink data patterns  */
464static int check_read_data(struct f_sourcesink *ss, struct usb_request *req)
465{
466	unsigned		i;
467	u8			*buf = req->buf;
468	struct usb_composite_dev *cdev = ss->function.config->cdev;
469	int max_packet_size = le16_to_cpu(ss->out_ep->desc->wMaxPacketSize);
470
471	if (ss->pattern == 2)
472		return 0;
473
474	for (i = 0; i < req->actual; i++, buf++) {
475		switch (ss->pattern) {
476
477		/* all-zeroes has no synchronization issues */
478		case 0:
479			if (*buf == 0)
480				continue;
481			break;
482
483		/* "mod63" stays in sync with short-terminated transfers,
484		 * OR otherwise when host and gadget agree on how large
485		 * each usb transfer request should be.  Resync is done
486		 * with set_interface or set_config.  (We *WANT* it to
487		 * get quickly out of sync if controllers or their drivers
488		 * stutter for any reason, including buffer duplication...)
489		 */
490		case 1:
491			if (*buf == (u8)((i % max_packet_size) % 63))
492				continue;
493			break;
494		}
495		ERROR(cdev, "bad OUT byte, buf[%d] = %d\n", i, *buf);
496		usb_ep_set_halt(ss->out_ep);
497		return -EINVAL;
498	}
499	return 0;
500}
501
502static void reinit_write_data(struct usb_ep *ep, struct usb_request *req)
503{
504	unsigned	i;
505	u8		*buf = req->buf;
506	int max_packet_size = le16_to_cpu(ep->desc->wMaxPacketSize);
507	struct f_sourcesink *ss = ep->driver_data;
508
509	switch (ss->pattern) {
510	case 0:
511		memset(req->buf, 0, req->length);
512		break;
513	case 1:
514		for  (i = 0; i < req->length; i++)
515			*buf++ = (u8) ((i % max_packet_size) % 63);
516		break;
517	case 2:
518		break;
519	}
520}
521
522static void source_sink_complete(struct usb_ep *ep, struct usb_request *req)
523{
524	struct usb_composite_dev	*cdev;
525	struct f_sourcesink		*ss = ep->driver_data;
526	int				status = req->status;
527
528	/* driver_data will be null if ep has been disabled */
529	if (!ss)
530		return;
531
532	cdev = ss->function.config->cdev;
533
534	switch (status) {
535
536	case 0:				/* normal completion? */
537		if (ep == ss->out_ep) {
538			check_read_data(ss, req);
539			if (ss->pattern != 2)
540				memset(req->buf, 0x55, req->length);
541		}
542		break;
543
544	/* this endpoint is normally active while we're configured */
545	case -ECONNABORTED:		/* hardware forced ep reset */
546	case -ECONNRESET:		/* request dequeued */
547	case -ESHUTDOWN:		/* disconnect from host */
548		VDBG(cdev, "%s gone (%d), %d/%d\n", ep->name, status,
549				req->actual, req->length);
550		if (ep == ss->out_ep)
551			check_read_data(ss, req);
552		free_ep_req(ep, req);
553		return;
554
555	case -EOVERFLOW:		/* buffer overrun on read means that
556					 * we didn't provide a big enough
557					 * buffer.
558					 */
559	default:
560#if 1
561		DBG(cdev, "%s complete --> %d, %d/%d\n", ep->name,
562				status, req->actual, req->length);
563#endif
564	case -EREMOTEIO:		/* short read */
565		break;
566	}
567
568	status = usb_ep_queue(ep, req, GFP_ATOMIC);
569	if (status) {
570		ERROR(cdev, "kill %s:  resubmit %d bytes --> %d\n",
571				ep->name, req->length, status);
572		usb_ep_set_halt(ep);
573		/* FIXME recover later ... somehow */
574	}
575}
576
577static int source_sink_start_ep(struct f_sourcesink *ss, bool is_in,
578		bool is_iso, int speed)
579{
580	struct usb_ep		*ep;
581	struct usb_request	*req;
582	int			i, size, qlen, status = 0;
583
584	if (is_iso) {
585		switch (speed) {
586		case USB_SPEED_SUPER_PLUS:
587		case USB_SPEED_SUPER:
588			size = ss->isoc_maxpacket *
589					(ss->isoc_mult + 1) *
590					(ss->isoc_maxburst + 1);
591			break;
592		case USB_SPEED_HIGH:
593			size = ss->isoc_maxpacket * (ss->isoc_mult + 1);
594			break;
595		default:
596			size = ss->isoc_maxpacket > 1023 ?
597					1023 : ss->isoc_maxpacket;
598			break;
599		}
600		ep = is_in ? ss->iso_in_ep : ss->iso_out_ep;
601		qlen = ss->iso_qlen;
602	} else {
603		ep = is_in ? ss->in_ep : ss->out_ep;
604		qlen = ss->bulk_qlen;
605		size = ss->buflen;
606	}
607
608	for (i = 0; i < qlen; i++) {
609		req = ss_alloc_ep_req(ep, size);
610		if (!req)
611			return -ENOMEM;
612
613		req->complete = source_sink_complete;
614		if (is_in)
615			reinit_write_data(ep, req);
616		else if (ss->pattern != 2)
617			memset(req->buf, 0x55, req->length);
618
619		status = usb_ep_queue(ep, req, GFP_ATOMIC);
620		if (status) {
621			struct usb_composite_dev	*cdev;
622
623			cdev = ss->function.config->cdev;
624			ERROR(cdev, "start %s%s %s --> %d\n",
625			      is_iso ? "ISO-" : "", is_in ? "IN" : "OUT",
626			      ep->name, status);
627			free_ep_req(ep, req);
628			return status;
629		}
630	}
631
632	return status;
633}
634
635static void disable_source_sink(struct f_sourcesink *ss)
636{
637	struct usb_composite_dev	*cdev;
638
639	cdev = ss->function.config->cdev;
640	disable_endpoints(cdev, ss->in_ep, ss->out_ep, ss->iso_in_ep,
641			ss->iso_out_ep);
642	VDBG(cdev, "%s disabled\n", ss->function.name);
643}
644
645static int
646enable_source_sink(struct usb_composite_dev *cdev, struct f_sourcesink *ss,
647		int alt)
648{
649	int					result = 0;
650	int					speed = cdev->gadget->speed;
651	struct usb_ep				*ep;
652
653	/* one bulk endpoint writes (sources) zeroes IN (to the host) */
654	ep = ss->in_ep;
655	result = config_ep_by_speed(cdev->gadget, &(ss->function), ep);
656	if (result)
657		return result;
658	result = usb_ep_enable(ep);
659	if (result < 0)
660		return result;
661	ep->driver_data = ss;
662
663	result = source_sink_start_ep(ss, true, false, speed);
664	if (result < 0) {
665fail:
666		ep = ss->in_ep;
667		usb_ep_disable(ep);
668		return result;
669	}
670
671	/* one bulk endpoint reads (sinks) anything OUT (from the host) */
672	ep = ss->out_ep;
673	result = config_ep_by_speed(cdev->gadget, &(ss->function), ep);
674	if (result)
675		goto fail;
676	result = usb_ep_enable(ep);
677	if (result < 0)
678		goto fail;
679	ep->driver_data = ss;
680
681	result = source_sink_start_ep(ss, false, false, speed);
682	if (result < 0) {
683fail2:
684		ep = ss->out_ep;
685		usb_ep_disable(ep);
686		goto fail;
687	}
688
689	if (alt == 0)
690		goto out;
691
692	/* one iso endpoint writes (sources) zeroes IN (to the host) */
693	ep = ss->iso_in_ep;
694	if (ep) {
695		result = config_ep_by_speed(cdev->gadget, &(ss->function), ep);
696		if (result)
697			goto fail2;
698		result = usb_ep_enable(ep);
699		if (result < 0)
700			goto fail2;
701		ep->driver_data = ss;
702
703		result = source_sink_start_ep(ss, true, true, speed);
704		if (result < 0) {
705fail3:
706			ep = ss->iso_in_ep;
707			if (ep)
708				usb_ep_disable(ep);
709			goto fail2;
710		}
711	}
712
713	/* one iso endpoint reads (sinks) anything OUT (from the host) */
714	ep = ss->iso_out_ep;
715	if (ep) {
716		result = config_ep_by_speed(cdev->gadget, &(ss->function), ep);
717		if (result)
718			goto fail3;
719		result = usb_ep_enable(ep);
720		if (result < 0)
721			goto fail3;
722		ep->driver_data = ss;
723
724		result = source_sink_start_ep(ss, false, true, speed);
725		if (result < 0) {
726			usb_ep_disable(ep);
727			goto fail3;
728		}
729	}
730out:
731	ss->cur_alt = alt;
732
733	DBG(cdev, "%s enabled, alt intf %d\n", ss->function.name, alt);
734	return result;
735}
736
737static int sourcesink_set_alt(struct usb_function *f,
738		unsigned intf, unsigned alt)
739{
740	struct f_sourcesink		*ss = func_to_ss(f);
741	struct usb_composite_dev	*cdev = f->config->cdev;
742
743	disable_source_sink(ss);
744	return enable_source_sink(cdev, ss, alt);
745}
746
747static int sourcesink_get_alt(struct usb_function *f, unsigned intf)
748{
749	struct f_sourcesink		*ss = func_to_ss(f);
750
751	return ss->cur_alt;
752}
753
754static void sourcesink_disable(struct usb_function *f)
755{
756	struct f_sourcesink	*ss = func_to_ss(f);
757
758	disable_source_sink(ss);
759}
760
761/*-------------------------------------------------------------------------*/
762
763static int sourcesink_setup(struct usb_function *f,
764		const struct usb_ctrlrequest *ctrl)
765{
766	struct usb_configuration        *c = f->config;
767	struct usb_request	*req = c->cdev->req;
768	int			value = -EOPNOTSUPP;
769	u16			w_index = le16_to_cpu(ctrl->wIndex);
770	u16			w_value = le16_to_cpu(ctrl->wValue);
771	u16			w_length = le16_to_cpu(ctrl->wLength);
772
773	req->length = USB_COMP_EP0_BUFSIZ;
774
775	/* composite driver infrastructure handles everything except
776	 * the two control test requests.
777	 */
778	switch (ctrl->bRequest) {
779
780	/*
781	 * These are the same vendor-specific requests supported by
782	 * Intel's USB 2.0 compliance test devices.  We exceed that
783	 * device spec by allowing multiple-packet requests.
784	 *
785	 * NOTE:  the Control-OUT data stays in req->buf ... better
786	 * would be copying it into a scratch buffer, so that other
787	 * requests may safely intervene.
788	 */
789	case 0x5b:	/* control WRITE test -- fill the buffer */
790		if (ctrl->bRequestType != (USB_DIR_OUT|USB_TYPE_VENDOR))
791			goto unknown;
792		if (w_value || w_index)
793			break;
794		/* just read that many bytes into the buffer */
795		if (w_length > req->length)
796			break;
797		value = w_length;
798		break;
799	case 0x5c:	/* control READ test -- return the buffer */
800		if (ctrl->bRequestType != (USB_DIR_IN|USB_TYPE_VENDOR))
801			goto unknown;
802		if (w_value || w_index)
803			break;
804		/* expect those bytes are still in the buffer; send back */
805		if (w_length > req->length)
806			break;
807		value = w_length;
808		break;
809
810	default:
811unknown:
812		VDBG(c->cdev,
813			"unknown control req%02x.%02x v%04x i%04x l%d\n",
814			ctrl->bRequestType, ctrl->bRequest,
815			w_value, w_index, w_length);
816	}
817
818	/* respond with data transfer or status phase? */
819	if (value >= 0) {
820		VDBG(c->cdev, "source/sink req%02x.%02x v%04x i%04x l%d\n",
821			ctrl->bRequestType, ctrl->bRequest,
822			w_value, w_index, w_length);
823		req->zero = 0;
824		req->length = value;
825		value = usb_ep_queue(c->cdev->gadget->ep0, req, GFP_ATOMIC);
826		if (value < 0)
827			ERROR(c->cdev, "source/sink response, err %d\n",
828					value);
829	}
830
831	/* device either stalls (value < 0) or reports success */
832	return value;
833}
834
835static struct usb_function *source_sink_alloc_func(
836		struct usb_function_instance *fi)
837{
838	struct f_sourcesink     *ss;
839	struct f_ss_opts	*ss_opts;
840
841	ss = kzalloc(sizeof(*ss), GFP_KERNEL);
842	if (!ss)
843		return ERR_PTR(-ENOMEM);
844
845	ss_opts =  container_of(fi, struct f_ss_opts, func_inst);
846
847	mutex_lock(&ss_opts->lock);
848	ss_opts->refcnt++;
849	mutex_unlock(&ss_opts->lock);
850
851	ss->pattern = ss_opts->pattern;
852	ss->isoc_interval = ss_opts->isoc_interval;
853	ss->isoc_maxpacket = ss_opts->isoc_maxpacket;
854	ss->isoc_mult = ss_opts->isoc_mult;
855	ss->isoc_maxburst = ss_opts->isoc_maxburst;
856	ss->buflen = ss_opts->bulk_buflen;
857	ss->bulk_qlen = ss_opts->bulk_qlen;
858	ss->iso_qlen = ss_opts->iso_qlen;
859
860	ss->function.name = "source/sink";
861	ss->function.bind = sourcesink_bind;
862	ss->function.set_alt = sourcesink_set_alt;
863	ss->function.get_alt = sourcesink_get_alt;
864	ss->function.disable = sourcesink_disable;
865	ss->function.setup = sourcesink_setup;
866	ss->function.strings = sourcesink_strings;
867
868	ss->function.free_func = sourcesink_free_func;
869
870	return &ss->function;
871}
872
873static inline struct f_ss_opts *to_f_ss_opts(struct config_item *item)
874{
875	return container_of(to_config_group(item), struct f_ss_opts,
876			    func_inst.group);
877}
878
879static void ss_attr_release(struct config_item *item)
880{
881	struct f_ss_opts *ss_opts = to_f_ss_opts(item);
882
883	usb_put_function_instance(&ss_opts->func_inst);
884}
885
886static struct configfs_item_operations ss_item_ops = {
887	.release		= ss_attr_release,
888};
889
890static ssize_t f_ss_opts_pattern_show(struct config_item *item, char *page)
891{
892	struct f_ss_opts *opts = to_f_ss_opts(item);
893	int result;
894
895	mutex_lock(&opts->lock);
896	result = sprintf(page, "%u\n", opts->pattern);
897	mutex_unlock(&opts->lock);
898
899	return result;
900}
901
902static ssize_t f_ss_opts_pattern_store(struct config_item *item,
903				       const char *page, size_t len)
904{
905	struct f_ss_opts *opts = to_f_ss_opts(item);
906	int ret;
907	u8 num;
908
909	mutex_lock(&opts->lock);
910	if (opts->refcnt) {
911		ret = -EBUSY;
912		goto end;
913	}
914
915	ret = kstrtou8(page, 0, &num);
916	if (ret)
917		goto end;
918
919	if (num != 0 && num != 1 && num != 2) {
920		ret = -EINVAL;
921		goto end;
922	}
923
924	opts->pattern = num;
925	ret = len;
926end:
927	mutex_unlock(&opts->lock);
928	return ret;
929}
930
931CONFIGFS_ATTR(f_ss_opts_, pattern);
932
933static ssize_t f_ss_opts_isoc_interval_show(struct config_item *item, char *page)
934{
935	struct f_ss_opts *opts = to_f_ss_opts(item);
936	int result;
937
938	mutex_lock(&opts->lock);
939	result = sprintf(page, "%u\n", opts->isoc_interval);
940	mutex_unlock(&opts->lock);
941
942	return result;
943}
944
945static ssize_t f_ss_opts_isoc_interval_store(struct config_item *item,
946				       const char *page, size_t len)
947{
948	struct f_ss_opts *opts = to_f_ss_opts(item);
949	int ret;
950	u8 num;
951
952	mutex_lock(&opts->lock);
953	if (opts->refcnt) {
954		ret = -EBUSY;
955		goto end;
956	}
957
958	ret = kstrtou8(page, 0, &num);
959	if (ret)
960		goto end;
961
962	if (num > 16) {
963		ret = -EINVAL;
964		goto end;
965	}
966
967	opts->isoc_interval = num;
968	ret = len;
969end:
970	mutex_unlock(&opts->lock);
971	return ret;
972}
973
974CONFIGFS_ATTR(f_ss_opts_, isoc_interval);
975
976static ssize_t f_ss_opts_isoc_maxpacket_show(struct config_item *item, char *page)
977{
978	struct f_ss_opts *opts = to_f_ss_opts(item);
979	int result;
980
981	mutex_lock(&opts->lock);
982	result = sprintf(page, "%u\n", opts->isoc_maxpacket);
983	mutex_unlock(&opts->lock);
984
985	return result;
986}
987
988static ssize_t f_ss_opts_isoc_maxpacket_store(struct config_item *item,
989				       const char *page, size_t len)
990{
991	struct f_ss_opts *opts = to_f_ss_opts(item);
992	int ret;
993	u16 num;
994
995	mutex_lock(&opts->lock);
996	if (opts->refcnt) {
997		ret = -EBUSY;
998		goto end;
999	}
1000
1001	ret = kstrtou16(page, 0, &num);
1002	if (ret)
1003		goto end;
1004
1005	if (num > 1024) {
1006		ret = -EINVAL;
1007		goto end;
1008	}
1009
1010	opts->isoc_maxpacket = num;
1011	ret = len;
1012end:
1013	mutex_unlock(&opts->lock);
1014	return ret;
1015}
1016
1017CONFIGFS_ATTR(f_ss_opts_, isoc_maxpacket);
1018
1019static ssize_t f_ss_opts_isoc_mult_show(struct config_item *item, char *page)
1020{
1021	struct f_ss_opts *opts = to_f_ss_opts(item);
1022	int result;
1023
1024	mutex_lock(&opts->lock);
1025	result = sprintf(page, "%u\n", opts->isoc_mult);
1026	mutex_unlock(&opts->lock);
1027
1028	return result;
1029}
1030
1031static ssize_t f_ss_opts_isoc_mult_store(struct config_item *item,
1032				       const char *page, size_t len)
1033{
1034	struct f_ss_opts *opts = to_f_ss_opts(item);
1035	int ret;
1036	u8 num;
1037
1038	mutex_lock(&opts->lock);
1039	if (opts->refcnt) {
1040		ret = -EBUSY;
1041		goto end;
1042	}
1043
1044	ret = kstrtou8(page, 0, &num);
1045	if (ret)
1046		goto end;
1047
1048	if (num > 2) {
1049		ret = -EINVAL;
1050		goto end;
1051	}
1052
1053	opts->isoc_mult = num;
1054	ret = len;
1055end:
1056	mutex_unlock(&opts->lock);
1057	return ret;
1058}
1059
1060CONFIGFS_ATTR(f_ss_opts_, isoc_mult);
1061
1062static ssize_t f_ss_opts_isoc_maxburst_show(struct config_item *item, char *page)
1063{
1064	struct f_ss_opts *opts = to_f_ss_opts(item);
1065	int result;
1066
1067	mutex_lock(&opts->lock);
1068	result = sprintf(page, "%u\n", opts->isoc_maxburst);
1069	mutex_unlock(&opts->lock);
1070
1071	return result;
1072}
1073
1074static ssize_t f_ss_opts_isoc_maxburst_store(struct config_item *item,
1075				       const char *page, size_t len)
1076{
1077	struct f_ss_opts *opts = to_f_ss_opts(item);
1078	int ret;
1079	u8 num;
1080
1081	mutex_lock(&opts->lock);
1082	if (opts->refcnt) {
1083		ret = -EBUSY;
1084		goto end;
1085	}
1086
1087	ret = kstrtou8(page, 0, &num);
1088	if (ret)
1089		goto end;
1090
1091	if (num > 15) {
1092		ret = -EINVAL;
1093		goto end;
1094	}
1095
1096	opts->isoc_maxburst = num;
1097	ret = len;
1098end:
1099	mutex_unlock(&opts->lock);
1100	return ret;
1101}
1102
1103CONFIGFS_ATTR(f_ss_opts_, isoc_maxburst);
1104
1105static ssize_t f_ss_opts_bulk_buflen_show(struct config_item *item, char *page)
1106{
1107	struct f_ss_opts *opts = to_f_ss_opts(item);
1108	int result;
1109
1110	mutex_lock(&opts->lock);
1111	result = sprintf(page, "%u\n", opts->bulk_buflen);
1112	mutex_unlock(&opts->lock);
1113
1114	return result;
1115}
1116
1117static ssize_t f_ss_opts_bulk_buflen_store(struct config_item *item,
1118					   const char *page, size_t len)
1119{
1120	struct f_ss_opts *opts = to_f_ss_opts(item);
1121	int ret;
1122	u32 num;
1123
1124	mutex_lock(&opts->lock);
1125	if (opts->refcnt) {
1126		ret = -EBUSY;
1127		goto end;
1128	}
1129
1130	ret = kstrtou32(page, 0, &num);
1131	if (ret)
1132		goto end;
1133
1134	opts->bulk_buflen = num;
1135	ret = len;
1136end:
1137	mutex_unlock(&opts->lock);
1138	return ret;
1139}
1140
1141CONFIGFS_ATTR(f_ss_opts_, bulk_buflen);
1142
1143static ssize_t f_ss_opts_bulk_qlen_show(struct config_item *item, char *page)
1144{
1145	struct f_ss_opts *opts = to_f_ss_opts(item);
1146	int result;
1147
1148	mutex_lock(&opts->lock);
1149	result = sprintf(page, "%u\n", opts->bulk_qlen);
1150	mutex_unlock(&opts->lock);
1151
1152	return result;
1153}
1154
1155static ssize_t f_ss_opts_bulk_qlen_store(struct config_item *item,
1156					   const char *page, size_t len)
1157{
1158	struct f_ss_opts *opts = to_f_ss_opts(item);
1159	int ret;
1160	u32 num;
1161
1162	mutex_lock(&opts->lock);
1163	if (opts->refcnt) {
1164		ret = -EBUSY;
1165		goto end;
1166	}
1167
1168	ret = kstrtou32(page, 0, &num);
1169	if (ret)
1170		goto end;
1171
1172	opts->bulk_qlen = num;
1173	ret = len;
1174end:
1175	mutex_unlock(&opts->lock);
1176	return ret;
1177}
1178
1179CONFIGFS_ATTR(f_ss_opts_, bulk_qlen);
1180
1181static ssize_t f_ss_opts_iso_qlen_show(struct config_item *item, char *page)
1182{
1183	struct f_ss_opts *opts = to_f_ss_opts(item);
1184	int result;
1185
1186	mutex_lock(&opts->lock);
1187	result = sprintf(page, "%u\n", opts->iso_qlen);
1188	mutex_unlock(&opts->lock);
1189
1190	return result;
1191}
1192
1193static ssize_t f_ss_opts_iso_qlen_store(struct config_item *item,
1194					   const char *page, size_t len)
1195{
1196	struct f_ss_opts *opts = to_f_ss_opts(item);
1197	int ret;
1198	u32 num;
1199
1200	mutex_lock(&opts->lock);
1201	if (opts->refcnt) {
1202		ret = -EBUSY;
1203		goto end;
1204	}
1205
1206	ret = kstrtou32(page, 0, &num);
1207	if (ret)
1208		goto end;
1209
1210	opts->iso_qlen = num;
1211	ret = len;
1212end:
1213	mutex_unlock(&opts->lock);
1214	return ret;
1215}
1216
1217CONFIGFS_ATTR(f_ss_opts_, iso_qlen);
1218
1219static struct configfs_attribute *ss_attrs[] = {
1220	&f_ss_opts_attr_pattern,
1221	&f_ss_opts_attr_isoc_interval,
1222	&f_ss_opts_attr_isoc_maxpacket,
1223	&f_ss_opts_attr_isoc_mult,
1224	&f_ss_opts_attr_isoc_maxburst,
1225	&f_ss_opts_attr_bulk_buflen,
1226	&f_ss_opts_attr_bulk_qlen,
1227	&f_ss_opts_attr_iso_qlen,
1228	NULL,
1229};
1230
1231static const struct config_item_type ss_func_type = {
1232	.ct_item_ops    = &ss_item_ops,
1233	.ct_attrs	= ss_attrs,
1234	.ct_owner       = THIS_MODULE,
1235};
1236
1237static void source_sink_free_instance(struct usb_function_instance *fi)
1238{
1239	struct f_ss_opts *ss_opts;
1240
1241	ss_opts = container_of(fi, struct f_ss_opts, func_inst);
1242	kfree(ss_opts);
1243}
1244
1245static struct usb_function_instance *source_sink_alloc_inst(void)
1246{
1247	struct f_ss_opts *ss_opts;
1248
1249	ss_opts = kzalloc(sizeof(*ss_opts), GFP_KERNEL);
1250	if (!ss_opts)
1251		return ERR_PTR(-ENOMEM);
1252	mutex_init(&ss_opts->lock);
1253	ss_opts->func_inst.free_func_inst = source_sink_free_instance;
1254	ss_opts->isoc_interval = GZERO_ISOC_INTERVAL;
1255	ss_opts->isoc_maxpacket = GZERO_ISOC_MAXPACKET;
1256	ss_opts->bulk_buflen = GZERO_BULK_BUFLEN;
1257	ss_opts->bulk_qlen = GZERO_SS_BULK_QLEN;
1258	ss_opts->iso_qlen = GZERO_SS_ISO_QLEN;
1259
1260	config_group_init_type_name(&ss_opts->func_inst.group, "",
1261				    &ss_func_type);
1262
1263	return &ss_opts->func_inst;
1264}
1265DECLARE_USB_FUNCTION(SourceSink, source_sink_alloc_inst,
1266		source_sink_alloc_func);
1267
1268static int __init sslb_modinit(void)
1269{
1270	int ret;
1271
1272	ret = usb_function_register(&SourceSinkusb_func);
1273	if (ret)
1274		return ret;
1275	ret = lb_modinit();
1276	if (ret)
1277		usb_function_unregister(&SourceSinkusb_func);
1278	return ret;
1279}
1280static void __exit sslb_modexit(void)
1281{
1282	usb_function_unregister(&SourceSinkusb_func);
1283	lb_modexit();
1284}
1285module_init(sslb_modinit);
1286module_exit(sslb_modexit);
1287
1288MODULE_LICENSE("GPL");
1289