Lines Matching +full:num +full:- +full:strings

1 // SPDX-License-Identifier: GPL-2.0+
3 * f_loopback.c - USB peripheral loopback configuration driver
5 * Copyright (C) 2003-2008 David Brownell
43 /*-------------------------------------------------------------------------*/
147 /* function-specific strings: */
155 .language = 0x0409, /* en-us */
156 .strings = strings_loopback,
164 /*-------------------------------------------------------------------------*/
168 struct usb_composite_dev *cdev = c->cdev; in loopback_bind()
187 loop->in_ep = usb_ep_autoconfig(cdev->gadget, &fs_loop_source_desc); in loopback_bind()
188 if (!loop->in_ep) { in loopback_bind()
191 f->name, cdev->gadget->name); in loopback_bind()
192 return -ENODEV; in loopback_bind()
195 loop->out_ep = usb_ep_autoconfig(cdev->gadget, &fs_loop_sink_desc); in loopback_bind()
196 if (!loop->out_ep) in loopback_bind()
215 f->name, loop->in_ep->name, loop->out_ep->name); in loopback_bind()
223 opts = container_of(f->fi, struct f_lb_opts, func_inst); in lb_free_func()
225 mutex_lock(&opts->lock); in lb_free_func()
226 opts->refcnt--; in lb_free_func()
227 mutex_unlock(&opts->lock); in lb_free_func()
235 struct f_loopback *loop = ep->driver_data; in loopback_complete()
236 struct usb_composite_dev *cdev = loop->function.config->cdev; in loopback_complete()
237 int status = req->status; in loopback_complete()
241 if (ep == loop->out_ep) { in loopback_complete()
246 struct usb_request *in_req = req->context; in loopback_complete()
248 in_req->zero = (req->actual < req->length); in loopback_complete()
249 in_req->length = req->actual; in loopback_complete()
250 ep = loop->in_ep; in loopback_complete()
257 req = req->context; in loopback_complete()
258 ep = loop->out_ep; in loopback_complete()
267 ep->name, status); in loopback_complete()
273 ERROR(cdev, "%s loop complete --> %d, %d/%d\n", ep->name, in loopback_complete()
274 status, req->actual, req->length); in loopback_complete()
282 case -ECONNABORTED: /* hardware forced ep reset */ in loopback_complete()
283 case -ECONNRESET: /* request dequeued */ in loopback_complete()
284 case -ESHUTDOWN: /* disconnect from host */ in loopback_complete()
286 usb_ep_free_request(ep == loop->in_ep ? in loopback_complete()
287 loop->out_ep : loop->in_ep, in loopback_complete()
288 req->context); in loopback_complete()
298 cdev = loop->function.config->cdev; in disable_loopback()
299 disable_endpoints(cdev, loop->in_ep, loop->out_ep, NULL, NULL); in disable_loopback()
300 VDBG(cdev, "%s disabled\n", loop->function.name); in disable_loopback()
321 for (i = 0; i < loop->qlen && result == 0; i++) { in alloc_requests()
322 result = -ENOMEM; in alloc_requests()
324 in_req = usb_ep_alloc_request(loop->in_ep, GFP_ATOMIC); in alloc_requests()
328 out_req = lb_alloc_ep_req(loop->out_ep, loop->buflen); in alloc_requests()
332 in_req->complete = loopback_complete; in alloc_requests()
333 out_req->complete = loopback_complete; in alloc_requests()
335 in_req->buf = out_req->buf; in alloc_requests()
337 in_req->context = out_req; in alloc_requests()
338 out_req->context = in_req; in alloc_requests()
340 result = usb_ep_queue(loop->out_ep, out_req, GFP_ATOMIC); in alloc_requests()
342 ERROR(cdev, "%s queue req --> %d\n", in alloc_requests()
343 loop->out_ep->name, result); in alloc_requests()
351 free_ep_req(loop->out_ep, out_req); in alloc_requests()
353 usb_ep_free_request(loop->in_ep, in_req); in alloc_requests()
363 result = config_ep_by_speed(cdev->gadget, &(loop->function), ep); in enable_endpoint()
370 ep->driver_data = loop; in enable_endpoint()
382 result = enable_endpoint(cdev, loop, loop->in_ep); in enable_loopback()
386 result = enable_endpoint(cdev, loop, loop->out_ep); in enable_loopback()
394 DBG(cdev, "%s enabled\n", loop->function.name); in enable_loopback()
398 usb_ep_disable(loop->out_ep); in enable_loopback()
400 usb_ep_disable(loop->in_ep); in enable_loopback()
409 struct usb_composite_dev *cdev = f->config->cdev; in loopback_set_alt()
430 return ERR_PTR(-ENOMEM); in loopback_alloc()
434 mutex_lock(&lb_opts->lock); in loopback_alloc()
435 lb_opts->refcnt++; in loopback_alloc()
436 mutex_unlock(&lb_opts->lock); in loopback_alloc()
438 loop->buflen = lb_opts->bulk_buflen; in loopback_alloc()
439 loop->qlen = lb_opts->qlen; in loopback_alloc()
440 if (!loop->qlen) in loopback_alloc()
441 loop->qlen = 32; in loopback_alloc()
443 loop->function.name = "loopback"; in loopback_alloc()
444 loop->function.bind = loopback_bind; in loopback_alloc()
445 loop->function.set_alt = loopback_set_alt; in loopback_alloc()
446 loop->function.disable = loopback_disable; in loopback_alloc()
447 loop->function.strings = loopback_strings; in loopback_alloc()
449 loop->function.free_func = lb_free_func; in loopback_alloc()
451 return &loop->function; in loopback_alloc()
464 usb_put_function_instance(&lb_opts->func_inst); in lb_attr_release()
476 mutex_lock(&opts->lock); in f_lb_opts_qlen_show()
477 result = sprintf(page, "%d\n", opts->qlen); in f_lb_opts_qlen_show()
478 mutex_unlock(&opts->lock); in f_lb_opts_qlen_show()
488 u32 num; in f_lb_opts_qlen_store() local
490 mutex_lock(&opts->lock); in f_lb_opts_qlen_store()
491 if (opts->refcnt) { in f_lb_opts_qlen_store()
492 ret = -EBUSY; in f_lb_opts_qlen_store()
496 ret = kstrtou32(page, 0, &num); in f_lb_opts_qlen_store()
500 opts->qlen = num; in f_lb_opts_qlen_store()
503 mutex_unlock(&opts->lock); in f_lb_opts_qlen_store()
514 mutex_lock(&opts->lock); in f_lb_opts_bulk_buflen_show()
515 result = sprintf(page, "%d\n", opts->bulk_buflen); in f_lb_opts_bulk_buflen_show()
516 mutex_unlock(&opts->lock); in f_lb_opts_bulk_buflen_show()
526 u32 num; in f_lb_opts_bulk_buflen_store() local
528 mutex_lock(&opts->lock); in f_lb_opts_bulk_buflen_store()
529 if (opts->refcnt) { in f_lb_opts_bulk_buflen_store()
530 ret = -EBUSY; in f_lb_opts_bulk_buflen_store()
534 ret = kstrtou32(page, 0, &num); in f_lb_opts_bulk_buflen_store()
538 opts->bulk_buflen = num; in f_lb_opts_bulk_buflen_store()
541 mutex_unlock(&opts->lock); in f_lb_opts_bulk_buflen_store()
573 return ERR_PTR(-ENOMEM); in loopback_alloc_instance()
574 mutex_init(&lb_opts->lock); in loopback_alloc_instance()
575 lb_opts->func_inst.free_func_inst = lb_free_instance; in loopback_alloc_instance()
576 lb_opts->bulk_buflen = GZERO_BULK_BUFLEN; in loopback_alloc_instance()
577 lb_opts->qlen = GZERO_QLEN; in loopback_alloc_instance()
579 config_group_init_type_name(&lb_opts->func_inst.group, "", in loopback_alloc_instance()
582 return &lb_opts->func_inst; in loopback_alloc_instance()