1 // SPDX-License-Identifier: GPL-2.0+
3 * f_sourcesink.c - USB peripheral source/sink configuration driver
5 * Copyright (C) 2003-2008 David Brownell
6 * Copyright (C) 2008 by Nokia Corporation
9 /* #define VERBOSE_DEBUG */
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>
22 * SOURCE/SINK FUNCTION ... a primary testing vehicle for USB peripheral
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.
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.
35 struct usb_function function
;
38 struct usb_ep
*out_ep
;
39 struct usb_ep
*iso_in_ep
;
40 struct usb_ep
*iso_out_ep
;
44 unsigned isoc_interval
;
45 unsigned isoc_maxpacket
;
47 unsigned isoc_maxburst
;
53 static inline struct f_sourcesink
*func_to_ss(struct usb_function
*f
)
55 return container_of(f
, struct f_sourcesink
, function
);
58 /*-------------------------------------------------------------------------*/
60 static struct usb_interface_descriptor source_sink_intf_alt0
= {
61 .bLength
= USB_DT_INTERFACE_SIZE
,
62 .bDescriptorType
= USB_DT_INTERFACE
,
64 .bAlternateSetting
= 0,
66 .bInterfaceClass
= USB_CLASS_VENDOR_SPEC
,
67 /* .iInterface = DYNAMIC */
70 static struct usb_interface_descriptor source_sink_intf_alt1
= {
71 .bLength
= USB_DT_INTERFACE_SIZE
,
72 .bDescriptorType
= USB_DT_INTERFACE
,
74 .bAlternateSetting
= 1,
76 .bInterfaceClass
= USB_CLASS_VENDOR_SPEC
,
77 /* .iInterface = DYNAMIC */
80 /* full speed support: */
82 static struct usb_endpoint_descriptor fs_source_desc
= {
83 .bLength
= USB_DT_ENDPOINT_SIZE
,
84 .bDescriptorType
= USB_DT_ENDPOINT
,
86 .bEndpointAddress
= USB_DIR_IN
,
87 .bmAttributes
= USB_ENDPOINT_XFER_BULK
,
90 static struct usb_endpoint_descriptor fs_sink_desc
= {
91 .bLength
= USB_DT_ENDPOINT_SIZE
,
92 .bDescriptorType
= USB_DT_ENDPOINT
,
94 .bEndpointAddress
= USB_DIR_OUT
,
95 .bmAttributes
= USB_ENDPOINT_XFER_BULK
,
98 static struct usb_endpoint_descriptor fs_iso_source_desc
= {
99 .bLength
= USB_DT_ENDPOINT_SIZE
,
100 .bDescriptorType
= USB_DT_ENDPOINT
,
102 .bEndpointAddress
= USB_DIR_IN
,
103 .bmAttributes
= USB_ENDPOINT_XFER_ISOC
,
104 .wMaxPacketSize
= cpu_to_le16(1023),
108 static struct usb_endpoint_descriptor fs_iso_sink_desc
= {
109 .bLength
= USB_DT_ENDPOINT_SIZE
,
110 .bDescriptorType
= USB_DT_ENDPOINT
,
112 .bEndpointAddress
= USB_DIR_OUT
,
113 .bmAttributes
= USB_ENDPOINT_XFER_ISOC
,
114 .wMaxPacketSize
= cpu_to_le16(1023),
118 static 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
,
131 /* high speed support: */
133 static struct usb_endpoint_descriptor hs_source_desc
= {
134 .bLength
= USB_DT_ENDPOINT_SIZE
,
135 .bDescriptorType
= USB_DT_ENDPOINT
,
137 .bmAttributes
= USB_ENDPOINT_XFER_BULK
,
138 .wMaxPacketSize
= cpu_to_le16(512),
141 static struct usb_endpoint_descriptor hs_sink_desc
= {
142 .bLength
= USB_DT_ENDPOINT_SIZE
,
143 .bDescriptorType
= USB_DT_ENDPOINT
,
145 .bmAttributes
= USB_ENDPOINT_XFER_BULK
,
146 .wMaxPacketSize
= cpu_to_le16(512),
149 static struct usb_endpoint_descriptor hs_iso_source_desc
= {
150 .bLength
= USB_DT_ENDPOINT_SIZE
,
151 .bDescriptorType
= USB_DT_ENDPOINT
,
153 .bmAttributes
= USB_ENDPOINT_XFER_ISOC
,
154 .wMaxPacketSize
= cpu_to_le16(1024),
158 static struct usb_endpoint_descriptor hs_iso_sink_desc
= {
159 .bLength
= USB_DT_ENDPOINT_SIZE
,
160 .bDescriptorType
= USB_DT_ENDPOINT
,
162 .bmAttributes
= USB_ENDPOINT_XFER_ISOC
,
163 .wMaxPacketSize
= cpu_to_le16(1024),
167 static 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
,
180 /* super speed support: */
182 static struct usb_endpoint_descriptor ss_source_desc
= {
183 .bLength
= USB_DT_ENDPOINT_SIZE
,
184 .bDescriptorType
= USB_DT_ENDPOINT
,
186 .bmAttributes
= USB_ENDPOINT_XFER_BULK
,
187 .wMaxPacketSize
= cpu_to_le16(1024),
190 static 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
,
196 .wBytesPerInterval
= 0,
199 static struct usb_endpoint_descriptor ss_sink_desc
= {
200 .bLength
= USB_DT_ENDPOINT_SIZE
,
201 .bDescriptorType
= USB_DT_ENDPOINT
,
203 .bmAttributes
= USB_ENDPOINT_XFER_BULK
,
204 .wMaxPacketSize
= cpu_to_le16(1024),
207 static 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
,
213 .wBytesPerInterval
= 0,
216 static struct usb_endpoint_descriptor ss_iso_source_desc
= {
217 .bLength
= USB_DT_ENDPOINT_SIZE
,
218 .bDescriptorType
= USB_DT_ENDPOINT
,
220 .bmAttributes
= USB_ENDPOINT_XFER_ISOC
,
221 .wMaxPacketSize
= cpu_to_le16(1024),
225 static 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
,
231 .wBytesPerInterval
= cpu_to_le16(1024),
234 static struct usb_endpoint_descriptor ss_iso_sink_desc
= {
235 .bLength
= USB_DT_ENDPOINT_SIZE
,
236 .bDescriptorType
= USB_DT_ENDPOINT
,
238 .bmAttributes
= USB_ENDPOINT_XFER_ISOC
,
239 .wMaxPacketSize
= cpu_to_le16(1024),
243 static 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
,
249 .wBytesPerInterval
= cpu_to_le16(1024),
252 static 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
,
271 /* function-specific strings: */
273 static struct usb_string strings_sourcesink
[] = {
274 [0].s
= "source and sink data",
275 { } /* end of list */
278 static struct usb_gadget_strings stringtab_sourcesink
= {
279 .language
= 0x0409, /* en-us */
280 .strings
= strings_sourcesink
,
283 static struct usb_gadget_strings
*sourcesink_strings
[] = {
284 &stringtab_sourcesink
,
288 /*-------------------------------------------------------------------------*/
290 static inline struct usb_request
*ss_alloc_ep_req(struct usb_ep
*ep
, int len
)
292 return alloc_ep_req(ep
, len
);
295 static void disable_ep(struct usb_composite_dev
*cdev
, struct usb_ep
*ep
)
299 value
= usb_ep_disable(ep
);
301 DBG(cdev
, "disable %s --> %d\n", ep
->name
, value
);
304 void 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
)
308 disable_ep(cdev
, in
);
309 disable_ep(cdev
, out
);
311 disable_ep(cdev
, iso_in
);
313 disable_ep(cdev
, iso_out
);
317 sourcesink_bind(struct usb_configuration
*c
, struct usb_function
*f
)
319 struct usb_composite_dev
*cdev
= c
->cdev
;
320 struct f_sourcesink
*ss
= func_to_ss(f
);
324 /* allocate interface ID(s) */
325 id
= usb_interface_id(c
, f
);
328 source_sink_intf_alt0
.bInterfaceNumber
= id
;
329 source_sink_intf_alt1
.bInterfaceNumber
= id
;
331 /* allocate bulk endpoints */
332 ss
->in_ep
= usb_ep_autoconfig(cdev
->gadget
, &fs_source_desc
);
335 ERROR(cdev
, "%s: can't autoconfigure on %s\n",
336 f
->name
, cdev
->gadget
->name
);
340 ss
->out_ep
= usb_ep_autoconfig(cdev
->gadget
, &fs_sink_desc
);
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)
351 if (ss
->isoc_maxburst
> 15)
352 ss
->isoc_maxburst
= 15;
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
;
362 /* allocate iso endpoints */
363 ss
->iso_in_ep
= usb_ep_autoconfig(cdev
->gadget
, &fs_iso_source_desc
);
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
;
373 * We still want to work even if the UDC doesn't have isoc
374 * endpoints, so null out the alt interface that contains
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
;
382 if (ss
->isoc_maxpacket
> 1024)
383 ss
->isoc_maxpacket
= 1024;
385 /* support high speed hardware */
386 hs_source_desc
.bEndpointAddress
= fs_source_desc
.bEndpointAddress
;
387 hs_sink_desc
.bEndpointAddress
= fs_sink_desc
.bEndpointAddress
;
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.
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
;
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
;
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
;
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.
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
;
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
;
433 ret
= usb_assign_descriptors(f
, fs_source_sink_descs
,
434 hs_source_sink_descs
, ss_source_sink_descs
, NULL
);
438 DBG(cdev
, "%s speed %s: IN/%s, OUT/%s, ISO-IN/%s, ISO-OUT/%s\n",
439 (gadget_is_superspeed(c
->cdev
->gadget
) ? "super" :
440 (gadget_is_dualspeed(c
->cdev
->gadget
) ? "dual" : "full")),
441 f
->name
, ss
->in_ep
->name
, ss
->out_ep
->name
,
442 ss
->iso_in_ep
? ss
->iso_in_ep
->name
: "<none>",
443 ss
->iso_out_ep
? ss
->iso_out_ep
->name
: "<none>");
448 sourcesink_free_func(struct usb_function
*f
)
450 struct f_ss_opts
*opts
;
452 opts
= container_of(f
->fi
, struct f_ss_opts
, func_inst
);
454 mutex_lock(&opts
->lock
);
456 mutex_unlock(&opts
->lock
);
458 usb_free_all_descriptors(f
);
459 kfree(func_to_ss(f
));
462 /* optionally require specific source/sink data patterns */
463 static int check_read_data(struct f_sourcesink
*ss
, struct usb_request
*req
)
467 struct usb_composite_dev
*cdev
= ss
->function
.config
->cdev
;
468 int max_packet_size
= le16_to_cpu(ss
->out_ep
->desc
->wMaxPacketSize
);
470 if (ss
->pattern
== 2)
473 for (i
= 0; i
< req
->actual
; i
++, buf
++) {
474 switch (ss
->pattern
) {
476 /* all-zeroes has no synchronization issues */
482 /* "mod63" stays in sync with short-terminated transfers,
483 * OR otherwise when host and gadget agree on how large
484 * each usb transfer request should be. Resync is done
485 * with set_interface or set_config. (We *WANT* it to
486 * get quickly out of sync if controllers or their drivers
487 * stutter for any reason, including buffer duplication...)
490 if (*buf
== (u8
)((i
% max_packet_size
) % 63))
494 ERROR(cdev
, "bad OUT byte, buf[%d] = %d\n", i
, *buf
);
495 usb_ep_set_halt(ss
->out_ep
);
501 static void reinit_write_data(struct usb_ep
*ep
, struct usb_request
*req
)
505 int max_packet_size
= le16_to_cpu(ep
->desc
->wMaxPacketSize
);
506 struct f_sourcesink
*ss
= ep
->driver_data
;
508 switch (ss
->pattern
) {
510 memset(req
->buf
, 0, req
->length
);
513 for (i
= 0; i
< req
->length
; i
++)
514 *buf
++ = (u8
) ((i
% max_packet_size
) % 63);
521 static void source_sink_complete(struct usb_ep
*ep
, struct usb_request
*req
)
523 struct usb_composite_dev
*cdev
;
524 struct f_sourcesink
*ss
= ep
->driver_data
;
525 int status
= req
->status
;
527 /* driver_data will be null if ep has been disabled */
531 cdev
= ss
->function
.config
->cdev
;
535 case 0: /* normal completion? */
536 if (ep
== ss
->out_ep
) {
537 check_read_data(ss
, req
);
538 if (ss
->pattern
!= 2)
539 memset(req
->buf
, 0x55, req
->length
);
543 /* this endpoint is normally active while we're configured */
544 case -ECONNABORTED
: /* hardware forced ep reset */
545 case -ECONNRESET
: /* request dequeued */
546 case -ESHUTDOWN
: /* disconnect from host */
547 VDBG(cdev
, "%s gone (%d), %d/%d\n", ep
->name
, status
,
548 req
->actual
, req
->length
);
549 if (ep
== ss
->out_ep
)
550 check_read_data(ss
, req
);
551 free_ep_req(ep
, req
);
554 case -EOVERFLOW
: /* buffer overrun on read means that
555 * we didn't provide a big enough
560 DBG(cdev
, "%s complete --> %d, %d/%d\n", ep
->name
,
561 status
, req
->actual
, req
->length
);
564 case -EREMOTEIO
: /* short read */
568 status
= usb_ep_queue(ep
, req
, GFP_ATOMIC
);
570 ERROR(cdev
, "kill %s: resubmit %d bytes --> %d\n",
571 ep
->name
, req
->length
, status
);
573 /* FIXME recover later ... somehow */
577 static int source_sink_start_ep(struct f_sourcesink
*ss
, bool is_in
,
578 bool is_iso
, int speed
)
581 struct usb_request
*req
;
582 int i
, size
, qlen
, status
= 0;
586 case USB_SPEED_SUPER
:
587 size
= ss
->isoc_maxpacket
*
588 (ss
->isoc_mult
+ 1) *
589 (ss
->isoc_maxburst
+ 1);
592 size
= ss
->isoc_maxpacket
* (ss
->isoc_mult
+ 1);
595 size
= ss
->isoc_maxpacket
> 1023 ?
596 1023 : ss
->isoc_maxpacket
;
599 ep
= is_in
? ss
->iso_in_ep
: ss
->iso_out_ep
;
602 ep
= is_in
? ss
->in_ep
: ss
->out_ep
;
603 qlen
= ss
->bulk_qlen
;
607 for (i
= 0; i
< qlen
; i
++) {
608 req
= ss_alloc_ep_req(ep
, size
);
612 req
->complete
= source_sink_complete
;
614 reinit_write_data(ep
, req
);
615 else if (ss
->pattern
!= 2)
616 memset(req
->buf
, 0x55, req
->length
);
618 status
= usb_ep_queue(ep
, req
, GFP_ATOMIC
);
620 struct usb_composite_dev
*cdev
;
622 cdev
= ss
->function
.config
->cdev
;
623 ERROR(cdev
, "start %s%s %s --> %d\n",
624 is_iso
? "ISO-" : "", is_in
? "IN" : "OUT",
626 free_ep_req(ep
, req
);
634 static void disable_source_sink(struct f_sourcesink
*ss
)
636 struct usb_composite_dev
*cdev
;
638 cdev
= ss
->function
.config
->cdev
;
639 disable_endpoints(cdev
, ss
->in_ep
, ss
->out_ep
, ss
->iso_in_ep
,
641 VDBG(cdev
, "%s disabled\n", ss
->function
.name
);
645 enable_source_sink(struct usb_composite_dev
*cdev
, struct f_sourcesink
*ss
,
649 int speed
= cdev
->gadget
->speed
;
652 /* one bulk endpoint writes (sources) zeroes IN (to the host) */
654 result
= config_ep_by_speed(cdev
->gadget
, &(ss
->function
), ep
);
657 result
= usb_ep_enable(ep
);
660 ep
->driver_data
= ss
;
662 result
= source_sink_start_ep(ss
, true, false, speed
);
670 /* one bulk endpoint reads (sinks) anything OUT (from the host) */
672 result
= config_ep_by_speed(cdev
->gadget
, &(ss
->function
), ep
);
675 result
= usb_ep_enable(ep
);
678 ep
->driver_data
= ss
;
680 result
= source_sink_start_ep(ss
, false, false, speed
);
691 /* one iso endpoint writes (sources) zeroes IN (to the host) */
694 result
= config_ep_by_speed(cdev
->gadget
, &(ss
->function
), ep
);
697 result
= usb_ep_enable(ep
);
700 ep
->driver_data
= ss
;
702 result
= source_sink_start_ep(ss
, true, true, speed
);
712 /* one iso endpoint reads (sinks) anything OUT (from the host) */
715 result
= config_ep_by_speed(cdev
->gadget
, &(ss
->function
), ep
);
718 result
= usb_ep_enable(ep
);
721 ep
->driver_data
= ss
;
723 result
= source_sink_start_ep(ss
, false, true, speed
);
732 DBG(cdev
, "%s enabled, alt intf %d\n", ss
->function
.name
, alt
);
736 static int sourcesink_set_alt(struct usb_function
*f
,
737 unsigned intf
, unsigned alt
)
739 struct f_sourcesink
*ss
= func_to_ss(f
);
740 struct usb_composite_dev
*cdev
= f
->config
->cdev
;
742 disable_source_sink(ss
);
743 return enable_source_sink(cdev
, ss
, alt
);
746 static int sourcesink_get_alt(struct usb_function
*f
, unsigned intf
)
748 struct f_sourcesink
*ss
= func_to_ss(f
);
753 static void sourcesink_disable(struct usb_function
*f
)
755 struct f_sourcesink
*ss
= func_to_ss(f
);
757 disable_source_sink(ss
);
760 /*-------------------------------------------------------------------------*/
762 static int sourcesink_setup(struct usb_function
*f
,
763 const struct usb_ctrlrequest
*ctrl
)
765 struct usb_configuration
*c
= f
->config
;
766 struct usb_request
*req
= c
->cdev
->req
;
767 int value
= -EOPNOTSUPP
;
768 u16 w_index
= le16_to_cpu(ctrl
->wIndex
);
769 u16 w_value
= le16_to_cpu(ctrl
->wValue
);
770 u16 w_length
= le16_to_cpu(ctrl
->wLength
);
772 req
->length
= USB_COMP_EP0_BUFSIZ
;
774 /* composite driver infrastructure handles everything except
775 * the two control test requests.
777 switch (ctrl
->bRequest
) {
780 * These are the same vendor-specific requests supported by
781 * Intel's USB 2.0 compliance test devices. We exceed that
782 * device spec by allowing multiple-packet requests.
784 * NOTE: the Control-OUT data stays in req->buf ... better
785 * would be copying it into a scratch buffer, so that other
786 * requests may safely intervene.
788 case 0x5b: /* control WRITE test -- fill the buffer */
789 if (ctrl
->bRequestType
!= (USB_DIR_OUT
|USB_TYPE_VENDOR
))
791 if (w_value
|| w_index
)
793 /* just read that many bytes into the buffer */
794 if (w_length
> req
->length
)
798 case 0x5c: /* control READ test -- return the buffer */
799 if (ctrl
->bRequestType
!= (USB_DIR_IN
|USB_TYPE_VENDOR
))
801 if (w_value
|| w_index
)
803 /* expect those bytes are still in the buffer; send back */
804 if (w_length
> req
->length
)
812 "unknown control req%02x.%02x v%04x i%04x l%d\n",
813 ctrl
->bRequestType
, ctrl
->bRequest
,
814 w_value
, w_index
, w_length
);
817 /* respond with data transfer or status phase? */
819 VDBG(c
->cdev
, "source/sink req%02x.%02x v%04x i%04x l%d\n",
820 ctrl
->bRequestType
, ctrl
->bRequest
,
821 w_value
, w_index
, w_length
);
824 value
= usb_ep_queue(c
->cdev
->gadget
->ep0
, req
, GFP_ATOMIC
);
826 ERROR(c
->cdev
, "source/sink response, err %d\n",
830 /* device either stalls (value < 0) or reports success */
834 static struct usb_function
*source_sink_alloc_func(
835 struct usb_function_instance
*fi
)
837 struct f_sourcesink
*ss
;
838 struct f_ss_opts
*ss_opts
;
840 ss
= kzalloc(sizeof(*ss
), GFP_KERNEL
);
842 return ERR_PTR(-ENOMEM
);
844 ss_opts
= container_of(fi
, struct f_ss_opts
, func_inst
);
846 mutex_lock(&ss_opts
->lock
);
848 mutex_unlock(&ss_opts
->lock
);
850 ss
->pattern
= ss_opts
->pattern
;
851 ss
->isoc_interval
= ss_opts
->isoc_interval
;
852 ss
->isoc_maxpacket
= ss_opts
->isoc_maxpacket
;
853 ss
->isoc_mult
= ss_opts
->isoc_mult
;
854 ss
->isoc_maxburst
= ss_opts
->isoc_maxburst
;
855 ss
->buflen
= ss_opts
->bulk_buflen
;
856 ss
->bulk_qlen
= ss_opts
->bulk_qlen
;
857 ss
->iso_qlen
= ss_opts
->iso_qlen
;
859 ss
->function
.name
= "source/sink";
860 ss
->function
.bind
= sourcesink_bind
;
861 ss
->function
.set_alt
= sourcesink_set_alt
;
862 ss
->function
.get_alt
= sourcesink_get_alt
;
863 ss
->function
.disable
= sourcesink_disable
;
864 ss
->function
.setup
= sourcesink_setup
;
865 ss
->function
.strings
= sourcesink_strings
;
867 ss
->function
.free_func
= sourcesink_free_func
;
869 return &ss
->function
;
872 static inline struct f_ss_opts
*to_f_ss_opts(struct config_item
*item
)
874 return container_of(to_config_group(item
), struct f_ss_opts
,
878 static void ss_attr_release(struct config_item
*item
)
880 struct f_ss_opts
*ss_opts
= to_f_ss_opts(item
);
882 usb_put_function_instance(&ss_opts
->func_inst
);
885 static struct configfs_item_operations ss_item_ops
= {
886 .release
= ss_attr_release
,
889 static ssize_t
f_ss_opts_pattern_show(struct config_item
*item
, char *page
)
891 struct f_ss_opts
*opts
= to_f_ss_opts(item
);
894 mutex_lock(&opts
->lock
);
895 result
= sprintf(page
, "%u\n", opts
->pattern
);
896 mutex_unlock(&opts
->lock
);
901 static ssize_t
f_ss_opts_pattern_store(struct config_item
*item
,
902 const char *page
, size_t len
)
904 struct f_ss_opts
*opts
= to_f_ss_opts(item
);
908 mutex_lock(&opts
->lock
);
914 ret
= kstrtou8(page
, 0, &num
);
918 if (num
!= 0 && num
!= 1 && num
!= 2) {
926 mutex_unlock(&opts
->lock
);
930 CONFIGFS_ATTR(f_ss_opts_
, pattern
);
932 static ssize_t
f_ss_opts_isoc_interval_show(struct config_item
*item
, char *page
)
934 struct f_ss_opts
*opts
= to_f_ss_opts(item
);
937 mutex_lock(&opts
->lock
);
938 result
= sprintf(page
, "%u\n", opts
->isoc_interval
);
939 mutex_unlock(&opts
->lock
);
944 static ssize_t
f_ss_opts_isoc_interval_store(struct config_item
*item
,
945 const char *page
, size_t len
)
947 struct f_ss_opts
*opts
= to_f_ss_opts(item
);
951 mutex_lock(&opts
->lock
);
957 ret
= kstrtou8(page
, 0, &num
);
966 opts
->isoc_interval
= num
;
969 mutex_unlock(&opts
->lock
);
973 CONFIGFS_ATTR(f_ss_opts_
, isoc_interval
);
975 static ssize_t
f_ss_opts_isoc_maxpacket_show(struct config_item
*item
, char *page
)
977 struct f_ss_opts
*opts
= to_f_ss_opts(item
);
980 mutex_lock(&opts
->lock
);
981 result
= sprintf(page
, "%u\n", opts
->isoc_maxpacket
);
982 mutex_unlock(&opts
->lock
);
987 static ssize_t
f_ss_opts_isoc_maxpacket_store(struct config_item
*item
,
988 const char *page
, size_t len
)
990 struct f_ss_opts
*opts
= to_f_ss_opts(item
);
994 mutex_lock(&opts
->lock
);
1000 ret
= kstrtou16(page
, 0, &num
);
1009 opts
->isoc_maxpacket
= num
;
1012 mutex_unlock(&opts
->lock
);
1016 CONFIGFS_ATTR(f_ss_opts_
, isoc_maxpacket
);
1018 static ssize_t
f_ss_opts_isoc_mult_show(struct config_item
*item
, char *page
)
1020 struct f_ss_opts
*opts
= to_f_ss_opts(item
);
1023 mutex_lock(&opts
->lock
);
1024 result
= sprintf(page
, "%u\n", opts
->isoc_mult
);
1025 mutex_unlock(&opts
->lock
);
1030 static ssize_t
f_ss_opts_isoc_mult_store(struct config_item
*item
,
1031 const char *page
, size_t len
)
1033 struct f_ss_opts
*opts
= to_f_ss_opts(item
);
1037 mutex_lock(&opts
->lock
);
1043 ret
= kstrtou8(page
, 0, &num
);
1052 opts
->isoc_mult
= num
;
1055 mutex_unlock(&opts
->lock
);
1059 CONFIGFS_ATTR(f_ss_opts_
, isoc_mult
);
1061 static ssize_t
f_ss_opts_isoc_maxburst_show(struct config_item
*item
, char *page
)
1063 struct f_ss_opts
*opts
= to_f_ss_opts(item
);
1066 mutex_lock(&opts
->lock
);
1067 result
= sprintf(page
, "%u\n", opts
->isoc_maxburst
);
1068 mutex_unlock(&opts
->lock
);
1073 static ssize_t
f_ss_opts_isoc_maxburst_store(struct config_item
*item
,
1074 const char *page
, size_t len
)
1076 struct f_ss_opts
*opts
= to_f_ss_opts(item
);
1080 mutex_lock(&opts
->lock
);
1086 ret
= kstrtou8(page
, 0, &num
);
1095 opts
->isoc_maxburst
= num
;
1098 mutex_unlock(&opts
->lock
);
1102 CONFIGFS_ATTR(f_ss_opts_
, isoc_maxburst
);
1104 static ssize_t
f_ss_opts_bulk_buflen_show(struct config_item
*item
, char *page
)
1106 struct f_ss_opts
*opts
= to_f_ss_opts(item
);
1109 mutex_lock(&opts
->lock
);
1110 result
= sprintf(page
, "%u\n", opts
->bulk_buflen
);
1111 mutex_unlock(&opts
->lock
);
1116 static ssize_t
f_ss_opts_bulk_buflen_store(struct config_item
*item
,
1117 const char *page
, size_t len
)
1119 struct f_ss_opts
*opts
= to_f_ss_opts(item
);
1123 mutex_lock(&opts
->lock
);
1129 ret
= kstrtou32(page
, 0, &num
);
1133 opts
->bulk_buflen
= num
;
1136 mutex_unlock(&opts
->lock
);
1140 CONFIGFS_ATTR(f_ss_opts_
, bulk_buflen
);
1142 static ssize_t
f_ss_opts_bulk_qlen_show(struct config_item
*item
, char *page
)
1144 struct f_ss_opts
*opts
= to_f_ss_opts(item
);
1147 mutex_lock(&opts
->lock
);
1148 result
= sprintf(page
, "%u\n", opts
->bulk_qlen
);
1149 mutex_unlock(&opts
->lock
);
1154 static ssize_t
f_ss_opts_bulk_qlen_store(struct config_item
*item
,
1155 const char *page
, size_t len
)
1157 struct f_ss_opts
*opts
= to_f_ss_opts(item
);
1161 mutex_lock(&opts
->lock
);
1167 ret
= kstrtou32(page
, 0, &num
);
1171 opts
->bulk_qlen
= num
;
1174 mutex_unlock(&opts
->lock
);
1178 CONFIGFS_ATTR(f_ss_opts_
, bulk_qlen
);
1180 static ssize_t
f_ss_opts_iso_qlen_show(struct config_item
*item
, char *page
)
1182 struct f_ss_opts
*opts
= to_f_ss_opts(item
);
1185 mutex_lock(&opts
->lock
);
1186 result
= sprintf(page
, "%u\n", opts
->iso_qlen
);
1187 mutex_unlock(&opts
->lock
);
1192 static ssize_t
f_ss_opts_iso_qlen_store(struct config_item
*item
,
1193 const char *page
, size_t len
)
1195 struct f_ss_opts
*opts
= to_f_ss_opts(item
);
1199 mutex_lock(&opts
->lock
);
1205 ret
= kstrtou32(page
, 0, &num
);
1209 opts
->iso_qlen
= num
;
1212 mutex_unlock(&opts
->lock
);
1216 CONFIGFS_ATTR(f_ss_opts_
, iso_qlen
);
1218 static struct configfs_attribute
*ss_attrs
[] = {
1219 &f_ss_opts_attr_pattern
,
1220 &f_ss_opts_attr_isoc_interval
,
1221 &f_ss_opts_attr_isoc_maxpacket
,
1222 &f_ss_opts_attr_isoc_mult
,
1223 &f_ss_opts_attr_isoc_maxburst
,
1224 &f_ss_opts_attr_bulk_buflen
,
1225 &f_ss_opts_attr_bulk_qlen
,
1226 &f_ss_opts_attr_iso_qlen
,
1230 static const struct config_item_type ss_func_type
= {
1231 .ct_item_ops
= &ss_item_ops
,
1232 .ct_attrs
= ss_attrs
,
1233 .ct_owner
= THIS_MODULE
,
1236 static void source_sink_free_instance(struct usb_function_instance
*fi
)
1238 struct f_ss_opts
*ss_opts
;
1240 ss_opts
= container_of(fi
, struct f_ss_opts
, func_inst
);
1244 static struct usb_function_instance
*source_sink_alloc_inst(void)
1246 struct f_ss_opts
*ss_opts
;
1248 ss_opts
= kzalloc(sizeof(*ss_opts
), GFP_KERNEL
);
1250 return ERR_PTR(-ENOMEM
);
1251 mutex_init(&ss_opts
->lock
);
1252 ss_opts
->func_inst
.free_func_inst
= source_sink_free_instance
;
1253 ss_opts
->isoc_interval
= GZERO_ISOC_INTERVAL
;
1254 ss_opts
->isoc_maxpacket
= GZERO_ISOC_MAXPACKET
;
1255 ss_opts
->bulk_buflen
= GZERO_BULK_BUFLEN
;
1256 ss_opts
->bulk_qlen
= GZERO_SS_BULK_QLEN
;
1257 ss_opts
->iso_qlen
= GZERO_SS_ISO_QLEN
;
1259 config_group_init_type_name(&ss_opts
->func_inst
.group
, "",
1262 return &ss_opts
->func_inst
;
1264 DECLARE_USB_FUNCTION(SourceSink
, source_sink_alloc_inst
,
1265 source_sink_alloc_func
);
1267 static int __init
sslb_modinit(void)
1271 ret
= usb_function_register(&SourceSinkusb_func
);
1276 usb_function_unregister(&SourceSinkusb_func
);
1279 static void __exit
sslb_modexit(void)
1281 usb_function_unregister(&SourceSinkusb_func
);
1284 module_init(sslb_modinit
);
1285 module_exit(sslb_modexit
);
1287 MODULE_LICENSE("GPL");