Lines Matching +full:num +full:- +full:strings
1 // SPDX-License-Identifier: GPL-2.0+
3 * trans_usbg.c - USB peripheral usb9pfs configuration driver and transport.
12 /* +--------------------------+ | +--------------------------+
15 * | (this:trans_usbg) | | |(e.g. diod or nfs-ganesha)|
16 * +-------------^------------+ | +-------------^------------+
18 * ------------------|------------------------------------|-------------
20 * +-------------v------------+ | +-------------v------------+
22 * HW | USB Device Controller <---------> USB Host Controller |
24 * +--------------------------+ | +--------------------------+
94 struct usb_composite_dev *cdev = usb9pfs->function.config->cdev; in usb9pfs_queue_tx()
95 struct usb_request *req = usb9pfs->in_req; in usb9pfs_queue_tx()
98 if (!(p9_tx_req->tc.size % usb9pfs->in_ep->maxpacket)) in usb9pfs_queue_tx()
99 req->zero = 1; in usb9pfs_queue_tx()
101 req->buf = p9_tx_req->tc.sdata; in usb9pfs_queue_tx()
102 req->length = p9_tx_req->tc.size; in usb9pfs_queue_tx()
103 req->context = p9_tx_req; in usb9pfs_queue_tx()
105 dev_dbg(&cdev->gadget->dev, "%s usb9pfs send --> %d/%d, zero: %d\n", in usb9pfs_queue_tx()
106 usb9pfs->in_ep->name, req->actual, req->length, req->zero); in usb9pfs_queue_tx()
108 ret = usb_ep_queue(usb9pfs->in_ep, req, gfp_flags); in usb9pfs_queue_tx()
110 req->context = NULL; in usb9pfs_queue_tx()
112 dev_dbg(&cdev->gadget->dev, "tx submit --> %d\n", ret); in usb9pfs_queue_tx()
120 struct usb_composite_dev *cdev = usb9pfs->function.config->cdev; in usb9pfs_queue_rx()
123 ret = usb_ep_queue(usb9pfs->out_ep, req, gfp_flags); in usb9pfs_queue_rx()
125 dev_dbg(&cdev->gadget->dev, "rx submit --> %d\n", ret); in usb9pfs_queue_rx()
134 guard(spinlock_irqsave)(&usb9pfs->lock); in usb9pfs_transmit()
140 list_del(&p9_req->req_list); in usb9pfs_transmit()
149 struct f_usb9pfs *usb9pfs = ep->driver_data; in usb9pfs_tx_complete()
150 struct usb_composite_dev *cdev = usb9pfs->function.config->cdev; in usb9pfs_tx_complete()
151 struct p9_req_t *p9_tx_req = req->context; in usb9pfs_tx_complete()
155 req->zero = 0; in usb9pfs_tx_complete()
157 if (req->status) { in usb9pfs_tx_complete()
158 dev_err(&cdev->gadget->dev, "%s usb9pfs complete --> %d, %d/%d\n", in usb9pfs_tx_complete()
159 ep->name, req->status, req->actual, req->length); in usb9pfs_tx_complete()
163 dev_dbg(&cdev->gadget->dev, "%s usb9pfs complete --> %d, %d/%d\n", in usb9pfs_tx_complete()
164 ep->name, req->status, req->actual, req->length); in usb9pfs_tx_complete()
166 spin_lock_irqsave(&usb9pfs->lock, flags); in usb9pfs_tx_complete()
167 WRITE_ONCE(p9_tx_req->status, REQ_STATUS_SENT); in usb9pfs_tx_complete()
169 p9_req_put(usb9pfs->client, p9_tx_req); in usb9pfs_tx_complete()
171 req->context = NULL; in usb9pfs_tx_complete()
173 spin_unlock_irqrestore(&usb9pfs->lock, flags); in usb9pfs_tx_complete()
175 complete(&usb9pfs->send); in usb9pfs_tx_complete()
191 rc.capacity - rc.offset); in usb9pfs_rx_header()
204 p9_rx_req = p9_tag_lookup(usb9pfs->client, rc.tag); in usb9pfs_rx_header()
205 if (!p9_rx_req || p9_rx_req->status != REQ_STATUS_SENT) { in usb9pfs_rx_header()
210 if (rc.size > p9_rx_req->rc.capacity) { in usb9pfs_rx_header()
213 rc.size, rc.tag, p9_rx_req->rc.capacity); in usb9pfs_rx_header()
214 p9_req_put(usb9pfs->client, p9_rx_req); in usb9pfs_rx_header()
218 if (!p9_rx_req->rc.sdata) { in usb9pfs_rx_header()
222 p9_req_put(usb9pfs->client, p9_rx_req); in usb9pfs_rx_header()
231 struct f_usb9pfs *usb9pfs = ep->driver_data; in usb9pfs_rx_complete()
232 struct usb_composite_dev *cdev = usb9pfs->function.config->cdev; in usb9pfs_rx_complete()
235 if (req->status) { in usb9pfs_rx_complete()
236 dev_err(&cdev->gadget->dev, "%s usb9pfs complete --> %d, %d/%d\n", in usb9pfs_rx_complete()
237 ep->name, req->status, req->actual, req->length); in usb9pfs_rx_complete()
241 p9_rx_req = usb9pfs_rx_header(usb9pfs, req->buf); in usb9pfs_rx_complete()
245 memcpy(p9_rx_req->rc.sdata, req->buf, req->actual); in usb9pfs_rx_complete()
247 p9_rx_req->rc.size = req->actual; in usb9pfs_rx_complete()
249 p9_client_cb(usb9pfs->client, p9_rx_req, REQ_STATUS_RCVD); in usb9pfs_rx_complete()
250 p9_req_put(usb9pfs->client, p9_rx_req); in usb9pfs_rx_complete()
252 complete(&usb9pfs->received); in usb9pfs_rx_complete()
261 dev_info(&cdev->gadget->dev, in disable_ep()
262 "disable %s --> %d\n", ep->name, value); in disable_ep()
268 usb9pfs->function.config->cdev; in disable_usb9pfs()
270 if (usb9pfs->in_req) { in disable_usb9pfs()
271 usb_ep_free_request(usb9pfs->in_ep, usb9pfs->in_req); in disable_usb9pfs()
272 usb9pfs->in_req = NULL; in disable_usb9pfs()
275 if (usb9pfs->out_req) { in disable_usb9pfs()
276 usb_ep_free_request(usb9pfs->out_ep, usb9pfs->out_req); in disable_usb9pfs()
277 usb9pfs->out_req = NULL; in disable_usb9pfs()
280 disable_ep(cdev, usb9pfs->in_ep); in disable_usb9pfs()
281 disable_ep(cdev, usb9pfs->out_ep); in disable_usb9pfs()
282 dev_dbg(&cdev->gadget->dev, "%s disabled\n", in disable_usb9pfs()
283 usb9pfs->function.name); in disable_usb9pfs()
291 usb9pfs->in_req = usb_ep_alloc_request(usb9pfs->in_ep, GFP_ATOMIC); in alloc_requests()
292 if (!usb9pfs->in_req) { in alloc_requests()
293 ret = -ENOENT; in alloc_requests()
297 usb9pfs->out_req = alloc_ep_req(usb9pfs->out_ep, usb9pfs->buflen); in alloc_requests()
298 if (!usb9pfs->out_req) { in alloc_requests()
299 ret = -ENOENT; in alloc_requests()
303 usb9pfs->in_req->complete = usb9pfs_tx_complete; in alloc_requests()
304 usb9pfs->out_req->complete = usb9pfs_rx_complete; in alloc_requests()
307 usb9pfs->in_req->context = usb9pfs; in alloc_requests()
308 usb9pfs->out_req->context = usb9pfs; in alloc_requests()
313 usb_ep_free_request(usb9pfs->in_ep, usb9pfs->in_req); in alloc_requests()
323 ret = config_ep_by_speed(cdev->gadget, &usb9pfs->function, ep); in enable_endpoint()
331 ep->driver_data = usb9pfs; in enable_endpoint()
342 ret = enable_endpoint(cdev, usb9pfs, usb9pfs->in_ep); in enable_usb9pfs()
346 ret = enable_endpoint(cdev, usb9pfs, usb9pfs->out_ep); in enable_usb9pfs()
354 client = usb9pfs->client; in enable_usb9pfs()
356 client->status = Connected; in enable_usb9pfs()
358 dev_dbg(&cdev->gadget->dev, "%s enabled\n", usb9pfs->function.name); in enable_usb9pfs()
362 usb_ep_disable(usb9pfs->out_ep); in enable_usb9pfs()
364 usb_ep_disable(usb9pfs->in_ep); in enable_usb9pfs()
373 int ret = -ENOENT; in p9_usbg_create()
377 return -EINVAL; in p9_usbg_create()
382 if (!strncmp(devname, dev->tag, strlen(devname))) { in p9_usbg_create()
383 if (!dev->inuse) { in p9_usbg_create()
384 dev->inuse = true; in p9_usbg_create()
388 ret = -EBUSY; in p9_usbg_create()
398 usb9pfs = dev->usb9pfs; in p9_usbg_create()
400 return -EINVAL; in p9_usbg_create()
402 client->trans = (void *)usb9pfs; in p9_usbg_create()
403 if (!usb9pfs->in_req) in p9_usbg_create()
404 client->status = Disconnected; in p9_usbg_create()
406 client->status = Connected; in p9_usbg_create()
407 usb9pfs->client = client; in p9_usbg_create()
409 client->trans_mod->maxsize = usb9pfs->buflen; in p9_usbg_create()
411 complete(&usb9pfs->received); in p9_usbg_create()
420 guard(spinlock_irqsave)(&usb9pfs->lock); in usb9pfs_clear_tx()
422 req = usb9pfs->in_req->context; in usb9pfs_clear_tx()
426 if (!req->t_err) in usb9pfs_clear_tx()
427 req->t_err = -ECONNRESET; in usb9pfs_clear_tx()
429 p9_client_cb(usb9pfs->client, req, REQ_STATUS_ERROR); in usb9pfs_clear_tx()
441 usb9pfs = client->trans; in p9_usbg_close()
445 client->status = Disconnected; in p9_usbg_close()
449 opts = container_of(usb9pfs->function.fi, in p9_usbg_close()
452 dev = opts->dev; in p9_usbg_close()
455 dev->inuse = false; in p9_usbg_close()
461 struct f_usb9pfs *usb9pfs = client->trans; in p9_usbg_request()
464 if (client->status != Connected) in p9_usbg_request()
465 return -EBUSY; in p9_usbg_request()
467 ret = wait_for_completion_killable(&usb9pfs->received); in p9_usbg_request()
475 ret = wait_for_completion_killable(&usb9pfs->send); in p9_usbg_request()
479 return usb9pfs_queue_rx(usb9pfs, usb9pfs->out_req, GFP_ATOMIC); in p9_usbg_request()
484 struct f_usb9pfs *usb9pfs = client->trans; in p9_usbg_cancel()
489 guard(spinlock_irqsave)(&usb9pfs->lock); in p9_usbg_cancel()
491 if (req->status == REQ_STATUS_UNSENT) { in p9_usbg_cancel()
492 list_del(&req->req_list); in p9_usbg_cancel()
493 WRITE_ONCE(req->status, REQ_STATUS_FLSHD); in p9_usbg_cancel()
510 /*-------------------------------------------------------------------------*/
619 /* function-specific strings: */
626 .language = 0x0409, /* en-us */
627 .strings = strings_usb9pfs,
635 /*-------------------------------------------------------------------------*/
642 struct usb_composite_dev *cdev = c->cdev; in usb9pfs_func_bind()
659 usb9pfs->in_ep = usb_ep_autoconfig(cdev->gadget, in usb9pfs_func_bind()
661 if (!usb9pfs->in_ep) in usb9pfs_func_bind()
664 usb9pfs->out_ep = usb_ep_autoconfig(cdev->gadget, in usb9pfs_func_bind()
666 if (!usb9pfs->out_ep) in usb9pfs_func_bind()
686 opts = container_of(f->fi, struct f_usb9pfs_opts, func_inst); in usb9pfs_func_bind()
687 opts->dev->usb9pfs = usb9pfs; in usb9pfs_func_bind()
689 dev_dbg(&cdev->gadget->dev, "%s speed %s: IN/%s, OUT/%s\n", in usb9pfs_func_bind()
690 (gadget_is_superspeed(c->cdev->gadget) ? "super" : in usb9pfs_func_bind()
691 (gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full")), in usb9pfs_func_bind()
692 f->name, usb9pfs->in_ep->name, usb9pfs->out_ep->name); in usb9pfs_func_bind()
698 f->name, cdev->gadget->name); in usb9pfs_func_bind()
699 return -ENODEV; in usb9pfs_func_bind()
717 opts = container_of(f->fi, struct f_usb9pfs_opts, func_inst); in usb9pfs_free_func()
719 mutex_lock(&opts->lock); in usb9pfs_free_func()
720 opts->refcnt--; in usb9pfs_free_func()
721 mutex_unlock(&opts->lock); in usb9pfs_free_func()
730 struct usb_composite_dev *cdev = f->config->cdev; in usb9pfs_set_alt()
749 return ERR_PTR(-ENOMEM); in usb9pfs_alloc()
751 spin_lock_init(&usb9pfs->lock); in usb9pfs_alloc()
753 init_completion(&usb9pfs->send); in usb9pfs_alloc()
754 init_completion(&usb9pfs->received); in usb9pfs_alloc()
758 mutex_lock(&usb9pfs_opts->lock); in usb9pfs_alloc()
759 usb9pfs_opts->refcnt++; in usb9pfs_alloc()
760 mutex_unlock(&usb9pfs_opts->lock); in usb9pfs_alloc()
762 usb9pfs->buflen = usb9pfs_opts->buflen; in usb9pfs_alloc()
764 usb9pfs->function.name = "usb9pfs"; in usb9pfs_alloc()
765 usb9pfs->function.bind = usb9pfs_func_bind; in usb9pfs_alloc()
766 usb9pfs->function.unbind = usb9pfs_func_unbind; in usb9pfs_alloc()
767 usb9pfs->function.set_alt = usb9pfs_set_alt; in usb9pfs_alloc()
768 usb9pfs->function.disable = usb9pfs_disable; in usb9pfs_alloc()
769 usb9pfs->function.strings = usb9pfs_strings; in usb9pfs_alloc()
771 usb9pfs->function.free_func = usb9pfs_free_func; in usb9pfs_alloc()
773 return &usb9pfs->function; in usb9pfs_alloc()
791 usb_put_function_instance(&usb9pfs_opts->func_inst); in usb9pfs_attr_release()
803 mutex_lock(&opts->lock); in f_usb9pfs_opts_buflen_show()
804 ret = sysfs_emit(page, "%d\n", opts->buflen); in f_usb9pfs_opts_buflen_show()
805 mutex_unlock(&opts->lock); in f_usb9pfs_opts_buflen_show()
815 u32 num; in f_usb9pfs_opts_buflen_store() local
817 guard(mutex)(&opts->lock); in f_usb9pfs_opts_buflen_store()
819 if (opts->refcnt) in f_usb9pfs_opts_buflen_store()
820 return -EBUSY; in f_usb9pfs_opts_buflen_store()
822 ret = kstrtou32(page, 0, &num); in f_usb9pfs_opts_buflen_store()
826 opts->buflen = num; in f_usb9pfs_opts_buflen_store()
852 if (strcmp(usb9pfs_dev->tag, tag) == 0) in _usb9pfs_do_find_dev()
868 strscpy(dev->tag, tag, ARRAY_SIZE(dev->tag)); in usb9pfs_tag_instance()
870 ret = -EBUSY; in usb9pfs_tag_instance()
878 return -ENAMETOOLONG; in usb9pfs_set_inst_tag()
879 return usb9pfs_tag_instance(fi_to_f_usb9pfs_opts(fi)->dev, tag); in usb9pfs_set_inst_tag()
886 struct f_usb9pfs_dev *dev = usb9pfs_opts->dev; in usb9pfs_free_instance()
889 list_del(&dev->usb9pfs_instance); in usb9pfs_free_instance()
902 return ERR_PTR(-ENOMEM); in usb9pfs_alloc_instance()
904 mutex_init(&usb9pfs_opts->lock); in usb9pfs_alloc_instance()
906 usb9pfs_opts->func_inst.set_inst_name = usb9pfs_set_inst_tag; in usb9pfs_alloc_instance()
907 usb9pfs_opts->func_inst.free_func_inst = usb9pfs_free_instance; in usb9pfs_alloc_instance()
909 usb9pfs_opts->buflen = DEFAULT_BUFLEN; in usb9pfs_alloc_instance()
914 return ERR_PTR(-ENOMEM); in usb9pfs_alloc_instance()
917 usb9pfs_opts->dev = dev; in usb9pfs_alloc_instance()
918 dev->opts = usb9pfs_opts; in usb9pfs_alloc_instance()
920 config_group_init_type_name(&usb9pfs_opts->func_inst.group, "", in usb9pfs_alloc_instance()
924 list_add_tail(&dev->usb9pfs_instance, &usbg_instance_list); in usb9pfs_alloc_instance()
927 return &usb9pfs_opts->func_inst; in usb9pfs_alloc_instance()