Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  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
 39struct 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
 59static inline struct f_usb9pfs *func_to_usb9pfs(struct usb_function *f)
 60{
 61	return container_of(f, struct f_usb9pfs, function);
 62}
 63
 64struct 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
 79struct 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
 88static DEFINE_MUTEX(usb9pfs_lock);
 89static struct list_head usbg_instance_list;
 90
 91static 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
117static 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
130static 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
147static 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
178static 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
229static 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
255static 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
265static 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
286static 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
312fail_in:
313	usb_ep_free_request(usb9pfs->in_ep, usb9pfs->in_req);
314fail:
315	return ret;
316}
317
318static 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
336static int
337enable_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
361disable_out:
362	usb_ep_disable(usb9pfs->out_ep);
363disable_in:
364	usb_ep_disable(usb9pfs->in_ep);
365out:
366	return ret;
367}
368
369static 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
416static 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
432static 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
459static 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
482static 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
501static 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
514static 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
528static 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
536static 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
544static 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
553static 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
561static 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
569static 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
578static 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
586static 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
594static 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
602static 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
610static 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: */
620static struct usb_string strings_usb9pfs[] = {
621	[0].s = "usb9pfs input to output",
622	{  }			/* end of list */
623};
624
625static struct usb_gadget_strings stringtab_usb9pfs = {
626	.language	= 0x0409,	/* en-us */
627	.strings	= strings_usb9pfs,
628};
629
630static struct usb_gadget_strings *usb9pfs_strings[] = {
631	&stringtab_usb9pfs,
632	NULL,
633};
634
635/*-------------------------------------------------------------------------*/
636
637static 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
696autoconf_fail:
697	ERROR(cdev, "%s: can't autoconfigure on %s\n",
698	      f->name, cdev->gadget->name);
699	return -ENODEV;
700}
701
702static 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
710static 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
726static 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
735static 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
742static 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
776static 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
782static 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
787static 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
794static struct configfs_item_operations usb9pfs_item_ops = {
795	.release		= usb9pfs_attr_release,
796};
797
798static 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
810static 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
831CONFIGFS_ATTR(f_usb9pfs_opts_, buflen);
832
833static struct configfs_attribute *usb9pfs_attrs[] = {
834	&f_usb9pfs_opts_attr_buflen,
835	NULL,
836};
837
838static 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
844static 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
859static 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
875static 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
882static 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
895static 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 (!dev) {
913		kfree(usb9pfs_opts);
914		return ERR_PTR(-ENOMEM);
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}
929DECLARE_USB_FUNCTION(usb9pfs, usb9pfs_alloc_instance, usb9pfs_alloc);
930
931static 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
944static void __exit usb9pfs_modexit(void)
945{
946	usb_function_unregister(&usb9pfsusb_func);
947	v9fs_unregister_trans(&p9_usbg_trans);
948}
949
950module_init(usb9pfs_modinit);
951module_exit(usb9pfs_modexit);
952
953MODULE_ALIAS_9P("usbg");
954MODULE_LICENSE("GPL");
955MODULE_DESCRIPTION("USB gadget 9pfs transport");
956MODULE_AUTHOR("Michael Grzeschik");