xref: /linux/net/9p/trans_usbg.c (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * trans_usbg.c - USB peripheral usb9pfs configuration driver and transport.
4  *
5  * Copyright (C) 2024 Michael Grzeschik <m.grzeschik@pengutronix.de>
6  */
7 
8 /* Gadget usb9pfs only needs two bulk endpoints, and will use the usb9pfs
9  * transport to mount host exported filesystem via usb gadget.
10  */
11 
12 /*     +--------------------------+    |    +--------------------------+
13  *     |  9PFS mounting client    |    |    |  9PFS exporting server   |
14  *  SW |                          |    |    |                          |
15  *     |   (this:trans_usbg)      |    |    |(e.g. diod or nfs-ganesha)|
16  *     +-------------^------------+    |    +-------------^------------+
17  *                   |                 |                  |
18  * ------------------|------------------------------------|-------------
19  *                   |                 |                  |
20  *     +-------------v------------+    |    +-------------v------------+
21  *     |                          |    |    |                          |
22  *  HW |   USB Device Controller  <--------->   USB Host Controller    |
23  *     |                          |    |    |                          |
24  *     +--------------------------+    |    +--------------------------+
25  */
26 
27 #include <linux/cleanup.h>
28 #include <linux/kernel.h>
29 #include <linux/module.h>
30 #include <linux/usb/composite.h>
31 #include <linux/usb/func_utils.h>
32 
33 #include <net/9p/9p.h>
34 #include <net/9p/client.h>
35 #include <net/9p/transport.h>
36 
37 #define DEFAULT_BUFLEN        16384
38 
39 struct f_usb9pfs {
40 	struct p9_client *client;
41 
42 	/* 9p request lock for en/dequeue */
43 	spinlock_t lock;
44 
45 	struct usb_request *in_req;
46 	struct usb_request *out_req;
47 
48 	struct usb_ep *in_ep;
49 	struct usb_ep *out_ep;
50 
51 	struct completion send;
52 	struct completion received;
53 
54 	unsigned int buflen;
55 
56 	struct usb_function function;
57 };
58 
59 static inline struct f_usb9pfs *func_to_usb9pfs(struct usb_function *f)
60 {
61 	return container_of(f, struct f_usb9pfs, function);
62 }
63 
64 struct f_usb9pfs_opts {
65 	struct usb_function_instance func_inst;
66 	unsigned int buflen;
67 
68 	struct f_usb9pfs_dev *dev;
69 
70 	/* Read/write access to configfs attributes is handled by configfs.
71 	 *
72 	 * This is to protect the data from concurrent access by read/write
73 	 * and create symlink/remove symlink.
74 	 */
75 	struct mutex lock;
76 	int refcnt;
77 };
78 
79 struct f_usb9pfs_dev {
80 	struct f_usb9pfs *usb9pfs;
81 	struct f_usb9pfs_opts *opts;
82 	char tag[41];
83 	bool inuse;
84 
85 	struct list_head usb9pfs_instance;
86 };
87 
88 static DEFINE_MUTEX(usb9pfs_lock);
89 static struct list_head usbg_instance_list;
90 
91 static int usb9pfs_queue_tx(struct f_usb9pfs *usb9pfs, struct p9_req_t *p9_tx_req,
92 			    gfp_t gfp_flags)
93 {
94 	struct usb_composite_dev *cdev = usb9pfs->function.config->cdev;
95 	struct usb_request *req = usb9pfs->in_req;
96 	int ret;
97 
98 	if (!(p9_tx_req->tc.size % usb9pfs->in_ep->maxpacket))
99 		req->zero = 1;
100 
101 	req->buf = p9_tx_req->tc.sdata;
102 	req->length = p9_tx_req->tc.size;
103 	req->context = p9_tx_req;
104 
105 	dev_dbg(&cdev->gadget->dev, "%s usb9pfs send --> %d/%d, zero: %d\n",
106 		usb9pfs->in_ep->name, req->actual, req->length, req->zero);
107 
108 	ret = usb_ep_queue(usb9pfs->in_ep, req, gfp_flags);
109 	if (ret)
110 		req->context = NULL;
111 
112 	dev_dbg(&cdev->gadget->dev, "tx submit --> %d\n", ret);
113 
114 	return ret;
115 }
116 
117 static int usb9pfs_queue_rx(struct f_usb9pfs *usb9pfs, struct usb_request *req,
118 			    gfp_t gfp_flags)
119 {
120 	struct usb_composite_dev *cdev = usb9pfs->function.config->cdev;
121 	int ret;
122 
123 	ret = usb_ep_queue(usb9pfs->out_ep, req, gfp_flags);
124 
125 	dev_dbg(&cdev->gadget->dev, "rx submit --> %d\n", ret);
126 
127 	return ret;
128 }
129 
130 static int usb9pfs_transmit(struct f_usb9pfs *usb9pfs, struct p9_req_t *p9_req)
131 {
132 	int ret = 0;
133 
134 	guard(spinlock_irqsave)(&usb9pfs->lock);
135 
136 	ret = usb9pfs_queue_tx(usb9pfs, p9_req, GFP_ATOMIC);
137 	if (ret)
138 		return ret;
139 
140 	list_del(&p9_req->req_list);
141 
142 	p9_req_get(p9_req);
143 
144 	return ret;
145 }
146 
147 static void usb9pfs_tx_complete(struct usb_ep *ep, struct usb_request *req)
148 {
149 	struct f_usb9pfs *usb9pfs = ep->driver_data;
150 	struct usb_composite_dev *cdev = usb9pfs->function.config->cdev;
151 	struct p9_req_t *p9_tx_req = req->context;
152 	unsigned long flags;
153 
154 	/* reset zero packages */
155 	req->zero = 0;
156 
157 	if (req->status) {
158 		dev_err(&cdev->gadget->dev, "%s usb9pfs complete --> %d, %d/%d\n",
159 			ep->name, req->status, req->actual, req->length);
160 		return;
161 	}
162 
163 	dev_dbg(&cdev->gadget->dev, "%s usb9pfs complete --> %d, %d/%d\n",
164 		ep->name, req->status, req->actual, req->length);
165 
166 	spin_lock_irqsave(&usb9pfs->lock, flags);
167 	WRITE_ONCE(p9_tx_req->status, REQ_STATUS_SENT);
168 
169 	p9_req_put(usb9pfs->client, p9_tx_req);
170 
171 	req->context = NULL;
172 
173 	spin_unlock_irqrestore(&usb9pfs->lock, flags);
174 
175 	complete(&usb9pfs->send);
176 }
177 
178 static struct p9_req_t *usb9pfs_rx_header(struct f_usb9pfs *usb9pfs, void *buf)
179 {
180 	struct p9_req_t *p9_rx_req;
181 	struct p9_fcall	rc;
182 	int ret;
183 
184 	/* start by reading header */
185 	rc.sdata = buf;
186 	rc.offset = 0;
187 	rc.capacity = P9_HDRSZ;
188 	rc.size = P9_HDRSZ;
189 
190 	p9_debug(P9_DEBUG_TRANS, "mux %p got %zu bytes\n", usb9pfs,
191 		 rc.capacity - rc.offset);
192 
193 	ret = p9_parse_header(&rc, &rc.size, NULL, NULL, 0);
194 	if (ret) {
195 		p9_debug(P9_DEBUG_ERROR,
196 			 "error parsing header: %d\n", ret);
197 		return NULL;
198 	}
199 
200 	p9_debug(P9_DEBUG_TRANS,
201 		 "mux %p pkt: size: %d bytes tag: %d\n",
202 		 usb9pfs, rc.size, rc.tag);
203 
204 	p9_rx_req = p9_tag_lookup(usb9pfs->client, rc.tag);
205 	if (!p9_rx_req || p9_rx_req->status != REQ_STATUS_SENT) {
206 		p9_debug(P9_DEBUG_ERROR, "Unexpected packet tag %d\n", rc.tag);
207 		return NULL;
208 	}
209 
210 	if (rc.size > p9_rx_req->rc.capacity) {
211 		p9_debug(P9_DEBUG_ERROR,
212 			 "requested packet size too big: %d for tag %d with capacity %zd\n",
213 			 rc.size, rc.tag, p9_rx_req->rc.capacity);
214 		p9_req_put(usb9pfs->client, p9_rx_req);
215 		return NULL;
216 	}
217 
218 	if (!p9_rx_req->rc.sdata) {
219 		p9_debug(P9_DEBUG_ERROR,
220 			 "No recv fcall for tag %d (req %p), disconnecting!\n",
221 			 rc.tag, p9_rx_req);
222 		p9_req_put(usb9pfs->client, p9_rx_req);
223 		return NULL;
224 	}
225 
226 	return p9_rx_req;
227 }
228 
229 static void usb9pfs_rx_complete(struct usb_ep *ep, struct usb_request *req)
230 {
231 	struct f_usb9pfs *usb9pfs = ep->driver_data;
232 	struct usb_composite_dev *cdev = usb9pfs->function.config->cdev;
233 	struct p9_req_t *p9_rx_req;
234 
235 	if (req->status) {
236 		dev_err(&cdev->gadget->dev, "%s usb9pfs complete --> %d, %d/%d\n",
237 			ep->name, req->status, req->actual, req->length);
238 		return;
239 	}
240 
241 	p9_rx_req = usb9pfs_rx_header(usb9pfs, req->buf);
242 	if (!p9_rx_req)
243 		return;
244 
245 	memcpy(p9_rx_req->rc.sdata, req->buf, req->actual);
246 
247 	p9_rx_req->rc.size = req->actual;
248 
249 	p9_client_cb(usb9pfs->client, p9_rx_req, REQ_STATUS_RCVD);
250 	p9_req_put(usb9pfs->client, p9_rx_req);
251 
252 	complete(&usb9pfs->received);
253 }
254 
255 static void disable_ep(struct usb_composite_dev *cdev, struct usb_ep *ep)
256 {
257 	int value;
258 
259 	value = usb_ep_disable(ep);
260 	if (value < 0)
261 		dev_info(&cdev->gadget->dev,
262 			 "disable %s --> %d\n", ep->name, value);
263 }
264 
265 static void disable_usb9pfs(struct f_usb9pfs *usb9pfs)
266 {
267 	struct usb_composite_dev *cdev =
268 		usb9pfs->function.config->cdev;
269 
270 	if (usb9pfs->in_req) {
271 		usb_ep_free_request(usb9pfs->in_ep, usb9pfs->in_req);
272 		usb9pfs->in_req = NULL;
273 	}
274 
275 	if (usb9pfs->out_req) {
276 		usb_ep_free_request(usb9pfs->out_ep, usb9pfs->out_req);
277 		usb9pfs->out_req = NULL;
278 	}
279 
280 	disable_ep(cdev, usb9pfs->in_ep);
281 	disable_ep(cdev, usb9pfs->out_ep);
282 	dev_dbg(&cdev->gadget->dev, "%s disabled\n",
283 		usb9pfs->function.name);
284 }
285 
286 static int alloc_requests(struct usb_composite_dev *cdev,
287 			  struct f_usb9pfs *usb9pfs)
288 {
289 	int ret;
290 
291 	usb9pfs->in_req = usb_ep_alloc_request(usb9pfs->in_ep, GFP_ATOMIC);
292 	if (!usb9pfs->in_req) {
293 		ret = -ENOENT;
294 		goto fail;
295 	}
296 
297 	usb9pfs->out_req = alloc_ep_req(usb9pfs->out_ep, usb9pfs->buflen);
298 	if (!usb9pfs->out_req) {
299 		ret = -ENOENT;
300 		goto fail_in;
301 	}
302 
303 	usb9pfs->in_req->complete = usb9pfs_tx_complete;
304 	usb9pfs->out_req->complete = usb9pfs_rx_complete;
305 
306 	/* length will be set in complete routine */
307 	usb9pfs->in_req->context = usb9pfs;
308 	usb9pfs->out_req->context = usb9pfs;
309 
310 	return 0;
311 
312 fail_in:
313 	usb_ep_free_request(usb9pfs->in_ep, usb9pfs->in_req);
314 fail:
315 	return ret;
316 }
317 
318 static int enable_endpoint(struct usb_composite_dev *cdev,
319 			   struct f_usb9pfs *usb9pfs, struct usb_ep *ep)
320 {
321 	int ret;
322 
323 	ret = config_ep_by_speed(cdev->gadget, &usb9pfs->function, ep);
324 	if (ret)
325 		return ret;
326 
327 	ret = usb_ep_enable(ep);
328 	if (ret < 0)
329 		return ret;
330 
331 	ep->driver_data = usb9pfs;
332 
333 	return 0;
334 }
335 
336 static int
337 enable_usb9pfs(struct usb_composite_dev *cdev, struct f_usb9pfs *usb9pfs)
338 {
339 	struct p9_client *client;
340 	int ret = 0;
341 
342 	ret = enable_endpoint(cdev, usb9pfs, usb9pfs->in_ep);
343 	if (ret)
344 		goto out;
345 
346 	ret = enable_endpoint(cdev, usb9pfs, usb9pfs->out_ep);
347 	if (ret)
348 		goto disable_in;
349 
350 	ret = alloc_requests(cdev, usb9pfs);
351 	if (ret)
352 		goto disable_out;
353 
354 	client = usb9pfs->client;
355 	if (client)
356 		client->status = Connected;
357 
358 	dev_dbg(&cdev->gadget->dev, "%s enabled\n", usb9pfs->function.name);
359 	return 0;
360 
361 disable_out:
362 	usb_ep_disable(usb9pfs->out_ep);
363 disable_in:
364 	usb_ep_disable(usb9pfs->in_ep);
365 out:
366 	return ret;
367 }
368 
369 static int p9_usbg_create(struct p9_client *client, const char *devname, char *args)
370 {
371 	struct f_usb9pfs_dev *dev;
372 	struct f_usb9pfs *usb9pfs;
373 	int ret = -ENOENT;
374 	int found = 0;
375 
376 	if (!devname)
377 		return -EINVAL;
378 
379 	guard(mutex)(&usb9pfs_lock);
380 
381 	list_for_each_entry(dev, &usbg_instance_list, usb9pfs_instance) {
382 		if (!strncmp(devname, dev->tag, strlen(devname))) {
383 			if (!dev->inuse) {
384 				dev->inuse = true;
385 				found = 1;
386 				break;
387 			}
388 			ret = -EBUSY;
389 			break;
390 		}
391 	}
392 
393 	if (!found) {
394 		pr_err("no channels available for device %s\n", devname);
395 		return ret;
396 	}
397 
398 	usb9pfs = dev->usb9pfs;
399 	if (!usb9pfs)
400 		return -EINVAL;
401 
402 	client->trans = (void *)usb9pfs;
403 	if (!usb9pfs->in_req)
404 		client->status = Disconnected;
405 	else
406 		client->status = Connected;
407 	usb9pfs->client = client;
408 
409 	client->trans_mod->maxsize = usb9pfs->buflen;
410 
411 	complete(&usb9pfs->received);
412 
413 	return 0;
414 }
415 
416 static void usb9pfs_clear_tx(struct f_usb9pfs *usb9pfs)
417 {
418 	struct p9_req_t *req;
419 
420 	guard(spinlock_irqsave)(&usb9pfs->lock);
421 
422 	req = usb9pfs->in_req->context;
423 	if (!req)
424 		return;
425 
426 	if (!req->t_err)
427 		req->t_err = -ECONNRESET;
428 
429 	p9_client_cb(usb9pfs->client, req, REQ_STATUS_ERROR);
430 }
431 
432 static void p9_usbg_close(struct p9_client *client)
433 {
434 	struct f_usb9pfs *usb9pfs;
435 	struct f_usb9pfs_dev *dev;
436 	struct f_usb9pfs_opts *opts;
437 
438 	if (!client)
439 		return;
440 
441 	usb9pfs = client->trans;
442 	if (!usb9pfs)
443 		return;
444 
445 	client->status = Disconnected;
446 
447 	usb9pfs_clear_tx(usb9pfs);
448 
449 	opts = container_of(usb9pfs->function.fi,
450 			    struct f_usb9pfs_opts, func_inst);
451 
452 	dev = opts->dev;
453 
454 	mutex_lock(&usb9pfs_lock);
455 	dev->inuse = false;
456 	mutex_unlock(&usb9pfs_lock);
457 }
458 
459 static int p9_usbg_request(struct p9_client *client, struct p9_req_t *p9_req)
460 {
461 	struct f_usb9pfs *usb9pfs = client->trans;
462 	int ret;
463 
464 	if (client->status != Connected)
465 		return -EBUSY;
466 
467 	ret = wait_for_completion_killable(&usb9pfs->received);
468 	if (ret)
469 		return ret;
470 
471 	ret = usb9pfs_transmit(usb9pfs, p9_req);
472 	if (ret)
473 		return ret;
474 
475 	ret = wait_for_completion_killable(&usb9pfs->send);
476 	if (ret)
477 		return ret;
478 
479 	return usb9pfs_queue_rx(usb9pfs, usb9pfs->out_req, GFP_ATOMIC);
480 }
481 
482 static int p9_usbg_cancel(struct p9_client *client, struct p9_req_t *req)
483 {
484 	struct f_usb9pfs *usb9pfs = client->trans;
485 	int ret = 1;
486 
487 	p9_debug(P9_DEBUG_TRANS, "client %p req %p\n", client, req);
488 
489 	guard(spinlock_irqsave)(&usb9pfs->lock);
490 
491 	if (req->status == REQ_STATUS_UNSENT) {
492 		list_del(&req->req_list);
493 		WRITE_ONCE(req->status, REQ_STATUS_FLSHD);
494 		p9_req_put(client, req);
495 		ret = 0;
496 	}
497 
498 	return ret;
499 }
500 
501 static struct p9_trans_module p9_usbg_trans = {
502 	.name = "usbg",
503 	.create = p9_usbg_create,
504 	.close = p9_usbg_close,
505 	.request = p9_usbg_request,
506 	.cancel = p9_usbg_cancel,
507 	.owner = THIS_MODULE,
508 };
509 
510 /*-------------------------------------------------------------------------*/
511 
512 #define USB_PROTOCOL_9PFS	0x09
513 
514 static struct usb_interface_descriptor usb9pfs_intf = {
515 	.bLength =		sizeof(usb9pfs_intf),
516 	.bDescriptorType =	USB_DT_INTERFACE,
517 
518 	.bNumEndpoints =	2,
519 	.bInterfaceClass =	USB_CLASS_VENDOR_SPEC,
520 	.bInterfaceSubClass =	USB_SUBCLASS_VENDOR_SPEC,
521 	.bInterfaceProtocol =   USB_PROTOCOL_9PFS,
522 
523 	/* .iInterface = DYNAMIC */
524 };
525 
526 /* full speed support: */
527 
528 static struct usb_endpoint_descriptor fs_usb9pfs_source_desc = {
529 	.bLength =		USB_DT_ENDPOINT_SIZE,
530 	.bDescriptorType =	USB_DT_ENDPOINT,
531 
532 	.bEndpointAddress =	USB_DIR_IN,
533 	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
534 };
535 
536 static struct usb_endpoint_descriptor fs_usb9pfs_sink_desc = {
537 	.bLength =		USB_DT_ENDPOINT_SIZE,
538 	.bDescriptorType =	USB_DT_ENDPOINT,
539 
540 	.bEndpointAddress =	USB_DIR_OUT,
541 	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
542 };
543 
544 static struct usb_descriptor_header *fs_usb9pfs_descs[] = {
545 	(struct usb_descriptor_header *)&usb9pfs_intf,
546 	(struct usb_descriptor_header *)&fs_usb9pfs_sink_desc,
547 	(struct usb_descriptor_header *)&fs_usb9pfs_source_desc,
548 	NULL,
549 };
550 
551 /* high speed support: */
552 
553 static struct usb_endpoint_descriptor hs_usb9pfs_source_desc = {
554 	.bLength =		USB_DT_ENDPOINT_SIZE,
555 	.bDescriptorType =	USB_DT_ENDPOINT,
556 
557 	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
558 	.wMaxPacketSize =	cpu_to_le16(512),
559 };
560 
561 static struct usb_endpoint_descriptor hs_usb9pfs_sink_desc = {
562 	.bLength =		USB_DT_ENDPOINT_SIZE,
563 	.bDescriptorType =	USB_DT_ENDPOINT,
564 
565 	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
566 	.wMaxPacketSize =	cpu_to_le16(512),
567 };
568 
569 static struct usb_descriptor_header *hs_usb9pfs_descs[] = {
570 	(struct usb_descriptor_header *)&usb9pfs_intf,
571 	(struct usb_descriptor_header *)&hs_usb9pfs_source_desc,
572 	(struct usb_descriptor_header *)&hs_usb9pfs_sink_desc,
573 	NULL,
574 };
575 
576 /* super speed support: */
577 
578 static struct usb_endpoint_descriptor ss_usb9pfs_source_desc = {
579 	.bLength =		USB_DT_ENDPOINT_SIZE,
580 	.bDescriptorType =	USB_DT_ENDPOINT,
581 
582 	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
583 	.wMaxPacketSize =	cpu_to_le16(1024),
584 };
585 
586 static struct usb_ss_ep_comp_descriptor ss_usb9pfs_source_comp_desc = {
587 	.bLength =		USB_DT_SS_EP_COMP_SIZE,
588 	.bDescriptorType =	USB_DT_SS_ENDPOINT_COMP,
589 	.bMaxBurst =		0,
590 	.bmAttributes =		0,
591 	.wBytesPerInterval =	0,
592 };
593 
594 static struct usb_endpoint_descriptor ss_usb9pfs_sink_desc = {
595 	.bLength =		USB_DT_ENDPOINT_SIZE,
596 	.bDescriptorType =	USB_DT_ENDPOINT,
597 
598 	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
599 	.wMaxPacketSize =	cpu_to_le16(1024),
600 };
601 
602 static struct usb_ss_ep_comp_descriptor ss_usb9pfs_sink_comp_desc = {
603 	.bLength =		USB_DT_SS_EP_COMP_SIZE,
604 	.bDescriptorType =	USB_DT_SS_ENDPOINT_COMP,
605 	.bMaxBurst =		0,
606 	.bmAttributes =		0,
607 	.wBytesPerInterval =	0,
608 };
609 
610 static struct usb_descriptor_header *ss_usb9pfs_descs[] = {
611 	(struct usb_descriptor_header *)&usb9pfs_intf,
612 	(struct usb_descriptor_header *)&ss_usb9pfs_source_desc,
613 	(struct usb_descriptor_header *)&ss_usb9pfs_source_comp_desc,
614 	(struct usb_descriptor_header *)&ss_usb9pfs_sink_desc,
615 	(struct usb_descriptor_header *)&ss_usb9pfs_sink_comp_desc,
616 	NULL,
617 };
618 
619 /* function-specific strings: */
620 static struct usb_string strings_usb9pfs[] = {
621 	[0].s = "usb9pfs input to output",
622 	{  }			/* end of list */
623 };
624 
625 static struct usb_gadget_strings stringtab_usb9pfs = {
626 	.language	= 0x0409,	/* en-us */
627 	.strings	= strings_usb9pfs,
628 };
629 
630 static struct usb_gadget_strings *usb9pfs_strings[] = {
631 	&stringtab_usb9pfs,
632 	NULL,
633 };
634 
635 /*-------------------------------------------------------------------------*/
636 
637 static int usb9pfs_func_bind(struct usb_configuration *c,
638 			     struct usb_function *f)
639 {
640 	struct f_usb9pfs *usb9pfs = func_to_usb9pfs(f);
641 	struct f_usb9pfs_opts *opts;
642 	struct usb_composite_dev *cdev = c->cdev;
643 	int ret;
644 	int id;
645 
646 	/* allocate interface ID(s) */
647 	id = usb_interface_id(c, f);
648 	if (id < 0)
649 		return id;
650 	usb9pfs_intf.bInterfaceNumber = id;
651 
652 	id = usb_string_id(cdev);
653 	if (id < 0)
654 		return id;
655 	strings_usb9pfs[0].id = id;
656 	usb9pfs_intf.iInterface = id;
657 
658 	/* allocate endpoints */
659 	usb9pfs->in_ep = usb_ep_autoconfig(cdev->gadget,
660 					   &fs_usb9pfs_source_desc);
661 	if (!usb9pfs->in_ep)
662 		goto autoconf_fail;
663 
664 	usb9pfs->out_ep = usb_ep_autoconfig(cdev->gadget,
665 					    &fs_usb9pfs_sink_desc);
666 	if (!usb9pfs->out_ep)
667 		goto autoconf_fail;
668 
669 	/* support high speed hardware */
670 	hs_usb9pfs_source_desc.bEndpointAddress =
671 		fs_usb9pfs_source_desc.bEndpointAddress;
672 	hs_usb9pfs_sink_desc.bEndpointAddress =
673 		fs_usb9pfs_sink_desc.bEndpointAddress;
674 
675 	/* support super speed hardware */
676 	ss_usb9pfs_source_desc.bEndpointAddress =
677 		fs_usb9pfs_source_desc.bEndpointAddress;
678 	ss_usb9pfs_sink_desc.bEndpointAddress =
679 		fs_usb9pfs_sink_desc.bEndpointAddress;
680 
681 	ret = usb_assign_descriptors(f, fs_usb9pfs_descs, hs_usb9pfs_descs,
682 				     ss_usb9pfs_descs, ss_usb9pfs_descs);
683 	if (ret)
684 		return ret;
685 
686 	opts = container_of(f->fi, struct f_usb9pfs_opts, func_inst);
687 	opts->dev->usb9pfs = usb9pfs;
688 
689 	dev_dbg(&cdev->gadget->dev, "%s speed %s: IN/%s, OUT/%s\n",
690 		(gadget_is_superspeed(c->cdev->gadget) ? "super" :
691 		(gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full")),
692 			f->name, usb9pfs->in_ep->name, usb9pfs->out_ep->name);
693 
694 	return 0;
695 
696 autoconf_fail:
697 	ERROR(cdev, "%s: can't autoconfigure on %s\n",
698 	      f->name, cdev->gadget->name);
699 	return -ENODEV;
700 }
701 
702 static void usb9pfs_func_unbind(struct usb_configuration *c,
703 				struct usb_function *f)
704 {
705 	struct f_usb9pfs *usb9pfs = func_to_usb9pfs(f);
706 
707 	disable_usb9pfs(usb9pfs);
708 }
709 
710 static void usb9pfs_free_func(struct usb_function *f)
711 {
712 	struct f_usb9pfs *usb9pfs = func_to_usb9pfs(f);
713 	struct f_usb9pfs_opts *opts;
714 
715 	kfree(usb9pfs);
716 
717 	opts = container_of(f->fi, struct f_usb9pfs_opts, func_inst);
718 
719 	mutex_lock(&opts->lock);
720 	opts->refcnt--;
721 	mutex_unlock(&opts->lock);
722 
723 	usb_free_all_descriptors(f);
724 }
725 
726 static int usb9pfs_set_alt(struct usb_function *f,
727 			   unsigned int intf, unsigned int alt)
728 {
729 	struct f_usb9pfs *usb9pfs = func_to_usb9pfs(f);
730 	struct usb_composite_dev *cdev = f->config->cdev;
731 
732 	return enable_usb9pfs(cdev, usb9pfs);
733 }
734 
735 static void usb9pfs_disable(struct usb_function *f)
736 {
737 	struct f_usb9pfs *usb9pfs = func_to_usb9pfs(f);
738 
739 	usb9pfs_clear_tx(usb9pfs);
740 }
741 
742 static struct usb_function *usb9pfs_alloc(struct usb_function_instance *fi)
743 {
744 	struct f_usb9pfs_opts *usb9pfs_opts;
745 	struct f_usb9pfs *usb9pfs;
746 
747 	usb9pfs = kzalloc(sizeof(*usb9pfs), GFP_KERNEL);
748 	if (!usb9pfs)
749 		return ERR_PTR(-ENOMEM);
750 
751 	spin_lock_init(&usb9pfs->lock);
752 
753 	init_completion(&usb9pfs->send);
754 	init_completion(&usb9pfs->received);
755 
756 	usb9pfs_opts = container_of(fi, struct f_usb9pfs_opts, func_inst);
757 
758 	mutex_lock(&usb9pfs_opts->lock);
759 	usb9pfs_opts->refcnt++;
760 	mutex_unlock(&usb9pfs_opts->lock);
761 
762 	usb9pfs->buflen = usb9pfs_opts->buflen;
763 
764 	usb9pfs->function.name = "usb9pfs";
765 	usb9pfs->function.bind = usb9pfs_func_bind;
766 	usb9pfs->function.unbind = usb9pfs_func_unbind;
767 	usb9pfs->function.set_alt = usb9pfs_set_alt;
768 	usb9pfs->function.disable = usb9pfs_disable;
769 	usb9pfs->function.strings = usb9pfs_strings;
770 
771 	usb9pfs->function.free_func = usb9pfs_free_func;
772 
773 	return &usb9pfs->function;
774 }
775 
776 static inline struct f_usb9pfs_opts *to_f_usb9pfs_opts(struct config_item *item)
777 {
778 	return container_of(to_config_group(item), struct f_usb9pfs_opts,
779 			    func_inst.group);
780 }
781 
782 static inline struct f_usb9pfs_opts *fi_to_f_usb9pfs_opts(struct usb_function_instance *fi)
783 {
784 	return container_of(fi, struct f_usb9pfs_opts, func_inst);
785 }
786 
787 static void usb9pfs_attr_release(struct config_item *item)
788 {
789 	struct f_usb9pfs_opts *usb9pfs_opts = to_f_usb9pfs_opts(item);
790 
791 	usb_put_function_instance(&usb9pfs_opts->func_inst);
792 }
793 
794 static struct configfs_item_operations usb9pfs_item_ops = {
795 	.release		= usb9pfs_attr_release,
796 };
797 
798 static ssize_t f_usb9pfs_opts_buflen_show(struct config_item *item, char *page)
799 {
800 	struct f_usb9pfs_opts *opts = to_f_usb9pfs_opts(item);
801 	int ret;
802 
803 	mutex_lock(&opts->lock);
804 	ret = sysfs_emit(page, "%d\n", opts->buflen);
805 	mutex_unlock(&opts->lock);
806 
807 	return ret;
808 }
809 
810 static ssize_t f_usb9pfs_opts_buflen_store(struct config_item *item,
811 					   const char *page, size_t len)
812 {
813 	struct f_usb9pfs_opts *opts = to_f_usb9pfs_opts(item);
814 	int ret;
815 	u32 num;
816 
817 	guard(mutex)(&opts->lock);
818 
819 	if (opts->refcnt)
820 		return -EBUSY;
821 
822 	ret = kstrtou32(page, 0, &num);
823 	if (ret)
824 		return ret;
825 
826 	opts->buflen = num;
827 
828 	return len;
829 }
830 
831 CONFIGFS_ATTR(f_usb9pfs_opts_, buflen);
832 
833 static struct configfs_attribute *usb9pfs_attrs[] = {
834 	&f_usb9pfs_opts_attr_buflen,
835 	NULL,
836 };
837 
838 static const struct config_item_type usb9pfs_func_type = {
839 	.ct_item_ops	= &usb9pfs_item_ops,
840 	.ct_attrs	= usb9pfs_attrs,
841 	.ct_owner	= THIS_MODULE,
842 };
843 
844 static struct f_usb9pfs_dev *_usb9pfs_do_find_dev(const char *tag)
845 {
846 	struct f_usb9pfs_dev *usb9pfs_dev;
847 
848 	if (!tag)
849 		return NULL;
850 
851 	list_for_each_entry(usb9pfs_dev, &usbg_instance_list, usb9pfs_instance) {
852 		if (strcmp(usb9pfs_dev->tag, tag) == 0)
853 			return usb9pfs_dev;
854 	}
855 
856 	return NULL;
857 }
858 
859 static int usb9pfs_tag_instance(struct f_usb9pfs_dev *dev, const char *tag)
860 {
861 	struct f_usb9pfs_dev *existing;
862 	int ret = 0;
863 
864 	guard(mutex)(&usb9pfs_lock);
865 
866 	existing = _usb9pfs_do_find_dev(tag);
867 	if (!existing)
868 		strscpy(dev->tag, tag, ARRAY_SIZE(dev->tag));
869 	else if (existing != dev)
870 		ret = -EBUSY;
871 
872 	return ret;
873 }
874 
875 static int usb9pfs_set_inst_tag(struct usb_function_instance *fi, const char *tag)
876 {
877 	if (strlen(tag) >= sizeof_field(struct f_usb9pfs_dev, tag))
878 		return -ENAMETOOLONG;
879 	return usb9pfs_tag_instance(fi_to_f_usb9pfs_opts(fi)->dev, tag);
880 }
881 
882 static void usb9pfs_free_instance(struct usb_function_instance *fi)
883 {
884 	struct f_usb9pfs_opts *usb9pfs_opts =
885 		container_of(fi, struct f_usb9pfs_opts, func_inst);
886 	struct f_usb9pfs_dev *dev = usb9pfs_opts->dev;
887 
888 	mutex_lock(&usb9pfs_lock);
889 	list_del(&dev->usb9pfs_instance);
890 	mutex_unlock(&usb9pfs_lock);
891 
892 	kfree(usb9pfs_opts);
893 }
894 
895 static struct usb_function_instance *usb9pfs_alloc_instance(void)
896 {
897 	struct f_usb9pfs_opts *usb9pfs_opts;
898 	struct f_usb9pfs_dev *dev;
899 
900 	usb9pfs_opts = kzalloc(sizeof(*usb9pfs_opts), GFP_KERNEL);
901 	if (!usb9pfs_opts)
902 		return ERR_PTR(-ENOMEM);
903 
904 	mutex_init(&usb9pfs_opts->lock);
905 
906 	usb9pfs_opts->func_inst.set_inst_name = usb9pfs_set_inst_tag;
907 	usb9pfs_opts->func_inst.free_func_inst = usb9pfs_free_instance;
908 
909 	usb9pfs_opts->buflen = DEFAULT_BUFLEN;
910 
911 	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
912 	if (IS_ERR(dev)) {
913 		kfree(usb9pfs_opts);
914 		return ERR_CAST(dev);
915 	}
916 
917 	usb9pfs_opts->dev = dev;
918 	dev->opts = usb9pfs_opts;
919 
920 	config_group_init_type_name(&usb9pfs_opts->func_inst.group, "",
921 				    &usb9pfs_func_type);
922 
923 	mutex_lock(&usb9pfs_lock);
924 	list_add_tail(&dev->usb9pfs_instance, &usbg_instance_list);
925 	mutex_unlock(&usb9pfs_lock);
926 
927 	return &usb9pfs_opts->func_inst;
928 }
929 DECLARE_USB_FUNCTION(usb9pfs, usb9pfs_alloc_instance, usb9pfs_alloc);
930 
931 static int __init usb9pfs_modinit(void)
932 {
933 	int ret;
934 
935 	INIT_LIST_HEAD(&usbg_instance_list);
936 
937 	ret = usb_function_register(&usb9pfsusb_func);
938 	if (!ret)
939 		v9fs_register_trans(&p9_usbg_trans);
940 
941 	return ret;
942 }
943 
944 static void __exit usb9pfs_modexit(void)
945 {
946 	usb_function_unregister(&usb9pfsusb_func);
947 	v9fs_unregister_trans(&p9_usbg_trans);
948 }
949 
950 module_init(usb9pfs_modinit);
951 module_exit(usb9pfs_modexit);
952 
953 MODULE_ALIAS_9P("usbg");
954 MODULE_LICENSE("GPL");
955 MODULE_DESCRIPTION("USB gadget 9pfs transport");
956 MODULE_AUTHOR("Michael Grzeschik");
957