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 (gadget_is_superspeed(c->cdev->gadget) ? "super" : in loopback_bind()
216 (gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full")), in loopback_bind()
217 f->name, loop->in_ep->name, loop->out_ep->name); in loopback_bind()
225 opts = container_of(f->fi, struct f_lb_opts, func_inst); in lb_free_func()
227 mutex_lock(&opts->lock); in lb_free_func()
228 opts->refcnt--; in lb_free_func()
229 mutex_unlock(&opts->lock); in lb_free_func()
237 struct f_loopback *loop = ep->driver_data; in loopback_complete()
238 struct usb_composite_dev *cdev = loop->function.config->cdev; in loopback_complete()
239 int status = req->status; in loopback_complete()
243 if (ep == loop->out_ep) { in loopback_complete()
248 struct usb_request *in_req = req->context; in loopback_complete()
250 in_req->zero = (req->actual < req->length); in loopback_complete()
251 in_req->length = req->actual; in loopback_complete()
252 ep = loop->in_ep; in loopback_complete()
259 req = req->context; in loopback_complete()
260 ep = loop->out_ep; in loopback_complete()
269 ep->name, status); in loopback_complete()
275 ERROR(cdev, "%s loop complete --> %d, %d/%d\n", ep->name, in loopback_complete()
276 status, req->actual, req->length); in loopback_complete()
284 case -ECONNABORTED: /* hardware forced ep reset */ in loopback_complete()
285 case -ECONNRESET: /* request dequeued */ in loopback_complete()
286 case -ESHUTDOWN: /* disconnect from host */ in loopback_complete()
288 usb_ep_free_request(ep == loop->in_ep ? in loopback_complete()
289 loop->out_ep : loop->in_ep, in loopback_complete()
290 req->context); in loopback_complete()
300 cdev = loop->function.config->cdev; in disable_loopback()
301 disable_endpoints(cdev, loop->in_ep, loop->out_ep, NULL, NULL); in disable_loopback()
302 VDBG(cdev, "%s disabled\n", loop->function.name); in disable_loopback()
323 for (i = 0; i < loop->qlen && result == 0; i++) { in alloc_requests()
324 result = -ENOMEM; in alloc_requests()
326 in_req = usb_ep_alloc_request(loop->in_ep, GFP_ATOMIC); in alloc_requests()
330 out_req = lb_alloc_ep_req(loop->out_ep, loop->buflen); in alloc_requests()
334 in_req->complete = loopback_complete; in alloc_requests()
335 out_req->complete = loopback_complete; in alloc_requests()
337 in_req->buf = out_req->buf; in alloc_requests()
339 in_req->context = out_req; in alloc_requests()
340 out_req->context = in_req; in alloc_requests()
342 result = usb_ep_queue(loop->out_ep, out_req, GFP_ATOMIC); in alloc_requests()
344 ERROR(cdev, "%s queue req --> %d\n", in alloc_requests()
345 loop->out_ep->name, result); in alloc_requests()
353 free_ep_req(loop->out_ep, out_req); in alloc_requests()
355 usb_ep_free_request(loop->in_ep, in_req); in alloc_requests()
365 result = config_ep_by_speed(cdev->gadget, &(loop->function), ep); in enable_endpoint()
372 ep->driver_data = loop; in enable_endpoint()
384 result = enable_endpoint(cdev, loop, loop->in_ep); in enable_loopback()
388 result = enable_endpoint(cdev, loop, loop->out_ep); in enable_loopback()
396 DBG(cdev, "%s enabled\n", loop->function.name); in enable_loopback()
400 usb_ep_disable(loop->out_ep); in enable_loopback()
402 usb_ep_disable(loop->in_ep); in enable_loopback()
411 struct usb_composite_dev *cdev = f->config->cdev; in loopback_set_alt()
432 return ERR_PTR(-ENOMEM); in loopback_alloc()
436 mutex_lock(&lb_opts->lock); in loopback_alloc()
437 lb_opts->refcnt++; in loopback_alloc()
438 mutex_unlock(&lb_opts->lock); in loopback_alloc()
440 loop->buflen = lb_opts->bulk_buflen; in loopback_alloc()
441 loop->qlen = lb_opts->qlen; in loopback_alloc()
442 if (!loop->qlen) in loopback_alloc()
443 loop->qlen = 32; in loopback_alloc()
445 loop->function.name = "loopback"; in loopback_alloc()
446 loop->function.bind = loopback_bind; in loopback_alloc()
447 loop->function.set_alt = loopback_set_alt; in loopback_alloc()
448 loop->function.disable = loopback_disable; in loopback_alloc()
449 loop->function.strings = loopback_strings; in loopback_alloc()
451 loop->function.free_func = lb_free_func; in loopback_alloc()
453 return &loop->function; in loopback_alloc()
466 usb_put_function_instance(&lb_opts->func_inst); in lb_attr_release()
478 mutex_lock(&opts->lock); in f_lb_opts_qlen_show()
479 result = sprintf(page, "%d\n", opts->qlen); in f_lb_opts_qlen_show()
480 mutex_unlock(&opts->lock); in f_lb_opts_qlen_show()
490 u32 num; in f_lb_opts_qlen_store() local
492 mutex_lock(&opts->lock); in f_lb_opts_qlen_store()
493 if (opts->refcnt) { in f_lb_opts_qlen_store()
494 ret = -EBUSY; in f_lb_opts_qlen_store()
498 ret = kstrtou32(page, 0, &num); in f_lb_opts_qlen_store()
502 opts->qlen = num; in f_lb_opts_qlen_store()
505 mutex_unlock(&opts->lock); in f_lb_opts_qlen_store()
516 mutex_lock(&opts->lock); in f_lb_opts_bulk_buflen_show()
517 result = sprintf(page, "%d\n", opts->bulk_buflen); in f_lb_opts_bulk_buflen_show()
518 mutex_unlock(&opts->lock); in f_lb_opts_bulk_buflen_show()
528 u32 num; in f_lb_opts_bulk_buflen_store() local
530 mutex_lock(&opts->lock); in f_lb_opts_bulk_buflen_store()
531 if (opts->refcnt) { in f_lb_opts_bulk_buflen_store()
532 ret = -EBUSY; in f_lb_opts_bulk_buflen_store()
536 ret = kstrtou32(page, 0, &num); in f_lb_opts_bulk_buflen_store()
540 opts->bulk_buflen = num; in f_lb_opts_bulk_buflen_store()
543 mutex_unlock(&opts->lock); in f_lb_opts_bulk_buflen_store()
575 return ERR_PTR(-ENOMEM); in loopback_alloc_instance()
576 mutex_init(&lb_opts->lock); in loopback_alloc_instance()
577 lb_opts->func_inst.free_func_inst = lb_free_instance; in loopback_alloc_instance()
578 lb_opts->bulk_buflen = GZERO_BULK_BUFLEN; in loopback_alloc_instance()
579 lb_opts->qlen = GZERO_QLEN; in loopback_alloc_instance()
581 config_group_init_type_name(&lb_opts->func_inst.group, "", in loopback_alloc_instance()
584 return &lb_opts->func_inst; in loopback_alloc_instance()