Lines Matching +full:0 +full:- +full:1023

1 // SPDX-License-Identifier: GPL-2.0+
3 * f_sourcesink.c - USB peripheral source/sink configuration driver
5 * Copyright (C) 2003-2008 David Brownell
30 * plus two that support control-OUT tests. If the optional "autoresume"
32 * test harness from USB-IF.
58 /*-------------------------------------------------------------------------*/
64 .bAlternateSetting = 0,
104 .wMaxPacketSize = cpu_to_le16(1023),
114 .wMaxPacketSize = cpu_to_le16(1023),
194 .bMaxBurst = 0,
195 .bmAttributes = 0,
196 .wBytesPerInterval = 0,
211 .bMaxBurst = 0,
212 .bmAttributes = 0,
213 .wBytesPerInterval = 0,
229 .bMaxBurst = 0,
230 .bmAttributes = 0,
247 .bMaxBurst = 0,
248 .bmAttributes = 0,
271 /* function-specific strings: */
274 [0].s = "source and sink data",
279 .language = 0x0409, /* en-us */
288 /*-------------------------------------------------------------------------*/
300 if (value < 0) in disable_ep()
301 DBG(cdev, "disable %s --> %d\n", ep->name, value); in disable_ep()
319 struct usb_composite_dev *cdev = c->cdev; in sourcesink_bind()
326 if (id < 0) in sourcesink_bind()
332 ss->in_ep = usb_ep_autoconfig(cdev->gadget, &fs_source_desc); in sourcesink_bind()
333 if (!ss->in_ep) { in sourcesink_bind()
336 f->name, cdev->gadget->name); in sourcesink_bind()
337 return -ENODEV; in sourcesink_bind()
340 ss->out_ep = usb_ep_autoconfig(cdev->gadget, &fs_sink_desc); in sourcesink_bind()
341 if (!ss->out_ep) in sourcesink_bind()
345 if (ss->isoc_interval < 1) in sourcesink_bind()
346 ss->isoc_interval = 1; in sourcesink_bind()
347 if (ss->isoc_interval > 16) in sourcesink_bind()
348 ss->isoc_interval = 16; in sourcesink_bind()
349 if (ss->isoc_mult > 2) in sourcesink_bind()
350 ss->isoc_mult = 2; in sourcesink_bind()
351 if (ss->isoc_maxburst > 15) in sourcesink_bind()
352 ss->isoc_maxburst = 15; in sourcesink_bind()
355 fs_iso_source_desc.wMaxPacketSize = ss->isoc_maxpacket > 1023 ? in sourcesink_bind()
356 1023 : ss->isoc_maxpacket; in sourcesink_bind()
357 fs_iso_source_desc.bInterval = ss->isoc_interval; in sourcesink_bind()
358 fs_iso_sink_desc.wMaxPacketSize = ss->isoc_maxpacket > 1023 ? in sourcesink_bind()
359 1023 : ss->isoc_maxpacket; in sourcesink_bind()
360 fs_iso_sink_desc.bInterval = ss->isoc_interval; in sourcesink_bind()
363 ss->iso_in_ep = usb_ep_autoconfig(cdev->gadget, &fs_iso_source_desc); in sourcesink_bind()
364 if (!ss->iso_in_ep) in sourcesink_bind()
367 ss->iso_out_ep = usb_ep_autoconfig(cdev->gadget, &fs_iso_sink_desc); in sourcesink_bind()
368 if (!ss->iso_out_ep) { in sourcesink_bind()
369 usb_ep_autoconfig_release(ss->iso_in_ep); in sourcesink_bind()
370 ss->iso_in_ep = NULL; in sourcesink_bind()
382 if (ss->isoc_maxpacket > 1024) in sourcesink_bind()
383 ss->isoc_maxpacket = 1024; in sourcesink_bind()
394 hs_iso_source_desc.wMaxPacketSize = ss->isoc_maxpacket; in sourcesink_bind()
395 hs_iso_source_desc.wMaxPacketSize |= ss->isoc_mult << 11; in sourcesink_bind()
396 hs_iso_source_desc.bInterval = ss->isoc_interval; in sourcesink_bind()
400 hs_iso_sink_desc.wMaxPacketSize = ss->isoc_maxpacket; in sourcesink_bind()
401 hs_iso_sink_desc.wMaxPacketSize |= ss->isoc_mult << 11; in sourcesink_bind()
402 hs_iso_sink_desc.bInterval = ss->isoc_interval; in sourcesink_bind()
416 ss_iso_source_desc.wMaxPacketSize = ss->isoc_maxpacket; in sourcesink_bind()
417 ss_iso_source_desc.bInterval = ss->isoc_interval; in sourcesink_bind()
418 ss_iso_source_comp_desc.bmAttributes = ss->isoc_mult; in sourcesink_bind()
419 ss_iso_source_comp_desc.bMaxBurst = ss->isoc_maxburst; in sourcesink_bind()
420 ss_iso_source_comp_desc.wBytesPerInterval = ss->isoc_maxpacket * in sourcesink_bind()
421 (ss->isoc_mult + 1) * (ss->isoc_maxburst + 1); in sourcesink_bind()
425 ss_iso_sink_desc.wMaxPacketSize = ss->isoc_maxpacket; in sourcesink_bind()
426 ss_iso_sink_desc.bInterval = ss->isoc_interval; in sourcesink_bind()
427 ss_iso_sink_comp_desc.bmAttributes = ss->isoc_mult; in sourcesink_bind()
428 ss_iso_sink_comp_desc.bMaxBurst = ss->isoc_maxburst; in sourcesink_bind()
429 ss_iso_sink_comp_desc.wBytesPerInterval = ss->isoc_maxpacket * in sourcesink_bind()
430 (ss->isoc_mult + 1) * (ss->isoc_maxburst + 1); in sourcesink_bind()
439 DBG(cdev, "%s: IN/%s, OUT/%s, ISO-IN/%s, ISO-OUT/%s\n", in sourcesink_bind()
440 f->name, ss->in_ep->name, ss->out_ep->name, in sourcesink_bind()
441 ss->iso_in_ep ? ss->iso_in_ep->name : "<none>", in sourcesink_bind()
442 ss->iso_out_ep ? ss->iso_out_ep->name : "<none>"); in sourcesink_bind()
443 return 0; in sourcesink_bind()
451 opts = container_of(f->fi, struct f_ss_opts, func_inst); in sourcesink_free_func()
453 mutex_lock(&opts->lock); in sourcesink_free_func()
454 opts->refcnt--; in sourcesink_free_func()
455 mutex_unlock(&opts->lock); in sourcesink_free_func()
465 u8 *buf = req->buf; in check_read_data()
466 struct usb_composite_dev *cdev = ss->function.config->cdev; in check_read_data()
467 int max_packet_size = le16_to_cpu(ss->out_ep->desc->wMaxPacketSize); in check_read_data()
469 if (ss->pattern == 2) in check_read_data()
470 return 0; in check_read_data()
472 for (i = 0; i < req->actual; i++, buf++) { in check_read_data()
473 switch (ss->pattern) { in check_read_data()
475 /* all-zeroes has no synchronization issues */ in check_read_data()
476 case 0: in check_read_data()
477 if (*buf == 0) in check_read_data()
481 /* "mod63" stays in sync with short-terminated transfers, in check_read_data()
494 usb_ep_set_halt(ss->out_ep); in check_read_data()
495 return -EINVAL; in check_read_data()
497 return 0; in check_read_data()
503 u8 *buf = req->buf; in reinit_write_data()
504 int max_packet_size = le16_to_cpu(ep->desc->wMaxPacketSize); in reinit_write_data()
505 struct f_sourcesink *ss = ep->driver_data; in reinit_write_data()
507 switch (ss->pattern) { in reinit_write_data()
508 case 0: in reinit_write_data()
509 memset(req->buf, 0, req->length); in reinit_write_data()
512 for (i = 0; i < req->length; i++) in reinit_write_data()
523 struct f_sourcesink *ss = ep->driver_data; in source_sink_complete()
524 int status = req->status; in source_sink_complete()
530 cdev = ss->function.config->cdev; in source_sink_complete()
534 case 0: /* normal completion? */ in source_sink_complete()
535 if (ep == ss->out_ep) { in source_sink_complete()
537 if (ss->pattern != 2) in source_sink_complete()
538 memset(req->buf, 0x55, req->length); in source_sink_complete()
543 case -ECONNABORTED: /* hardware forced ep reset */ in source_sink_complete()
544 case -ECONNRESET: /* request dequeued */ in source_sink_complete()
545 case -ESHUTDOWN: /* disconnect from host */ in source_sink_complete()
546 VDBG(cdev, "%s gone (%d), %d/%d\n", ep->name, status, in source_sink_complete()
547 req->actual, req->length); in source_sink_complete()
548 if (ep == ss->out_ep) in source_sink_complete()
553 case -EOVERFLOW: /* buffer overrun on read means that in source_sink_complete()
559 DBG(cdev, "%s complete --> %d, %d/%d\n", ep->name, in source_sink_complete()
560 status, req->actual, req->length); in source_sink_complete()
563 case -EREMOTEIO: /* short read */ in source_sink_complete()
569 ERROR(cdev, "kill %s: resubmit %d bytes --> %d\n", in source_sink_complete()
570 ep->name, req->length, status); in source_sink_complete()
581 int i, size, qlen, status = 0; in source_sink_start_ep()
587 size = ss->isoc_maxpacket * in source_sink_start_ep()
588 (ss->isoc_mult + 1) * in source_sink_start_ep()
589 (ss->isoc_maxburst + 1); in source_sink_start_ep()
592 size = ss->isoc_maxpacket * (ss->isoc_mult + 1); in source_sink_start_ep()
595 size = ss->isoc_maxpacket > 1023 ? in source_sink_start_ep()
596 1023 : ss->isoc_maxpacket; in source_sink_start_ep()
599 ep = is_in ? ss->iso_in_ep : ss->iso_out_ep; in source_sink_start_ep()
600 qlen = ss->iso_qlen; in source_sink_start_ep()
602 ep = is_in ? ss->in_ep : ss->out_ep; in source_sink_start_ep()
603 qlen = ss->bulk_qlen; in source_sink_start_ep()
604 size = ss->buflen; in source_sink_start_ep()
607 for (i = 0; i < qlen; i++) { in source_sink_start_ep()
610 return -ENOMEM; in source_sink_start_ep()
612 req->complete = source_sink_complete; in source_sink_start_ep()
615 else if (ss->pattern != 2) in source_sink_start_ep()
616 memset(req->buf, 0x55, req->length); in source_sink_start_ep()
622 cdev = ss->function.config->cdev; in source_sink_start_ep()
623 ERROR(cdev, "start %s%s %s --> %d\n", in source_sink_start_ep()
624 is_iso ? "ISO-" : "", is_in ? "IN" : "OUT", in source_sink_start_ep()
625 ep->name, status); in source_sink_start_ep()
638 cdev = ss->function.config->cdev; in disable_source_sink()
639 disable_endpoints(cdev, ss->in_ep, ss->out_ep, ss->iso_in_ep, in disable_source_sink()
640 ss->iso_out_ep); in disable_source_sink()
641 VDBG(cdev, "%s disabled\n", ss->function.name); in disable_source_sink()
648 int result = 0; in enable_source_sink()
649 int speed = cdev->gadget->speed; in enable_source_sink()
653 ep = ss->in_ep; in enable_source_sink()
654 result = config_ep_by_speed(cdev->gadget, &(ss->function), ep); in enable_source_sink()
658 if (result < 0) in enable_source_sink()
660 ep->driver_data = ss; in enable_source_sink()
663 if (result < 0) { in enable_source_sink()
665 ep = ss->in_ep; in enable_source_sink()
671 ep = ss->out_ep; in enable_source_sink()
672 result = config_ep_by_speed(cdev->gadget, &(ss->function), ep); in enable_source_sink()
676 if (result < 0) in enable_source_sink()
678 ep->driver_data = ss; in enable_source_sink()
681 if (result < 0) { in enable_source_sink()
683 ep = ss->out_ep; in enable_source_sink()
688 if (alt == 0) in enable_source_sink()
692 ep = ss->iso_in_ep; in enable_source_sink()
694 result = config_ep_by_speed(cdev->gadget, &(ss->function), ep); in enable_source_sink()
698 if (result < 0) in enable_source_sink()
700 ep->driver_data = ss; in enable_source_sink()
703 if (result < 0) { in enable_source_sink()
705 ep = ss->iso_in_ep; in enable_source_sink()
713 ep = ss->iso_out_ep; in enable_source_sink()
715 result = config_ep_by_speed(cdev->gadget, &(ss->function), ep); in enable_source_sink()
719 if (result < 0) in enable_source_sink()
721 ep->driver_data = ss; in enable_source_sink()
724 if (result < 0) { in enable_source_sink()
730 ss->cur_alt = alt; in enable_source_sink()
732 DBG(cdev, "%s enabled, alt intf %d\n", ss->function.name, alt); in enable_source_sink()
740 struct usb_composite_dev *cdev = f->config->cdev; in sourcesink_set_alt()
750 return ss->cur_alt; in sourcesink_get_alt()
760 /*-------------------------------------------------------------------------*/
765 struct usb_configuration *c = f->config; in sourcesink_setup()
766 struct usb_request *req = c->cdev->req; in sourcesink_setup()
767 int value = -EOPNOTSUPP; in sourcesink_setup()
768 u16 w_index = le16_to_cpu(ctrl->wIndex); in sourcesink_setup()
769 u16 w_value = le16_to_cpu(ctrl->wValue); in sourcesink_setup()
770 u16 w_length = le16_to_cpu(ctrl->wLength); in sourcesink_setup()
772 req->length = USB_COMP_EP0_BUFSIZ; in sourcesink_setup()
777 switch (ctrl->bRequest) { in sourcesink_setup()
780 * These are the same vendor-specific requests supported by in sourcesink_setup()
782 * device spec by allowing multiple-packet requests. in sourcesink_setup()
784 * NOTE: the Control-OUT data stays in req->buf ... better in sourcesink_setup()
788 case 0x5b: /* control WRITE test -- fill the buffer */ in sourcesink_setup()
789 if (ctrl->bRequestType != (USB_DIR_OUT|USB_TYPE_VENDOR)) in sourcesink_setup()
794 if (w_length > req->length) in sourcesink_setup()
798 case 0x5c: /* control READ test -- return the buffer */ in sourcesink_setup()
799 if (ctrl->bRequestType != (USB_DIR_IN|USB_TYPE_VENDOR)) in sourcesink_setup()
804 if (w_length > req->length) in sourcesink_setup()
811 VDBG(c->cdev, in sourcesink_setup()
813 ctrl->bRequestType, ctrl->bRequest, in sourcesink_setup()
818 if (value >= 0) { in sourcesink_setup()
819 VDBG(c->cdev, "source/sink req%02x.%02x v%04x i%04x l%d\n", in sourcesink_setup()
820 ctrl->bRequestType, ctrl->bRequest, in sourcesink_setup()
822 req->zero = 0; in sourcesink_setup()
823 req->length = value; in sourcesink_setup()
824 value = usb_ep_queue(c->cdev->gadget->ep0, req, GFP_ATOMIC); in sourcesink_setup()
825 if (value < 0) in sourcesink_setup()
826 ERROR(c->cdev, "source/sink response, err %d\n", in sourcesink_setup()
830 /* device either stalls (value < 0) or reports success */ in sourcesink_setup()
842 return ERR_PTR(-ENOMEM); in source_sink_alloc_func()
846 mutex_lock(&ss_opts->lock); in source_sink_alloc_func()
847 ss_opts->refcnt++; in source_sink_alloc_func()
848 mutex_unlock(&ss_opts->lock); in source_sink_alloc_func()
850 ss->pattern = ss_opts->pattern; in source_sink_alloc_func()
851 ss->isoc_interval = ss_opts->isoc_interval; in source_sink_alloc_func()
852 ss->isoc_maxpacket = ss_opts->isoc_maxpacket; in source_sink_alloc_func()
853 ss->isoc_mult = ss_opts->isoc_mult; in source_sink_alloc_func()
854 ss->isoc_maxburst = ss_opts->isoc_maxburst; in source_sink_alloc_func()
855 ss->buflen = ss_opts->bulk_buflen; in source_sink_alloc_func()
856 ss->bulk_qlen = ss_opts->bulk_qlen; in source_sink_alloc_func()
857 ss->iso_qlen = ss_opts->iso_qlen; in source_sink_alloc_func()
859 ss->function.name = "source/sink"; in source_sink_alloc_func()
860 ss->function.bind = sourcesink_bind; in source_sink_alloc_func()
861 ss->function.set_alt = sourcesink_set_alt; in source_sink_alloc_func()
862 ss->function.get_alt = sourcesink_get_alt; in source_sink_alloc_func()
863 ss->function.disable = sourcesink_disable; in source_sink_alloc_func()
864 ss->function.setup = sourcesink_setup; in source_sink_alloc_func()
865 ss->function.strings = sourcesink_strings; in source_sink_alloc_func()
867 ss->function.free_func = sourcesink_free_func; in source_sink_alloc_func()
869 return &ss->function; in source_sink_alloc_func()
882 usb_put_function_instance(&ss_opts->func_inst); in ss_attr_release()
894 mutex_lock(&opts->lock); in f_ss_opts_pattern_show()
895 result = sprintf(page, "%u\n", opts->pattern); in f_ss_opts_pattern_show()
896 mutex_unlock(&opts->lock); in f_ss_opts_pattern_show()
908 mutex_lock(&opts->lock); in f_ss_opts_pattern_store()
909 if (opts->refcnt) { in f_ss_opts_pattern_store()
910 ret = -EBUSY; in f_ss_opts_pattern_store()
914 ret = kstrtou8(page, 0, &num); in f_ss_opts_pattern_store()
918 if (num != 0 && num != 1 && num != 2) { in f_ss_opts_pattern_store()
919 ret = -EINVAL; in f_ss_opts_pattern_store()
923 opts->pattern = num; in f_ss_opts_pattern_store()
926 mutex_unlock(&opts->lock); in f_ss_opts_pattern_store()
937 mutex_lock(&opts->lock); in f_ss_opts_isoc_interval_show()
938 result = sprintf(page, "%u\n", opts->isoc_interval); in f_ss_opts_isoc_interval_show()
939 mutex_unlock(&opts->lock); in f_ss_opts_isoc_interval_show()
951 mutex_lock(&opts->lock); in f_ss_opts_isoc_interval_store()
952 if (opts->refcnt) { in f_ss_opts_isoc_interval_store()
953 ret = -EBUSY; in f_ss_opts_isoc_interval_store()
957 ret = kstrtou8(page, 0, &num); in f_ss_opts_isoc_interval_store()
962 ret = -EINVAL; in f_ss_opts_isoc_interval_store()
966 opts->isoc_interval = num; in f_ss_opts_isoc_interval_store()
969 mutex_unlock(&opts->lock); in f_ss_opts_isoc_interval_store()
980 mutex_lock(&opts->lock); in f_ss_opts_isoc_maxpacket_show()
981 result = sprintf(page, "%u\n", opts->isoc_maxpacket); in f_ss_opts_isoc_maxpacket_show()
982 mutex_unlock(&opts->lock); in f_ss_opts_isoc_maxpacket_show()
994 mutex_lock(&opts->lock); in f_ss_opts_isoc_maxpacket_store()
995 if (opts->refcnt) { in f_ss_opts_isoc_maxpacket_store()
996 ret = -EBUSY; in f_ss_opts_isoc_maxpacket_store()
1000 ret = kstrtou16(page, 0, &num); in f_ss_opts_isoc_maxpacket_store()
1005 ret = -EINVAL; in f_ss_opts_isoc_maxpacket_store()
1009 opts->isoc_maxpacket = num; in f_ss_opts_isoc_maxpacket_store()
1012 mutex_unlock(&opts->lock); in f_ss_opts_isoc_maxpacket_store()
1023 mutex_lock(&opts->lock); in f_ss_opts_isoc_mult_show()
1024 result = sprintf(page, "%u\n", opts->isoc_mult); in f_ss_opts_isoc_mult_show()
1025 mutex_unlock(&opts->lock); in f_ss_opts_isoc_mult_show()
1037 mutex_lock(&opts->lock); in f_ss_opts_isoc_mult_store()
1038 if (opts->refcnt) { in f_ss_opts_isoc_mult_store()
1039 ret = -EBUSY; in f_ss_opts_isoc_mult_store()
1043 ret = kstrtou8(page, 0, &num); in f_ss_opts_isoc_mult_store()
1048 ret = -EINVAL; in f_ss_opts_isoc_mult_store()
1052 opts->isoc_mult = num; in f_ss_opts_isoc_mult_store()
1055 mutex_unlock(&opts->lock); in f_ss_opts_isoc_mult_store()
1066 mutex_lock(&opts->lock); in f_ss_opts_isoc_maxburst_show()
1067 result = sprintf(page, "%u\n", opts->isoc_maxburst); in f_ss_opts_isoc_maxburst_show()
1068 mutex_unlock(&opts->lock); in f_ss_opts_isoc_maxburst_show()
1080 mutex_lock(&opts->lock); in f_ss_opts_isoc_maxburst_store()
1081 if (opts->refcnt) { in f_ss_opts_isoc_maxburst_store()
1082 ret = -EBUSY; in f_ss_opts_isoc_maxburst_store()
1086 ret = kstrtou8(page, 0, &num); in f_ss_opts_isoc_maxburst_store()
1091 ret = -EINVAL; in f_ss_opts_isoc_maxburst_store()
1095 opts->isoc_maxburst = num; in f_ss_opts_isoc_maxburst_store()
1098 mutex_unlock(&opts->lock); in f_ss_opts_isoc_maxburst_store()
1109 mutex_lock(&opts->lock); in f_ss_opts_bulk_buflen_show()
1110 result = sprintf(page, "%u\n", opts->bulk_buflen); in f_ss_opts_bulk_buflen_show()
1111 mutex_unlock(&opts->lock); in f_ss_opts_bulk_buflen_show()
1123 mutex_lock(&opts->lock); in f_ss_opts_bulk_buflen_store()
1124 if (opts->refcnt) { in f_ss_opts_bulk_buflen_store()
1125 ret = -EBUSY; in f_ss_opts_bulk_buflen_store()
1129 ret = kstrtou32(page, 0, &num); in f_ss_opts_bulk_buflen_store()
1133 opts->bulk_buflen = num; in f_ss_opts_bulk_buflen_store()
1136 mutex_unlock(&opts->lock); in f_ss_opts_bulk_buflen_store()
1147 mutex_lock(&opts->lock); in f_ss_opts_bulk_qlen_show()
1148 result = sprintf(page, "%u\n", opts->bulk_qlen); in f_ss_opts_bulk_qlen_show()
1149 mutex_unlock(&opts->lock); in f_ss_opts_bulk_qlen_show()
1161 mutex_lock(&opts->lock); in f_ss_opts_bulk_qlen_store()
1162 if (opts->refcnt) { in f_ss_opts_bulk_qlen_store()
1163 ret = -EBUSY; in f_ss_opts_bulk_qlen_store()
1167 ret = kstrtou32(page, 0, &num); in f_ss_opts_bulk_qlen_store()
1171 opts->bulk_qlen = num; in f_ss_opts_bulk_qlen_store()
1174 mutex_unlock(&opts->lock); in f_ss_opts_bulk_qlen_store()
1185 mutex_lock(&opts->lock); in f_ss_opts_iso_qlen_show()
1186 result = sprintf(page, "%u\n", opts->iso_qlen); in f_ss_opts_iso_qlen_show()
1187 mutex_unlock(&opts->lock); in f_ss_opts_iso_qlen_show()
1199 mutex_lock(&opts->lock); in f_ss_opts_iso_qlen_store()
1200 if (opts->refcnt) { in f_ss_opts_iso_qlen_store()
1201 ret = -EBUSY; in f_ss_opts_iso_qlen_store()
1205 ret = kstrtou32(page, 0, &num); in f_ss_opts_iso_qlen_store()
1209 opts->iso_qlen = num; in f_ss_opts_iso_qlen_store()
1212 mutex_unlock(&opts->lock); in f_ss_opts_iso_qlen_store()
1250 return ERR_PTR(-ENOMEM); in source_sink_alloc_inst()
1251 mutex_init(&ss_opts->lock); in source_sink_alloc_inst()
1252 ss_opts->func_inst.free_func_inst = source_sink_free_instance; in source_sink_alloc_inst()
1253 ss_opts->isoc_interval = GZERO_ISOC_INTERVAL; in source_sink_alloc_inst()
1254 ss_opts->isoc_maxpacket = GZERO_ISOC_MAXPACKET; in source_sink_alloc_inst()
1255 ss_opts->bulk_buflen = GZERO_BULK_BUFLEN; in source_sink_alloc_inst()
1256 ss_opts->bulk_qlen = GZERO_SS_BULK_QLEN; in source_sink_alloc_inst()
1257 ss_opts->iso_qlen = GZERO_SS_ISO_QLEN; in source_sink_alloc_inst()
1259 config_group_init_type_name(&ss_opts->func_inst.group, "", in source_sink_alloc_inst()
1262 return &ss_opts->func_inst; in source_sink_alloc_inst()