trans_usbg.c 23 KB

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